This is an old revision of the document!
Table of Contents
Sablier configuratie:
Aanbevolen Schaalbare Oplossing
1. Netwerk Architectuur
┌─────────────────────────────────────────────────────────┐ │ Host (192.168.10.5) │ ├─────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │ │ │ Public │ │ Shared │ │ Private │ │ │ │ (NPM) │◄──►│ (Sablier) │◄──►│ (DBs) │ │ │ └──────────────┘ └──────────────┘ └────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ books.verhaar.xyz Sablier API PostgreSQL │ │ nextcloud.verhaar… Booklore, etc. Redis │ └─────────────────────────────────────────────────────────┘
2. Sablier Compose (~/docker/sablier/docker-compose.yml)
version: '3.8'
services:
sablier:
image: ghcr.io/containrrr/sablier:latest
container_name: sablier
restart: unless-stopped
environment:
- TZ=Europe/Amsterdam
- SABLIER_API_ADDR=:8080
- SABLIER_DOCKER_HOST=unix:///var/run/docker.sock
- SABLIER_IDLE_DURATION=15m
- SABLIER_GRACE_PERIOD=5m
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- public_net # Voor NPM communicatie
- shared_net # Voor container besturing
ports:
- "8080:8080"
networks:
public_net:
external: true # NPM netwerk
shared_net:
external: true # Gedeeld netwerk voor sleepers
3. Template voor Elke Container (~/docker/{app}/docker-compose.yml)
version: '3.8'
services:
appname:
image: your-image:latest
container_name: appname
restart: "no"
networks:
- shared_net # Alleen Sablier ziet deze container
labels:
- sablier.enabled=true
- sablier.duration=15m
- sablier.on-demand=true
- sablier.container-name=appname
# NPM proxy config (handmatig in NPM GUI aanmaken)
- nginxproxymanager.proxy_host=app.verhaar.xyz
- nginxproxymanager.forward_host=appname
- nginxproxymanager.forward_port=8080
networks:
shared_net:
external: true
4. NPM Configuratie (Per Container)
In NPM GUI per proxy host:
- Domain: app.verhaar.xyz
- Forward IP: 192.168.10.5
- Forward Port: 8080 (Sablier)
- Advanced:
location / {
proxy_pass http://192.168.10.5:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Sablier-Container appname;
}
Alternatief: Traefik + Sablier
Voor 20+ containers is Traefik vaak beter dan NPM voor Sablier-integratie:
| Feature | NPM + Sablier | Traefik + Sablier |
|---|---|---|
| Labels | Handmatig per host | Automatisch via labels |
| Schalen | Moeilijk (20+ hosts) | Makkelijk (alleen labels) |
| SSL | Handmatig certificaat | Automatisch per label |
| Complexiteit | Medium | Hoog (eerste setup) |
Traefik voorbeeld:
labels: - traefik.enable=true - traefik.http.routers.app.rule=Host(`app.verhaar.xyz`) - traefik.http.services.app.loadbalancer.server.port=8080 - sablier.enabled=true - sablier.duration=15m
Quick Security Checklist
# 1. Docker Socket beveiligen (optioneel maar aanbevolen) sudo chmod 660 /var/run/docker.sock sudo chown root:sablier /var/run/docker.sock # 2. Netwerk isolatie controleren docker network ls docker network inspect shared_net # 3. Sablier beperken tot specifieke containers # Voeg toe aan Sablier env: # SABLIER_ALLOWED_CONTAINERS=booklore,nextcloud,plex,... # 4. Firewall regels (optioneel) sudo ufw deny 8080 # Alleen interne toegang sudo ufw allow from 192.168.10.0/24 to any port 8080
Stappen:
Stap 1: Het Gedeelde Netwerk aanmaken
Voer deze éénmalige commando uit op je host om het netwerk te creëren waar alle “slaap”-containers op komen te zitten.
docker network create sleepers_net
Stap 2: Sablier Configuratie (De Brug)
Maak ~/docker/sablier/docker-compose.yml. Belangrijk: Sablier zit op twee netwerken: nginx_npm_default (om NPM te zien) en sleepers_net (om de containers te besturen).
version: '3.8'
services:
sablier:
image: ghcr.io/containrrr/sablier:latest
container_name: sablier
restart: unless-stopped
environment:
- TZ=Europe/Amsterdam
- SABLIER_API_ADDR=:8080
- SABLIER_DOCKER_HOST=unix:///var/run/docker.sock
- SABLIER_IDLE_DURATION=15m
- SABLIER_GRACE_PERIOD=5m
- SABLIER_STARTUP_TIMEOUT=60s
# Beperk Sablier tot alleen containers die je expliciet toestaat (Optioneel maar veilig)
# - SABLIER_ALLOWED_CONTAINERS=booklore,nextcloud,plex,radarr,sonarr,jellyfin,immich,homeassistant,grafana,prometheus,pihole,unifi,ombi,readarr,lidarr,bazarr,tautulli,deluge,qbittorrent,transmission,sonarr
volumes:
- /var/run/docker.sock:/var/run/docker.sock
networks:
- nginx_npm_default # Voor communicatie met NPM
- sleepers_net # Voor besturing van de slaapcontainers
ports:
- "8080:8080"
networks:
nginx_npm_default:
external: true
sleepers_net:
external: true
Stap 3: Template voor je 20 Containers
Maak een mapstructuur zoals ~/docker/{appnaam}/. Hieronder staat een generiek template dat je voor elk van je 20 containers kunt kopiëren en aanpassen.
Bestand: ~/docker/{appnaam}/docker-compose.yml (Vervang {appnaam} door de daadwerkelijke naam, bijv. booklore, nextcloud, etc.)
version: '3.8'
services:
{appnaam}:
image: {image_naam}:{tag} # Bijv: ghcr.io/jc21/booklore:latest
container_name: {appnaam}
restart: "no" # Cruciaal: Laat Sablier de start/stoptaken doen
environment:
- TZ=Europe/Amsterdam
# Voeg hier je specifieke env variables toe
volumes:
- ./data:/data # Pas paden aan naar jouw structuur
networks:
- sleepers_net # Alleen dit netwerk nodig
labels:
# --- Sablier Configuratie ---
- sablier.enabled=true
- sablier.duration=15m
- sablier.on-demand=true
- sablier.container-name={appnaam}
# --- NPM Configuratie (Referentie voor handmatige setup) ---
# Deze labels helpen je om te weten wat je in NPM moet invullen
- npm.domain={subdomein}.verhaar.xyz
- npm.forward_port={interne_poort}
networks:
sleepers_net:
external: true
Voorbeeld Invulling (Voor 3 van de 20)
1. Booklore (~/docker/booklore/docker-compose.yml)
booklore:
image: ghcr.io/jc21/booklore:latest
container_name: booklore
restart: "no"
networks:
- sleepers_net
labels:
- sablier.enabled=true
- sablier.duration=15m
- sablier.on-demand=true
- sablier.container-name=booklore
- npm.domain=books.verhaar.xyz
- npm.forward_port=8080
2. Nextcloud (~/docker/nextcloud/docker-compose.yml)
nextcloud:
image: nextcloud:latest
container_name: nextcloud
restart: "no"
networks:
- sleepers_net
labels:
- sablier.enabled=true
- sablier.duration=15m
- sablier.on-demand=true
- sablier.container-name=nextcloud
- npm.domain=cloud.verhaar.xyz
- npm.forward_port=80
3. Plex (~/docker/plex/docker-compose.yml)
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
restart: "no"
networks:
- sleepers_net
labels:
- sablier.enabled=true
- sablier.duration=15m
- sablier.on-demand=true
- sablier.container-name=plex
- npm.domain=media.verhaar.xyz
- npm.forward_port=32400
Stap 4: Nginx Proxy Manager (NPM) Setup
Omdat we 20 containers hebben, is handmatig configureren in NPM tijdrovend. Maar het is de veiligste methode omdat we geen complexe labels-automatisering hoeven die soms faalt.
Voor elke container (herhaal dit 20x):
- Ga naar Proxy Hosts in NPM.
- Klik op Add Proxy Host.
- Vul in:
- Domain: books.verhaar.xyz (of cloud, media, etc.)
- Forward Type: IP Address
- Forward IP: 192.168.10.5 (Jouw host IP)
- Forward Port: 8080 (Dit is Sablier's poort, niet de app!)
- SSL: Selecteer je certificaat of laat NPM een nieuw aanvragen.
- Klik op Advanced en plak dit blok:
location / {
proxy_pass http://192.168.10.5:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# Dit vertelt Sablier welke container hij moet starten
proxy_set_header X-Sablier-Container booklore;
}
(Vervang booklore in de laatste regel door de container naam van deze specifieke proxy host).
Hoe het werkt in de praktijk
- Geen verkeer: booklore container is gestopt.
- Gebruiker bezoekt: https://books.verhaar.xyz.
- NPM: Ontvangt request, stuurt naar 192.168.10.5:8080 (Sablier) met header X-Sablier-Container: booklore.
- Sablier: Zie de header, zoekt container booklore op het sleepers_net.
- Actie: Sablier start booklore (duurt ~10-30 sec).
- Doorsturen: Sablier stuurt het oorspronkelijke request door naar de nu draaiende booklore container.
- Inactiviteit: Na 15 minuten zonder verkeer stopt Sablier de container weer.
Veiligheidscontrolelijst voor 20+ containers
- Isolatie: Alle slaapcontainers zitten op sleepers_net. Ze kunnen elkaar niet zien tenzij je ze expliciet op meerdere netwerken zet.
- Docker Socket: Alleen Sablier heeft toegang. Zorg dat Sablier zelf goed beveiligd is (bijv. firewall regels die alleen 8080 toestaan vanaf 192.168.10.0/24).
- Resource Management: 20 containers die tegelijk starten kan je CPU/RAM zwaar belasten.
- Tip: Overweeg SABLIER_CONCURRENT_LIMIT=3 in Sablier env variabelen om te voorkomen dat 20 containers tegelijk starten.
- Updates: Gebruik Watchtower of een ander tool om de images te updaten, maar zorg dat je de containers eerst stopt voordat je ze update (Sablier doet dit automatisch als ze stopten, maar bij een update moet je soms handmatig docker compose pull en up -d doen, waarna Sablier ze weer oppikt).
