# Infraestructura: Heimdall
# Heimdall Application Dashboard — Despliegue con Docker Compose
Este repositorio proporciona una forma sencilla de desplegar **Heimdall** usando Docker Compose, siguiendo las recomendaciones de LinuxServer.io.
## ¿Qué es Heimdall?
Heimdall es un dashboard elegante y minimalista para organizar todos tus servicios web en un solo lugar. Ideal para:
- 🏠 **Dashboard de servicios** - Organiza accesos a todas tus aplicaciones
- 🎨 **Personalizable** - Temas, iconos y colores configurables
- 🔍 **Búsqueda integrada** - Acceso rápido a servicios
- 📱 **Responsive** - Funciona en móvil, tablet y escritorio
- 🔌 **Enhanced apps** - Widgets con información en tiempo real
## Requisitos
- Docker y Docker Compose instalados en el host
- Puertos 80/443 disponibles (o usar puertos alternativos)
- (Opcional) NPM desplegado para acceso con dominio y SSL
## Qué incluye este stack
- **Servicio**: `heimdall` con la imagen `lscr.io/linuxserver/heimdall:latest`
- **Volúmenes**:
- `heimdall_config`: Configuración y base de datos
- **Variables de entorno**:
- `PUID=1000` / `PGID=1000`: Usuario/grupo para permisos de archivos
- `TZ=Europe/Madrid`: Zona horaria
**⚠️ IMPORTANTE**: El `docker-compose.yml` base **NO publica puertos** por seguridad. Para acceder a Heimdall:
- **Con proxy** (recomendado): Usa archivos override para Traefik o NPM
- **Sin proxy** (acceso directo): Usa `docker-compose.override.standalone.yml.example`
## Pasos de despliegue
### Opción 1: Docker Compose (Línea de comandos)
#### 1. Clonar el repositorio
```bash
git clone https://git.ictiberia.com/groales/heimdall
cd heimdall
```
#### 2. Levantar el stack
```bash
docker compose up -d
```
### Opción 2: Desplegar desde Portainer (Recomendado)
Portainer ofrece dos métodos de despliegue:
#### Método A: Git Repository
Usa los archivos directamente del repositorio. Portainer fusiona automáticamente el base + override.
**Stacks** → **Add stack**
- **Name**: `heimdall`
- **Build method**: **Git Repository**
- **Repository URL**: `https://git.ictiberia.com/groales/heimdall`
- **Repository reference**: `refs/heads/main`
- **Compose path**: `docker-compose.yml`
- **Additional paths** (según modo de acceso):
- Para Traefik: `docker-compose.override.traefik.yml.example`
- Para NPM: `docker-compose.override.npm.yml.example`
- Para acceso directo IP:puerto: `docker-compose.override.standalone.yml.example`
- **Deploy the stack**
#### Método B: Web Editor
Copia y pega un docker-compose consolidado (base + override fusionados).
**Stacks** → **Add stack**
- **Name**: `heimdall`
- **Build method**: **Web editor**
- **Web editor**: Copiar y pegar uno de los siguientes compose completos:
📋 Docker Compose para Traefik (click para expandir)
```yaml
services:
heimdall:
container_name: heimdall
image: lscr.io/linuxserver/heimdall:latest
restart: unless-stopped
environment:
PUID: 1000
PGID: 1000
TZ: Europe/Madrid
volumes:
- heimdall_config:/config
networks:
- proxy
labels:
- "traefik.enable=true"
- "traefik.http.routers.heimdall.rule=Host(`${DOMAIN:-heimdall.tudominio.com}`)"
- "traefik.http.routers.heimdall.entrypoints=websecure"
- "traefik.http.routers.heimdall.tls=true"
- "traefik.http.routers.heimdall.tls.certresolver=letsencrypt"
- "traefik.http.services.heimdall.loadbalancer.server.port=80"
- "traefik.http.routers.heimdall.middlewares=security-headers@file"
volumes:
heimdall_config:
name: heimdall_config
networks:
proxy:
external: true
```
⚠️ **Importante**: En Portainer, añadir variable de entorno:
- **name**: `DOMAIN`
- **value**: `heimdall.tudominio.com` (tu dominio real)
O editar directamente en el YAML cambiando `${DOMAIN:-heimdall.tudominio.com}` por tu dominio.
📋 Docker Compose para NPM (click para expandir)
```yaml
services:
heimdall:
container_name: heimdall
image: lscr.io/linuxserver/heimdall:latest
restart: unless-stopped
environment:
PUID: 1000
PGID: 1000
TZ: Europe/Madrid
volumes:
- heimdall_config:/config
networks:
- proxy
volumes:
heimdall_config:
name: heimdall_config
networks:
proxy:
external: true
```
ℹ️ Después de desplegar, configura el Proxy Host en la UI de NPM (puerto 81).
📋 Docker Compose Standalone (click para expandir)
```yaml
services:
heimdall:
container_name: heimdall
image: lscr.io/linuxserver/heimdall:latest
restart: unless-stopped
environment:
PUID: 1000
PGID: 1000
TZ: Europe/Madrid
volumes:
- heimdall_config:/config
ports:
- "8080:80"
- "8443:443"
volumes:
heimdall_config:
name: heimdall_config
```
ℹ️ Acceso directo: `http://IP:8080` o `https://IP:8443`
- **Deploy the stack**
#### 2. Verificar despliegue
**Stacks** → `heimdall` → Ver logs del contenedor
### 3. Verificar el estado
```bash
docker ps --filter name=heimdall
```
### 4. Acceder a la interfaz
Depende del override usado:
- **Con Traefik**: `https://heimdall.tudominio.com` (ajustar dominio en override)
- **Con NPM**: Configura Proxy Host primero (ver sección NPM), luego `https://heimdall.tudominio.com`
- **Acceso directo**: `http://IP-del-servidor:8080` o `https://IP-del-servidor:8443`
**Nota**: Si no usaste ningún override, el contenedor arranca pero no es accesible (sin puertos publicados).
## Configuración inicial
Al primer acceso, Heimdall muestra una interfaz vacía. Para añadir aplicaciones:
1. Click en **icono de llave** (esquina superior derecha) para editar
2. Click en **Add Application**
3. Rellenar detalles:
- **Application name**: Nombre del servicio
- **Colour**: Color del icono
- **Icon**: Buscar icono o usar URL personalizada
- **URL**: Dirección completa (ej: `https://portainer.tudominio.com`)
- **Description**: Descripción opcional
4. **Save**
### Enhanced Apps
Heimdall soporta widgets especiales para apps populares:
- **Plex** - Muestra streams activos
- **Sonarr/Radarr** - Próximos estrenos
- **SABnzbd/NZBGet** - Estado de descargas
- **Pihole** - Estadísticas de bloqueo
Para habilitar:
- Marcar **Enable** en la aplicación
- Proporcionar **API Key** del servicio
- Configurar **Enhanced options**
## Integración con Proxy Inverso
Este repositorio incluye tres archivos override:
- `docker-compose.override.traefik.yml.example` - Integración con Traefik
- `docker-compose.override.npm.yml.example` - Integración con NGINX Proxy Manager
- `docker-compose.override.standalone.yml.example` - Acceso directo sin proxy (publica puertos 8080/8443)
**⚠️ Importante**: El `docker-compose.yml` base NO publica puertos. Debes usar uno de estos overrides para acceder a Heimdall.
### Acceso Directo (sin proxy)
**Desde Portainer (Git)**:
- **Additional paths**: `docker-compose.override.standalone.yml.example`
**Desde CLI**:
```bash
cp docker-compose.override.standalone.yml.example docker-compose.override.yml
docker compose up -d
```
Acceso:
- **HTTP**: `http://IP-del-servidor:8080`
- **HTTPS**: `https://IP-del-servidor:8443` (certificado autofirmado)
### Con Traefik
**Desde Portainer (Git)**:
- **Additional paths**: `docker-compose.override.traefik.yml.example`
- Editar dominio en el archivo antes de desplegar, o después desde Stack Editor
**Desde CLI**:
```bash
cp docker-compose.override.traefik.yml.example docker-compose.override.yml
# Editar dominio en docker-compose.override.yml
docker compose up -d
```
Accede a: `https://heimdall.tudominio.com`
### Con NGINX Proxy Manager
#### 1. Desplegar con override
**Desde Portainer (Git)**:
- **Additional paths**: `docker-compose.override.npm.yml.example`
**Desde CLI**:
```bash
cp docker-compose.override.npm.yml.example docker-compose.override.yml
docker compose up -d
```
Esto conecta Heimdall a la red `proxy` compartida con NPM.
#### 2. Configurar Proxy Host en NPM
Accede a NPM (puerto 81) y crea un Proxy Host:
**Pestaña Details**:
- **Domain Names**: `heimdall.tudominio.com`
- **Scheme**: `http`
- **Forward Hostname / IP**: `heimdall` (nombre del contenedor)
- **Forward Port**: `80`
- **Cache Assets**: ✅
- **Block Common Exploits**: ✅
- **Websockets Support**: ❌
**Pestaña SSL**:
- ✅ **Request a new SSL Certificate**
- ✅ **Force SSL**
- ✅ **HTTP/2 Support**
- Email: `tu@email.com`
- ✅ **I Agree to Let's Encrypt ToS**
**Save** y accede a: `https://heimdall.tudominio.com` 🎉
## Personalización
### Cambiar tema
1. Click en **icono de llave** → **Settings**
2. **Theme**: Seleccionar tema (Classic, Dark, etc.)
3. **Save**
### Cambiar fondo
1. **Settings** → **Background image**
2. Subir imagen o usar URL
3. **Save**
### Organizar aplicaciones
En modo edición:
- **Drag & drop** para reordenar
- Click en **engranaje** de cada app para editar/eliminar
- Crear **Tags** para agrupar aplicaciones
### Cambiar puertos
**Si usas acceso directo** (override standalone), puedes personalizar los puertos editando `docker-compose.override.standalone.yml.example`:
```yaml
ports:
- "9080:80" # HTTP en puerto 9080
- "9443:443" # HTTPS en puerto 9443
```
**Si usas proxy** (Traefik o NPM), no necesitas puertos publicados - el acceso es via dominio.
### Variables de entorno
Ajusta PUID/PGID según tu sistema:
```bash
# Ver tu UID/GID
id
# Actualizar en docker-compose.yml
PUID: 1000 # Tu UID
PGID: 1000 # Tu GID
```
## Backup y Restauración
### Backup del volumen
```bash
docker run --rm \
-v heimdall_config:/config \
-v $(pwd):/backup \
alpine tar czf /backup/heimdall-config-$(date +%Y%m%d-%H%M%S).tar.gz -C /config .
```
### Restaurar backup
```bash
# Detener Heimdall
docker compose down
# Restaurar
docker run --rm \
-v heimdall_config:/config \
-v $(pwd):/backup \
alpine tar xzf /backup/heimdall-config-YYYYMMDD-HHMMSS.tar.gz -C /config
# Iniciar Heimdall
docker compose up -d
```
## Solución de problemas
### Puerto ocupado
**Solo aplica si usas acceso directo** (override standalone):
```bash
# Ver qué proceso usa el puerto
Get-NetTCPConnection -LocalPort 8080
# o en Linux
sudo netstat -tulpn | grep :8080
# Cambiar puerto en docker-compose.override.standalone.yml.example
ports:
- "9080:80"
```
### Contenedor no arranca
```bash
# Ver logs
docker logs heimdall
# Verificar permisos del volumen
docker exec heimdall ls -la /config
```
### Error de permisos
Si ves errores de permisos en logs:
```bash
# Verificar PUID/PGID
id
# Actualizar docker-compose.yml con tus valores
# Recrear contenedor
docker compose down
docker compose up -d
```
### Aplicaciones no se guardan
Verifica que el volumen está montado correctamente:
```bash
docker volume inspect heimdall_config
docker exec heimdall ls -la /config
```
## Actualización
```bash
# Pull nueva imagen
docker compose pull
# Reiniciar con nueva versión
docker compose up -d
# Ver logs
docker logs -f heimdall
```
Heimdall mantiene la configuración entre actualizaciones (volumen persistente).
## Recursos oficiales
- 📘 [Documentación LinuxServer.io](https://docs.linuxserver.io/images/docker-heimdall)
- 🐙 [GitHub - Heimdall](https://github.com/linuxserver/Heimdall)
- 💬 [Comunidad LinuxServer.io](https://discord.gg/YWrKVTn)
- 🐳 [Docker Hub](https://hub.docker.com/r/linuxserver/heimdall)
## Seguridad
### Recomendaciones
1. ✅ **Usar proxy con SSL** (Traefik o NPM) para acceso seguro por dominio
2. ✅ **Evitar acceso directo** en producción - usa override standalone solo para testing
3. ✅ **Restringir acceso** con Access Lists en NPM o middlewares en Traefik
4. ✅ **Backup periódico** del volumen `heimdall_config`
5. ✅ **Actualizar regularmente** con `docker compose pull && docker compose up -d`
### Proteger con Access List (NPM)
En NPM, crea una Access List para restringir acceso:
1. **Access Lists** → **Add Access List**
2. **Name**: `Red local`
3. **Access** → **Allow** → IPs permitidas (ej: `192.168.1.0/24`)
4. **Access** → **Deny** → `0.0.0.0/0`
5. Aplicar al Proxy Host de Heimdall
---
**Versión**: Latest (imagen LinuxServer.io rolling)
**Última actualización**: Diciembre 2025