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.
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.
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).
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 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.
# 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).
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).
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.
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.
# 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.
# 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 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.
# 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).
# 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.
# 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
- Repositorio GitHub (documentación, ejemplos, logos): https://github.com/amslertec/containly
- Sitio web oficial y precios: https://containly.ch
- Guía de instalación: https://containly.ch/install
- Preguntas frecuentes: https://faq.containly.ch
- Ayuda y troubleshooting: https://help.containly.ch
- Foro de la comunidad: https://forum.containly.ch
- Vídeo tour 7 minutos (YouTube): https://www.youtube.com/watch?v=yinohixGwG4
- Política de seguridad y reporte de vulnerabilidades: https://github.com/amslertec/containly/blob/main/SECURITY.md
- Licencia propietaria (free 2 hosts, Pro): https://github.com/amslertec/containly/blob/main/LICENSE
- Formato de backup (.clbk): https://github.com/amslertec/containly/blob/main/docs/backup-format.md
- Docker Hub (imagen amslertec/containly): https://hub.docker.com/r/amslertec/containly
- Soporte por email: mailto:[email protected]
Apoya el canal GENBYTE
¿Te ha sido útil este contenido?
Suscríbete a YouTube
Newsletter GENBYTE
Ko-fi
Contacto: [email protected]
