marc:linux:dockerfiles:sablier
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| marc:linux:dockerfiles:sablier [2026/03/23 14:35] – created marcv | marc:linux:dockerfiles:sablier [2026/04/02 16:07] (current) – marcv | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== | + | ====== |
| - | Ik wil een voorbeeld van een docker-compose.yml bestand voor sablierapp / sablier en bijbehorend configuratiebestand (sablier.yml). | + | ===== Aanbevolen Schaalbare Oplossing |
| - | + | ||
| - | Ik gebruik Nginx NPM als reverse proxy (draaiend vanuit ~/ | + | |
| - | + | ||
| - | ====== | + | |
| - | + | ||
| - | Hier is een voorbeeld van hoe je docker-compose.yml en sablier.yml kunt opzetten voor Sablier (voorheen bekend als sablierapp), | + | |
| - | + | ||
| - | Sablier is een tool die tijdelijke containers (zoals bentopdf) automatisch start wanneer ze worden aangesproken en ze stopt na een periode van inactiviteit om bronnen te besparen. | + | |
| - | + | ||
| - | ===== 1. Directory Structuur ===== | + | |
| - | + | ||
| - | Stel eerst je mappenstructuur op zoals gevraagd: | + | |
| - | + | ||
| - | < | + | |
| - | ├── nginx/ | + | |
| - | ├── sablier/ | + | |
| - | │ | + | |
| - | │ | + | |
| - | └── bentopdf/ | + | |
| - | + | ||
| - | ===== 2. Docker Compose voor Sablier (~/ | + | |
| - | + | ||
| - | Dit bestand draait Sablier. Het heeft toegang nodig tot de Docker socket om containers te kunnen starten/ | + | |
| + | ==== 1. Netwerk Architectuur ==== | ||
| + | < | ||
| + | ┌─────────────────────────────────────────────────────────┐ | ||
| + | │ Host (192.168.10.5) | ||
| + | ├─────────────────────────────────────────────────────────┤ | ||
| + | │ ┌──────────────┐ | ||
| + | │ │ | ||
| + | │ │ | ||
| + | │ └──────────────┘ | ||
| + | │ | ||
| + | │ | ||
| + | │ books.verhaar.xyz | ||
| + | │ nextcloud.verhaar... Booklore, etc. | ||
| + | └─────────────────────────────────────────────────────────┘ | ||
| + | </ | ||
| + | ==== 2. Sablier Compose (~/ | ||
| < | < | ||
| services: | services: | ||
| sablier: | sablier: | ||
| - | image: ghcr.io/proxers/ | + | image: ghcr.io/containrrr/ |
| container_name: | container_name: | ||
| restart: unless-stopped | restart: unless-stopped | ||
| environment: | environment: | ||
| - TZ=Europe/ | - TZ=Europe/ | ||
| - | | + | |
| - | - SABLIER_AUTH_PASSWORD=JeVeiligWachtwoord123 | + | - SABLIER_DOCKER_HOST=unix:/// |
| - | | + | |
| - | | + | - SABLIER_GRACE_PERIOD=5m |
| volumes: | volumes: | ||
| - | # Configuratiebestand | ||
| - | - ./ | ||
| - | # Docker socket om containers te managen | ||
| - / | - / | ||
| - | # Optioneel: Logs opslaan | ||
| - | - ./ | ||
| networks: | networks: | ||
| - | - proxy-network | + | - public_net |
| + | | ||
| ports: | ports: | ||
| - | - " | + | - " |
| networks: | networks: | ||
| - | | + | |
| - | external: true | + | external: true # NPM netwerk |
| - | | + | shared_net: |
| + | | ||
| + | |||
| + | ==== 3. Template voor Elke Container (~/ | ||
| - | //Let op: Controleer de naam van je externe netwerk. Als je NPM hebt geïnstalleerd via een andere compose file, kan de netwerknaam anders zijn (bijv. nginx_default). Je kunt dit controleren met docker network ls.// | + | < |
| - | ===== 3. Configuratiebestand (~/ | ||
| - | |||
| - | Dit bestand definieert welke containers beheerd moeten worden. Hier configureren we Sablier om de bentopdf container te starten als er een verzoek komt naar een specifieke route. | ||
| - | |||
| - | < | ||
| - | auth: | ||
| - | enabled: true | ||
| - | password: " | ||
| - | |||
| - | # Definities van services die beheerd moeten worden | ||
| services: | services: | ||
| - | | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | # Hoe lang de container actief blijft na het laatste verzoek (in seconden) | + | |
| - | idleTimeout: 300 | + | - shared_net |
| - | + | | |
| - | # Hoe lang het mag duren om te starten (timeout) | + | - sablier.enabled=true |
| - | | + | - sablier.duration=15m |
| - | + | - sablier.on-demand=true | |
| - | | + | - sablier.container-name=appname |
| - | | + | # NPM proxy config (handmatig in NPM GUI aanmaken) |
| - | routes: | + | - nginxproxymanager.proxy_host=app.verhaar.xyz |
| - | - path: "/ | + | - nginxproxymanager.forward_host=appname |
| - | | + | |
| - | # Optioneel: headers of body validatie | + | |
| - | + | ||
| - | # Optioneel: Environment variables die aan de container | + | |
| - | # environment: | + | |
| - | # | + | |
| - | # Optioneel: Command overrides als je de container anders wilt starten | + | networks: |
| - | | + | shared_net: |
| + | | ||
| | | ||
| - | ===== 4. Configuratie | + | ==== 4. NPM Configuratie (Per Container) ==== |
| - | Omdat je NPM gebruikt als reverse | + | In NPM GUI per proxy host: |
| - | **Stappen in de NPM Dashboard:** | + | |
| + | | ||
| + | | ||
| + | | ||
| + | < | ||
| + | proxy_pass http:// | ||
| + | proxy_set_header Host $host; | ||
| + | proxy_set_header X-Real-IP $remote_addr; | ||
| + | proxy_set_header X-Sablier-Container appname; | ||
| + | }</ | ||
| - | 1. Ga naar **Hosts | + | === Alternatief: |
| + | Voor 20+ containers is Traefik vaak beter dan NPM voor Sablier-integratie: | ||
| - | 2. Klik op **Add Proxy Host**. | + | ^ 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) | | ||
| - | 3. Vul het volgende in: | + | **Traefik voorbeeld:** |
| - | * **Domain Names**: sablier.jouw-domein.nl (of een lokaal domein als je die gebruikt). | + | |
| - | * **Scheme**: http. | + | |
| - | * **Forward Hostname/ | + | |
| - | * Tip: Als beide containers in hetzelfde netwerk zitten (zie punt 5), gebruik dan de container naam: sablier. | + | |
| - | * **Forward Port**: 8080. | + | |
| - | * **SSL**: Kies een certificaat (Let's Encrypt) als je HTTPS wilt. | + | |
| - | 4. Voeg een tweede Proxy Host toe voor de PDF service: | + | < |
| - | | + | |
| - | * **Forward Hostname/ | + | |
| - | * // | + | - traefik.http.services.app.loadbalancer.server.port=8080 |
| - | * **Forward Port**: 8000 (of de poort die bentopdf gebruikt). | + | - sablier.enabled=true |
| + | - sablier.duration=15m</ | ||
| - | ==== Hoe Sablier en NPM samenwerken | + | ==== Quick Security Checklist |
| - | : Meestal configureer je Sablier zodat het luistert op een specifieke route (bijv. /start/bentopdf). Wanneer een gebruiker naar die route gaat, start Sablier de container. Zodra de container draait, moet het verzoek worden doorgestuurd naar de container zelf. | + | < |
| + | sudo chmod 660 /var/run/docker.sock | ||
| + | sudo chown root: | ||
| - | Een veelgebruikte methode is: | + | # 2. Netwerk isolatie controleren |
| - | - Gebruik Sablier als een " | + | docker network ls |
| - | - Of, gebruik Sablier' | + | docker network inspect shared_net |
| - | Als je Sablier | + | # 3. Sablier |
| + | # Voeg toe aan Sablier env: | ||
| + | # SABLIER_ALLOWED_CONTAINERS=booklore,nextcloud, | ||
| - | ==== Alternatieve | + | # 4. Firewall regels |
| + | sudo ufw deny 8080 # Alleen interne toegang | ||
| + | sudo ufw allow from 192.168.10.0/ | ||
| - | : Laat Sablier de poort van de container | + | ===== 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. | ||
| - | De meest robuuste setup voor Sablier is vaak: | + | < |
| - | * Sablier draait op poort 8080. | + | |
| - | * Je stuurt requests naar sablier.jouw-domein.nl/api/ | + | |
| - | * Sablier start de container. | + | |
| - | * Vervolgens moet de client (of een script) wachten tot de container klaar is en dan het verzoek sturen naar pdf.jouw-domein.nl (die NPM naar de nu lopende container forwardt). | + | |
| - | ===== 5. Netwerk | + | ==== Stap 2: Sablier |
| - | Zorg dat alle containers | + | Maak ~/ |
| - | Voeg dit toe aan je nginx/ | + | < |
| - | < | + | |
| - | En zorg dat in je sablier/docker-compose.yml (zoals hierboven) en je bentopdf compose file (indien apart) het volgende staat: | + | services: |
| + | | ||
| + | image: ghcr.io/containrrr/ | ||
| + | container_name: | ||
| + | restart: unless-stopped | ||
| + | environment: | ||
| + | - TZ=Europe/ | ||
| + | - SABLIER_API_ADDR=: | ||
| + | - SABLIER_DOCKER_HOST=unix:/// | ||
| + | - SABLIER_IDLE_DURATION=15m | ||
| + | - SABLIER_GRACE_PERIOD=5m | ||
| + | - SABLIER_STARTUP_TIMEOUT=60s | ||
| + | # Beperk Sablier tot alleen containers die je expliciet toestaat | ||
| + | # - SABLIER_ALLOWED_CONTAINERS=booklore, | ||
| + | volumes: | ||
| + | - / | ||
| + | networks: | ||
| + | - nginx_npm_default # Voor communicatie met NPM | ||
| + | - sleepers_net | ||
| + | ports: | ||
| + | - "8080:8080" | ||
| - | < | + | networks: |
| - | | + | |
| external: true | external: true | ||
| - | name: proxy-network</ | + | sleepers_net: |
| + | external: true</ | ||
| | | ||
| - | ===== 6. Voorbeeld bentopdf Docker Compose (Optioneel) ===== | + | ==== Stap 3: Template voor je 20 Containers |
| - | Als je bentopdf nog niet hebt draaien, hier een basis voorbeeld: | + | |
| + | Maak een mapstructuur zoals ~/ | ||
| + | |||
| + | Bestand: ~/ | ||
| + | |||
| + | < | ||
| - | < | ||
| - | version: ' | ||
| services: | services: | ||
| - | | + | |
| - | image: | + | image: |
| - | container_name: | + | container_name: |
| - | restart: " | + | restart: " |
| + | environment: | ||
| + | - TZ=Europe/ | ||
| + | # Voeg hier je specifieke env variables toe | ||
| + | volumes: | ||
| + | - ./ | ||
| networks: | networks: | ||
| - | - proxy-network | + | - sleepers_net |
| - | | + | |
| - | - " | + | |
| - | # Geen ports mapping nodig als je alleen via NPM/Sablier benadert | + | - sablier.enabled=true |
| + | - sablier.duration=15m | ||
| + | - sablier.on-demand=true | ||
| + | - sablier.container-name={appnaam} | ||
| + | |||
| + | | ||
| + | # Deze labels helpen | ||
| + | - npm.domain={subdomein}.verhaar.xyz | ||
| + | - npm.forward_port={interne_poort} | ||
| networks: | networks: | ||
| - | | + | |
| - | external: true | + | external: true</ |
| - | name: proxy-network</ | + | |
| | | ||
| - | ===== Samenvatting | + | === Voorbeeld Invulling (Voor 3 van de 20) === |
| - | - Gebruiker vraagt pdf.jouw-domein.nl. | + | |
| - | - NPM probeert bentopdf: | + | **1. Booklore (~/ |
| - | - Container is gestopt | + | |
| - | - Hier is de complexe kant: Standaard Sablier start de container | + | < |
| - | * **Oplossing A**: Gebruik Sablier als de enige entrypoint. Gebruikers gaan naar sablier.jouw-domein.nl/request, Sablier start de container, | + | image: ghcr.io/ |
| - | * **Oplossing B**: Gebruik een " | + | container_name: |
| - | * **Oplossing C (Aanbevolen voor Sablier)**: Configureer Sablier om te luisteren | + | restart: " |
| + | networks: | ||
| + | | ||
| + | labels: | ||
| + | - sablier.enabled=true | ||
| + | | ||
| + | - sablier.on-demand=true | ||
| + | - sablier.container-name=booklore | ||
| + | - npm.domain=books.verhaar.xyz | ||
| + | | ||
| + | |||
| + | **2. Nextcloud (~/ | ||
| + | |||
| + | < | ||
| + | image: nextcloud: | ||
| + | container_name: | ||
| + | restart: " | ||
| + | networks: | ||
| + | | ||
| + | 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 (~/ | ||
| + | |||
| + | < | ||
| + | image: lscr.io/ | ||
| + | container_name: | ||
| + | restart: " | ||
| + | networks: | ||
| + | - sleepers_net | ||
| + | labels: | ||
| + | - sablier.enabled=true | ||
| + | | ||
| + | - 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 | ||
| + | |||
| + | - 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 Port: 8080 (Dit is Sablier's poort, niet de app!) | ||
| + | | ||
| + | - Klik op Advanced en plak dit blok: | ||
| + | < | ||
| + | proxy_pass http:// | ||
| + | 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 === | ||
| + | | ||
| + | - Gebruiker bezoekt: https://books.verhaar.xyz. | ||
| + | - NPM: Ontvangt request, stuurt naar 192.168.10.5: | ||
| + | - Sablier: Zie de header, zoekt container | ||
| + | - Actie: Sablier start booklore | ||
| + | - Doorsturen: Sablier stuurt | ||
| + | - Inactiviteit: | ||
| - | Voor de meeste gebruikers is **Oplossing A** (Sablier als reverse proxy zelf) de makkelijkste, | + | 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/ | ||
| + | - 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). | ||
marc/linux/dockerfiles/sablier.1774272907.txt.gz · Last modified: by marcv
