Crear wiki completa de Heimdall con todas las guías

2025-12-03 11:16:53 +01:00
parent 1b74407c42
commit 4ecd79e027
9 changed files with 3210 additions and 1 deletions

442
Actualización.md Normal file

@@ -0,0 +1,442 @@
# Actualización
Guía para mantener Heimdall actualizado con las últimas versiones de LinuxServer.io.
## 🔄 Proceso de Actualización
Heimdall usa la imagen `lscr.io/linuxserver/heimdall:latest` que se actualiza regularmente.
### Método 1: Actualización Manual (Recomendado)
El método más seguro con control total.
#### Desde CLI
```bash
# 1. Hacer backup (recomendado)
docker run --rm \
-v heimdall_config:/config \
-v ~/backups/heimdall:/backup \
alpine tar czf /backup/heimdall-pre-update-$(date +%Y%m%d).tar.gz -C /config .
# 2. Descargar nueva imagen
docker compose pull
# 3. Recrear contenedor
docker compose up -d
# 4. Verificar logs
docker logs -f heimdall
```
#### Desde Portainer
**Stacks**`heimdall`**Pull and redeploy**
1.**Pull latest image versions**
2.**Re-deploy stack**
3. Click en **Update**
Verificar:
- **Containers** → `heimdall`**Logs**
#### PowerShell (Windows)
```powershell
# Backup
docker run --rm `
-v heimdall_config:/config `
-v ${HOME}\backups\heimdall:/backup `
alpine tar czf /backup/heimdall-pre-update-$(Get-Date -Format "yyyyMMdd").tar.gz -C /config .
# Actualizar
docker compose pull
docker compose up -d
# Ver logs
docker logs -f heimdall
```
### Método 2: Watchtower (Automático)
Usa **Watchtower** del repositorio [groales/watchtower](https://git.ictiberia.com/groales/watchtower) para auto-actualizar.
#### Configuración
Watchtower ya está configurado para monitorear todos los contenedores.
**Etiquetar para actualización automática**:
En `docker-compose.yml` o override:
```yaml
services:
heimdall:
labels:
- "com.centurylinklabs.watchtower.enable=true"
```
**Excluir de auto-actualización**:
```yaml
services:
heimdall:
labels:
- "com.centurylinklabs.watchtower.enable=false"
```
#### Verificar Watchtower
```bash
# Ver logs de Watchtower
docker logs watchtower
# Debe mostrar:
# Checking heimdall
# Found new lscr.io/linuxserver/heimdall:latest image
# Stopping heimdall
# Removing heimdall
# Creating heimdall
```
### Método 3: Actualización Programada
Crear script de actualización automática.
#### Script Bash (Linux)
`~/scripts/update-heimdall.sh`:
```bash
#!/bin/bash
BACKUP_DIR=~/backups/heimdall
DATE=$(date +%Y%m%d-%H%M%S)
# Función de log
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}
log "Iniciando actualización de Heimdall"
# Backup
log "Creando backup..."
docker run --rm \
-v heimdall_config:/config \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/heimdall-pre-update-$DATE.tar.gz -C /config . || {
log "ERROR: Falló el backup. Abortando actualización."
exit 1
}
log "Backup creado: heimdall-pre-update-$DATE.tar.gz"
# Actualizar
log "Descargando nueva imagen..."
cd ~/heimdall
docker compose pull || {
log "ERROR: Falló la descarga de la imagen."
exit 1
}
log "Recreando contenedor..."
docker compose up -d || {
log "ERROR: Falló la recreación del contenedor."
log "Restaurando desde backup..."
docker run --rm \
-v heimdall_config:/config \
-v $BACKUP_DIR:/backup \
alpine tar xzf /backup/heimdall-pre-update-$DATE.tar.gz -C /config
docker compose up -d
exit 1
}
# Verificar salud
log "Esperando 10 segundos para verificar salud..."
sleep 10
if docker ps | grep -q heimdall; then
log "✓ Heimdall actualizado correctamente"
# Limpiar backups antiguos (30 días)
find $BACKUP_DIR -name "heimdall-pre-update-*.tar.gz" -mtime +30 -delete
log "✓ Backups antiguos limpiados"
else
log "ERROR: Heimdall no está corriendo. Revisa los logs:"
docker logs heimdall
exit 1
fi
```
Hacer ejecutable:
```bash
chmod +x ~/scripts/update-heimdall.sh
```
#### Automatizar con Cron
```bash
crontab -e
# Actualizar semanalmente (domingos a las 3 AM)
0 3 * * 0 ~/scripts/update-heimdall.sh >> ~/logs/heimdall-updates.log 2>&1
```
#### PowerShell Script (Windows)
`C:\Scripts\Update-Heimdall.ps1`:
```powershell
$BackupPath = "$HOME\backups\heimdall"
$Date = Get-Date -Format "yyyyMMdd-HHmmss"
$LogFile = "$HOME\logs\heimdall-updates.log"
function Write-Log {
param($Message)
$Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
"$Timestamp - $Message" | Tee-Object -FilePath $LogFile -Append
}
Write-Log "Iniciando actualización de Heimdall"
# Backup
Write-Log "Creando backup..."
docker run --rm `
-v heimdall_config:/config `
-v ${BackupPath}:/backup `
alpine tar czf /backup/heimdall-pre-update-$Date.tar.gz -C /config .
if ($LASTEXITCODE -ne 0) {
Write-Log "ERROR: Falló el backup. Abortando."
exit 1
}
Write-Log "Backup creado: heimdall-pre-update-$Date.tar.gz"
# Actualizar
Write-Log "Descargando nueva imagen..."
Set-Location "$HOME\repos\heimdall"
docker compose pull
if ($LASTEXITCODE -ne 0) {
Write-Log "ERROR: Falló la descarga."
exit 1
}
Write-Log "Recreando contenedor..."
docker compose up -d
if ($LASTEXITCODE -ne 0) {
Write-Log "ERROR: Falló la recreación."
Write-Log "Restaurando desde backup..."
docker run --rm `
-v heimdall_config:/config `
-v ${BackupPath}:/backup `
alpine tar xzf /backup/heimdall-pre-update-$Date.tar.gz -C /config
docker compose up -d
exit 1
}
# Verificar
Start-Sleep -Seconds 10
if (docker ps | Select-String "heimdall") {
Write-Log "✓ Heimdall actualizado correctamente"
# Limpiar backups antiguos (30 días)
Get-ChildItem -Path $BackupPath -Filter "heimdall-pre-update-*.tar.gz" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item
Write-Log "✓ Backups antiguos limpiados"
} else {
Write-Log "ERROR: Heimdall no está corriendo"
docker logs heimdall | Out-File -Append $LogFile
exit 1
}
```
Automatizar con Tarea Programada:
```powershell
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\Update-Heimdall.ps1"
$Trigger = New-ScheduledTaskTrigger -Weekly -DaysOfWeek Sunday -At 3am
Register-ScheduledTask -TaskName "Heimdall Update" -Action $Action -Trigger $Trigger
```
## 🔍 Verificar Versión
### Ver versión actual
```bash
docker inspect heimdall | grep -A 5 Labels | grep build_version
# O ver logs al iniciar:
docker logs heimdall | grep "Version:"
```
Salida ejemplo:
```
Version: 2.5.8-ls234 Built: 2024-12-01
```
### Ver versión disponible
```bash
# Comparar con registro remoto
docker pull lscr.io/linuxserver/heimdall:latest
docker inspect lscr.io/linuxserver/heimdall:latest | grep build_version
```
### Desde Portainer
**Containers**`heimdall`**Details****Labels**
Buscar: `org.opencontainers.image.version`
## 📋 Changelog
Ver cambios en nuevas versiones:
- **GitHub**: [Heimdall Releases](https://github.com/linuxserver/Heimdall/releases)
- **LinuxServer.io**: [Blog](https://www.linuxserver.io/blog)
- **Docker Hub**: [Tags](https://hub.docker.com/r/linuxserver/heimdall/tags)
## 🔔 Notificaciones de Actualizaciones
### Con Diun
Usar **Diun** (Docker Image Update Notifier):
```yaml
# docker-compose.yml de Diun
services:
diun:
image: crazymax/diun:latest
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DIUN_WATCH_WORKERS=5
- DIUN_NOTIF_MAIL_HOST=smtp.gmail.com
- DIUN_NOTIF_MAIL_PORT=587
- DIUN_NOTIF_MAIL_FROM=tu@gmail.com
- DIUN_NOTIF_MAIL_TO=tu@gmail.com
```
### Con Watchtower (solo notificaciones)
```yaml
# Watchtower en modo notificación (no actualiza)
services:
watchtower:
command:
- --monitor-only
- --notifications
- email
environment:
- WATCHTOWER_NOTIFICATION_EMAIL_TO=tu@email.com
```
## 🐛 Solución de Problemas
### Actualización falla
```bash
# Ver logs detallados
docker logs heimdall
# Errores comunes:
# 1. Permisos: Verificar PUID/PGID
# 2. Volumen corrupto: Restaurar desde backup
# 3. Red: Verificar conectividad a Docker Hub
```
### Contenedor no inicia tras actualización
```bash
# Revertir a versión anterior
docker compose down
docker pull lscr.io/linuxserver/heimdall:2.5.8 # Versión específica
# Editar docker-compose.yml: image: lscr.io/linuxserver/heimdall:2.5.8
docker compose up -d
# O restaurar desde backup
docker run --rm \
-v heimdall_config:/config \
-v ~/backups/heimdall:/backup \
alpine tar xzf /backup/heimdall-pre-update-20251203.tar.gz -C /config
docker start heimdall
```
### Configuración perdida tras actualización
**Esto NO debería ocurrir** (el volumen persiste). Si ocurre:
```bash
# Verificar volumen
docker volume inspect heimdall_config
# Verificar montaje
docker inspect heimdall | grep -A 10 Mounts
# Restaurar desde backup
# Ver guía: [[Backup y Restauración]]
```
### Actualizaciones muy frecuentes
LinuxServer.io actualiza regularmente. Para estabilidad:
**Usar tag específico**:
```yaml
services:
heimdall:
image: lscr.io/linuxserver/heimdall:2.5.8
```
**Actualizar manualmente** cada 1-2 meses en lugar de `:latest`.
## 📊 Mejores Prácticas
1.**Backup antes de actualizar** (siempre)
2.**Actualizar en horario de bajo uso** (madrugada)
3.**Verificar changelog** antes de actualizar
4.**Probar en desarrollo** si tienes entorno test
5.**Mantener 2-3 backups** recientes
6.**Monitorear logs** tras actualización
7.**NO actualizar en producción** sin backup
## 🔄 Frecuencia Recomendada
| Entorno | Frecuencia | Método |
|---------|-----------|--------|
| **Producción** | Mensual | Manual con backup |
| **Personal** | Semanal | Watchtower o manual |
| **Testing** | Diario | Watchtower |
## 🚀 Actualización con Downtime Cero
Para entornos críticos:
1. Despliega segunda instancia con nueva versión
2. Configura balanceo en proxy (NPM/Traefik)
3. Cambia tráfico a nueva instancia
4. Verifica funcionamiento
5. Detiene instancia antigua
**Con Traefik**:
```yaml
services:
heimdall-blue:
# Versión actual
heimdall-green:
# Nueva versión
# Traefik balancea entre ambas
# Cambiar peso gradualmente
```
## 📚 Siguiente Paso
- [[Backup y Restauración]] - Protege tu configuración
- [[Solución de Problemas]] - Resolver errores
---
**Repositorio**: [groales/heimdall](https://git.ictiberia.com/groales/heimdall)

423
Backup-y-Restauración.md Normal file

@@ -0,0 +1,423 @@
# Backup y Restauración
Guía completa para hacer backup de tu configuración de Heimdall y restaurarla en caso de desastre.
## 📦 ¿Qué se Guarda?
Heimdall almacena toda la configuración en el volumen `heimdall_config`:
```
/config/
├── www/
│ ├── app.sqlite ← Base de datos (apps, settings)
│ ├── icons/ ← Iconos subidos
│ └── backgrounds/ ← Imágenes de fondo subidas
├── log/ ← Logs de la aplicación
└── nginx/ ← Configuración NGINX
```
**Importante**: Solo necesitas backup de `/config/www/` para recuperar tus aplicaciones y personalización.
## 💾 Métodos de Backup
### Método 1: Backup Completo del Volumen (Recomendado)
Este método guarda TODO el volumen.
#### Desde CLI
```bash
# Crear directorio de backups
mkdir -p ~/backups/heimdall
# Backup completo
docker run --rm \
-v heimdall_config:/config \
-v ~/backups/heimdall:/backup \
alpine tar czf /backup/heimdall-config-$(date +%Y%m%d-%H%M%S).tar.gz -C /config .
# Ejemplo de resultado:
# heimdall-config-20251203-143022.tar.gz
```
#### Desde PowerShell (Windows)
```powershell
# Crear directorio de backups
New-Item -ItemType Directory -Force -Path "$HOME\backups\heimdall"
# Backup completo
docker run --rm `
-v heimdall_config:/config `
-v ${HOME}\backups\heimdall:/backup `
alpine tar czf /backup/heimdall-config-$(Get-Date -Format "yyyyMMdd-HHmmss").tar.gz -C /config .
```
#### Automatizar con Cron (Linux)
```bash
# Editar crontab
crontab -e
# Añadir backup diario a las 3 AM
0 3 * * * docker run --rm -v heimdall_config:/config -v ~/backups/heimdall:/backup alpine tar czf /backup/heimdall-config-$(date +\%Y\%m\%d).tar.gz -C /config .
# Limpiar backups antiguos (mantener 30 días)
0 4 * * * find ~/backups/heimdall -name "heimdall-config-*.tar.gz" -mtime +30 -delete
```
#### Automatizar con Tarea Programada (Windows)
**PowerShell script** (`heimdall-backup.ps1`):
```powershell
$BackupPath = "$HOME\backups\heimdall"
$Date = Get-Date -Format "yyyyMMdd-HHmmss"
$BackupFile = "heimdall-config-$Date.tar.gz"
docker run --rm `
-v heimdall_config:/config `
-v ${BackupPath}:/backup `
alpine tar czf /backup/$BackupFile -C /config .
# Limpiar backups antiguos (30 días)
Get-ChildItem -Path $BackupPath -Filter "heimdall-config-*.tar.gz" |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item
```
**Crear tarea**:
```powershell
$Action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-File C:\Scripts\heimdall-backup.ps1"
$Trigger = New-ScheduledTaskTrigger -Daily -At 3am
Register-ScheduledTask -TaskName "Heimdall Backup" -Action $Action -Trigger $Trigger
```
### Método 2: Backup Solo de Base de Datos
Más rápido, solo guarda configuración (no iconos/fondos subidos).
```bash
# Backup de SQLite
docker exec heimdall cat /config/www/app.sqlite > ~/backups/heimdall-$(date +%Y%m%d).sqlite
# Verificar
file ~/backups/heimdall-$(date +%Y%m%d).sqlite
# Debe decir: SQLite 3.x database
```
### Método 3: Backup con docker-compose
Si usas `docker-compose`:
```yaml
# Añadir servicio de backup en docker-compose.override.yml
services:
heimdall-backup:
image: alpine:latest
volumes:
- heimdall_config:/config:ro
- ./backups:/backup
command: >
sh -c "tar czf /backup/heimdall-config-$$(date +%Y%m%d-%H%M%S).tar.gz -C /config . &&
find /backup -name 'heimdall-config-*.tar.gz' -mtime +30 -delete"
profiles:
- backup
```
Ejecutar manualmente:
```bash
docker compose --profile backup run --rm heimdall-backup
```
### Método 4: Backup Remoto (Nextcloud/NAS)
#### A Nextcloud
```bash
# Backup + subida a Nextcloud
BACKUP_FILE="heimdall-config-$(date +%Y%m%d).tar.gz"
docker run --rm \
-v heimdall_config:/config \
-v /tmp:/backup \
alpine tar czf /backup/$BACKUP_FILE -C /config .
# Subir a Nextcloud con curl
curl -u "usuario:password" \
-T /tmp/$BACKUP_FILE \
"https://nextcloud.tudominio.com/remote.php/dav/files/usuario/Backups/$BACKUP_FILE"
rm /tmp/$BACKUP_FILE
```
#### A NAS (SMB/CIFS)
```bash
# Montar carpeta NAS
sudo mount -t cifs //nas.local/backups /mnt/nas -o username=user,password=pass
# Backup directo a NAS
docker run --rm \
-v heimdall_config:/config \
-v /mnt/nas/heimdall:/backup \
alpine tar czf /backup/heimdall-config-$(date +%Y%m%d).tar.gz -C /config .
```
## 🔄 Restauración
### Restaurar Backup Completo
```bash
# Detener Heimdall
docker stop heimdall
# Restaurar
docker run --rm \
-v heimdall_config:/config \
-v ~/backups/heimdall:/backup \
alpine tar xzf /backup/heimdall-config-20251203-143022.tar.gz -C /config
# Iniciar Heimdall
docker start heimdall
```
#### PowerShell (Windows)
```powershell
# Detener Heimdall
docker stop heimdall
# Restaurar (ajustar nombre de archivo)
docker run --rm `
-v heimdall_config:/config `
-v ${HOME}\backups\heimdall:/backup `
alpine tar xzf /backup/heimdall-config-20251203-143022.tar.gz -C /config
# Iniciar Heimdall
docker start heimdall
```
### Restaurar Solo Base de Datos
```bash
# Detener Heimdall
docker stop heimdall
# Restaurar SQLite
cat ~/backups/heimdall-20251203.sqlite | docker exec -i heimdall tee /config/www/app.sqlite > /dev/null
# Iniciar Heimdall
docker start heimdall
```
### Restaurar en Nuevo Servidor
```bash
# 1. Clonar repositorio
git clone https://git.ictiberia.com/groales/heimdall
cd heimdall
# 2. Desplegar Heimdall (sin configuración)
docker compose up -d
# 3. Detener para restaurar
docker stop heimdall
# 4. Copiar backup al servidor
scp ~/backups/heimdall-config-20251203.tar.gz user@nuevo-servidor:/tmp/
# 5. Restaurar (en nuevo servidor)
docker run --rm \
-v heimdall_config:/config \
-v /tmp:/backup \
alpine tar xzf /backup/heimdall-config-20251203.tar.gz -C /config
# 6. Iniciar
docker start heimdall
```
## 🔁 Migración entre Modos
### De Standalone a NPM/Traefik
La configuración de Heimdall es independiente del proxy. Solo necesitas:
1. Hacer backup del volumen
2. Cambiar override file
3. Restaurar backup
```bash
# Backup actual
docker run --rm -v heimdall_config:/config -v /tmp:/backup \
alpine tar czf /backup/heimdall-migrate.tar.gz -C /config .
# Detener stack actual
docker compose down
# Cambiar override
cp docker-compose.override.npm.yml.example docker-compose.override.yml
# Desplegar con nuevo override
docker compose up -d
# Restaurar configuración (si es nueva instalación)
docker stop heimdall
docker run --rm -v heimdall_config:/config -v /tmp:/backup \
alpine tar xzf /backup/heimdall-migrate.tar.gz -C /config
docker start heimdall
```
## 🗄️ Backup con Watchtower
Si usas **Watchtower** para auto-actualizar, configura backup previo:
```yaml
# docker-compose.yml de Heimdall
services:
heimdall:
labels:
- "com.centurylinklabs.watchtower.lifecycle.pre-update=/backup.sh"
```
Crear script `/backup.sh` en contenedor:
```bash
#!/bin/sh
tar czf /backup/heimdall-pre-update-$(date +%Y%m%d-%H%M%S).tar.gz -C /config .
```
## 📊 Verificar Backup
```bash
# Listar contenido sin extraer
tar tzf ~/backups/heimdall-config-20251203.tar.gz
# Debe mostrar:
# www/app.sqlite
# www/icons/
# www/backgrounds/
# log/
# nginx/
```
## 🐛 Solución de Problemas
### Backup corrupto
```bash
# Verificar integridad
tar tzf ~/backups/heimdall-config-20251203.tar.gz > /dev/null
# Si falla:
# tar: Error is not recoverable: exiting now
# → Backup corrupto, usar backup anterior
```
### Permisos incorrectos tras restaurar
```bash
# Ajustar permisos (PUID/PGID del docker-compose.yml)
docker exec heimdall chown -R 1000:1000 /config
```
### Base de datos bloqueada
```bash
# Detener Heimdall antes de backup/restauración
docker stop heimdall
# Si persiste:
docker exec heimdall fuser /config/www/app.sqlite
# Matar proceso si es necesario
```
## ☁️ Backup en la Nube
### Rclone (recomendado)
Soporta Google Drive, Dropbox, OneDrive, S3, etc.
```bash
# Instalar rclone
curl https://rclone.org/install.sh | sudo bash
# Configurar (seguir wizard)
rclone config
# Backup a Google Drive
BACKUP_FILE="heimdall-config-$(date +%Y%m%d).tar.gz"
docker run --rm \
-v heimdall_config:/config \
-v /tmp:/backup \
alpine tar czf /backup/$BACKUP_FILE -C /config .
rclone copy /tmp/$BACKUP_FILE gdrive:Backups/Heimdall/
rm /tmp/$BACKUP_FILE
```
### Restic (con encriptación)
```bash
# Instalar restic
sudo apt install restic
# Inicializar repositorio
restic -r /mnt/backups/heimdall init
# Backup encriptado
docker run --rm \
-v heimdall_config:/config \
-v /tmp:/backup \
alpine tar czf /backup/heimdall-latest.tar.gz -C /config .
restic -r /mnt/backups/heimdall backup /tmp/heimdall-latest.tar.gz
# Restaurar
restic -r /mnt/backups/heimdall restore latest --target /tmp/restore
```
## 📅 Estrategia de Backup Recomendada
```
Diario: Backup completo (retener 7 días)
Semanal: Backup completo (retener 4 semanas)
Mensual: Backup completo (retener 12 meses)
```
Script completo:
```bash
#!/bin/bash
BACKUP_DIR=~/backups/heimdall
DATE=$(date +%Y%m%d)
BACKUP_FILE="heimdall-config-$DATE.tar.gz"
# Crear backup
docker run --rm \
-v heimdall_config:/config \
-v $BACKUP_DIR:/backup \
alpine tar czf /backup/$BACKUP_FILE -C /config .
# Copiar a semanales (si es domingo)
if [ $(date +%u) -eq 7 ]; then
cp $BACKUP_DIR/$BACKUP_FILE $BACKUP_DIR/weekly/
fi
# Copiar a mensuales (si es día 1)
if [ $(date +%d) -eq 01 ]; then
cp $BACKUP_DIR/$BACKUP_FILE $BACKUP_DIR/monthly/
fi
# Limpiar antiguos
find $BACKUP_DIR -maxdepth 1 -name "heimdall-config-*.tar.gz" -mtime +7 -delete
find $BACKUP_DIR/weekly -name "heimdall-config-*.tar.gz" -mtime +28 -delete
find $BACKUP_DIR/monthly -name "heimdall-config-*.tar.gz" -mtime +365 -delete
```
## 🚀 Siguiente Paso
- [[Actualización]] - Mantén Heimdall al día
- [[Solución de Problemas]] - Resolver errores comunes
---
**Repositorio**: [groales/heimdall](https://git.ictiberia.com/groales/heimdall)

330
Configuración-Inicial.md Normal file

@@ -0,0 +1,330 @@
# Configuración Inicial
Guía para configurar Heimdall tras el primer despliegue, independientemente del modo usado ([[Traefik]], [[NPM]], o [[Standalone]]).
## 🎯 Primer Acceso
Al abrir Heimdall por primera vez verás una interfaz vacía con mensaje de bienvenida.
### Activar Modo Edición
1. Click en el **icono de llave inglesa** 🔧 (esquina superior derecha)
2. La interfaz cambia a modo edición (fondo con cuadrícula)
## Añadir Primera Aplicación
### Ejemplo: Añadir Portainer
1. Click en **Add Application** (botón grande en el centro)
2. Rellenar formulario:
**Campos básicos**:
- **Application name**: `Portainer`
- **Colour**: `#13bef9` (azul Portainer)
- **Icon**: Buscar `portainer` en el selector
- **URL**: `https://portainer.tudominio.com` (o IP:puerto si standalone)
- **Description**: `Gestión de contenedores Docker`
**Opciones adicionales (opcional)**:
- **Pinned**: ✅ (mantiene la app al inicio)
- **Open in new window**: ✅ (abre en nueva pestaña)
3. Click en **Save** 💾
La aplicación aparece como tarjeta en el dashboard.
## 🎨 Añadir Más Aplicaciones
### Aplicaciones Comunes
#### Proxmox
```
Name: Proxmox
Colour: #E57000
Icon: proxmox
URL: https://proxmox.tudominio.com:8006
Description: Virtualización y contenedores
```
#### Jellyfin
```
Name: Jellyfin
Colour: #00A4DC
Icon: jellyfin
URL: https://jellyfin.tudominio.com
Description: Servidor multimedia
```
#### Home Assistant
```
Name: Home Assistant
Colour: #41BDF5
Icon: home-assistant
URL: https://homeassistant.tudominio.com
Description: Domótica
```
#### Pi-hole
```
Name: Pi-hole
Colour: #96060C
Icon: pi-hole
URL: https://pihole.tudominio.com/admin
Description: Bloqueador DNS
```
#### qBittorrent
```
Name: qBittorrent
Colour: #3889CE
Icon: qbittorrent
URL: https://qbittorrent.tudominio.com
Description: Cliente torrent
```
## 🔌 Enhanced Apps - Widgets Especiales
Heimdall soporta widgets avanzados para apps populares que muestran información en tiempo real.
### Configurar Enhanced App
#### Ejemplo: Sonarr
1. Click en **engranaje** ⚙️ de la aplicación
2. **Enable**: ✅ Marcar checkbox
3. **Application type**: Seleccionar `Sonarr`
4. **Enhanced options** (se expande):
- **API Key**: Ir a Sonarr → Settings → General → API Key (copiar)
- Pegar en Heimdall
5. **Save**
El widget ahora muestra:
- Próximos episodios
- Series monitorizadas
- Actividad de descargas
### Enhanced Apps Disponibles
| Aplicación | Muestra |
|-----------|---------|
| **Plex** | Streams activos, películas/series |
| **Sonarr** | Próximos episodios, series |
| **Radarr** | Próximas películas, biblioteca |
| **Lidarr** | Próximos lanzamientos, artistas |
| **SABnzbd** | Cola de descargas, velocidad |
| **NZBGet** | Cola, historial |
| **Deluge** | Torrents activos, velocidad |
| **qBittorrent** | Torrents, ratio |
| **Pi-hole** | Consultas bloqueadas, % bloqueo |
| **Nextcloud** | Notificaciones |
| **pfSense** | Tráfico, alertas |
### Obtener API Keys
**Sonarr/Radarr/Lidarr**:
```
Settings → General → Security → API Key
```
**SABnzbd**:
```
Config → General → Security → API Key
```
**NZBGet**:
```
Settings → Security → ControlPassword (usar como API Key)
```
**qBittorrent**:
```
# No requiere API Key, usa usuario/password en enhanced options
```
**Pi-hole**:
```
# API Token desde la UI o:
sudo cat /etc/pihole/setupVars.conf | grep WEBPASSWORD
```
## 🏷️ Organizar con Tags
Los **tags** permiten agrupar aplicaciones por categorías.
### Crear Tags
1. Al añadir/editar app, campo **Tags**: `media, streaming`
2. Separar múltiples tags con comas
3. **Save**
### Filtrar por Tags
- Los tags aparecen como botones en la parte superior
- Click en un tag para filtrar aplicaciones
### Tags Sugeridos
```
media - Jellyfin, Plex, Emby
automation - Sonarr, Radarr, Lidarr
downloads - SABnzbd, qBittorrent, Deluge
infrastructure- Portainer, Proxmox, Traefik
monitoring - Grafana, Prometheus, Uptime Kuma
security - Pi-hole, pfSense, Vaultwarden
productivity - Nextcloud, Bookstack, Wiki.js
```
## 🎨 Personalización Visual
### Cambiar Tema
1. **Modo edición****Settings** (icono engranaje arriba)
2. **Theme**: Seleccionar tema
- Classic (claro)
- Dark (oscuro)
- Nord
- Gruvbox
- Custom (personalizado)
3. **Save**
### Cambiar Fondo
#### Opción 1: URL de Imagen
1. **Settings****Background image**
2. URL: `https://example.com/imagen.jpg`
3. **Save**
#### Opción 2: Subir Imagen
1. **Settings****Background image**
2. Click en **Upload**
3. Seleccionar imagen local
4. **Save**
#### Opción 3: Unsplash Aleatoria
URL de Unsplash con keywords:
```
https://source.unsplash.com/1920x1080/?nature,landscape
```
### Ajustar Búsqueda
**Settings****Search Settings**:
- **Enable search**: ✅
- **Search provider**:
- Google
- DuckDuckGo
- Bing
- StartPage
- Custom
**Custom search URL**:
```
https://duckduckgo.com/?q=
```
## 📐 Organizar Dashboard
### Reordenar Aplicaciones
En **modo edición**:
1. **Drag & drop** las tarjetas
2. Soltar donde quieras
3. Salir de modo edición → Se guarda automáticamente
### Crear Secciones
Usa **tags** + orden para crear secciones visuales:
1. Agrupa apps similares con mismo tag
2. Reordena para que queden juntas
3. Ejemplo:
```
[Media] [Media] [Media]
[Downloads] [Downloads]
[Admin] [Admin]
```
### Aplicaciones Destacadas
Marca **Pinned** ✅ en aplicaciones importantes para mantenerlas arriba.
## ⚙️ Configuración Avanzada
### Multi-usuario (con proxy)
Heimdall no tiene autenticación nativa. Usa:
**Con NPM**:
- Access List con usuario/password (ver [[NPM]])
**Con Traefik**:
- Middleware BasicAuth (ver [[Traefik]])
### Dashboard Público vs Privado
**Privado** (recomendado):
- Heimdall detrás de VPN
- Access List limitada a red local
- Autenticación en proxy
**Público** (con precaución):
- Solo enlaces a servicios públicos
- No incluir IPs internas
- No incluir admin panels
### Configurar Idioma
Heimdall actualmente solo soporta inglés en UI. Los **nombres y descripciones** de apps pueden ser en español.
## 🔧 Ajustes del Sistema
### Variables de Entorno
Editar en **Portainer** → Stack Editor o en `docker-compose.yml`:
```yaml
environment:
PUID: 1000 # ID de usuario (tu UID)
PGID: 1000 # ID de grupo (tu GID)
TZ: Europe/Madrid # Zona horaria
```
**Obtener tu UID/GID**:
```bash
id
```
### Reiniciar Heimdall
```bash
docker restart heimdall
```
O desde Portainer:
**Containers** → `heimdall` → **Restart**
## 📱 Acceso Móvil
Heimdall es completamente responsive.
### Añadir a Pantalla de Inicio (iOS/Android)
**iOS**:
1. Safari → `https://heimdall.tudominio.com`
2. Icono compartir → **Añadir a pantalla de inicio**
3. Nombrar: `Dashboard`
**Android**:
1. Chrome → `https://heimdall.tudominio.com`
2. Menú → **Añadir a pantalla de inicio**
Ahora funciona como una app.
## 🚀 Siguiente Paso
- [[Personalización]] - Temas, fondos, búsqueda avanzada
- [[Backup y Restauración]] - Protege tu configuración
- [[Actualización]] - Mantén Heimdall al día
---
**Repositorio**: [groales/heimdall](https://git.ictiberia.com/groales/heimdall)

39
Home.md

@@ -1 +1,38 @@
¡Bienvenidos a la Wiki!
# Wiki: Heimdall Application Dashboard
Bienvenido a la documentación de **Heimdall**, un dashboard elegante para organizar todos tus servicios web.
## 📋 Índice
### Información General
- [[Home]] - Esta página
- [[Configuración Inicial]] - Primeros pasos tras el despliegue
- [[Personalización]] - Temas, fondos y organización
### Modos de Despliegue
- [[Traefik]] - Integración con Traefik (proxy reverso)
- [[NPM]] - Integración con NGINX Proxy Manager
- [[Standalone]] - Acceso directo sin proxy (IP:puerto)
### Administración
- [[Backup y Restauración]] - Gestión de configuraciones
- [[Actualización]] - Mantener Heimdall al día
- [[Solución de Problemas]] - Errores comunes y soluciones
## 🎯 ¿Qué modo usar?
| Modo | Cuándo usarlo | Ventajas |
|------|---------------|----------|
| **[[Traefik]]** | Infraestructura con Traefik | SSL automático, routing avanzado |
| **[[NPM]]** | Infraestructura con NPM | UI gráfica, SSL Let's Encrypt |
| **[[Standalone]]** | Testing, entornos sin proxy | Simple, acceso directo |
## 🔒 Recomendación de Seguridad
**En producción**: Usa siempre **[[Traefik]]** o **[[NPM]]** con SSL. El modo **[[Standalone]]** es solo para testing o redes internas confiables.
## 🔗 Recursos Oficiales
- [Documentación LinuxServer.io](https://docs.linuxserver.io/images/docker-heimdall)
- [GitHub - Heimdall](https://github.com/linuxserver/Heimdall)
- [Docker Hub](https://hub.docker.com/r/linuxserver/heimdall)

262
NPM.md Normal file

@@ -0,0 +1,262 @@
# Integración con NGINX Proxy Manager
Esta guía explica cómo desplegar Heimdall con **NPM (NGINX Proxy Manager)** del repositorio [groales/npm](https://git.ictiberia.com/groales/npm).
## 📋 Requisitos Previos
- ✅ NPM desplegado y funcionando ([groales/npm](https://git.ictiberia.com/groales/npm))
- ✅ Red Docker `proxy` creada (NPM la crea automáticamente)
- ✅ DNS configurado apuntando a tu servidor (ej: `heimdall.tudominio.com`)
- ✅ Acceso a la UI de NPM (puerto 81)
## 🚀 Despliegue desde Portainer
### 1. Crear Stack en Portainer
**Stacks****Add stack**
**Configuración**:
- **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**: `docker-compose.override.npm.yml.example`
- **Deploy the stack**
### 2. Verificar Despliegue
**Stacks**`heimdall` → Ver contenedor
Estado debe ser **running**
```bash
docker logs heimdall
```
Deberías ver:
```
[services.d] starting services
[services.d] done.
```
### 3. Configurar Proxy Host en NPM
Accede a NPM: `http://IP-del-servidor:81`
**Dashboard****Proxy Hosts****Add Proxy Host**
#### Pestaña Details
- **Domain Names**: `heimdall.tudominio.com`
- **Scheme**: `http` ⚠️ (importante: HTTP, no HTTPS)
- **Forward Hostname / IP**: `heimdall` (nombre del contenedor)
- **Forward Port**: `80`
- **Cache Assets**: ✅ (opcional, mejora rendimiento)
- **Block Common Exploits**: ✅ (recomendado)
- **Websockets Support**: ❌ (no necesario para Heimdall)
#### Pestaña SSL
-**Request a new SSL Certificate**
-**Force SSL** (redirige HTTP → HTTPS)
-**HTTP/2 Support**
- **Email Address**: `tu@email.com`
-**I Agree to the Let's Encrypt Terms of Service**
**Save** 💾
### 4. Acceder
Abre tu navegador en: `https://heimdall.tudominio.com` 🎉
NPM gestiona automáticamente el certificado SSL con Let's Encrypt.
## 🛠️ Despliegue desde CLI
### 1. Clonar repositorio
```bash
git clone https://git.ictiberia.com/groales/heimdall
cd heimdall
```
### 2. Copiar override
```bash
cp docker-compose.override.npm.yml.example docker-compose.override.yml
```
### 3. Desplegar
```bash
docker compose up -d
```
### 4. Configurar en NPM
Sigue el **paso 3** de la sección anterior (Configurar Proxy Host en NPM).
## 📝 Configuración Completa del Override
El archivo `docker-compose.override.npm.yml.example` es muy simple:
```yaml
services:
heimdall:
networks:
- proxy
networks:
proxy:
external: true
```
**¿Por qué tan simple?**
Porque NPM no usa labels de Docker. Toda la configuración (dominio, SSL, headers) se hace desde la UI de NPM.
## 🔒 Seguridad Adicional con Access Lists
NPM permite restringir acceso por IP mediante Access Lists.
### Crear Access List
**Dashboard****Access Lists****Add Access List**
**Details**:
- **Name**: `Red Local`
- **Satisfy Any**: ❌ (desmarcado = todas las reglas deben cumplirse)
**Authorization**:
- Añadir usuario/password (opcional)
**Access**:
- **Allow**: `192.168.1.0/24` (tu red local)
- **Allow**: `10.0.0.0/8` (si usas VPN)
- **Deny**: `0.0.0.0/0` (denegar todo lo demás)
**Save**
### Aplicar Access List a Heimdall
**Proxy Hosts** → Editar `heimdall.tudominio.com`
**Pestaña Details**:
- **Access List**: Seleccionar `Red Local`
**Save**
Ahora solo IPs de tu red local pueden acceder a Heimdall.
## 🔐 Protección con Usuario/Contraseña
En la Access List, pestaña **Authorization**:
**Añadir usuario**:
- **Username**: `admin`
- **Password**: `contraseña_segura`
- **Add**
**Save**
Ahora NPM pedirá usuario/contraseña antes de acceder a Heimdall.
## 🌐 Configuración Avanzada
### Headers de Seguridad Personalizados
**Proxy Hosts** → Editar `heimdall.tudominio.com`**Pestaña Advanced**
```nginx
# Security Headers
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# Opcional: Content Security Policy
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline';" always;
```
### Rate Limiting
Limitar peticiones por IP:
```nginx
# Limitar a 10 peticiones por segundo
limit_req_zone $binary_remote_addr zone=heimdall_limit:10m rate=10r/s;
limit_req zone=heimdall_limit burst=20 nodelay;
```
## 🔄 Actualización
```bash
docker compose pull
docker compose up -d
```
La configuración en NPM se mantiene automáticamente.
## 🐛 Solución de Problemas
### Error 502 Bad Gateway
**Verificar que Heimdall está corriendo**:
```bash
docker ps | grep heimdall
```
**Verificar red proxy**:
```bash
docker network inspect proxy
```
Tanto NPM como Heimdall deben aparecer en la red.
**Verificar en NPM**:
- **Forward Hostname**: Debe ser `heimdall` (nombre del contenedor), no IP
- **Forward Port**: Debe ser `80`
- **Scheme**: Debe ser `http`
### SSL no se genera
**Verificar DNS**:
```bash
nslookup heimdall.tudominio.com
```
Debe resolver a la IP pública de tu servidor.
**Verificar puertos**:
- Puerto 80 (HTTP) debe estar accesible desde Internet (Let's Encrypt lo necesita)
- Puerto 443 (HTTPS) debe estar accesible
**Ver logs de NPM**:
```bash
docker logs npm
```
### Heimdall no aparece en la red proxy
**Recrear stack**:
```bash
docker compose down
docker compose up -d
```
**Verificar override**:
```bash
docker compose config
```
Debe mostrar la red `proxy` con `external: true`.
## 📚 Siguiente Paso
Ve a [[Configuración Inicial]] para configurar Heimdall.
---
**Repositorio**: [groales/heimdall](https://git.ictiberia.com/groales/heimdall)
**NPM**: [groales/npm](https://git.ictiberia.com/groales/npm)

539
Personalización.md Normal file

@@ -0,0 +1,539 @@
# Personalización
Guía completa para personalizar Heimdall: temas, fondos, iconos, búsqueda y configuraciones avanzadas.
## 🎨 Temas
Heimdall incluye varios temas predefinidos.
### Cambiar Tema
1. **Modo edición** (icono llave 🔧)
2. **Settings** (engranaje arriba)
3. **Theme**: Seleccionar tema
4. **Save**
### Temas Disponibles
#### Classic (Claro)
```
Fondo: Blanco
Tarjetas: Blancas con sombra
Texto: Negro
Ideal: Uso diurno
```
#### Dark (Oscuro)
```
Fondo: Gris oscuro (#1a1a1a)
Tarjetas: Gris medio (#2d2d2d)
Texto: Blanco
Ideal: Uso nocturno, menos fatiga visual
```
#### Nord
```
Basado en paleta Nord
Tonos azules fríos
Aspecto: Moderno y minimalista
```
#### Gruvbox
```
Basado en esquema Gruvbox
Tonos cálidos tierra
Aspecto: Retro y acogedor
```
#### Custom (Personalizado)
Permite definir colores propios mediante CSS.
### Crear Tema Custom
1. **Settings****Theme**: `Custom`
2. **Custom CSS** (se habilita):
```css
/* Fondo principal */
body {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
/* Tarjetas de aplicaciones */
.item {
background: rgba(255, 255, 255, 0.1);
backdrop-filter: blur(10px);
border: 1px solid rgba(255, 255, 255, 0.2);
}
/* Texto */
.item-title {
color: #ffffff;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
```
3. **Save**
### Ejemplos de CSS Custom
#### Glassmorphism
```css
body {
background: linear-gradient(135deg, #1e3c72 0%, #2a5298 100%);
}
.item {
background: rgba(255, 255, 255, 0.15);
backdrop-filter: blur(15px);
border-radius: 15px;
border: 1px solid rgba(255, 255, 255, 0.3);
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
}
```
#### Matrix Theme
```css
body {
background: #000000;
}
.item {
background: #001a00;
border: 1px solid #00ff00;
box-shadow: 0 0 10px #00ff00;
}
.item-title {
color: #00ff00;
font-family: 'Courier New', monospace;
}
```
#### Dracula Theme
```css
body {
background: #282a36;
}
.item {
background: #44475a;
border: 1px solid #6272a4;
}
.item-title {
color: #f8f8f2;
}
.item-description {
color: #6272a4;
}
```
## 🖼️ Fondos
### Tipos de Fondos
#### 1. URL de Imagen
**Settings****Background image**:
```
https://images.unsplash.com/photo-1579546929518-9e396f3cc809
```
#### 2. Subir Imagen Local
1. **Settings****Background image**
2. Click en **Upload**
3. Seleccionar archivo (JPG, PNG)
4. Max: 5MB recomendado
#### 3. Unsplash Aleatoria
URL dinámica que cambia cada vez:
```
https://source.unsplash.com/1920x1080/?landscape,nature
```
Categorías populares:
```
?landscape - Paisajes
?space - Espacio
?city,night - Ciudad nocturna
?nature,forest - Bosque
?mountain - Montañas
?abstract - Abstracto
?technology - Tecnología
```
#### 4. Gradientes CSS
En **Custom CSS**:
```css
body {
background: linear-gradient(45deg, #FF6B6B, #4ECDC4);
}
```
Gradientes populares:
```css
/* Sunset */
background: linear-gradient(to right, #fa709a 0%, #fee140 100%);
/* Ocean */
background: linear-gradient(to right, #2E3192 0%, #1BFFFF 100%);
/* Purple Dream */
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
/* Dark Ocean */
background: linear-gradient(to top, #0f2027, #203a43, #2c5364);
```
#### 5. Animaciones
Fondo animado con CSS:
```css
@keyframes gradient {
0% { background-position: 0% 50%; }
50% { background-position: 100% 50%; }
100% { background-position: 0% 50%; }
}
body {
background: linear-gradient(-45deg, #ee7752, #e73c7e, #23a6d5, #23d5ab);
background-size: 400% 400%;
animation: gradient 15s ease infinite;
}
```
### Ajustes de Fondo
```css
/* Fondo fijo (no scroll) */
body {
background-attachment: fixed;
}
/* Cubrir toda la pantalla */
body {
background-size: cover;
background-position: center;
}
/* Oscurecer fondo */
body::before {
content: "";
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
z-index: -1;
}
```
## 🔍 Búsqueda
### Configurar Motor de Búsqueda
**Settings****Search Settings**:
#### Motores Predefinidos
- **Google**: `https://www.google.com/search?q=`
- **DuckDuckGo**: `https://duckduckgo.com/?q=`
- **Bing**: `https://www.bing.com/search?q=`
- **StartPage**: `https://www.startpage.com/do/search?q=`
#### Motores Custom
**Brave**:
```
https://search.brave.com/search?q=
```
**Ecosia**:
```
https://www.ecosia.org/search?q=
```
**Qwant**:
```
https://www.qwant.com/?q=
```
**SearX** (autohosteado):
```
https://searx.tudominio.com/search?q=
```
### Abrir en Nueva Pestaña
```css
/* Force search to open in new tab */
.search-form {
target: _blank;
}
```
## 🎯 Iconos
### Opciones de Iconos
#### 1. Iconos Predefinidos
Heimdall incluye cientos de iconos. Al añadir app:
**Icon**: Buscar nombre (ej: `portainer`, `plex`, `jellyfin`)
#### 2. URL de Icono Custom
**Icon**: Pegar URL directa:
```
https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/portainer.png
```
#### 3. Font Awesome
```html
<i class="fab fa-docker"></i>
```
#### 4. Emoji
Simplemente usa el emoji:
```
📊 Grafana
🐳 Portainer
🎬 Jellyfin
```
### Repositorios de Iconos
#### Dashboard Icons (recomendado)
```
https://github.com/walkxcode/dashboard-icons
```
Usar vía jsDelivr:
```
https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons/png/[nombre].png
```
#### Home Assistant Icons
```
https://github.com/home-assistant/brands/tree/master/core_integrations
```
#### Simple Icons
```
https://simpleicons.org/
```
### Crear Iconos Custom
**Online**:
1. [Favicon.io](https://favicon.io/) - Generador de favicons
2. [Flaticon](https://www.flaticon.com/) - Miles de iconos
3. Redimensionar a 128x128px o 256x256px
**Local**:
```bash
# Convertir y redimensionar con ImageMagick
convert icono.png -resize 128x128 icono-128.png
```
Subir a:
- Repositorio Git
- CDN (Cloudflare R2, AWS S3)
- Nextcloud/servidor propio
## 🎨 Colores de Aplicaciones
### Colores por Marca
```yaml
Portainer: #13bef9
Jellyfin: #00A4DC
Plex: #E5A00D
Sonarr: #35C5F4
Radarr: #FFC230
Lidarr: #159552
qBittorrent: #3889CE
Nextcloud: #0082C9
Pi-hole: #96060C
Proxmox: #E57000
Grafana: #F46800
Home Assistant: #41BDF5
Vaultwarden: #175DDC
```
### Herramientas de Color
**Obtener color de logo**:
1. [ImageColorPicker.com](https://imagecolorpicker.com/)
2. Subir logo
3. Click en color principal
4. Copiar HEX
**Generar paletas**:
- [Coolors.co](https://coolors.co/)
- [Adobe Color](https://color.adobe.com/)
## 📐 Layout y Organización
### Tamaño de Tarjetas
```css
/* Tarjetas más grandes */
.item {
width: 300px;
height: 200px;
}
/* Tarjetas más pequeñas (más apps visibles) */
.item {
width: 150px;
height: 120px;
}
/* Tarjetas rectangulares */
.item {
width: 350px;
height: 180px;
}
```
### Grid Layout
```css
/* 3 columnas en desktop */
.items {
grid-template-columns: repeat(3, 1fr);
}
/* 5 columnas en pantallas grandes */
.items {
grid-template-columns: repeat(5, 1fr);
}
/* Auto-ajustar según espacio */
.items {
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
}
```
### Espaciado
```css
/* Más espacio entre tarjetas */
.items {
gap: 30px;
}
/* Menos espacio */
.items {
gap: 10px;
}
```
## 🔤 Tipografía
### Cambiar Fuente
```css
/* Google Fonts */
@import url('https://fonts.googleapis.com/css2?family=Roboto:wght@400;700&display=swap');
body, .item-title {
font-family: 'Roboto', sans-serif;
}
```
Fuentes populares:
```css
/* Moderna */
font-family: 'Inter', sans-serif;
/* Mono espaciada (tech) */
font-family: 'JetBrains Mono', monospace;
/* Elegante */
font-family: 'Playfair Display', serif;
```
### Tamaño de Texto
```css
/* Títulos más grandes */
.item-title {
font-size: 20px;
font-weight: 700;
}
/* Descripción más pequeña */
.item-description {
font-size: 12px;
}
```
## 🌙 Modo Oscuro Automático
Cambiar tema según hora del día:
```javascript
// Añadir en Custom CSS como <script>
const hour = new Date().getHours();
if (hour >= 20 || hour < 7) {
document.body.classList.add('dark-theme');
}
```
## 💾 Exportar/Importar Configuración
Heimdall guarda todo en `/config`:
```bash
# Backup de configuración
docker exec heimdall cat /config/www/app.sqlite > heimdall-config.sqlite
# Restaurar
cat heimdall-config.sqlite | docker exec -i heimdall tee /config/www/app.sqlite > /dev/null
docker restart heimdall
```
Ver guía completa: [[Backup y Restauración]]
## 📱 Responsive
Heimdall es responsive por defecto, pero puedes ajustar:
```css
/* Tablet */
@media (max-width: 1024px) {
.items {
grid-template-columns: repeat(3, 1fr);
}
}
/* Móvil */
@media (max-width: 768px) {
.items {
grid-template-columns: repeat(2, 1fr);
}
.item {
height: 100px;
}
}
```
## 🚀 Siguiente Paso
- [[Backup y Restauración]] - Protege tu configuración
- [[Actualización]] - Mantén Heimdall al día
---
**Repositorio**: [groales/heimdall](https://git.ictiberia.com/groales/heimdall)

638
Solución-de-Problemas.md Normal file

@@ -0,0 +1,638 @@
# Solución de Problemas
Guía completa para resolver los problemas más comunes con Heimdall.
## 🔍 Diagnóstico General
Antes de buscar soluciones específicas, recopila información:
```bash
# Estado del contenedor
docker ps -a | grep heimdall
# Logs recientes
docker logs --tail 50 heimdall
# Logs en vivo
docker logs -f heimdall
# Inspeccionar contenedor
docker inspect heimdall
# Verificar volumen
docker volume inspect heimdall_config
# Verificar red (si usas proxy)
docker network inspect proxy
```
## 🚫 Problemas de Acceso
### No puedo acceder a Heimdall
#### Síntoma: Timeout o "No se puede acceder al sitio"
**1. Verificar que el contenedor está corriendo**:
```bash
docker ps | grep heimdall
```
Si NO aparece:
```bash
# Ver por qué se detuvo
docker ps -a | grep heimdall
docker logs heimdall
```
**2. Verificar modo de despliegue**:
**Standalone** - Debe tener puertos publicados:
```bash
docker ps | grep heimdall
# Debe mostrar: 0.0.0.0:8080->80/tcp
```
Si no hay puertos:
```bash
# Verifica que usaste override standalone
docker compose config | grep -A 5 ports
```
**Con proxy (NPM/Traefik)** - Debe estar en red proxy:
```bash
docker network inspect proxy | grep heimdall
```
Si no aparece:
```bash
# Verifica override
docker compose config | grep -A 5 networks
```
**3. Verificar conectividad**:
Desde el host:
```bash
curl http://localhost:8080 # Si standalone
curl http://heimdall # Si proxy (desde otro contenedor en red proxy)
```
Desde otro dispositivo:
```bash
curl http://IP-DEL-SERVIDOR:8080
telnet IP-DEL-SERVIDOR 8080
```
**4. Verificar firewall**:
Linux (UFW):
```bash
sudo ufw status
sudo ufw allow 8080/tcp # Si standalone
```
Linux (iptables):
```bash
sudo iptables -L -n | grep 8080
```
Windows:
```powershell
Get-NetFirewallRule | Where-Object DisplayName -like "*8080*"
# Crear regla si no existe
New-NetFirewallRule -DisplayName "Heimdall" -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow
```
### Error 502 Bad Gateway (con proxy)
**Causa**: NPM/Traefik no puede conectar con Heimdall.
**Solución**:
1. **Verificar que están en la misma red**:
```bash
docker network inspect proxy
# Deben aparecer tanto npm/traefik como heimdall
```
2. **Verificar nombre del contenedor**:
En NPM: **Forward Hostname** debe ser `heimdall`
En Traefik: Labels deben usar el nombre correcto
```bash
# Verificar nombre real
docker ps | grep heimdall
# Usar el nombre exacto en NAMES
```
3. **Verificar puerto interno**:
En NPM: **Forward Port** debe ser `80` (no 8080)
En Traefik: `loadbalancer.server.port=80`
4. **Recrear stack**:
```bash
docker compose down
docker compose up -d
```
### Error 404 Not Found (con Traefik)
**Causa**: Traefik no encuentra el router.
**Solución**:
1. **Verificar labels**:
```bash
docker inspect heimdall | grep -A 20 Labels
```
Debe incluir:
```
traefik.enable=true
traefik.http.routers.heimdall.rule=Host(...)
```
2. **Verificar en Traefik Dashboard**:
Accede al dashboard de Traefik y busca:
- **HTTP Routers** → `heimdall` (debe aparecer)
- **Services** → `heimdall@docker`
Si no aparece: Revisar override y labels.
3. **Verificar dominio**:
```bash
nslookup heimdall.tudominio.com
# Debe resolver a IP del servidor
```
### Advertencia de certificado SSL
**Modo Standalone** (puerto 8443):
**Causa**: Heimdall usa certificado autofirmado.
**Soluciones**:
1. Acepta la advertencia (OK para red local)
2. Usa HTTP puerto 8080 en su lugar
3. Migra a [[NPM]] o [[Traefik]] para SSL real
**Con proxy**:
**Causa**: SSL no configurado correctamente.
NPM: Verifica que marcaste "Request a new SSL Certificate"
Traefik: Verifica que `tls.certresolver=letsencrypt`
```bash
# Ver logs de generación de certificado
docker logs npm | grep -i ssl
docker logs traefik | grep -i certificate
```
## 🗄️ Problemas de Base de Datos
### "Database is locked"
**Síntoma**: Error al guardar aplicaciones o configuración.
**Causa**: Múltiples procesos accediendo a SQLite simultáneamente.
**Solución**:
1. **Reiniciar contenedor**:
```bash
docker restart heimdall
```
2. **Si persiste, verificar procesos**:
```bash
docker exec heimdall fuser /config/www/app.sqlite
```
3. **Reparar base de datos**:
```bash
# Backup primero
docker exec heimdall cp /config/www/app.sqlite /config/www/app.sqlite.bak
# Reparar
docker exec heimdall sqlite3 /config/www/app.sqlite "PRAGMA integrity_check;"
# Si falla, restaurar desde backup
# Ver [[Backup y Restauración]]
```
### Aplicaciones desaparecen tras reiniciar
**Causa**: Base de datos no persiste.
**Solución**:
1. **Verificar volumen**:
```bash
docker volume inspect heimdall_config
# Debe existir y tener Mountpoint
```
2. **Verificar montaje en contenedor**:
```bash
docker inspect heimdall | grep -A 10 Mounts
# Debe mostrar heimdall_config montado en /config
```
3. **Si el volumen no existe, recrearlo**:
```bash
docker compose down
docker volume create heimdall_config
docker compose up -d
```
**Nota**: Si recreas el volumen, perderás la configuración. Restaura desde backup.
## 🔐 Problemas de Permisos
### "Permission denied" en logs
**Síntoma**:
```
s6-supervise nginx: warning: unable to spawn ./run - disabling service
Permission denied
```
**Causa**: PUID/PGID incorrectos.
**Solución**:
1. **Verificar tu UID/GID**:
```bash
id
# uid=1000(user) gid=1000(user)
```
2. **Actualizar docker-compose.yml**:
```yaml
environment:
PUID: 1000 # Tu UID
PGID: 1000 # Tu GID
```
3. **Recrear contenedor**:
```bash
docker compose down
docker compose up -d
```
4. **Si persiste, forzar permisos**:
```bash
docker exec heimdall chown -R 1000:1000 /config
docker restart heimdall
```
### No puedo subir iconos o fondos
**Síntoma**: Error al subir archivos en Settings.
**Solución**:
1. **Verificar permisos de escritura**:
```bash
docker exec heimdall ls -la /config/www/
# Debe ser owned por PUID:PGID
```
2. **Verificar espacio en disco**:
```bash
df -h
```
3. **Ajustar permisos**:
```bash
docker exec heimdall chown -R 1000:1000 /config/www
docker exec heimdall chmod -R 755 /config/www
```
## 🎨 Problemas de Interfaz
### Interfaz se ve rota (sin estilos)
**Síntoma**: Solo texto plano, sin colores ni diseño.
**Causa**: Archivos estáticos no cargan.
**Solución**:
1. **Limpiar caché del navegador**:
- Chrome: Ctrl+Shift+Delete
- Firefox: Ctrl+Shift+Delete
- Safari: Cmd+Opt+E
2. **Forzar recarga sin caché**:
- Ctrl+F5 (Windows/Linux)
- Cmd+Shift+R (Mac)
3. **Verificar logs de NGINX**:
```bash
docker logs heimdall | grep -i error
```
4. **Recrear contenedor**:
```bash
docker compose down
docker compose up -d --force-recreate
```
### Cambios no se guardan
**Síntoma**: Edito aplicaciones pero desaparecen al recargar.
**Causa**: Sesión o base de datos.
**Solución**:
1. **Verificar que sales del modo edición** (click en llave de nuevo)
2. **Limpiar cookies**:
- Navegador → Configuración → Cookies
- Eliminar cookies de heimdall.tudominio.com
3. **Verificar base de datos**:
```bash
docker exec heimdall ls -la /config/www/app.sqlite
# Debe tener tamaño > 0
```
4. **Verificar permisos de escritura** (ver sección anterior)
### Enhanced apps no funcionan
**Síntoma**: No muestra información de Sonarr/Radarr/etc.
**Solución**:
1. **Verificar API Key**:
- Copia de nuevo el API Key desde la app
- Pega en Heimdall sin espacios extra
2. **Verificar URL**:
- Debe ser accesible desde Heimdall
- Si está en la misma red proxy: `http://sonarr:8989`
- Si es externo: `https://sonarr.tudominio.com`
3. **Probar conectividad**:
```bash
docker exec heimdall curl http://sonarr:8989/api/system/status -H "X-Api-Key: TU_API_KEY"
```
4. **Verificar CORS**:
Algunas apps bloquean peticiones desde Heimdall. Verifica logs de la app (Sonarr/Radarr).
## 🌐 Problemas de Red
### Contenedor no puede conectar a Internet
**Síntoma**: Enhanced apps no funcionan, no descarga iconos.
**Solución**:
1. **Verificar DNS**:
```bash
docker exec heimdall cat /etc/resolv.conf
docker exec heimdall ping -c 3 google.com
```
2. **Configurar DNS custom en docker-compose.yml**:
```yaml
services:
heimdall:
dns:
- 8.8.8.8
- 1.1.1.1
```
3. **Recrear contenedor**:
```bash
docker compose down
docker compose up -d
```
### No puedo conectar con otros contenedores
**Síntoma**: Enhanced apps no funcionan con apps locales.
**Causa**: No están en la misma red Docker.
**Solución**:
1. **Verificar redes**:
```bash
# Red de Heimdall
docker inspect heimdall | grep -A 10 Networks
# Red de Sonarr (ejemplo)
docker inspect sonarr | grep -A 10 Networks
```
2. **Conectar a red compartida**:
Si ambos deben comunicarse, usa red proxy:
```bash
docker network connect proxy sonarr
docker network connect proxy heimdall
```
O configura en docker-compose.yml:
```yaml
networks:
- proxy
```
## 🔄 Problemas de Actualización
Ver guía completa: [[Actualización]]
### Actualización falla
```bash
# Restaurar desde backup
docker run --rm \
-v heimdall_config:/config \
-v ~/backups/heimdall:/backup \
alpine tar xzf /backup/heimdall-pre-update-20251203.tar.gz -C /config
docker start heimdall
```
### Nuevo contenedor no inicia
```bash
# Ver logs de inicio
docker logs heimdall
# Volver a versión anterior
docker compose down
# Editar docker-compose.yml: cambiar :latest por :2.5.7
docker compose up -d
```
## 🐛 Problemas Específicos
### Puerto 8080 ya en uso
**Síntoma**:
```
Error starting userland proxy: listen tcp 0.0.0.0:8080: bind: address already in use
```
**Solución**:
1. **Ver qué proceso usa el puerto**:
```bash
# Linux
sudo netstat -tulpn | grep :8080
sudo lsof -i :8080
# Windows
Get-NetTCPConnection -LocalPort 8080
```
2. **Cambiar puerto en override standalone**:
```yaml
ports:
- "9080:80" # Usar puerto 9080 en lugar de 8080
```
3. **Recrear**:
```bash
docker compose up -d
```
### Contenedor se reinicia constantemente
**Síntoma**: `docker ps` muestra `Restarting (1) 5 seconds ago`
**Solución**:
1. **Ver logs de error**:
```bash
docker logs heimdall
```
2. **Errores comunes**:
- Permisos: Ajustar PUID/PGID
- Volumen corrupto: Restaurar desde backup
- Puerto en uso: Cambiar puerto
3. **Detener auto-restart para debug**:
```bash
docker update --restart=no heimdall
docker stop heimdall
# Investigar problema
# Arreglar
docker start heimdall
docker update --restart=unless-stopped heimdall
```
### Certificado SSL no se renueva (con proxy)
**Con NPM**:
1. Verificar que puerto 80 es accesible desde Internet
2. **Proxy Hosts** → Editar → SSL → **Force Renew**
**Con Traefik**:
1. Verificar logs:
```bash
docker logs traefik | grep -i certificate
docker logs traefik | grep -i acme
```
2. Verificar archivo acme.json:
```bash
docker exec traefik ls -la /letsencrypt/acme.json
# Debe tener permisos 600
```
3. Forzar renovación:
```bash
docker exec traefik rm /letsencrypt/acme.json
docker restart traefik
```
## 🔧 Modo de Recuperación
Si nada funciona:
### Reset Completo
```bash
# 1. Backup actual (por si acaso)
docker run --rm \
-v heimdall_config:/config \
-v /tmp:/backup \
alpine tar czf /backup/heimdall-emergency.tar.gz -C /config .
# 2. Detener y eliminar todo
docker compose down
docker volume rm heimdall_config
# 3. Redesplegar limpio
docker compose up -d
# 4. Si necesitas recuperar datos, restaura backup
docker stop heimdall
docker run --rm \
-v heimdall_config:/config \
-v /tmp:/backup \
alpine tar xzf /backup/heimdall-emergency.tar.gz -C /config
docker start heimdall
```
## 📊 Herramientas de Diagnóstico
### Verificación Completa
Script para recopilar toda la info:
```bash
#!/bin/bash
echo "=== HEIMDALL DIAGNOSTICS ==="
echo ""
echo "--- Container Status ---"
docker ps -a | grep heimdall
echo ""
echo "--- Recent Logs ---"
docker logs --tail 20 heimdall
echo ""
echo "--- Volume Info ---"
docker volume inspect heimdall_config
echo ""
echo "--- Network Info ---"
docker network inspect proxy 2>/dev/null | grep -A 5 heimdall || echo "Not in proxy network"
echo ""
echo "--- Config Files ---"
docker exec heimdall ls -la /config/www/
echo ""
echo "--- Disk Space ---"
df -h | grep docker
```
## 📚 Recursos Adicionales
- [[Configuración Inicial]] - Configurar desde cero
- [[Backup y Restauración]] - Recuperación de datos
- [[Actualización]] - Problemas de actualización
**Soporte oficial**:
- [Foro LinuxServer.io](https://discourse.linuxserver.io/)
- [Discord LinuxServer.io](https://discord.gg/YWrKVTn)
- [GitHub Issues](https://github.com/linuxserver/Heimdall/issues)
---
**Repositorio**: [groales/heimdall](https://git.ictiberia.com/groales/heimdall)

314
Standalone.md Normal file

@@ -0,0 +1,314 @@
# Modo Standalone - Acceso Directo
Esta guía explica cómo desplegar Heimdall con **acceso directo** mediante IP:puerto, sin proxy inverso.
## ⚠️ Advertencia de Seguridad
**Este modo NO es recomendado para producción**. Solo úsalo para:
- 🧪 **Testing** y desarrollo
- 🏠 **Redes internas** confiables
- 🔧 **Troubleshooting** temporal
**Para producción**: Usa [[Traefik]] o [[NPM]] con SSL.
## 📋 Cuándo Usar Este Modo
**Usa standalone si**:
- Estás probando Heimdall por primera vez
- Tu servidor solo es accesible desde red local
- No tienes dominio o DNS configurado
- Necesitas acceso temporal rápido
**NO uses standalone si**:
- El servidor es accesible desde Internet
- Necesitas SSL/HTTPS
- Tienes múltiples servicios
- Es un entorno de producción
## 🚀 Despliegue desde Portainer
### 1. Crear Stack en Portainer
**Stacks****Add stack**
**Configuración**:
- **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**: `docker-compose.override.standalone.yml.example`
- **Deploy the stack**
### 2. Verificar Despliegue
**Stacks**`heimdall` → Ver contenedor
Estado debe ser **running**
```bash
docker ps | grep heimdall
```
Deberías ver:
```
CONTAINER ID IMAGE PORTS NAMES
abc123def456 lscr.io/linuxserver/heimdall:latest 0.0.0.0:8080->80/tcp, 0.0.0.0:8443->443/tcp heimdall
```
### 3. Acceder
Abre tu navegador en:
- **HTTP**: `http://IP-del-servidor:8080`
- **HTTPS**: `https://IP-del-servidor:8443` (certificado autofirmado ⚠️)
## 🛠️ Despliegue desde CLI
### 1. Clonar repositorio
```bash
git clone https://git.ictiberia.com/groales/heimdall
cd heimdall
```
### 2. Copiar override
```bash
cp docker-compose.override.standalone.yml.example docker-compose.override.yml
```
### 3. Desplegar
```bash
docker compose up -d
```
### 4. Verificar
```bash
docker logs -f heimdall
```
## 📝 Configuración Completa del Override
El archivo `docker-compose.override.standalone.yml.example`:
```yaml
services:
heimdall:
ports:
- "8080:80"
- "8443:443"
```
**Explicación**:
- `8080:80` - Puerto HTTP del host → Puerto 80 del contenedor
- `8443:443` - Puerto HTTPS del host → Puerto 443 del contenedor
## 🔧 Personalización de Puertos
Si los puertos 8080/8443 están ocupados, edita el override:
```yaml
services:
heimdall:
ports:
- "9080:80" # HTTP en puerto 9080
- "9443:443" # HTTPS en puerto 9443
```
Luego actualiza el stack:
```bash
docker compose up -d
```
Acceso: `http://IP-del-servidor:9080`
## 🔒 Mejorar Seguridad en Modo Standalone
### 1. Firewall - Restringir Acceso por IP
**UFW (Ubuntu/Debian)**:
```bash
# Permitir solo desde red local
sudo ufw allow from 192.168.1.0/24 to any port 8080
sudo ufw allow from 192.168.1.0/24 to any port 8443
# Denegar desde otras IPs (se aplica automáticamente)
sudo ufw enable
```
**Firewalld (CentOS/RHEL)**:
```bash
# Crear zona para red local
sudo firewall-cmd --permanent --new-zone=localnet
sudo firewall-cmd --permanent --zone=localnet --add-source=192.168.1.0/24
sudo firewall-cmd --permanent --zone=localnet --add-port=8080/tcp
sudo firewall-cmd --permanent --zone=localnet --add-port=8443/tcp
sudo firewall-cmd --reload
```
**Windows Firewall**:
```powershell
# Crear regla para puerto 8080
New-NetFirewallRule -DisplayName "Heimdall HTTP" -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow -RemoteAddress 192.168.1.0/24
# Crear regla para puerto 8443
New-NetFirewallRule -DisplayName "Heimdall HTTPS" -Direction Inbound -LocalPort 8443 -Protocol TCP -Action Allow -RemoteAddress 192.168.1.0/24
```
### 2. Proxy Reverso Local (Opcional)
Puedes usar **Caddy** o **NGINX** local para añadir SSL:
**Caddy** (más fácil):
```caddyfile
heimdall.local {
reverse_proxy localhost:8080
tls internal # Genera certificado autofirmado
}
```
**NGINX**:
```nginx
server {
listen 443 ssl http2;
server_name heimdall.local;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
location / {
proxy_pass http://localhost:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
```
### 3. VPN - Acceso Remoto Seguro
Si necesitas acceder desde fuera de tu red local, usa VPN (WireGuard, OpenVPN) en lugar de exponer puertos.
**WireGuard**:
```bash
# Instalar WireGuard
sudo apt install wireguard
# Conectar a tu red
wg-quick up wg0
# Acceder a Heimdall via IP local
http://192.168.1.100:8080
```
## 🐛 Solución de Problemas
### Puerto ocupado
**Ver qué proceso usa el puerto**:
```bash
# Linux
sudo netstat -tulpn | grep :8080
sudo lsof -i :8080
# Windows
Get-NetTCPConnection -LocalPort 8080
```
**Solución**: Cambia el puerto en el override (ver sección Personalización).
### No puedo acceder desde otro dispositivo
**Verificar que el puerto está publicado**:
```bash
docker ps | grep heimdall
```
Debe aparecer: `0.0.0.0:8080->80/tcp`
**Verificar firewall del host**:
```bash
# Linux
sudo ufw status
sudo iptables -L
# Windows
Get-NetFirewallRule | Where-Object DisplayName -like "*8080*"
```
**Verificar conectividad**:
```bash
# Desde otro dispositivo
ping IP-del-servidor
telnet IP-del-servidor 8080
```
### Advertencia de certificado en HTTPS (puerto 8443)
**Esto es normal**. Heimdall usa un certificado autofirmado.
**Opciones**:
1. Acepta la advertencia (OK para red local)
2. Usa HTTP (puerto 8080) en su lugar
3. Migra a [[NPM]] o [[Traefik]] para SSL real
### Contenedor no arranca
**Ver logs**:
```bash
docker logs heimdall
```
**Errores comunes**:
- `port already allocated` → Puerto ocupado, cambiar en override
- `permission denied` → Verificar PUID/PGID en docker-compose.yml
## 🔄 Migrar a Proxy Reverso
Cuando estés listo para producción:
### Opción 1: Migrar a NPM
1. Despliega NPM: [groales/npm](https://git.ictiberia.com/groales/npm)
2. Cambia el override:
```bash
cp docker-compose.override.npm.yml.example docker-compose.override.yml
docker compose up -d
```
3. Configura Proxy Host en NPM: Ver [[NPM]]
### Opción 2: Migrar a Traefik
1. Despliega Traefik: [groales/traefik](https://git.ictiberia.com/groales/traefik)
2. Cambia el override:
```bash
cp docker-compose.override.traefik.yml.example docker-compose.override.yml
# Editar dominio
docker compose up -d
```
3. Ver guía completa: [[Traefik]]
**Ventajas de migrar**:
- ✅ SSL automático con Let's Encrypt
- ✅ Acceso por dominio (no IP:puerto)
- ✅ Mejor seguridad
- ✅ Fácil de compartir con otros
## 📊 Comparación de Modos
| Característica | Standalone | NPM | Traefik |
|---------------|-----------|-----|---------|
| **SSL automático** | ❌ | ✅ | ✅ |
| **Acceso por dominio** | ❌ | ✅ | ✅ |
| **Dificultad setup** | Fácil | Media | Media |
| **Ideal para** | Testing | Producción | Producción |
| **Requiere DNS** | ❌ | ✅ | ✅ |
## 📚 Siguiente Paso
Ve a [[Configuración Inicial]] para configurar Heimdall.
---
**Repositorio**: [groales/heimdall](https://git.ictiberia.com/groales/heimdall)

224
Traefik.md Normal file

@@ -0,0 +1,224 @@
# Integración con Traefik
Esta guía explica cómo desplegar Heimdall con **Traefik** del repositorio [groales/traefik](https://git.ictiberia.com/groales/traefik).
## 📋 Requisitos Previos
- ✅ Traefik desplegado y funcionando ([groales/traefik](https://git.ictiberia.com/groales/traefik))
- ✅ Red Docker `proxy` creada (Traefik la crea automáticamente)
- ✅ DNS configurado apuntando a tu servidor (ej: `heimdall.tudominio.com`)
## 🚀 Despliegue desde Portainer
### 1. Crear Stack en Portainer
**Stacks****Add stack**
**Configuración**:
- **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**: `docker-compose.override.traefik.yml.example`
- **Deploy the stack**
### 2. Personalizar Dominio
Antes o después del despliegue, edita el dominio en el stack:
**Stacks**`heimdall`**Editor**
Busca en el archivo override:
```yaml
- "traefik.http.routers.heimdall.rule=Host(`heimdall.tudominio.com`)"
```
Cambia `heimdall.tudominio.com` por tu dominio real.
**Update the stack**
### 3. Verificar Despliegue
```bash
docker logs heimdall
```
Deberías ver:
```
[services.d] starting services
[services.d] done.
```
### 4. Verificar en Traefik
Accede al dashboard de Traefik y verifica:
- **HTTP Routers** → Debe aparecer `heimdall`
- **Services** → Debe aparecer `heimdall@docker`
- **Estado**: Verde (healthy)
### 5. Acceder
Abre tu navegador en: `https://heimdall.tudominio.com`
✅ Traefik gestiona automáticamente el certificado SSL con Let's Encrypt.
## 🛠️ Despliegue desde CLI
### 1. Clonar repositorio
```bash
git clone https://git.ictiberia.com/groales/heimdall
cd heimdall
```
### 2. Copiar y personalizar override
```bash
cp docker-compose.override.traefik.yml.example docker-compose.override.yml
```
Edita `docker-compose.override.yml`:
```yaml
- "traefik.http.routers.heimdall.rule=Host(`heimdall.tudominio.com`)"
```
### 3. Desplegar
```bash
docker compose up -d
```
### 4. Verificar logs
```bash
docker logs -f heimdall
```
## 📝 Configuración Completa del Override
El archivo `docker-compose.override.traefik.yml.example` incluye:
```yaml
services:
heimdall:
networks:
- proxy
labels:
# Habilitar Traefik
- "traefik.enable=true"
# Router HTTPS
- "traefik.http.routers.heimdall.rule=Host(`heimdall.tudominio.com`)"
- "traefik.http.routers.heimdall.entrypoints=websecure"
- "traefik.http.routers.heimdall.tls=true"
- "traefik.http.routers.heimdall.tls.certresolver=letsencrypt"
# Service backend
- "traefik.http.services.heimdall.loadbalancer.server.port=80"
# Middlewares de seguridad (opcional)
- "traefik.http.routers.heimdall.middlewares=security-headers@file"
networks:
proxy:
external: true
```
## 🔒 Seguridad Adicional
### Middleware de Autenticación Básica
Si quieres proteger Heimdall con usuario/contraseña:
1. Genera password hash:
```bash
echo $(htpasswd -nb admin tu_password) | sed -e s/\\$/\\$\\$/g
```
2. Añade al override:
```yaml
labels:
- "traefik.http.routers.heimdall.middlewares=heimdall-auth"
- "traefik.http.middlewares.heimdall-auth.basicauth.users=admin:$$apr1$$xxx"
```
### Restricción por IP (Access List)
En tu `traefik.yml` dinámico, define:
```yaml
http:
middlewares:
heimdall-ipwhitelist:
ipWhiteList:
sourceRange:
- "192.168.1.0/24"
- "10.0.0.0/8"
```
Y añade al override:
```yaml
labels:
- "traefik.http.routers.heimdall.middlewares=heimdall-ipwhitelist@file"
```
## 🔄 Actualización
```bash
docker compose pull
docker compose up -d
```
Heimdall mantiene la configuración gracias al volumen persistente `heimdall_config`.
## 🐛 Solución de Problemas
### Error 404 o Gateway Timeout
**Verificar red proxy**:
```bash
docker network inspect proxy
```
Heimdall debe aparecer en la lista de contenedores conectados.
**Verificar labels**:
```bash
docker inspect heimdall | grep -A 20 Labels
```
### SSL no funciona
**Verificar DNS**:
```bash
nslookup heimdall.tudominio.com
```
Debe resolver a la IP pública de tu servidor.
**Verificar logs de Traefik**:
```bash
docker logs traefik | grep heimdall
```
### Contenedor no arranca
**Ver logs detallados**:
```bash
docker logs heimdall
```
**Verificar permisos**:
```bash
docker exec heimdall ls -la /config
```
## 📚 Siguiente Paso
Ve a [[Configuración Inicial]] para configurar Heimdall.
---
**Repositorio**: [groales/heimdall](https://git.ictiberia.com/groales/heimdall)
**Traefik**: [groales/traefik](https://git.ictiberia.com/groales/traefik)