TL;DR: Sablier apaga contenedores tras un tiempo definido, y la integración con Traefik permite autoarrancarlos al acceder a la web.
Si se tiene un servidor de pruebas, los contenedores tienden a amontonarse, y estar entrando manualmente a gestionarlos es poco eficiente. Por otro lado, puede que se tenga una web pesada que no conviene tener todo el rato encendida, e igualmente tener que arrancarla manualmente es tedioso.
Sablier monitoriza los contenedores activos y puede apagarlos tras un intervalo de tiempo definido.
Requisitos
Se presupone que ya se tiene una instalación de Traefik funcionando con docker.
Instalación de Sablier
Sablier solamente necesita un archivo de configuración y el archivo de docker compose:
# sablier.yml
provider:
name: docker
docker:
strategy: stop
server:
port: 10000
base-path: /
storage:
file:
sessions:
default-duration: 5m
expiration-interval: 20s
logging:
level: info
strategy:
dynamic:
custom-themes-path:
show-details-by-default: true
default-theme: hacker-terminal
default-refresh-frequency: 5s
blocking:
default-timeout: 1m
# docker-compose.yml
services:
sablier:
volumes:
- ./sablier.yaml:/etc/sablier/sablier.yaml
- /var/run/docker.sock:/var/run/docker.sock
image: sablierapp/sablier:1.11.1
container_name: sablier
labels:
- "traefik.enable=true"
- "traefik.http.routers.sablier.entrypoints=https"
- "traefik.http.routers.sablier.rule=Host(`sablier.solucionex.dev`)"
restart: unless-stopped
networks:
- traefik
networks:
traefik:
external: trueUna vez definidos ambos archivos, levantar el contenedor.
Integración con Traefik
Existe un plugin de integración. Para usarlo, hay que añadir lo siguiente en el archivo de configuración de Traefik:
experimental:
plugins:
sablier:
moduleName: "github.com/sablierapp/sablier-traefik-plugin"
version: "v1.1.0"Además, es necesario configurar el plugin. Esto puede hacerse de varias maneras, como por ejemplo usando etiquetas de docker. Para este post se define en el archivo de configuración dinámica de Traefik:
# dynamic_conf.yml (o el nombre que se use para el archivo de configuración dinámica de traefik)
http:
middlewares:
sablier:
plugin:
sablier:
sablierUrl: http://sablier:10000
group: pre # Nombre que se le quiera dar al grupo
sessionDuration: 1m # Duración para pruebas. Es mejor subirlo una vez esté funcionando
ignoreUserAgent: curl
dynamic:
displayName: Project
showDetails: true
theme: shuffle
refreshFrequency: 10sReiniciar contenedor de Traefik.
Configuración de los contenedores a autogestionar
Para cada contenedor que se quiera gestionado por Sablier, hay que añadir las siguientes etiquetas:
# docker-compose.yml
myservice:
...
labels:
...
# Sablier config
- "sablier.enable=true" # Permite que sablier apague / encienda este contenedor
- "sablier.group=pre" # Grupo en el que se encuentra este servicio
- "traefik.docker.allownonrunning=true" # Permite que traefik enrute el contenedor aunque esté apagado
- "traefik.http.routers.${PROJECT_NAME}.middlewares=sablier@file"
# En caso de que se usen varios middlewares, pueden ponerse separados por comas. Ej:
#- "traefik.http.routers.${PROJECT_NAME}.middlewares=authelia@docker,sablier@file"Nota: es necesario poner dichas etiquetas en todos los contenedores del archivo que se quieran poner con autoapagado.
Una vez reiniciado el contenedor, ya estará gestionado por Sablier. Una vez que pase el tiempo especificado para que se autoapague y se acceda a la web, se verá el mensaje de que se está levantando el proyecto, y después se redigirá automáticamente a la web destino:
Posibles errores
No aparece la pantalla de carga al acceder a la web
En pantalla solo aparece el mensaje "no available server". En este caso, Sablier levanta los contenedores con éxito y probablemente con una recarga manual de la página ya se muestre la web correctamente, pero no aparece la pantalla de carga. Esto parece suceder solamente con la versión más actual de Sablier, y parece ser que ocurre cuando los contenedores que se quieren autoapagar / autoencender no tienen healthcheck. Se añade al post un healthcheck de ejemplo (realmente no comprueba nada) que se puede usar para comprobar que sí funciona la pantalla de carga:
# docker-compose.yml
myservice:
...
healthcheck:
test: ["CMD", "true"]
start_period: 1s
retries: 1Nota: reiniciar el contenedor tras modificar el archivo docker-compose.yml