Por qué Glance es perfecto para un VPS
Lo que obtiene por defecto
- Widgets integrados: feeds RSS, Hacker News, Reddit, clima, marcadores, reloj mundial
- Métricas en vivo del servidor: CPU, RAM, disco, carga media
- Estado de contenedores Docker (ejecutando / detenido / pausado)
- Temas claro/oscuro y colores personalizables vía YAML
- Sin dependencias externas: único binario estático Go (~15 MB)
- Recarga en caliente de la configuración sin reinicio
Glance vs alternativas: Heimdall, Homepage, Homarr
Comparativa de paneles self-hosted
Desplace la tabla
| Herramienta | Lenguaje | RAM reposo | Configuración | Métricas Docker | Widgets RSS/noticias |
|---|---|---|---|---|---|
| **Glance** | Go | < 25 MB | YAML puro | Sí (solo lectura) | Sí (nativo) |
| Homepage | Node/React | ~120 MB | YAML | Sí | Parcial |
| Homarr | Node/React | ~150 MB | GUI + JSON | Sí | Vía integración |
| Heimdall | PHP/Laravel | ~200 MB | GUI + MySQL | No nativo | No |
Glance destaca cuando la ligereza y la velocidad importan más que una interfaz gráfica de configuración. Para equipos no técnicos que prefieren hacer clic a editar YAML, Homarr o Heimdall son alternativas válidas.
Requisitos previos
Lo que necesita antes de empezar
- Un VPS ServOrbit con Ubuntu 22.04 / Debian 12 (≥ 1 vCPU, 512 MB RAM es suficiente)
dockerydocker composeinstalados (Docker Engine 24+, Compose v2)- Acceso SSH root o sudo
- Un subdominio apuntando a su VPS (p. ej.
glance.midominio.tld) — opcional pero recomendado para HTTPS
Desplegar Glance en su VPS ServOrbit
Instalación paso a paso
Crear el directorio de trabajo
Conéctese por SSH a su VPS y cree la carpeta que alojará la configuración de Glance:
mkdir -p /opt/glance && cd /opt/glanceEscribir el archivo `docker-compose.yml`
Cree el siguiente archivo. El montaje en solo lectura del socket Docker es obligatorio (véase la sección Seguridad más abajo):
services: glance: image: glanceapp/glance:latest restart: unless-stopped ports: - "8080:8080" volumes: - ./glance.yml:/app/glance.yml:ro - /var/run/docker.sock:/var/run/docker.sock:ro - /proc:/proc:ro environment: - TZ=Europe/MadridCrear la configuración base `glance.yml`
Este archivo YAML define sus páginas, columnas y widgets:
server: port: 8080 pages: - name: Inicio columns: - size: small widgets: - type: clock hour-format: 24h - type: resource-usage - size: full widgets: - type: hacker-news - type: rss feeds: - url: https://blog.servOrbit.com/rss title: ServOrbit Blog - size: small widgets: - type: docker-containersIniciar el contenedor
docker compose up -dVerifique que está corriendo:
docker compose ps— el estado debe mostrarUp.Abrir el firewall (si UFW está activo)
ufw allow 8080/tcpAbra
http://<IP-VPS>:8080en su navegador para confirmar que Glance responde.Configurar un proxy inverso nginx con HTTPS
Para servir Glance en
https://glance.midominio.tld, cree un vhost nginx y obtenga el certificado con Certbot:certbot --nginx -d glance.midominio.tld.Activar autenticación HTTP básica (recomendado)
Glance no tiene auth integrada. Proteja el acceso vía nginx:
htpasswd -c /etc/nginx/.htpasswd adminAñada en el bloque
location /del vhost:auth_basic "Glance"; auth_basic_user_file /etc/nginx/.htpasswd;Recargue nginx:
systemctl reload nginx.Verificar las métricas del sistema
El widget
resource-usagelee/proc— el montaje:roendocker-compose.ymles por tanto obligatorio. Si las métricas no aparecen, compruebe:docker compose logs glance | grep -i proc.Recargar la configuración sin reinicio
Cualquier cambio en
glance.ymlse aplica enviandoSIGHUPal contenedor:docker kill --signal=SIGHUP glance_glance_1Activar actualizaciones automáticas (opcional)
Despliegue [Watchtower](https://containrrr.dev/watchtower/) para mantener la imagen Glance actualizada automáticamente, o gestiónelo manualmente:
docker compose pull && docker compose up -d
Configuración YAML avanzada: widgets, temas y diseño
La potencia de Glance reside en su archivo YAML. Estas son las personalizaciones más útiles.
Opciones de configuración avanzada
- Tema personalizado — añada bajo
server::theme: { background-color: "240 21 15", primary-color: "217 92 83" }(formato HSL sinhsl()) - Páginas múltiples — añada tantos bloques
- name:bajopages:como contextos tenga (p. ej. "Dev", "Clientes", "Personal") - Widget de marcadores —
type: bookmarkscon grupos de enlaces para centralizar el acceso rápido a sus herramientas internas - Widget de monitor —
type: monitorcon una lista de URLs: Glance realiza comprobaciones HTTP y muestra latencia + estado en tiempo real - Widget de releases GitHub —
type: releasescon una lista de repositorios: ideal para seguir nuevas versiones de sus herramientas - Intervalo de refresco — cada widget acepta
cache: 1h(o30m,5m) para controlar la frecuencia de sondeo
Seguridad: el socket Docker en solo lectura
Montar /var/run/docker.sock dentro de un contenedor le da a ese contenedor un control potencialmente total sobre el daemon Docker del host — equivalente a root. Este es el vector de escalada de privilegios más común en entornos Docker.
Riesgos y mitigaciones
- Riesgo: un contenedor comprometido con acceso
:rwal socket puede lanzar contenedores root, montar/, exfiltrar secretos - Mitigación 1 — Montaje de solo lectura: el
:roendocker-compose.ymlbloquea todas las escrituras; Glance solo necesita leer el estado de los contenedores - Mitigación 2 — Proxy del socket: despliegue [Docker Socket Proxy](https://github.com/Tecnativa/docker-socket-proxy) para exponer solo los endpoints
GET /containersyGET /version - Mitigación 3 — Aislamiento de red: coloque Glance en una red Docker dedicada, aislada de sus servicios de aplicación
- Verificación:
docker inspect glance_glance_1 | grep -A5 Mounts— la líneaModedebe mostrarro, nuncarw
Si no necesita métricas Docker, simplemente elimine el montaje /var/run/docker.sock de docker-compose.yml y retire el widget docker-containers de glance.yml. Glance funciona perfectamente sin acceso al daemon Docker.
Resolución de problemas: errores frecuentes
Problemas habituales y soluciones
- Puerto 8080 ya en uso —
ss -tlnp | grep 8080para identificar el proceso. Cambie el puerto host endocker-compose.yml:"8181:8080"(el puerto del contenedor sigue siendo 8080). - Widget no carga / spinner permanente — verifique la conectividad de red saliente del contenedor:
docker exec glance_glance_1 curl -s https://news.ycombinator.com. Si hay timeout, su VPS está detrás de un firewall saliente restrictivo — abra los puertos 80/443 salientes conufw. - Socket Docker rechazado (
permission denied) — el contenedor corre bajo un UID no-root sin acceso al grupodocker. Solución: añadagroup_add: ["docker"]o monte el socket con los permisos correctos. Compruebe:ls -la /var/run/docker.sock(grupodocker, modo660). - Métricas de
/procausentes — falta el montaje/proc:/proc:roendocker-compose.yml. Sin él,resource-usagemuestra valores nulos o un error. Añada el volumen y reinicie:docker compose up -d.
Casos de uso reales para una agencia web
Una agencia que gestiona N proyectos de clientes en VPS separados puede centralizar la monitorización en Glance con una página por cliente o entorno.
Cómo estructurar Glance para una agencia
- Una página por cliente: cada bloque
pages[n]corresponde a un proyecto — widgetmonitorcon URLs críticas (front, API, backoffice), widgetdocker-containerssi los servicios corren localmente - Página "Infraestructura global": el widget
monitorpuede comprobar endpoints healthcheck expuestos en cada máquina (p. ej./healthz) para agregar el estado multi-VPS - Feed RSS de alertas: añada el feed RSS de su herramienta de monitorización (UptimeKuma, Gatus) para surfacear incidentes sin salir de Glance
- Widget de releases GitHub: siga las releases de CMS/frameworks de sus clientes para anticipar actualizaciones críticas
- Acceso multi-equipo: un Glance por entorno (staging / prod), cada uno protegido por una auth HTTP separada vía nginx, compartible por enlace con el equipo correspondiente
La documentación oficial de Glance (github.com/glanceapp/glance) lista todos los widgets disponibles y sus opciones. La sección de referencia glance.yml es la más actualizada — las opciones evolucionan con cada versión menor.