Sablier, apagar y encender contenedores de manera automática

sablier logo
Solucionex
06
Mar 26

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

Una 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: 10s

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

sablier loading page

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

Nota: reiniciar el contenedor tras modificar el archivo docker-compose.yml

DevOps