Containly: Interfaz web autohospedada para gestión multi-host de Docker

Publicado por


Gestión de contenedores

Containly: Interfaz web autohospedada para gestión multi-host de Docker

Panel único para contenedores, stacks Compose, escaneos Trivy, actualizaciones y migración en vivo. Gratis hasta 2 hosts.

Vídeo tutorial en YouTube

Mira el vídeo completo sobre cómo instalar y usar Containly: Interfaz web autohospedada para gestión multi-host de Docker en el canal GENBYTE:

¿Qué es Containly: Interfaz web autohospedada para gestión multi-host de Docker?

Containly es una interfaz web autohospedada diseñada para gestionar múltiples hosts Docker desde un solo lugar. Mantiene los stacks de Docker Compose como archivos planos en disco, sin bloqueo de base de datos, y ofrece visibilidad centralizada de contenedores, imágenes, volúmenes, redes, actualizaciones y vulnerabilidades. Está pensado para homelabs y flotas pequeñas: unos pocos hosts en casa, un NAS, un VPS o combinaciones detrás de un proxy inverso. La arquitectura separa el backend Fastify (Node 22) que habla con los sockets Docker, y el frontend React 19 servido por el mismo proceso. La persistencia usa SQLite para usuarios, sesiones, configuración de endpoints y auditoría, mientras que los stacks viven como archivos en el sistema de archivos del host.

Gestión multi-host con stacks como archivos, escaneo CVE integrado con Trivy, backups cifrados y migración en vivo entre hosts, todo desde una UI única con modo oscuro, PWA y atajos de teclado.

Características principales

Panel de control unificado

Línea de estado global, métricas clave, línea de tiempo 24 h por host y stack, cola de atención (hosts offline, contenedores unhealthy, actualizaciones pendientes, CVEs críticos) con acciones directas, matriz de hosts con calor de CPU/RAM/disco y feed de eventos en vivo con autoría de usuario.

Gestión de contenedores

Vista workbench con lista a la izquierda e inspector a la derecha. Pestañas: Overview (tendencias CPU/RAM, healthcheck, puertos, redes, montajes), Logs (stream en vivo, búsqueda, descarga), Stats (histórico 1 h–7 días), Consola (bash/ash/sh), Entorno (variables con secretos enmascarados), Archivos (navegar, subir, bajar, borrar) e Inspect crudo. Acciones masivas, puertos clicables, pausa, kill y migración.

Stacks como archivos (Docker Compose)

Los stacks residen en carpetas del host (versionables, sin lock-in). Editor con numeración de líneas, árbol de archivos (.env y extras), diff antes de desplegar, salida en vivo de deploy/start/stop/restart/down. Stacks Git: clonar repo público/privado con token, auto-sync programado, estado de sync. Conversor docker run → compose.yml, archivar/restaurar, acciones a nivel de stack.

Backups cifrados y restaurables

Backup de stacks, contenedores y volúmenes (incluye volúmenes anónimos por defecto). Cifrado AES-256-GCM streaming con tar+zstd, clave derivada de passphrase (nunca almacenada). Consistencia: en vivo, parar contenedores, hooks pre/post, dump de BD (PostgreSQL, MariaDB/MySQL, MongoDB, Redis). Destinos: carpeta en host o contenedor, y (Pro) S3-compatible, SFTP, SMB3 (requiere Linux 6.7+ y Landlock), NFSv4. Test de conexión sin guardar. Planes con retención, verificación programada (Pro) y aviso de backups obsoletos. Descarga/importación .clbk portables. Restaurar en otro host (Pro) con comprobaciones de rutas y privilegios.

Imágenes, volúmenes, redes y CVE

Imágenes: pull con buscador Docker Hub y selector de tags, tag, remove, prune, vista de capas, badges de actualización. Agrupación plana, por repositorio o por stack que las usa. Volúmenes: crear, borrar, prune, huérfanos, explorar archivos con subida/bajada. Redes: bridge, macvlan, ipvlan, overlay (opcional internal), prune, huérfanos, protección de redes del sistema. Escaneo Trivy a demanda o programado: conteos de severidad en lista, detalle por imagen con paquete, versión instalada y fija. Desactivable desde ajustes.

Catálogo de apps y actualizaciones

Catálogo con plantillas propias y fuentes externas, deploy como stack con variables rellenas. Comprobación de actualizaciones por digest de registro sin pull, detección semver en tags fijos, job masivo server-side con progreso persistente. Auto-actualización de Containly en un clic con rollback si falla healthcheck. Logins de registro múltiples (Docker Hub y privados) cifrados, selección automática por namespace.

Endpoints y migración en vivo

Cuatro formas de conectar hosts: socket local, TCP con TLS (certificados cliente), SSH, o agente (contenedor containly-agent que sale por WSS, sin puertos abiertos ni SSH en el host). Enrolamiento con token único y snippet docker run/compose. Páginas por host: estado, recursos 24 h, atención, detalles de sistema, contenedores y rutas de stacks. Stacks remotos sin agente vía helper container. Migración en vivo de contenedor o stack completo (imagen, volúmenes, redes) con pre-flight, log en vivo y rollback automático.

Administración y seguridad

Usuarios y roles (admin/viewer), invitaciones por email, reset de contraseña por admin, sesiones activas revocables. SSO Microsoft Entra ID (Pro): login con cuentas Microsoft, mapeo de grupos Entra a roles, device-code (funciona en HTTP sin dominio) o redirect, sync programado. 2FA TOTP con códigos de recuperación. Log de auditoría con usuario, objetivo, resultado e IP. Backup de configuración cifrado con passphrase, también programado. Notificaciones in-app y email (SMTP) por eventos: hosts offline, contenedores crashed/unhealthy/OOM/restart-loop, umbrales CPU/RAM/disco, actualizaciones de imagen/Containly, CVEs críticos, fallos/backups obsoletos. Destinatarios por tipo de evento; emails en idioma del usuario. Programaciones: comprobación de updates, escaneos, backups, prune, auto-updates, sync SSO (horario, días de semana, mensual). Cada ejecución en auditoría.

Apariencia, teclado, móvil e idiomas

Claro/oscuro (seguir sistema o forzar). Ocho temas (Pro) optimizados para ambos modos, temas custom desde color acento. Override por usuario (Pro): admin fija default, usuario elige tema, fuente y densidad si admin lo permite. Densidad y fuentes (Pro): filas cómodas/compactas, estilo de esquinas, cuatro parejas tipográficas autohospedadas. Atajos: Ctrl/Cmd+K paleta de comandos (páginas, hosts, contenedores, imágenes, acciones), j/k navegar, Enter abrir inspector, Esc cerrar, / buscar, g+letra saltar (d dashboard, c contenedores, s stacks), ? lista atajos. Móvil y PWA: layout teléfono con navegación inferior, pull-to-refresh, instalable, pantalla de error clara si servidor inalcanzable con reintento automático. Idiomas: inglés, alemán, español; menú con banderas en header, login y perfil; cambio instantáneo y persistente por usuario; emails en idioma del usuario.

Requisitos del sistema

  • Docker Engine y Docker Compose (v2) en el host donde se ejecuta Containly
  • Acceso al socket Docker local (/var/run/docker.sock) o conectividad a hosts remotos vía TCP/TLS, SSH o agente
  • Puerto 8420 TCP libre en el host (configurable vía variable PORT)
  • Para SMB3: kernel Linux 6.7+ y perfil seccomp por defecto de Docker (Landlock)
  • Reverse proxy con TLS para producción (Traefik, Caddy, nginx) y CONTAINLY_SECURE_COOKIES=true

Instalación con Docker Compose

Descargar archivos de ejemplo

Crear directorio y bajar docker-compose.example.yml y .env.example directamente a sus nombres finales.

mkdir containly && cd containly
curl -fsSL https://raw.githubusercontent.com/amslertec/containly/main/docker-compose.example.yml -o docker-compose.yml
curl -fsSL https://raw.githubusercontent.com/amslertec/containly/main/.env.example -o .env

Editar configuración (.env)

Ajustar .env: mantener CONTAINLY_SECURE_COOKIES=false para HTTP plano (true solo detrás de HTTPS). En docker-compose.yml, adaptar el montaje del volumen compose-projects (ruta host = ruta contenedor).

# Editar .env con tu editor
nano .env

Levantar la pila

Descargar imágenes y arrancar en segundo plano. Ver logs para obtener el token de configuración inicial.

docker compose pull
docker compose up -d
docker compose logs -f containly

Primer arranque: crear administrador

Al no existir admin, Containly entra en modo setup e imprime un token de un solo uso en los logs (también en /data/setup.token dentro del volumen containly-data). Abrir http://<ip-servidor>:8420, rellenar usuario, contraseña (confirmar) y pegar el token. Al enviar, se crea el admin, se cierra el modo setup y se borra el token.

# Token visible en los logs anteriores
# Abrir navegador en http://<ip-servidor>:8420

Endurecimiento opcional: proxy de socket filtrado

En lugar de montar el socket directamente, usar el perfil 'hardened' que levanta un socket-proxy con mínimos privilegios. Añadir luego endpoint TCP en socket-proxy:2375 (solo red interna Compose, nunca exponer 2375).

docker compose –profile hardened up -d

Acceder al proyecto

Interfaz web

http://<ip-servidor>:8420 (o https://dominio si hay reverse proxy con TLS). En HTTP plano requiere CONTAINLY_SECURE_COOKIES=false; si está a true la página queda en blanco/negro.

Token de setup inicial

Obtenido de 'docker compose logs containly' o del archivo /data/setup.token en el volumen containly-data. Válido una sola vez hasta crear el primer administrador.

Casos de uso

  • Gestión centralizada de varios hosts Docker (casa, NAS, VPS) desde un único panel
  • Despliegue y mantenimiento de stacks Docker Compose como archivos versionables en Git
  • Monitoreo de salud, recursos y eventos en vivo con línea de tiempo histórica
  • Escaneo de vulnerabilidades (CVE) en imágenes con Trivy integrado y programable
  • Backups cifrados de contenedores, volúmenes (incluyendo anónimos) y stacks con múltiples destinos (local, S3, SFTP, SMB, NFS)
  • Migración en vivo de contenedores o stacks completos entre hosts con rollback automático
  • Catálogo de aplicaciones para deploy rápido con variables de entorno predefinidas
  • Actualizaciones masivas de imágenes por digest sin pull previo, con job server-side persistente
  • Administración multi-usuario con roles, 2FA, SSO Entra ID (Pro), auditoría y notificaciones multi-canal

Configuración avanzada

Configuración de proxy inverso (producción)

Poner Traefik, Caddy o nginx delante con TLS, bind del puerto a 127.0.0.1:8420 y CONTAINLY_SECURE_COOKIES=true. Ejemplo genérico: el proxy termina TLS y reenvía a containly:8420 con cabeceras X-Forwarded-* (CONTAINLY_TRUST_PROXY=true).

# Ejemplo conceptual para Caddy
containly.tudominio.com {
reverse_proxy containly:8420
}

Añadir host remoto vía agente (sin puertos abiertos)

En Containly: Endpoints → Add endpoint → Agent. Copiar el snippet docker run o compose que incluye token de enrolamiento único. Ejecutar en el host remoto. El agente conecta por WSS a Containly; el host no necesita puerto Docker ni SSH expuestos.

# Snippet generado por Containly (ejemplo)
docker run -d –name containly-agent \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
amslertec/containly-agent \
–server wss://containly.tudominio.com \
–token <token-unico>

Backup programado a S3 (Pro)

Crear plan de backup (Settings → Backups → Plans), elegir contenidos, destino S3-compatible (AWS, Hetzner, Backblaze B2, MinIO, Cloudflare R2, Wasabi), passphrase (generador integrado), retención y schedule (horario, días de semana, mensual). Test de conexión valida credenciales sin guardar nada. Verificación programada opcional.

# Configuración vía UI: Settings → Backups → Plans → New plan
# Destino: S3-compatible → endpoint, bucket, region, access key, secret key
# Schedule: p.ej. '0 2 * * 0' (domingos 02:00)

Migración en vivo de stack a otro host

En vista Stacks → menú del stack → Migrate. Seleccionar host destino, carpeta de stack destino. Pre-flight comprueba rutas, privilegios, imagen disponible. Progreso en vivo; si falla, rollback automático. Requiere que ambos hosts estén conectados como endpoints en Containly.

# Acción vía UI: Stacks → ⋮ menú → Migrate
# No hay CLI expuesto; operación guiada en la interfaz

Gestión y mantenimiento

Actualizar Containly

Pull de nueva imagen y recreate. O usar auto-actualización en un clic desde la UI (Settings → Version and licence → Check for updates → Update). Hacer backup del volumen containly-data o backup de configuración antes si se desea fallback.

docker compose pull
docker compose up -d

Backup de configuración de Containly

Settings → Configuration backup → Create backup. Cifrado con passphrase. También programable (Settings → Schedules → Configuration backup). Restaurar desde archivo .clcfg.

# Vía UI: Settings → Configuration backup → Create backup
# Programación: Settings → Schedules → Add → Configuration backup

Rotación de logs y limpieza de recursos

Prune de imágenes, volúmenes y redes no usados en todos los hosts a la vez (UI: Images/Volumes/Networks → Prune). Previsualización antes de borrar. Programable vía Schedules (Prune images/volumes/networks).

# Vía UI: Images → Prune / Volumes → Prune / Networks → Prune
# Programación: Settings → Schedules → Add → Prune images (etc.)

Gestión de licencias Pro

Compra y activación en Settings → Version and licence. Licencia mensual, anual o lifetime. Desbloquea hosts ilimitados, SSO Entra ID, temas/appearance, backups Pro (schedules, S3/SFTP/SMB/NFS, restore to another host, verificación programada). Funciona offline. Si expira, features Pro se pausan; datos en destinos Pro siguen listables, verificables, descargables y restaurables en mismo host.

# Vía UI: Settings → Version and licence → Activate license key
# Gestión de cuenta y facturas: https://containly.ch/account

Stack técnico

  • Backend: Node 22, Fastify 5, dockerode, better-sqlite3, argon2, Zod
  • Frontend: React 19, TypeScript strict, Vite, TanStack Query + Router, Tailwind CSS 4, Radix UI, Phosphor Icons, i18next, xterm.js
  • Persistencia: SQLite (usuarios, sesiones, endpoints, registros, auditoría) + stacks Compose como archivos en disco
  • Agente remoto: containly-agent (contenedor endurecido, dial-out WSS)
  • Escaneo CVE: Trivy integrado
  • Cifrado: AES-256-GCM (credenciales, backups, config backup), Argon2id (passwords), zstd (compresión backups)

Referencias oficiales

Apoya el canal GENBYTE

Sígueme en mis redes sociales

Dejar un comentario

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