Site Tools


marc:linux:dockerfiles:sablier

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):

  1. Ga naar Proxy Hosts in NPM.
  2. Klik op Add Proxy Host.
  3. 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.
  4. 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

  1. Geen verkeer: booklore container is gestopt.
  2. Gebruiker bezoekt: https://books.verhaar.xyz.
  3. NPM: Ontvangt request, stuurt naar 192.168.10.5:8080 (Sablier) met header X-Sablier-Container: booklore.
  4. Sablier: Zie de header, zoekt container booklore op het sleepers_net.
  5. Actie: Sablier start booklore (duurt ~10-30 sec).
  6. Doorsturen: Sablier stuurt het oorspronkelijke request door naar de nu draaiende booklore container.
  7. Inactiviteit: Na 15 minuten zonder verkeer stopt Sablier de container weer.

Veiligheidscontrolelijst voor 20+ containers

  1. Isolatie: Alle slaapcontainers zitten op sleepers_net. Ze kunnen elkaar niet zien tenzij je ze expliciet op meerdere netwerken zet.
  2. 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).
  3. 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.
  4. 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.txt · Last modified: by marcv

Donate Powered by PHP Valid HTML5 Valid CSS Driven by DokuWiki