Files
Kelin 73cb274160 v0.1.2: Multi-server architecture + security cleanup
- Implement multi-server Traefik + Sablier architecture
- Add label-based automatic service discovery
- Create separate Sablier stack deployment
- Add remote server deployment workflow (Option 3)
- Add 9 new functions for multi-server management
- Remove deprecated config-templates folder
- Replace hardcoded private data with placeholders
- Update backup timestamp format to YY_MM_DD_hh_mm
- Add markup.yml to .gitignore

Breaking changes:
- Removed Sablier from core docker-compose.yml (now separate stack)
- Config templates moved from config-templates/ to docker-compose/core/
- REQUIRED_VARS now dynamic based on deployment type
2026-02-04 19:36:18 -05:00
..

Sablier Stack

This stack deploys Sablier, a service that provides lazy loading (on-demand startup) for Docker containers.

Overview

Sablier monitors Docker containers and can automatically start them when they receive traffic through Traefik, then stop them after a period of inactivity. This is useful for:

  • Reducing resource usage on servers with limited RAM/CPU
  • Managing seasonal or infrequently-used services
  • Extending the capacity of small servers (like Raspberry Pi)

Multi-Server Architecture

Each server in your homelab should have its own Sablier instance:

  • Core Server: Manages lazy loading for core services
  • Remote Servers: Each runs Sablier to control local containers

Sablier only connects to the local Docker socket (/var/run/docker.sock) on its own server.

Features

  • Web Dashboard: Access at https://sablier.yourdomain.duckdns.org
  • Protected by Authelia: SSO authentication required
  • Local Control: Only manages containers on the same server
  • Traefik Integration: Uses Traefik middlewares for automatic container startup

Usage

Enable Lazy Loading on a Container

Add these labels to any service in your docker-compose files:

services:
  myservice:
    image: myapp:latest
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.myservice.rule=Host(`myservice.yourdomain.duckdns.org`)"
      - "traefik.http.routers.myservice.entrypoints=websecure"
      - "traefik.http.routers.myservice.tls=true"
      - "traefik.http.routers.myservice.middlewares=sablier-myservice@docker"
      
      # Sablier middleware configuration
      - "traefik.http.middlewares.sablier-myservice.plugin.sablier.names=myservice"
      - "traefik.http.middlewares.sablier-myservice.plugin.sablier.sablierUrl=http://sablier:10000"
      - "traefik.http.middlewares.sablier-myservice.plugin.sablier.sessionDuration=5m"

Configuration Options

  • names: Container name(s) to manage (comma-separated for multiple)
  • sablierUrl: URL of the Sablier service (use http://sablier:10000 for local)
  • sessionDuration: How long to keep the container running after last request (e.g., 5m, 1h)

Deployment

This stack is automatically deployed:

  • On the core server after core infrastructure deployment
  • On remote servers during remote server setup

Manual deployment:

cd /opt/stacks/sablier
docker compose up -d

Resources

  • CPU: ~10-20 MB RAM per instance
  • Storage: Minimal (~50 MB)
  • Network: Internal Docker network only

Documentation