Crear wiki completa de Heimdall con todas las guías
442
Actualización.md
Normal file
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
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
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
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
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
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
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
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
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)
|
||||
Reference in New Issue
Block a user