Por qué un panel de control self-hosted en tu VPS
Un VPS multi-aplicaciones sin página central es una infraestructura gestionada a ciegas. Memorizas cada puerto (http://your-domain.com:3001, :8080, :9000…), pierdes tiempo encontrando la interfaz de un servicio parado hace tres semanas, y no tienes ninguna vista consolidada del estado de tus contenedores.
Un panel de control self-hosted resuelve esto sin sobrecargar tu infraestructura: una página única, accesible por HTTPS detrás de tu reverse proxy, que agrega estado, accesos directos y métricas. No compartes ningún dato con un servicio de terceros, y no pagas ninguna suscripción adicional.
Casos de uso concretos
- Página de inicio del navegador apuntando a tu propio VPS: todos tus servicios a un clic.
- Vista de estado en tiempo real de tus contenedores Docker sin abrir Portainer o Dozzle.
- Agregación de feeds RSS y noticias tech (Hacker News, Reddit, GitHub releases) en la misma pantalla que tus servicios.
- Acceso centralizado para un equipo o agencia que comparte un VPS común.
- Página de inicio de tu homelab o de tu infraestructura de desarrollo.
- Monitorización ligera sin desplegar una pila Grafana/Prometheus completa.
Homarr: panel completo con interfaz gráfica
Homarr es un panel de control self-hosted en Next.js con una interfaz de configuración completamente gráfica — arrastras y sueltas tiles, configuras integraciones Docker, Sonarr, Radarr, Jellyfin o cualquier servicio con una API. Funciona en un solo contenedor Docker (imagen ghcr.io/homarr-labs/homarr) y persiste su configuración en un volumen.
Requisitos: un VPS con al menos 512 MB de RAM disponibles después de tus otros contenedores, Docker y Docker Compose instalados, y un nombre de dominio o subdominio apuntando a tu IP. Espera 150 a 250 MB de RAM en reposo según las integraciones activas.
Desplegar Homarr con Docker Compose
Crear el directorio y el archivo Compose
En tu VPS, crea un directorio dedicado y un archivo
docker-compose.yml:mkdir -p /opt/homarr && cd /opt/homarrContenido del archivo
docker-compose.yml:services: homarr: image: ghcr.io/homarr-labs/homarr:latest container_name: homarr restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock:ro - ./appdata:/appdata environment: - SECRET_ENCRYPTION_KEY=tu-clave-aleatoria-32-chars ports: - "7575:7575"SECRET_ENCRYPTION_KEYes obligatorio: Homarr cifra los secretos de sus integraciones (tokens API, contraseñas) con esta clave. Genera una conopenssl rand -hex 32.Generar la clave de cifrado
Homarr requiere una clave hexadecimal de 64 caracteres:
openssl rand -hex 32Copia el valor en
SECRET_ENCRYPTION_KEYdel archivo Compose. Sin esta variable, el contenedor se niega a arrancar.Iniciar el contenedor
docker compose up -dHomarr es accesible en
http://your-domain.com:7575. En el primer acceso, crea tu cuenta de administrador. La configuración inicial (tiles, tema, integraciones) se realiza completamente desde la interfaz web.Configurar la integración Docker
El socket Docker (
/var/run/docker.sock) está montado en solo lectura. En la interfaz de Homarr, ve a Configuración → Integraciones y añade una integración Docker apuntando aunix:///var/run/docker.sock. Homarr mostrará automáticamente el estado (running/stopped) de tus contenedores en los tiles asociados.Configurar Traefik como reverse proxy
Para exponer Homarr en HTTPS, añade estos labels a tu servicio en el archivo Compose:
labels: - "traefik.enable=true" - "traefik.http.routers.homarr.rule=Host(`dashboard.your-domain.com`)" - "traefik.http.routers.homarr.entrypoints=websecure" - "traefik.http.routers.homarr.tls.certresolver=letsencrypt" - "traefik.http.services.homarr.loadbalancer.server.port=7575"Elimina el bloque
portssi expones únicamente via Traefik.Alternativa nginx
Si usas nginx, crea un vhost
/etc/nginx/sites-available/homarr.conf:server { listen 443 ssl; server_name dashboard.your-domain.com; ssl_certificate /etc/letsencrypt/live/dashboard.your-domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/dashboard.your-domain.com/privkey.pem; location / { proxy_pass http://127.0.0.1:7575; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } }Certificado Let's Encrypt via
certbot --nginx -d dashboard.your-domain.com.
Glance: un binario Go, una config YAML, sin base de datos
Glance está en el extremo opuesto del espectro de complejidad respecto a Homarr. Es un binario Go estático: sin Node.js, sin base de datos, sin interfaz de configuración. Todo se declara en un archivo glance.yml. Consume menos de 50 MB de RAM en reposo, lo que lo convierte en la elección natural para un VPS ajustado o un servidor donde cada megabyte cuenta.
Licencia: AGPL-3.0 (igual que Homarr). Código fuente en GitHub.
Desplegar Glance con Docker
Crear el directorio y el archivo de configuración
mkdir -p /opt/glance && cd /opt/glanceCrea un archivo
glance.ymlmínimo con un widget Hacker News y un widget Docker:server: host: 0.0.0.0 port: 8080 pages: - name: Inicio columns: - size: full widgets: - type: hacker-news title: Hacker News - size: small widgets: - type: docker-containers title: Contenedores collapsed-by-default: falseGlance expone el puerto 8080 por defecto.
Lanzar con Docker Compose
Crea un archivo
docker-compose.yml:services: glance: image: glanceapp/glance:latest container_name: glance restart: unless-stopped volumes: - ./glance.yml:/app/glance.yml:ro - /var/run/docker.sock:/var/run/docker.sock:ro ports: - "8080:8080"Arranca con:
docker compose up -dGlance es accesible en
http://your-domain.com:8080.Añadir un widget de tiempo
El widget
weatheres uno de los más sencillos de configurar — solo requiere una ubicación:- type: weather title: Tiempo location: Madrid, Spain units: metric hour-format: 24hAñade este bloque en la sección
widgetsde la columna que elijas.Configurar el reverse proxy para Glance
Con Traefik, añade en tu
docker-compose.yml:labels: - "traefik.enable=true" - "traefik.http.routers.glance.rule=Host(`glance.your-domain.com`)" - "traefik.http.routers.glance.entrypoints=websecure" - "traefik.http.routers.glance.tls.certresolver=letsencrypt" - "traefik.http.services.glance.loadbalancer.server.port=8080"Con nginx, misma estructura que Homarr, reemplazando el puerto por
8080.Recarga en caliente de la configuración
Glance monitoriza su archivo de configuración y se recarga automáticamente cuando lo modificas. No es necesario reiniciar el contenedor después de cada adición de widget —
docker logs glance -fmostrará la líneaConfig reloadedtras unos segundos.
Homarr vs Glance: tabla comparativa
Desplace la tabla
| Criterio | Homarr | Glance |
|---|---|---|
| RAM en reposo | 150 – 250 MB | < 50 MB |
| Configuración | Interfaz gráfica drag & drop | Archivo YAML únicamente |
| Base de datos | SQLite embebida | Ninguna |
| Widgets disponibles | Integraciones (Sonarr, Jellyfin, Docker…) + tiles libres | RSS, Hacker News, tiempo, Docker, GitHub, calendario… |
| Actualización | `docker compose pull && docker compose up -d` | `docker compose pull && docker compose up -d` |
| Licencia | AGPL-3.0 | AGPL-3.0 |
| Ideal para | Infraestructura rica, uso diario, uso en equipo | VPS ajustado, homelabs minimalistas, vista rápida |
Exponer en HTTPS con un reverse proxy
Ambas herramientas escuchan en HTTP localmente (7575 para Homarr, 8080 para Glance). Exponer un panel de control directamente a Internet sin TLS significa transmitir tus tokens de integración y sesiones en texto plano.
Dos opciones habituales:
Traefik — la opción recomendada si ya tienes Traefik en tu VPS. Los labels son suficientes (ejemplos arriba). Traefik solicita y renueva los certificados Let's Encrypt automáticamente via ACME DNS-01 o HTTP-01.
nginx — la opción natural si tu VPS ya funciona con nginx. La estructura proxy_pass http://127.0.0.1:<puerto> es idéntica para ambas herramientas; solo cambia el puerto.
Hardening: limitar el acceso al panel de control
Un panel de control self-hosted expone tus servicios internos. Algunas precauciones:
Autenticación Homarr: activa la autenticación integrada en el primer acceso. No dejes el panel abierto sin contraseña, aunque esté detrás de un subdominio oscuro.
Glance: no ofrece autenticación nativa. Protégelo con un middleware Traefik (BasicAuth o ForwardAuth) o via auth_basic de nginx antes de exponerlo públicamente.
Red Docker dedicada: crea una red internal: true para los servicios que no necesitan acceso externo, y conecta solo Homarr o Glance a la red Traefik.
Socket Docker en solo lectura: ambas herramientas montan /var/run/docker.sock — móntalo como :ro (solo lectura) como en los ejemplos anteriores. Un contenedor comprometido no podrá lanzar nuevos contenedores via el socket.
Resolución de problemas: errores comunes
Homarr se niega a arrancar — SECRET_ENCRYPTION_KEY missing: la variable de entorno está ausente o vacía. Genera una clave con openssl rand -hex 32 y añádela al archivo Compose.
Homarr muestra "Docker integration error": verifica que /var/run/docker.sock está montado en el contenedor (docker inspect homarr | grep docker.sock) y que el socket es legible.
Glance no carga el widget docker-containers: el socket Docker no está montado. Añade el volumen /var/run/docker.sock:/var/run/docker.sock:ro al Compose.
Glance muestra pantalla en blanco: tu glance.yml tiene un error de sintaxis YAML. Verifica con docker logs glance — el mensaje de error indica la línea exacta.
Error 502 Bad Gateway detrás de nginx/Traefik: el contenedor no está en ejecución o el puerto no coincide. Verifica con docker ps | grep homarr o docker ps | grep glance.
¿Qué herramienta elegir?
Elige Homarr si tienes múltiples servicios con APIs (Sonarr, Radarr, Jellyfin, Pi-hole…), si prefieres configurar via interfaz gráfica, o si compartes tu panel con otras personas. Presupuesta 200 MB de RAM adicionales en tu asignación de contenedores.
Elige Glance si tu VPS está ajustado de memoria, si te sientes cómodo con YAML, o si quieres una herramienta que arranque en segundos y consuma lo mínimo. La configuración versionada en un archivo de texto es también una ventaja para entornos gestionados como infrastructure-as-code.
Ambas coexisten sin problema en el mismo VPS si tienes la RAM — Homarr como panel principal, Glance como vista rápida lateral.