Site Tools


marc:linux:dockerfiles:sablier

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
marc:linux:dockerfiles:sablier [2026/03/23 14:35] – created marcvmarc:linux:dockerfiles:sablier [2026/04/02 16:07] (current) marcv
Line 1: Line 1:
-====== Vraag aan Lumo: ======+====== Sablier configuratie: ======
  
  
-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 ~/docker/nginx als docker container) en een docker container bentopdf vanuit ~/docker/bentopdf. +
- +
-====== Antwoord: ====== +
- +
-Hier is een voorbeeld van hoe je docker-compose.yml en sablier.yml kunt opzetten voor Sablier (voorheen bekend als sablierapp), geïntegreerd met Nginx Proxy Manager (NPM) en de bentopdf container. +
- +
-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: +
- +
-<code>~/docker/ +
-├── nginx/          # Voor Nginx Proxy Manager +
-├── sablier/        # Voor Sablier zelf +
-│   ├── docker-compose.yml +
-│   └── sablier.yml +
-└── bentopdf/       # Voor de target container (optioneel, als je deze apart wilt beheren)</code> +
- +
-===== 2. Docker Compose voor Sablier (~/docker/sablier/docker-compose.yml) ===== +
- +
-Dit bestand draait Sablier. Het heeft toegang nodig tot de Docker socket om containers te kunnen starten/stoppen en moet verbinding kunnen maken met Nginx Proxy Manager.+
  
 +==== 1. Netwerk Architectuur ====
 +<code>
 +┌─────────────────────────────────────────────────────────┐
 +│                    Host (192.168.10.5)                  │
 +├─────────────────────────────────────────────────────────┤
 +│  ┌──────────────┐    ┌──────────────┐    ┌────────────┐ │
 +│  │   Public     │    │   Shared     │    │  Private   │ │
 +│  │   (NPM)      │◄──►│   (Sablier)  │◄──►│  (DBs)     │ │
 +│  └──────────────┘    └──────────────┘    └────────────┘ │
 +│         │                   │                    │      │
 +│         ▼                   ▼                    ▼      │
 +│  books.verhaar.xyz    Sablier API          PostgreSQL   │
 +│  nextcloud.verhaar... Booklore, etc.       Redis        │
 +└─────────────────────────────────────────────────────────┘
 +</code>
 +==== 2. Sablier Compose (~/docker/sablier/docker-compose.yml) ====
 <code>version: '3.8' <code>version: '3.8'
  
 services: services:
   sablier:   sablier:
-    image: ghcr.io/proxers/sablier:latest+    image: ghcr.io/containrrr/sablier:latest
     container_name: sablier     container_name: sablier
     restart: unless-stopped     restart: unless-stopped
     environment:     environment:
       - TZ=Europe/Amsterdam       - TZ=Europe/Amsterdam
-      # Pas dit aan naar het wachtwoord dat je in sablier.yml gebruikt +      - SABLIER_API_ADDR=:8080 
-      - SABLIER_AUTH_PASSWORD=JeVeiligWachtwoord123  +      - SABLIER_DOCKER_HOST=unix:///var/run/docker.sock 
-      # Optioneel: Schakel auth uit voor lokaal gebruik (niet aanbevolen voor productie) +      - SABLIER_IDLE_DURATION=15m 
-      SABLIER_AUTH_ENABLED=false+      - SABLIER_GRACE_PERIOD=5m
     volumes:     volumes:
-      # Configuratiebestand 
-      - ./sablier.yml:/config/sablier.yml:ro 
-      # Docker socket om containers te managen 
       - /var/run/docker.sock:/var/run/docker.sock       - /var/run/docker.sock:/var/run/docker.sock
-      # Optioneel: Logs opslaan 
-      - ./logs:/logs 
     networks:     networks:
-      - proxy-network+      - public_net      # Voor NPM communicatie 
 +      shared_net      # Voor container besturing
     ports:     ports:
-      - "8080:8080" # Sablier dashboard poort (optioneel, afhankelijk van je setup)+      - "8080:8080"
  
 networks: networks:
-  proxy-network+  public_net
-    external: true +    external: true      # NPM netwerk 
-    namenginx-proxy-manager_default Meestal heet dit zo als je NPM standaard installeert</code>+  shared_net: 
 +    externaltrue      Gedeeld netwerk voor sleepers</code> 
 +     
 +==== 3. Template voor Elke Container (~/docker/{app}/docker-compose.yml) ====
  
-//Let opControleer de naam van je externe netwerkAls 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.//+<code>version'3.8'
  
-===== 3. Configuratiebestand (~/docker/sablier/sablier.yml) ===== 
- 
-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. 
- 
-<code># Algemene instellingen 
-auth: 
-  enabled: true 
-  password: "JeVeiligWachtwoord123" # Moet overeenkomen met de env var in docker-compose 
- 
-# Definities van services die beheerd moeten worden 
 services: services:
-  bentopdf+  appname
-    # De naam van de container zoals die in Docker staat (of de service naam in de compose file van bentopdf) +    image: your-image:latest 
-    containerNamebentopdf +    container_nameappname 
-     +    restart"no" 
-    # Hoe lang de container actief blijft na het laatste verzoek (in seconden) +    networks
-    idleTimeout300  +      - shared_net      Alleen Sablier ziet deze container 
-     +    labels
-    # Hoe lang het mag duren om te starten (timeout) +      - sablier.enabled=true 
-    startupTimeout60 +      - sablier.duration=15m 
-     +      - sablier.on-demand=true 
-    Labels die Sablier zoekt of expliciete triggers +      - sablier.container-name=appname 
-    # We gebruiken hier een route trigger +      NPM proxy config (handmatig in NPM GUI aanmaken) 
-    routes+      - nginxproxymanager.proxy_host=app.verhaar.xyz 
-      - path: "/pdf/generate" +      - nginxproxymanager.forward_host=appname 
-        method: "POST" +      nginxproxymanager.forward_port=8080
-        # Optioneel: headers of body validatie +
-         +
-    # Optioneel: Environment variables die aan de container worden doorgegeven bij start +
-    environment: +
-    #   SOME_VAR=value+
  
-    # OptioneelCommand overrides als je de container anders wilt starten +networks: 
-    # command["--custom-flag"]</code>+  shared_net
 +    externaltrue</code>
          
-===== 4. Configuratie voor Nginx Proxy Manager (NPM=====+==== 4. NPM Configuratie (Per Container) ====
  
-Omdat je NPM gebruikt als reverse proxy, hoef je geen aparte Nginx config bestanden te schrijven. Je doet dit via de NPM GUI.+In NPM GUI per proxy host:
  
-**Stappen in de NPM Dashboard:**+  Domain: app.verhaar.xyz 
 +  Forward IP192.168.10.5 
 +  Forward Port: 8080 (Sablier) 
 +  Advanced: 
 +<code>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; 
 +}</code>
  
-1. Ga naar **Hosts -> Proxy Hosts**.+=== Alternatief: Traefik + Sablier === 
 +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/IP**: host.docker.internal (als je NPM en Sablier op dezelfde host draaien maar in verschillende netwerken) OF het IP-adres van de Sablier container. +
-     * 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+<code>labels
-     **Domain Names**: pdf.jouw-domein.nl. +  - traefik.enable=true 
-    * **Forward Hostname/IP**: host.docker.internal (of sablier als je de Sablier API gebruikt om de container te triggeren, maar meestal wil je direct naar de container als hij draait)+  traefik.http.routers.app.rule=Host(`app.verhaar.xyz`) 
-    * //Belangrijk//: Sablier werkt vaak door een request naar een specifieke endpoint te sturen die de container startAls bentopdf een eigen poort heeft (bijv8000), moet NPM dit forwarden+  - traefik.http.services.app.loadbalancer.server.port=8080 
-    * **Forward Port**: 8000 (of de poort die bentopdf gebruikt).+  - sablier.enabled=true 
 +  - sablier.duration=15m</code>
  
-==== 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.+<code># 1Docker Socket beveiligen (optioneel maar aanbevolen) 
 +sudo chmod 660 /var/run/docker.sock 
 +sudo chown root:sablier /var/run/docker.sock
  
-Een veelgebruikte methode is: +# 2Netwerk isolatie controleren 
-  - Gebruik Sablier als een "trigger" service+docker network ls 
-  - Of, gebruik Sablier's ingebouwde proxy functionaliteit (afhankelijk van de versie) om het verzoek direct door te sturen zodra de container start.+docker network inspect shared_net
  
-Als je Sablier gebruikt om de container te starten en NPM om het verkeer te forwardenmoet je in NPM de "Forward Hostname" instellen op de Docker container naam (bentopdf). NPM zal dan proberen de container te bereiken. Als de container stoptfaalt de verbindingSablier moet dan ingrijpen.+# 3. Sablier beperken tot specifieke containers 
 +# Voeg toe aan Sablier env: 
 +# SABLIER_ALLOWED_CONTAINERS=booklore,nextcloud,plex,...
  
-==== Alternatieve (en vaak betereconfiguratie voor Sablier + NPM ====+# 4. Firewall regels (optioneel) 
 +sudo ufw deny 8080  # Alleen interne toegang 
 +sudo ufw allow from 192.168.10.0/24 to any port 8080</code>
  
-Laat Sablier de poort van de container "lezenen zorg dat NPM altijd naar die poort verwijst. Maar omdat de container stopt, is dit lastig zonder een "wake-on-request" mechanisme in NPM zelf.+===== 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: +<code>docker network create sleepers_net</code>
-  * Sablier draait op poort 8080. +
-  * Je stuurt requests naar sablier.jouw-domein.nl/api/start/bentopdf. +
-  * 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 Configuratie (Cruciaal=====+==== Stap 2: Sablier Configuratie (De Brug) ====
  
-Zorg dat alle containers in hetzelfde Docker netwerk zitten zodat ze elkaars namen kunnen oplossen.+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).
  
-Voeg dit toe aan je nginx/docker-compose.yml (als je die hebt) of maak een extern netwerk aan: +<code>version: '3.8'
-<code>docker network create proxy-network</code>+
  
-En zorg dat in je sablier/docker-compose.yml (zoals hierboven) en je bentopdf compose file (indien aparthet volgende staat:+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"
  
-<code>networks: +networks: 
-  default:+  nginx_npm_default:
     external: true     external: true
-    nameproxy-network</code>+  sleepers_net: 
 +    external: true</code>
          
-===== 6. Voorbeeld bentopdf Docker Compose (Optioneel) ===== +==== Stap 3: Template voor je 20 Containers ==== 
-Als je bentopdf nog niet hebt draaienhier een basis voorbeeld:+ 
 +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 naambijv. booklore, nextcloud, etc.) 
 + 
 +<code>version'3.8'
  
-<code># ~/docker/bentopdf/docker-compose.yml 
-version: '3.8' 
 services: services:
-  bentopdf+  {appnaam}
-    image: your-bentopdf-image:latest Vervang met de juiste image +    image: {image_naam}:{tag}  Bijv: ghcr.io/jc21/booklore:latest 
-    container_name: bentopdf +    container_name: {appnaam} 
-    restart: "no"Belangrijk: Laat Sablier de restart policy beheren+    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:     networks:
-      - proxy-network +      - sleepers_net           # Alleen dit netwerk nodig 
-    expose+    labels
-      - "8000" Interne poort +      --- Sablier Configuratie --- 
-    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} 
 +       
 +      --- 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: networks:
-  proxy-network+  sleepers_net
-    external: true +    external: true</code>
-    name: proxy-network</code>+
          
-===== Samenvatting van de werking ===== +=== Voorbeeld Invulling (Voor 3 van de 20) === 
-  - Gebruiker vraagt pdf.jouw-domein.nl+ 
-  NPM probeert bentopdf:8000 te bereiken+**1. Booklore (~/docker/booklore/docker-compose.yml)** 
-  Container is gestopt -> Verbinding geweigerd+ 
-  - Hier is de complexe kantStandaard Sablier start de container niet automatisch op een mislukte NPM connectie+<code>  booklore: 
-     **Oplossing A**: Gebruik Sablier als de enige entrypointGebruikers gaan naar sablier.jouw-domein.nl/requestSablier start de container, wacht tot hij klaar isen proxyt het verzoek door+    image: ghcr.io/jc21/booklore:latest 
-    * **Oplossing B**Gebruik een "Healthcheck" of "Watchdog" script in NPM (moeilijk). +    container_name: booklore 
-    * **Oplossing C (Aanbevolen voor Sablier)**Configureer Sablier om te luisteren op de specifieke route die de PDF generatie moet starten. De gebruiker doet een POST naar sablier.jouw-domein.nl/start/pdf. Sablier start de container en geeft een "200 OK" terug zodra hij klaar isDaarna kan de gebruiker (of een script) het daadwerkelijke PDF verzoek doen naar de container.+    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</code> 
 + 
 +**2Nextcloud (~/docker/nextcloud/docker-compose.yml)** 
 + 
 +<code>  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</code> 
 + 
 +**3. Plex (~/docker/plex/docker-compose.yml)** 
 + 
 +<code>  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</code> 
 + 
 +==== Stap 4: Nginx Proxy Manager (NPM) Setup ==== 
 + 
 +Omdat we 20 containers hebbenis 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 cloudmediaetc.) 
 +    * Forward Type: IP Address 
 +    Forward IP192.168.10.5 (Jouw host IP
 +    * Forward Port: 8080 (Dit is Sablier's poort, niet de app!) 
 +    SSLSelecteer je certificaat of laat NPM een nieuw aanvragen. 
 +  -  Klik op Advanced en plak dit blok: 
 +     <code>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;  
 +}</code> 
 +(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.
  
-Voor de meeste gebruikers is **Oplossing A** (Sablier als reverse proxy zelf) de makkelijkste, maar als je NPM al hebt staan, kun je Sablier ook gebruiken om de container te "wakker te maken" via een webhook of een speciaal endpoint, waarna NPM het verkeer oppikt.+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).
  
marc/linux/dockerfiles/sablier.1774272907.txt.gz · Last modified: by marcv

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki