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
This commit is contained in:
78
docker-compose/sablier/README.md
Normal file
78
docker-compose/sablier/README.md
Normal file
@@ -0,0 +1,78 @@
|
||||
# Sablier Stack
|
||||
|
||||
This stack deploys [Sablier](https://github.com/acouvreur/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:
|
||||
|
||||
```yaml
|
||||
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:
|
||||
```bash
|
||||
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
|
||||
|
||||
- [Sablier GitHub](https://github.com/acouvreur/sablier)
|
||||
- [Sablier Documentation](https://acouvreur.github.io/sablier/)
|
||||
- [Traefik Plugin Configuration](https://doc.traefik.io/traefik/plugins/sablier/)
|
||||
24
docker-compose/sablier/docker-compose.yml
Normal file
24
docker-compose/sablier/docker-compose.yml
Normal file
@@ -0,0 +1,24 @@
|
||||
services:
|
||||
sablier:
|
||||
image: acouvreur/sablier:1.7.0
|
||||
container_name: sablier
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- traefik-network
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock:ro
|
||||
labels:
|
||||
- "traefik.enable=true"
|
||||
- "traefik.http.routers.sablier.rule=Host(`sablier.{{DUCKDNS_DOMAIN}}`)"
|
||||
- "traefik.http.routers.sablier.entrypoints=websecure"
|
||||
- "traefik.http.routers.sablier.tls=true"
|
||||
- "traefik.http.routers.sablier.tls.certresolver=letsencrypt"
|
||||
- "traefik.http.routers.sablier.middlewares=authelia@file"
|
||||
- "traefik.http.services.sablier.loadbalancer.server.port=10000"
|
||||
command:
|
||||
- start
|
||||
- --provider.name=docker
|
||||
|
||||
networks:
|
||||
traefik-network:
|
||||
external: true
|
||||
Reference in New Issue
Block a user