661 - Controlando Docker desde el móvil

661 - Controlando Docker desde el móvil

Dos servicios #docker muy meta que te permitirán controlar tus contenedores #docker en #linux además de realizar operaciones sobre otros servicios

1:25
-3:15

En estos primeros días del año, uno de los objetivos que me he planteado es ordenar el maremagnum de contenedores docker que tengo en el VPS. Probablemente, no solo será organizar los contenedores sino también los distintos VPS, por los problemas que me encontré a finales del año pasado. La cuestión, es que tengo mas de 50 servicios funcionando, incluso algunos repetidos, y realmente no los estoy utilizando todos. Sin embargo, y la gestión de los contenedores la tengo bastante organizada y se replica a lo largo de los distintos VPS tal y como te contaré a lo largo del episodio. Sin embargo, esta gestión en ocasiones me da algún que otro problema, y siempre ando buscando soluciones para revolver estos problemas. Así, en este episodio te quiero hablar de otra opción que tienes para controlar Docker desde el móvil, o desde cualquier navegador y otras cuestiones.

661 – Controlando Docker desde el móvil

Sobre la gestión de los contenedores

Actualmente dentro del stack tecnológico que monto para los distintos sitios web que administro se encuentran las siguientes piezas.

  • Traefik
  • Crowdsec
  • Den
  • Watchtower
  • WordPress
    • fpm-alpine
    • nginx
    • mariadb
    • redis
    • wpcli
    • atbackup
  • Umami
  • GotoSocial

El problema que tengo actualmente, es que cuando se realiza la actualización de los imágenes de WordPress en ocasiones no arranca correctamente y me toca reiniciarlo.

Para resolver este problema utilizo semaphore que no es ni mas ni menos que una interfaz gráfica de Ansible. Realmente es mucho mas potente que eso, porque me permite realizar operaciones programadas y mucho mas.

Sin embargo, esto es una forma de resolver el problema, pero desde luego, no es la solución que mas me gusta.

El proyecto del bot de Telegram para Docker

Uno de los objetivos planteados para este año era continuar con el proyecto del bot de Telegram para gestionar tus contenedores Docker. Como bien sabes, el objetivo final de este proyecto, no es tanto el bot sino aprender Python. Es decir, el objetivo de este proyecto es el camino. Esto no quita que finalmente tengamos nuestro propio bot para controlar nuestros contenedores Docker y podamos personalizarlo a nuestro antojo.

La cuestión, es que, si bien, el proyecto del bot de Telegram para Docker es interesante, no creo que sea la mejor opción. Para mi, sin lugar a dudas, la mejor opción es una web desde la que poder, de un solo vistazo ver todos tus contenedores y además poder gestionarlo. Pero todo se andará.

AnyAppStart

AnyAppStart es un servicio web autoalojado que te permite realizar operaciones sobre Docker, servicios de Systemd, VMs y casi cualquier otra cosa que quieras utilizando scripts. Se trata de un servicio cuyo backend está implementado en Go, mientras que el frontend utiliza React, TypeScript y MobX.

Se trata de un servicio realmente muy ligero, fácil de configurar, y que los desarrolladores recomiendan que instales directamente en el servidor. A pesar de ello, y dado que yo lo quiero utilizar única y exclusivamente para gestionar Docker, lo que hice es instalarlo con Docker.

Mi docker-compose.yml tiene el siguiente aspecto,

services:
  anyappstart:
    image: aceberg/anyappstart
    container_name: anyappstart
    restart: unless-stopped
    init: true
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - data:/data/AnyAppStart
    networks:
      - proxy
    environment:
      TZ: Europe/Madrid
    labels:
      - traefik.enable=true
      - traefik.http.services.anyappstart.loadbalancer.server.port=8855
      - traefik.http.routers.anyappstart.entrypoints=https
      - traefik.http.routers.anyappstart.middlewares=myauth@file
      - traefik.http.routers.anyappstart.rule=Host(`any.tuservidor.es`)

volumes:
  data: {}

networks:
  proxy:
    external: true

Si te fijas, en los middleware de Traefik he añadido myauth@file. Esto es así, porque este servicio no tiene autenticación, y sin ello, exponerlo directamente a internet es muy loco.

Una vez hecho esto, necesitas crear los tipos que tienes que utilizar para las distintas operaciones. Esto, lo puedes hacer directamente desde la web o desde el archivo /data/AnyAppStart/types.yaml. Fíjate que le di persistencia a /data/AnyAppStart, porque de otra forma perdería esta información cada vez que reiniciara el servicio.

Por ejemplo, en el caso de Docker, es como te muestro a continuación,

Docker:
    Logs: docker logs $ITEMNAME
    Restart: docker start $ITEMNAME
    Start: docker start $ITEMNAME
    State: docker ps --filter status=running | grep $ITEMNAME
    Stop: docker stop $ITEMNAME

De la misma manera, dentro del archivo /data/AnyAppStart/items.yaml puedes configurar los distintos servicios. Por ejemplo,

- group: Docker
  name: den
  type: Docker
  link: https://den.tuservidor.es

Aquí lo importante es el name que es el que se utiliza en $ITEMNAME para poder realizar las operaciones.

Con este par de archivos lo tienes todo perfectamente configurado y no necesitas prácticamente ni entrar al sitio web para prepararlo. Una vez todo configurado, esto tiene un aspecto como el que te muestro a continuación,

Como ves, realmente sencillo y práctico. Sin complicaciones y directo al grano. El problema es que no puedes reiniciar el stack. Probablemente para esto necesitaría soluciones del tipo Portainer o Yacht.

Dagu

Otra alternativa, en este caso a Semaphore, mas o menos, sería Dagu. Dagu es una herramienta que te permite planificar distintas operaciones programadas. Se trata de una solución que está a caballo entre cron y soluciones mas complejas como Airflow.

En este caso, este servicio, también es recomendable instalarlo directamente sobre la máquina. Sin embargo, no es problemático hacerlo, porque es un único binario. Tiene una interfaz web sencilla, donde puedes visualizar, monitorizar y controlar los distintos flujos. Cada uno de los flujos es un sencillo archivo YAML y no necesitas ninguna configuración para poder a crear tus flujos.

Esta herramienta es realmente interesante y sencilla, y se basa en dos conceptos, los DAGs y los Executors. Un DAG no es ni mas ni menos que un archivo YAML, con una programación si quieres y una serie de pasos, donde cada paso lo realiza un ejecutor. Cada uno de los DAG te permite definir el código necesario, los parámetros y las variables de entorno. Puedes redirigir tanto la salida estándar como stderr. Tienes un control total de cada uno de los pasos on failure, on exit. Puedes repetir tareas y ejecutar flujos dependientes.

Respecto a que es lo que puedes hacer con Dagu, indicarte que tienes distintos tipos de ejecutores,

  • Docker
  • HTTP
  • Mail
  • SSH
  • JSON

Para que te hagas una idea esto podría ser un DAG,

schedule: "* * * * *" # Run the DAG every minute
params:
  - NAME: "Dagu"
steps:
  - name: Hello world
    command: echo Hello $NAME
  - name: Done
    command: echo Done!
    depends: Hello world

Una característica interesante es que te permite condicionar los pasos. De forma que puedes hacer que un paso no se ejecute si el anterior ha dado un resultado concreto.

Si conoces Ansible, te recordará mucho a los playbook pero mucho mas limitados y por tanto mas sencillo.

De nuevo, al igual que en el caso anterior, yo lo he levantado con Docker, de la siguiente forma,

services:
  dagu:
    image: ghcr.io/dagu-org/dagu:latest
    container_name: dagu
    restart: unless-stopped
    init: true
    command: dagu start-all
    environment:
      DAGU_TZ: Europe/Madrid
      DAGU_BASE_PATH: /dagu
      DAGU_IS_BASICAUTH: 1
      DAGU_BASICAUTH_USERNAME: usuario
      DAGU_BASICAUTH_PASSWORD: contraseña
    networks:
      - proxy
    labels:
      - traefik.enable=true
      - traefik.http.services.dagu.loadbalancer.server.port=8080
      - traefik.http.routers.dagu.entrypoints=https
      - traefik.http.routers.dagu.rule=Host(`dagu.tuservidor.es`)

networks:
  proxy:
    external: true

Más información,

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *