====== 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).