Saltar a contenido

Homelab — Índice

La fuente de verdad del estado del servidor es /home/notebook/AGENTS.md. Este archivo es solo un índice para humanos. No duplicar contenido de AGENTS.md acá.

Documentación por tema

  • Servicios Docker: Selfhosted/Docker/<servicio>.md
  • Composes de referencia: Selfhosted/Compose/
  • Game servers (Pelican): Selfhosted/Pelican/
  • Cloud: Cloud/
  • Backups y restore: Selfhosted/Docker/Backup del Homelab.md

Historial de cambios grandes

  • 01 sep 2026 — almacenamiento: el HDD Toshiba HDWG21C de 12 TB (/dev/sdb) fue reprovisionado con GPT y una única partición EXT4 (/dev/sdb1, etiqueta hdd_12tb). Está montado por UUID en /mnt/hdd_12tb y su entrada persistente en /etc/fstab usa defaults,nofail,x-systemd.device-timeout=5s, después de /mnt/backup_512 y /mnt/ssd_512.
  • 24 ago 2026 — Immich: migrada únicamente la biblioteca activa (4,8 GiB) desde /opt/docker/immich/library a /mnt/ssd_512/immich/library; PostgreSQL permanece en /opt/docker/immich/postgres. Verificados los tres contenedores saludables y respuestas HTTP 200 local/pública.
  • 17 ago 2026 — hardening y limpieza: activado UFW (deny incoming/routed), SSH key-only efectivo en 58450 sin forwarding/X11, retirado Cloudflare Tunnel, backends Docker sensibles ligados a loopback y permisos de secretos restringidos. Se retiraron servicios host residuales (Cockpit/PCP, nginx/PHP 8.4, MariaDB, Redis, PM2, libvirt/QEMU y open-vm-tools), se actualizaron todos los paquetes y quedó pendiente reiniciar para cargar el kernel 6.8.0-137. Navidrome permanece retirado y su vhost devuelve 410. El backup ahora incluye named volumes, checksum, locking y preflight; conserva 7 copias cifradas en B2 y elimina el staging local tras verificar la subida. Los servicios multimedia dependientes de /mnt/hdd_2tb quedan detenidos mediante homelab-mount-guard mientras el disco esté ausente.
  • 17 ago 2026 — recuperación Docker: al purgar configuración residual del paquete Ubuntu docker.io, su postrm intentó borrar /var/lib/docker usado por Docker CE. Se detuvo el proceso, se preservaron los 25 volúmenes y se reconstruyó el catálogo limpio desde Compose. Tras verificar 36 contenedores, datos persistentes y un backup local/B2 posterior, se eliminó /var/lib/docker.salvage-20260817; junto con caché APT y journals antiguos se recuperaron ~24 GiB (87% → 76%).
  • jul 2026: migración completa a WireGuard; eliminados Headscale/Headplane/Tailscale
  • ⚠️ tailscaled STILL activo y manejando /etc/resolv.conf (migración DNS incompleta). Pendiente desinstalar (no en sesión remota). LibreChat y Lidarr NO fueron eliminados (siguen corriendo).
  • jul 2026: HDD 2TB roto y desconectado; mountpoints inmutables con chattr +i
  • jul 2026: hardening de seguridad/redes — ver Selfhosted/Docker/Caddyfile.md y Selfhosted/Docker/ntfy.md
  • 27 jul 2026 — incidente "no anda nada desde afuera": NO era el firewall (ufw inactivo, INPUT/FORWARD ACCEPT, 80/443 abiertos). La IP pública cambió ~13:52 y deSEC devolvió HTTP 502 en tres intentos seguidos; el DNS recién se corrigió 14:10. Como deSEC fuerza minimum_ttl: 3600 (poner 300 devuelve HTTP 400), los resolvers de afuera siguieron con la IP vieja hasta ~1h. Diagnóstico rápido: comparar curl -s https://api.ipify.org contra dig +short A matias7235.com.ar @ns1.desec.io, y probar curl --resolve <host>:443:<IP_actual>. Si por IP anda y por nombre no → es cache de DNS, no el server.
  • 27 jul 2026: bajado collabora (imagen sin /bin/bash, no arrancaba desde hacía semanas) + opencloud-collaboration-1. Vhosts office. y wopi. fuera del Caddyfile. Reemplazo previsto: CryptPad.
  • 27 jul 2026: backup.sh mandaba las notificaciones ntfy sin token → 403 silencioso, el log mentía con "✅ Notificación enviada". Corregido con Authorization: Bearer + curl -sf.
  • Quitado /var/run/docker.sock de sonarr/radarr/lidarr (root-equivalent en servicios públicos).
  • ntfy con auth (default deny-all), token en /opt/scripts/ntfy.env.
  • Caddy: snippet (access_log) + headers HSTS includeSubDomains + X-Frame-Options SAMEORIGIN en (proxy).
  • fail2ban: jail caddy-auth (401/403/404 en sitios con login) + fail2ban-sync-public-ip.timer (evita auto-ban por hairpin).
  • ufw-docker: expuestos vía ufw route allow solo los puertos docker necesarios (forgejo SSH, qBittorrent, Ark/Minecraft). El resto bloqueado del WAN por defecto.
  • postfix loopback-only (ya no escucha en 0.0.0.0:25). unattended-upgrades notifica vía ntfy.
  • jun 2026: eliminados scrutiny, dozzle, glances, termix, code-executor, gptr-mcp, filebrowser, stirling
  • 15 ago 2026: desplegado RustDesk Server self-hosted (hbbs/hbbr, network_mode: host, puertos 21115-21117, imagen rustdesk/rustdesk-server:1.1.16) — ver Selfhosted/Docker/RustDesk.md. Solo LAN/WG (el router no forwardea los puertos). UFW sigue INACTIVO en el host (protección por router). Detenido navidrome (compose borrado el 14 ago sin parar el servicio); shared_redis se mantiene para Firecrawl y LibreChat usa shared_net para alcanzar Firecrawl.
  • 17 ago 2026: restaurado /opt/docker/shared/compose.yaml para gestionar shared_redis sin reiniciarlo. Immich vuelve a usar immich_net y shared_net externas; no usar external: false para shared_net, porque crea una red prefijada aislada. La biblioteca activa de Immich quedó en /opt/docker/immich/library (SSD), con marcadores .immich; la media histórica sigue en el backup frío.