┌─────────────────────────────────────────────────────────┐ │ Host (192.168.10.5) │ ├─────────────────────────────────────────────────────────┤ │ ┌──────────────┐ ┌──────────────┐ ┌────────────┐ │ │ │ Public │ │ Shared │ │ Private │ │ │ │ (NPM) │◄──►│ (Sablier) │◄──►│ (DBs) │ │ │ └──────────────┘ └──────────────┘ └────────────┘ │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ books.verhaar.xyz Sablier API PostgreSQL │ │ nextcloud.verhaar... Booklore, etc. Redis │ └─────────────────────────────────────────────────────────┘
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
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
In NPM GUI per proxy host:
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;
}
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
# 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
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
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
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
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
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):
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).
Veiligheidscontrolelijst voor 20+ containers