From 4ecd79e027a800610ebaf9dc9cea2b272e04ae2d Mon Sep 17 00:00:00 2001 From: groales Date: Wed, 3 Dec 2025 11:16:53 +0100 Subject: [PATCH] =?UTF-8?q?Crear=20wiki=20completa=20de=20Heimdall=20con?= =?UTF-8?q?=20todas=20las=20gu=C3=ADas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Actualización.md | 442 +++++++++++++++++++++++++++ Backup-y-Restauración.md | 423 ++++++++++++++++++++++++++ Configuración-Inicial.md | 330 ++++++++++++++++++++ Home.md | 39 ++- NPM.md | 262 ++++++++++++++++ Personalización.md | 539 +++++++++++++++++++++++++++++++++ Solución-de-Problemas.md | 638 +++++++++++++++++++++++++++++++++++++++ Standalone.md | 314 +++++++++++++++++++ Traefik.md | 224 ++++++++++++++ 9 files changed, 3210 insertions(+), 1 deletion(-) create mode 100644 Actualización.md create mode 100644 Backup-y-Restauración.md create mode 100644 Configuración-Inicial.md create mode 100644 NPM.md create mode 100644 Personalización.md create mode 100644 Solución-de-Problemas.md create mode 100644 Standalone.md create mode 100644 Traefik.md diff --git a/Actualización.md b/Actualización.md new file mode 100644 index 0000000..0ae2528 --- /dev/null +++ b/Actualización.md @@ -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) diff --git a/Backup-y-Restauración.md b/Backup-y-Restauración.md new file mode 100644 index 0000000..057990a --- /dev/null +++ b/Backup-y-Restauración.md @@ -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) diff --git a/Configuración-Inicial.md b/Configuración-Inicial.md new file mode 100644 index 0000000..a873ca3 --- /dev/null +++ b/Configuración-Inicial.md @@ -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) diff --git a/Home.md b/Home.md index 0ab951d..3b4be0d 100644 --- a/Home.md +++ b/Home.md @@ -1 +1,38 @@ -¡Bienvenidos a la Wiki! \ No newline at end of file +# 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) \ No newline at end of file diff --git a/NPM.md b/NPM.md new file mode 100644 index 0000000..ec06249 --- /dev/null +++ b/NPM.md @@ -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) diff --git a/Personalización.md b/Personalización.md new file mode 100644 index 0000000..96def1a --- /dev/null +++ b/Personalización.md @@ -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 + +``` + +#### 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