Instalación y Configuración de Homer Dashboard
Homer es un panel de inicio estático y ligero que centraliza el acceso a todos tus servicios self-hosted en una página web organizada y personalizable. Configurado completamente mediante un archivo YAML, Homer no requiere base de datos y puede desplegarse en segundos con Docker. Esta guía cubre la instalación y configuración completa de Homer en Linux para gestionar tu infraestructura de servicios.
Requisitos Previos
- Servidor con Ubuntu 20.04+, Debian 11+ o CentOS 8+
- Docker instalado (método recomendado)
- O servidor web estático (Nginx, Apache)
- Puerto 8080 disponible (configurable)
- Acceso a los URLs de tus servicios self-hosted
Instalación con Docker
# Crear directorio para la configuración de Homer
mkdir -p ~/homer/{assets,assets/icons,assets/tools}
# Descargar el archivo de configuración de ejemplo
wget -O ~/homer/assets/config.yml \
https://raw.githubusercontent.com/bastienwirtz/homer/main/public/assets/config.yml.dist
# Ejecutar Homer con Docker
docker run -d \
--name homer \
--restart unless-stopped \
-p 8080:8080 \
-v ~/homer/assets:/www/assets \
-u $(id -u):$(id -g) \
b4bz/homer:latest
Acceder al panel en http://TU-SERVIDOR:8080.
Instalación con Docker Compose
mkdir -p ~/homer/assets && cd ~/homer
# Crear docker-compose.yml
cat > docker-compose.yml << 'EOF'
version: '3'
services:
homer:
image: b4bz/homer:latest
container_name: homer
restart: unless-stopped
ports:
- 8080:8080
volumes:
- ./assets:/www/assets
user: "1000:1000"
environment:
- INIT_ASSETS=1 # Copiar assets por defecto si el directorio está vacío
EOF
docker compose up -d
Configuración YAML de Homer
La configuración completa de Homer se realiza en ~/homer/assets/config.yml:
---
# Configuración principal de Homer
title: "Mi Panel de Servicios"
subtitle: "Infraestructura self-hosted"
logo: "logo.png"
# Columnas del panel (1, 2 o 3)
columns: "3"
# Fondo del panel (color CSS o URL de imagen)
background: "#f5f5f5"
# Opciones de conexectividad
connectivityCheck: true
# Configuración del tema
theme: default # default, material-design
colors:
light:
highlight-primary: "#3367d6"
highlight-secondary: "#4285f4"
highlight-hover: "#5a95f5"
background: "#f5f5f5"
card-background: "#ffffff"
text: "#363636"
text-header: "#ffffff"
text-title: "#303030"
text-subtitle: "#424242"
card-shadow: rgba(0, 0, 0, 0.1)
link: "#3273dc"
link-hover: "#363636"
dark:
highlight-primary: "#3367d6"
highlight-secondary: "#4285f4"
highlight-hover: "#5a95f5"
background: "#131313"
card-background: "#2b2b2b"
text: "#eaeaea"
text-header: "#ffffff"
text-title: "#fafafa"
text-subtitle: "#f5f5f5"
card-shadow: rgba(0, 0, 0, 0.4)
link: "#3273dc"
link-hover: "#ffdd57"
# Mensaje informativo en la cabecera
message:
style: "is-dark"
title: "Bienvenido"
content: "Panel de administración de infraestructura self-hosted."
# Atajos de teclado en el buscador integrado
links:
- name: "Documentación"
icon: "fas fa-book"
url: "https://docs.tu-dominio.com"
target: "_blank"
- name: "GitHub"
icon: "fab fa-github"
url: "https://github.com/tu-usuario"
target: "_blank"
# Definición de servicios agrupados
services:
- name: "Monitorización"
icon: "fas fa-heartbeat"
items:
- name: "Grafana"
logo: "assets/icons/grafana.png"
subtitle: "Métricas y dashboards"
tag: "monitor"
url: "https://grafana.tu-dominio.com"
target: "_blank"
- name: "Uptime Kuma"
logo: "assets/icons/uptime-kuma.png"
subtitle: "Monitorización de uptime"
url: "https://status.tu-dominio.com"
target: "_blank"
- name: "Almacenamiento"
icon: "fas fa-database"
items:
- name: "Nextcloud"
logo: "assets/icons/nextcloud.png"
subtitle: "Almacenamiento en la nube"
url: "https://cloud.tu-dominio.com"
target: "_blank"
- name: "Seafile"
logo: "assets/icons/seafile.png"
subtitle: "Sincronización de archivos"
url: "https://seafile.tu-dominio.com"
target: "_blank"
Agrupación de Servicios
# Estructura de agrupación en config.yml
services:
# Grupo de medios
- name: "Medios"
icon: "fas fa-film"
items:
- name: "Jellyfin"
logo: "assets/icons/jellyfin.png"
subtitle: "Servidor de medios"
tag: "media"
url: "https://jellyfin.tu-dominio.com"
- name: "Navidrome"
logo: "assets/icons/navidrome.png"
subtitle: "Música"
url: "https://music.tu-dominio.com"
# Grupo de productividad
- name: "Productividad"
icon: "fas fa-tasks"
items:
- name: "Vikunja"
logo: "assets/icons/vikunja.png"
subtitle: "Gestión de tareas"
url: "https://tasks.tu-dominio.com"
- name: "Paperless"
logo: "assets/icons/paperless.png"
subtitle: "Gestión documental"
url: "https://docs.tu-dominio.com"
# Grupo de red
- name: "Red y Seguridad"
icon: "fas fa-network-wired"
items:
- name: "Portainer"
logo: "assets/icons/portainer.png"
subtitle: "Gestión Docker"
url: "https://portainer.tu-dominio.com"
- name: "Nginx Proxy Manager"
logo: "assets/icons/nginx.png"
subtitle: "Proxy inverso"
url: "https://proxy.tu-dominio.com"
Iconos Personalizados
Homer soporta iconos de múltiples fuentes:
# 1. Iconos de FontAwesome (incluidos por defecto)
# icon: "fas fa-home" # FontAwesome Solid
# icon: "fab fa-github" # FontAwesome Brands
# 2. Imágenes personalizadas (PNG, SVG)
# Copiar los iconos al directorio de assets
cp mis-iconos/*.png ~/homer/assets/icons/
# En el config.yml usar:
# logo: "assets/icons/mi-servicio.png"
# 3. Descargar iconos populares de self-hosted desde el repositorio oficial
wget https://raw.githubusercontent.com/walkxcode/dashboard-icons/main/png/jellyfin.png \
-O ~/homer/assets/icons/jellyfin.png
wget https://raw.githubusercontent.com/walkxcode/dashboard-icons/main/png/grafana.png \
-O ~/homer/assets/icons/grafana.png
# Script para descargar múltiples iconos
for servicio in jellyfin plex navidrome nextcloud portainer grafana; do
wget -q "https://raw.githubusercontent.com/walkxcode/dashboard-icons/main/png/${servicio}.png" \
-O ~/homer/assets/icons/${servicio}.png
echo "Descargado: ${servicio}.png"
done
Verificación de Estado de Servicios
Homer puede verificar automáticamente si los servicios están activos:
# En el config.yml, agregar tipo de verificación a cada servicio
services:
- name: "Servicios"
items:
# Verificación básica (ping HTTP)
- name: "Grafana"
url: "https://grafana.tu-dominio.com"
type: "Ping"
# Verificación de estado JSON
- name: "Jellyfin"
url: "https://jellyfin.tu-dominio.com"
type: "Jellyfin"
# Verificación de Prometheus
- name: "Prometheus"
url: "https://prometheus.tu-dominio.com"
type: "Prometheus"
# Sin verificación (link simple)
- name: "Mi Blog"
url: "https://blog.tu-dominio.com"
# Sin "type" = enlace simple sin verificación de estado
Homer incluye verificadores integrados para:
- Ping: Verificación básica HTTP (código 2xx)
- Jellyfin: Verifica la API de Jellyfin
- Plex: Verifica el estado de Plex
- Prometheus: Verifica métricas de Prometheus
- Portainer: Verifica contenedores Docker
Personalización del Tema
# Tema oscuro por defecto
defaults:
layout: columns
colorTheme: dark
# CSS personalizado (agregar archivo en assets/)
customCss: "custom.css"
# Crear CSS personalizado
cat > ~/homer/assets/custom.css << 'EOF'
/* Fuente personalizada */
body {
font-family: 'Inter', sans-serif;
}
/* Estilo de tarjetas */
.card {
border-radius: 12px;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
}
/* Fondo con gradiente */
#app {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
EOF
Proxy Inverso con Nginx
# Configuración de Nginx para Homer
sudo tee /etc/nginx/sites-available/homer << 'EOF'
server {
listen 443 ssl http2;
server_name inicio.tu-dominio.com;
ssl_certificate /etc/letsencrypt/live/inicio.tu-dominio.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/inicio.tu-dominio.com/privkey.pem;
# Autenticación básica opcional (para proteger el panel)
# auth_basic "Panel de administración";
# auth_basic_user_file /etc/nginx/.htpasswd;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto https;
# Caché para assets estáticos
proxy_cache_valid 200 1d;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/homer /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
# Proteger Homer con contraseña básica (opcional)
sudo apt install -y apache2-utils
sudo htpasswd -c /etc/nginx/.htpasswd admin
Solución de Problemas
Homer muestra un panel vacío:
# Verificar que el archivo config.yml es YAML válido
docker exec homer cat /www/assets/config.yml
# Validar el YAML
python3 -c "import yaml; yaml.safe_load(open('~/homer/assets/config.yml'))"
# Ver los logs de Homer
docker logs homer
# Verificar permisos del archivo de configuración
ls -la ~/homer/assets/config.yml
Los iconos no aparecen:
# Verificar que los archivos de iconos existen
ls -la ~/homer/assets/icons/
# Comprobar que los permisos son correctos
chmod -R 644 ~/homer/assets/icons/
chmod 755 ~/homer/assets/icons/
# Verificar la ruta en el config.yml (debe ser relativa a /www/assets/)
# logo: "assets/icons/grafana.png" ← correcto
# logo: "/www/assets/icons/grafana.png" ← incorrecto
La verificación de estado siempre muestra rojo:
# Homer no soporta autenticación para las verificaciones de estado
# Si el servicio requiere autenticación, Homer no podrá verificarlo
# Verificar que el servicio es accesible desde el servidor de Homer
docker exec homer wget -q -O /dev/null https://grafana.tu-dominio.com && echo "OK" || echo "FALLO"
# Revisar la configuración de CORS si el panel es accesible desde otro dominio
Conclusión
Homer es el punto de partida ideal para cualquier infraestructura self-hosted, proporcionando acceso rápido a todos los servicios desde un único panel web sin sobrecargar el servidor. Su configuración mediante YAML simple y la compatibilidad con iconos de FontAwesome y personalizados lo hacen muy fácil de mantener y adaptar a medida que crece tu infraestructura.


