[{"data":1,"prerenderedAt":188},["ShallowReactive",2],{"seo-verification":3,"blog-stack-homelab-vps-2026-cinco-servicios-self-hosted-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-stack-homelab-vps-2026-cinco-servicios-self-hosted-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":29,"intro":32,"sections":33,"ctaTitle":124,"ctaBody":125,"ctaButton":126,"ctaUrl":127,"relatedPosts":128},388,"stack-homelab-vps-2026-cinco-servicios-self-hosted",{"fr":12,"en":13,"ar":14,"es":10},"homelab-stack-vps-2026","2026-homelab-stack-vps-five-self-hosted-services","stack-homelab-vps-2026-5-خدمات-self-hosted","Stack homelab VPS 2026: cinco servicios self-hosted","Despliega cinco servicios self-hosted — Nextcloud, Vaultwarden, Jellyfin, Immich y Paperless-ngx — en un Docker Compose unificado con Caddy en un solo VPS.",10,0,false,"2026-09-29T00:00:00+00:00","2026-09-29T14:40:42+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},3,"Despliegue","deploiement","bg-success\u002F10 text-success",[28],{"id":23,"name":24,"slug":25,"color":26,"icon":25},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fhomelab-stack-vps-2026-poster.svg","Alojar una aplicación en un VPS se ha convertido en algo rutinario para los desarrolladores. Alojar cinco aplicaciones a la vez — un gestor de archivos, una bóveda de contraseñas, un servidor multimedia, una biblioteca de fotos y un archivador de documentos — en el mismo VPS, con un único archivo de composición y un único certificado SSL, es otra historia. Esta guía presenta la arquitectura completa del stack homelab 2026: cómo dimensionar el servidor, cómo estructurar el `docker-compose.yml`, cómo configurar Caddy para enrutar cada subdominio y cómo evitar los errores más habituales en el arranque.",[34,38,49,52,80,114,118,121],{"type":35,"title":36,"body":37},"h2","Por qué consolidar cinco servicios en un solo VPS","El enfoque «una app, un VPS» tiene su lógica: aislamiento total, despliegue independiente, sin riesgo de contención. También tiene un coste real — cinco servidores, cinco direcciones IP, cinco renovaciones, cinco configuraciones de nginx, cinco certificados TLS que vigilar. Para un stack personal o un equipo pequeño, ese coste solo se justifica si las aplicaciones tienen picos de carga muy distintos o requisitos de seguridad incompatibles.\n\nNextcloud, Vaultwarden, Jellyfin, Immich y Paperless-ngx comparten la característica de ser aplicaciones de tráfico moderado, utilizadas principalmente por uno o pocos usuarios. Vaultwarden consume menos de 50 MB de RAM en modo de espera. Paperless-ngx ronda los 200 MB. Immich, el más exigente en reposo fuera del transcodificado, se mantiene por debajo de 400 MB en inactividad. Estas mediciones están documentadas en los proyectos GitHub respectivos y en los comentarios de la comunidad self-hosting.\n\nLa consolidación en un VPS no elimina los riesgos — los concentra. La contrapartida es un único punto de entrada que endurecer, un único certificado que gestionar y un manifiesto Docker Compose versionado que constituye por sí solo la documentación completa de la infraestructura.",{"type":39,"title":40,"items":41},"ul","Lo que este stack aporta en la práctica",[42,43,44,45,46,47,48],"**Soberanía sobre los datos** — archivos, contraseñas, fotos y documentos permanecen en tu servidor, bajo tu clave de cifrado, sin dependencia de ningún proveedor cloud de terceros.","**Un único certificado TLS wildcard** — Caddy solicita y renueva automáticamente `*.votre-domaine.com` mediante el reto DNS-01, cubriendo todos los subdominios del stack con una sola configuración.","**Red Docker interna aislada** — ninguna aplicación expone un puerto público directamente; todo el tráfico entrante pasa por Caddy en los puertos 80 y 443, y los servicios se comunican a través de una red bridge privada.","**Volúmenes nombrados y restauración predecible** — cada servicio declara sus datos en un volumen Docker nombrado (`nextcloud_data`, `vaultwarden_data`…), lo que hace que las copias de seguridad y las migraciones sean reproducibles con un solo comando `rsync`.","**Actualizaciones independientes** — descargar una nueva imagen de Immich no reinicia ni Jellyfin ni Paperless-ngx; `docker compose up -d --no-deps immich` solo toca el servicio en cuestión.","**Coste fijo y predecible** — un VPS de recursos fijos elimina las sorpresas de facturación que generan los servicios en la nube cuando el transcodificado de Jellyfin se dispara o las tareas OCR de Paperless-ngx se acumulan.","**Posible interconexión de servicios** — Nextcloud puede usar Redis y MariaDB ya presentes en el Compose; Immich comparte la misma red que el reverse proxy sin configuración adicional.",{"type":35,"title":50,"body":51},"Requisitos previos: dimensionamiento y puertos","El suelo realista para este stack en uso habitual es **4 vCPU \u002F 8 GB de RAM \u002F 100 GB de almacenamiento SSD**. Este dimensionamiento cubre las huellas en reposo de cada servicio y deja margen para el transcodificado bajo demanda de Jellyfin y las tareas OCR de Paperless-ngx, que son los dos picos de carga más relevantes del stack.\n\nHuellas medidas en modo de espera (sin sesión activa, sin tarea en segundo plano):\n\n- **Nextcloud** (PHP-FPM + cron): ~300 MB según la carga de sincronización.\n- **Vaultwarden**: \u003C 50 MB, imagen Rust muy compacta.\n- **Jellyfin**: ~250 MB sin transcodificado activo. En transcodificado software (x264, 1080p): entre 1 y 2 vCPU en punta.\n- **Immich** (server + microservices): ~350-400 MB en reposo. Las tareas de aprendizaje automático (detección de caras, clasificación) pueden consumir hasta 2 GB de RAM según el volumen.\n- **Paperless-ngx** (web + worker): ~200 MB. El OCR de Tesseract sobre un PDF de 50 páginas puede saturar temporalmente un vCPU.\n- **Caddy**: \u003C 30 MB.\n- **Bases de datos** (MariaDB para Nextcloud + Paperless, Redis): ~200 MB combinados.\n\nTotal estimado en reposo: ~1,6 GB de los 8 GB disponibles. El margen absorbe los picos y permite añadir otro servicio sin redimensionar.\n\nPuertos que abrir en el cortafuegos: **80\u002Ftcp** y **443\u002Ftcp** únicamente. El resto permanece cerrado — los servicios internos no se exponen directamente.",{"type":53,"title":54,"steps":55},"steps","Despliegue paso a paso",[56,59,62,65,68,71,74,77],{"title":57,"body":58},"Preparar el VPS","Conéctate por SSH a tu VPS y actualiza el sistema: `apt update && apt upgrade -y`. Instala Docker y el plugin Compose: `curl -fsSL https:\u002F\u002Fget.docker.com | sh`. Verifica la instalación: `docker compose version`. Crea un usuario no root dedicado y agrégalo al grupo `docker`: `adduser deploy && usermod -aG docker deploy`. Activa UFW con las reglas mínimas: `ufw allow 22\u002Ftcp && ufw allow 80\u002Ftcp && ufw allow 443\u002Ftcp && ufw enable`.",{"title":60,"body":61},"Configurar el DNS","En tu zona DNS, crea un registro A para el dominio raíz apuntando a la IP de tu VPS, luego subdominios CNAME o A para cada servicio: `nextcloud.votre-domaine.com`, `vault.votre-domaine.com`, `jellyfin.votre-domaine.com`, `photos.votre-domaine.com` y `docs.votre-domaine.com`. Si usas el reto DNS-01 de Caddy para el certificado wildcard, asegúrate de que tu proveedor DNS tiene una API compatible con el módulo `caddy-dns` correspondiente. Espera la propagación del DNS (entre minutos y horas según el TTL configurado).",{"title":63,"body":64},"Crear la estructura de directorios","Crea el árbol del proyecto en el VPS: `mkdir -p \u002Fopt\u002Fhomelab\u002F{caddy,nextcloud,vaultwarden,jellyfin,immich,paperless}`. Este directorio contendrá el archivo `docker-compose.yml`, el `Caddyfile` y los archivos de entorno. Los datos persistentes se almacenarán en volúmenes Docker nombrados, no en bind-mounts, para simplificar las copias de seguridad y evitar problemas de permisos.",{"title":66,"body":67},"Escribir el Caddyfile","En `\u002Fopt\u002Fhomelab\u002Fcaddy\u002FCaddyfile`, declara un bloque por subdominio. Ejemplo para Nextcloud: `nextcloud.votre-domaine.com { reverse_proxy nextcloud:80 }`. Repite el patrón para cada servicio apuntando al nombre del servicio Docker (`vaultwarden`, `jellyfin`, `immich-server`, `paperless-webserver`). Caddy obtiene y renueva los certificados Let's Encrypt automáticamente en el primer acceso. Para un certificado wildcard, sustituye los bloques individuales por `*.votre-domaine.com` con el módulo DNS de tu proveedor, configurado mediante las variables de entorno de la imagen Caddy personalizada.",{"title":69,"body":70},"Escribir el docker-compose.yml","Crea `\u002Fopt\u002Fhomelab\u002Fdocker-compose.yml` con una red `proxy` compartida y una red `internal` aislada. Declara el servicio Caddy con `ports: [\"80:80\", \"443:443\"]` y `volumes: [\".\u002Fcaddy\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile\", \"caddy_data:\u002Fdata\"]`. Para cada aplicación, declara `networks: [proxy, internal]` y no expongas ningún `ports:` — solo Caddy expone puertos públicos. Usa `depends_on` con `condition: service_healthy` para que Nextcloud no intente conectarse a MariaDB antes de que esté lista. Las variables sensibles (contraseñas de bases de datos, claves secretas) van en un archivo `.env` referenciado por `env_file: .env`.",{"title":72,"body":73},"Configurar las variables de entorno","Crea `\u002Fopt\u002Fhomelab\u002F.env` con las variables requeridas por cada servicio: `MYSQL_ROOT_PASSWORD`, `MYSQL_DATABASE`, `MYSQL_USER`, `MYSQL_PASSWORD` para MariaDB; `NEXTCLOUD_ADMIN_USER`, `NEXTCLOUD_ADMIN_PASSWORD`, `NEXTCLOUD_TRUSTED_DOMAINS` para Nextcloud; `VAULTWARDEN_ADMIN_TOKEN` para Vaultwarden. Genera los secretos con `openssl rand -hex 32`. Para Immich, copia el archivo `.env` de ejemplo del repositorio oficial. Nunca hagas commit de este archivo en un repositorio público; añade `.env` a tu `.gitignore`.",{"title":75,"body":76},"Lanzar el stack","Desde `\u002Fopt\u002Fhomelab`, ejecuta `docker compose pull` para descargar todas las imágenes y luego `docker compose up -d` para arrancar el conjunto. Sigue los logs de arranque con `docker compose logs -f` para asegurarte de que cada servicio inicia sin errores. La primera inicialización de Nextcloud y Paperless-ngx puede tardar unos minutos (migraciones de base de datos, generación de claves). Caddy obtiene los certificados TLS en el primer acceso a cada subdominio — verifica que los puertos 80 y 443 son accesibles desde el exterior antes de probar.",{"title":78,"body":79},"Finalizar la configuración de cada servicio","Accede a cada interfaz web para completar la configuración inicial: Nextcloud (`nextcloud.votre-domaine.com`) para activar las aplicaciones recomendadas (Contacts, Calendar, Talk); Immich (`photos.votre-domaine.com`) para configurar las bibliotecas y activar las tareas de aprendizaje automático en segundo plano; Paperless-ngx (`docs.votre-domaine.com`) para configurar el consumidor de documentos y el OCR; Jellyfin (`jellyfin.votre-domaine.com`) para apuntar a las carpetas de medios montadas como volúmenes. Vaultwarden (`vault.votre-domaine.com`) solo requiere crear una cuenta desde el cliente Bitwarden — no se necesita configuración inicial del servidor.",{"type":81,"title":82,"headers":83,"rows":88},"comparison","Caddy, Nginx Proxy Manager o Traefik: qué reverse proxy para este stack",[84,85,86,87],"Criterio","Caddy","Nginx Proxy Manager","Traefik",[89,94,99,104,109],[90,91,92,93],"Configuración","Caddyfile declarativo, recarga sin downtime","Interfaz web, sin archivos que editar","Labels Docker, recarga automática",[95,96,97,98],"SSL automático","Integrado, DNS-01 y HTTP-01 nativos","Let's Encrypt vía interfaz, DNS-01 posible","Let's Encrypt vía ACME resolver, DNS-01 vía providers",[100,101,102,103],"Wildcard","Nativo vía módulo caddy-dns","Posible pero requiere configuración manual","Nativo vía certificateResolvers",[105,106,107,108],"Curva de aprendizaje","Baja — Caddyfile legible en 10 minutos","Muy baja — todo se hace con clics","Media — documentación extensa",[110,111,112,113],"Adecuado para este stack","Sí — configuración versionada, recarga en caliente","Sí para empezar, menos ideal para versionar","Sí para stacks más complejos, sobrecarga de config aquí",{"type":115,"title":116,"body":117},"tip","Hardening mínimo antes de la exposición pública","Cuatro medidas a aplicar antes de hacer el stack accesible desde el exterior:\n\n1. Desactiva la página de registro abierto de Vaultwarden poniendo `SIGNUPS_ALLOWED=false` en el `.env` una vez creada tu cuenta.\n2. Añade una cabecera `X-Robots-Tag: noindex` en el Caddyfile para Vaultwarden y la interfaz de administración de Paperless-ngx — estas páginas no deben indexarse.\n3. Activa la rotación de logs de Docker (`log-opts` en `\u002Fetc\u002Fdocker\u002Fdaemon.json`) para evitar que los logs de Jellyfin o Paperless-ngx llenen el disco.\n4. Programa un `docker compose pull && docker compose up -d` semanal mediante cron para mantener las imágenes actualizadas — las aplicaciones self-hosted publican periódicamente parches de seguridad. Revisa los changelogs antes de actualizar Immich, que puede introducir migraciones de base de datos no reversibles.",{"type":35,"title":119,"body":120},"Resolución de problemas: errores comunes en el arranque","**`Error response from daemon: network proxy declared as external, but could not be found`** — Este mensaje aparece cuando la red Docker externa declarada en `docker-compose.yml` no existe todavía. Créala manualmente antes del primer `docker compose up`: `docker network create proxy`. O convierte la red en interna en el Compose (elimina `external: true`) para que Compose la cree él mismo.\n\n**`nextcloud.votre-domaine.com redirected you too many times`** — Nextcloud detecta la petición HTTPS como HTTP porque Caddy la reenvía en HTTP sobre la red interna. Añade `NEXTCLOUD_TRUSTED_PROXIES` con la subred Docker (por ejemplo `172.16.0.0\u002F12`) y `OVERWRITEPROTOCOL=https` en el `.env`. Sin estas variables, Nextcloud no confía en las cabeceras `X-Forwarded-Proto` transmitidas por Caddy e intenta redirigir a HTTPS indefinidamente.\n\n**`Immich cannot connect to database: connection refused`** — Immich arranca antes de que PostgreSQL esté listo. Añade `depends_on` con `condition: service_healthy` en el servicio `immich-server` y verifica que el servicio `database` declara un `healthcheck` válido (por ejemplo `pg_isready -U immich`). Sin healthcheck, Docker Compose considera el servicio «arrancado» en cuanto se lanza el contenedor, no cuando acepta conexiones.\n\n**`Paperless-ngx worker exited with error: celery worker unhealthy`** — La base de datos Redis no es accesible. Comprueba que el servicio Redis está en la misma red que Paperless y que la variable `PAPERLESS_REDIS` apunta al nombre del servicio Compose (`redis:\u002F\u002Fredis:6379`), no a `localhost` — en Docker Compose, `localhost` dentro de un contenedor apunta al propio contenedor, no a otro servicio.\n\n**Caddy no renueva el certificado wildcard** — Si usas el reto DNS-01, verifica que las variables de entorno de la API DNS (token, zone ID) se transmiten correctamente al servicio Caddy en el Compose. Un token caducado o un permiso DNS insuficiente hace que la renovación falle silenciosamente 30 días antes de la expiración — Caddy registra el error pero no bloquea el tráfico hasta la expiración real.",{"type":35,"title":122,"body":123},"Para ir más lejos","Este stack cubre los cinco servicios más demandados en las configuraciones homelab de 2026. Cada uno tiene una guía dedicada en este blog si quieres profundizar en un aspecto concreto: backup de Nextcloud, gestión de álbumes en Immich, transcodificado hardware en Jellyfin, reglas de retención en Paperless-ngx o sincronización multidispositivo en Vaultwarden.\n\nPara ir más allá de este stack, las próximas piezas habitualmente añadidas son Uptime Kuma (monitorización de servicios internos) y Ntfy o Apprise (notificaciones push). Estos servicios son suficientemente ligeros para añadirse al mismo Compose sin afectar al dimensionamiento.\n\nSi la gestión manual de actualizaciones y copias de seguridad se convierte en una carga, Coolify y Dokploy ofrecen interfaces que automatizan estas tareas conservando la arquitectura Docker Compose subyacente.","Un VPS con acceso root para tu stack homelab","ServOrbit.com ofrece VPS cloud desde 99 DH\u002Fmes, con IPv4 dedicada, elección de OS (Ubuntu, Debian, AlmaLinux), red de alta disponibilidad y snapshots. Despliega todo este stack con un solo comando `docker compose up -d`.","Desplegar en VPS","\u002Fvps-cloud",[129,153,170],{"id":130,"slug":131,"slugs":132,"title":136,"excerpt":137,"readTime":138,"views":139,"isPinned":19,"publishedAt":140,"updatedAt":141,"category":142,"categories":148,"featuredImage":29,"bgImage":30,"posterImage":150,"relatedSolution":151},82,"alojar-immich-en-un-vps",{"fr":133,"en":134,"ar":135,"es":131},"heberger-immich","host-immich-on-your-own-vps","استضافة-immich-على-خادمك-الافتراضي-الخاص-vps","Alojar Immich en su propio VPS","Aloje Immich en su VPS: alternativa autoalojada a Google Photos con copia de seguridad móvil, reconocimiento facial y SSL con Docker. Incluye migración a v3.",11,1,"2026-03-30T00:00:00+00:00","2026-09-23T15:23:17+00:00",{"id":143,"name":144,"slug":145,"color":146,"icon":147},7,"Autoalojamiento","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[149],{"id":143,"name":144,"slug":145,"color":146,"icon":147},"\u002Fblog\u002Fcovers\u002Fheberger-immich-poster.svg",{"categorySlug":145,"appSlug":152},"immich",{"id":154,"slug":155,"slugs":156,"title":160,"excerpt":161,"readTime":162,"views":18,"isPinned":19,"publishedAt":163,"updatedAt":141,"category":164,"categories":165,"featuredImage":29,"bgImage":30,"posterImage":167,"relatedSolution":168},71,"alojar-nextcloud-en-su-propio-vps",{"fr":157,"en":158,"ar":159,"es":155},"heberger-nextcloud","hosting-nextcloud-on-your-own-vps","استضافة-nextcloud-على-خادمك-الـvps-الخاص","Alojar Nextcloud en VPS: guía completa NC 34 y seguridad","Despliegue Nextcloud 34.0.2 en su VPS con Docker y Redis. Guía completa: apps ausentes en NC 34.0.0, restricción PostgreSQL oc_filecache_extended y CVE de 2FA.",14,"2026-04-10T00:00:00+00:00",{"id":143,"name":144,"slug":145,"color":146,"icon":147},[166],{"id":143,"name":144,"slug":145,"color":146,"icon":147},"\u002Fblog\u002Fcovers\u002Fheberger-nextcloud-poster.svg",{"categorySlug":145,"appSlug":169},"nextcloud",{"id":171,"slug":172,"slugs":173,"title":177,"excerpt":178,"readTime":17,"views":23,"isPinned":19,"publishedAt":179,"updatedAt":180,"category":181,"categories":182,"featuredImage":29,"bgImage":30,"posterImage":184,"relatedSolution":185},84,"alojar-jellyfin-en-un-vps",{"fr":174,"en":175,"ar":176,"es":172},"heberger-jellyfin","host-jellyfin-on-your-own-vps","استضافة-jellyfin-على-خادمك-الافتراضي-الخاص-vps","Alojar Jellyfin en un VPS: guía completa 2026","Despliega Jellyfin self-hosted en VPS con Docker, nginx, HTTPS, plugins, almacenamiento y transcodificación. Guía completa actualizada para 2026.","2026-03-28T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":143,"name":144,"slug":145,"color":146,"icon":147},[183],{"id":143,"name":144,"slug":145,"color":146,"icon":147},"\u002Fblog\u002Fcovers\u002Fheberger-jellyfin-poster.svg",{"categorySlug":186,"appSlug":187},"colaboracion-productividad","jellyfin",1790693334451]