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