[{"data":1,"prerenderedAt":208},["ShallowReactive",2],{"seo-verification":3,"blog-checklist-docker-compose-en-produccion-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-checklist-docker-compose-en-produccion-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":154,"ctaBody":155,"ctaButton":156,"ctaUrl":157,"relatedPosts":158},229,"checklist-docker-compose-en-produccion",{"fr":12,"en":13,"ar":14,"es":10},"docker-compose-production-checklist","docker-compose-in-production-10-point-checklist","docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط","Docker Compose en producción: checklist de 10 puntos","Checklist de Docker Compose en producción: 10 ajustes esenciales, gestión de secretos sin downtime, copias de volúmenes sin corrupción, CVE-2026-17106.",8,0,false,"2026-08-06T00:00:00+00:00","2026-09-07T11:26:10+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\u002Fdocker-compose-production-checklist-poster.svg","Un archivo docker-compose.yml que funciona en su equipo no sobrevive tal cual a la producción. Reinicio tras un reboot, límites de recursos, secretos, rotación de logs: son otros tantos ajustes ausentes por defecto que provocan averías silenciosas una vez el servicio está expuesto. Esta checklist reúne los 10 parámetros que hay que controlar antes de desplegar su primera stack Compose en un VPS. Cada uno cabe en unas pocas líneas de YAML y le ahorra una incidencia nocturna.",[34,38,52,55,89,136,139,142,145,148,151],{"type":35,"title":36,"body":37},"h2","Por qué una checklist antes de producción","Docker Compose se diseñó para el desarrollo: sus valores por defecto priorizan la simplicidad, no la robustez. Un contenedor no se reinicia tras un reinicio del host, sus logs crecen sin límite, puede consumir toda la RAM de la máquina y escucha en todas las interfaces de red. En desarrollo, ninguno de estos comportamientos supone un problema, porque usted relanza la stack a mano varias veces al día. En producción, esos ajustes ausentes se convierten en incidentes: disco lleno a las tres de la madrugada, base de datos perdida tras un `docker compose down`, servicio inaccesible tras un corte de corriente. La buena noticia: endurecer una stack Compose no exige reescribirla, solo una decena de añadidos concretos. Repase cada punto de esta lista antes de publicar y su servicio aguantará la carga y los reinicios sin vigilancia constante.",{"type":39,"title":40,"items":41},"ul","Los 10 puntos de un vistazo",[42,43,44,45,46,47,48,49,50,51],"**restart: unless-stopped** — el contenedor se reinicia tras un reinicio del host o un fallo","**healthcheck** — Docker detecta un contenedor bloqueado y permite reinicios progresivos","**límites de CPU\u002Fmemoria** — un servicio desbocado ya no puede asfixiar a sus vecinos","**secretos vía .env o Docker secrets** — nunca una contraseña en claro en el archivo Compose","**volúmenes con nombre** — los datos sobreviven a un `docker compose down`","**rotación de logs** — `max-size` y `max-file` impiden que el disco se llene","**aislamiento de red** — separe `frontend` y `backend`, no exponga todo en el bridge por defecto","**binding de puertos** — `127.0.0.1:PORT` detrás de un reverse proxy, no `0.0.0.0`","**tags de imagen fijados** — una versión o un digest, nunca `latest`","**depends_on con condición** — `service_healthy` evita las carreras en el arranque",{"type":35,"title":53,"body":54},"Requisitos previos","Antes de aplicar esta checklist, asegúrese de disponer de un VPS con Docker Engine y el plugin Compose v2 instalados (el comando es `docker compose`, sin guion, desde 2022). Compruebe la versión con `docker compose version`: la sintaxis `deploy.resources` fuera de Swarm exige Compose v2. Coloque su archivo en una carpeta de proyecto dedicada, por ejemplo `\u002Fopt\u002Fmonapp`, con un archivo `.env` al lado y permisos restringidos (`chmod 600 .env`). Prevea un reverse proxy por delante — Traefik, Caddy o Nginx — porque varios ajustes, en particular el binding de puertos, dan por supuesto que el tráfico público nunca llega directamente a sus contenedores. Por último, mantenga una copia de su archivo Compose bajo control de versiones.",{"type":56,"title":57,"steps":58},"steps","Los 10 pasos en detalle",[59,62,65,68,71,74,77,80,83,86],{"title":60,"body":61},"1. Política de reinicio","Añada `restart: unless-stopped` a cada servicio. El contenedor se reinicia tras un fallo o un reinicio del host, pero permanece detenido si usted lo paró voluntariamente. Evite `restart: always`, que relanzaría incluso un contenedor que quería dejar parado.",{"title":63,"body":64},"2. Healthcheck","Declare un bloque `healthcheck:` con un `test` (por ejemplo `curl -f http:\u002F\u002Flocalhost:8080\u002Fhealth || exit 1`), un `interval`, un `timeout` y unos `retries`. Docker marca entonces el contenedor como `healthy` o `unhealthy`, lo que permite a los demás servicios reaccionar ante un bloqueo.",{"title":66,"body":67},"3. Límites de recursos","En `deploy.resources.limits`, fije `cpus` y `memory` (por ejemplo `memory: 512M`). Sin límite, un servicio con una fuga puede consumir toda la RAM y hacer que el OOM killer mate a los demás. Añada también `reservations` para garantizar un mínimo.",{"title":69,"body":70},"4. Secretos fuera del archivo","Nunca ponga una contraseña en claro en el YAML. Refiéralas mediante `env_file: .env` o `${VARIABLE}`, o utilice el mecanismo `secrets:` de Docker, que monta el secreto como archivo dentro del contenedor. Añada `.env` a su `.gitignore`.",{"title":72,"body":73},"5. Volúmenes con nombre","Declare sus datos en volúmenes con nombre y con un driver explícito, en lugar de un bind-mount anónimo. Un volumen con nombre sobrevive a `docker compose down`; solo `down -v` lo borra. Documente cada volumen para saber de qué hace copia de seguridad.",{"title":75,"body":76},"6. Rotación de logs","Añada un bloque `logging:` con `driver: json-file` y las opciones `max-size: \"10m\"` y `max-file: \"3\"`. Sin ello, los logs de un contenedor hablador llenan el disco hasta provocar la caída. Aplíquelo a cada servicio.",{"title":78,"body":79},"7. Aislamiento de red","Cree redes con nombre — una `frontend` para lo que está expuesto, una `backend` para la base de datos — y conecte cada servicio solo a las redes que necesita. Su base de datos únicamente debe ser accesible desde la aplicación, nunca desde el bridge por defecto compartido.",{"title":81,"body":82},"8. Binding de puertos","Detrás de un reverse proxy, publique en `127.0.0.1:8080:8080` y no en `8080:8080` (que equivale a `0.0.0.0`). De lo contrario, el puerto sigue accesible desde Internet pese al proxy, esquivando sus reglas de TLS y de autenticación.",{"title":84,"body":85},"9. Tags de imagen fijados","Sustituya `image: postgres:latest` por una versión precisa (`postgres:16.3`) o, mejor, por un digest (`postgres@sha256:...`). `latest` cambia sin avisar y hace que sus despliegues no sean reproducibles. Combínelo con `pull_policy: missing` para un comportamiento previsible.",{"title":87,"body":88},"10. Orden de arranque","Utilice `depends_on` con `condition: service_healthy` para que un servicio no espere solo al lanzamiento, sino a la disponibilidad real de su dependencia. Esto supone un healthcheck en el servicio dependiente (paso 2) y elimina las carreras en el arranque.",{"type":90,"title":91,"headers":92,"rows":96},"comparison","Valores por defecto de dev frente a ajustes de prod",[93,94,95],"Parámetro","Por defecto en dev","Recomendado en prod",[97,101,105,109,113,117,120,124,128,132],[98,99,100],"restart","no","unless-stopped",[102,103,104],"healthcheck","ausente","definido con interval y retries",[106,107,108],"memoria","sin límite","limit fijado (p. ej. 512M)",[110,111,112],"secretos","en claro posible",".env o Docker secrets",[114,115,116],"volúmenes","anónimos","con nombre y con driver",[118,107,119],"logs","max-size + max-file",[121,122,123],"red","bridge por defecto","frontend \u002F backend separados",[125,126,127],"puertos","0.0.0.0","127.0.0.1 detrás de proxy",[129,130,131],"imagen","latest","versión o digest fijado",[133,134,135],"depends_on","solo arranque","condition: service_healthy",{"type":137,"body":138},"tip","Pruebe siempre su stack endurecida en local antes de llevarla a producción: lance `docker compose config` para validar la sintaxis, después `docker compose up`, y simule un reinicio con `docker compose restart`. Compruebe que los contenedores vuelven a estar `healthy` y que los datos persisten tras un `down` seguido de un `up`.",{"type":35,"title":140,"body":141},"Solución de problemas","Si un contenedor se queda bloqueado en estado `starting`, su healthcheck está fallando: pruebe el comando `test` a mano con `docker compose exec service sh` y compruebe que devuelve 0. Un servicio que se reinicia en bucle (`Restarting`) suele esconder un error en el arranque — consulte `docker compose logs -f service`. Si `deploy.resources.limits` parece ignorarse, recuerde que en Compose v2 fuera de Swarm los límites sí se aplican, pero las `reservations` solo lo hacen en modo Swarm. Un puerto que sigue accesible pese a `127.0.0.1` suele señalar un cortafuegos ausente o una regla de Docker que esquiva UFW — compruébelo con `ss -tlnp`. Por último, si un `docker compose down` ha borrado sus datos, casi siempre es porque quedaba un `-v` de más o porque el volumen era anónimo en lugar de tener nombre.",{"type":35,"title":143,"body":144},"CVE-2026-17106 (CopyEscape): actualizar Docker Engine","\u003Ca href=\"https:\u002F\u002Fwww.imperva.com\u002Fblog\u002Fcopyescape-docker-vulnerability-cve-2026-17106\u002F\">CVE-2026-17106\u003C\u002Fa>, bautizada **CopyEscape**, es una race condition en `docker cp` divulgada el 10 de agosto de 2026. Un contenedor no confiable puede producir un archivo tar incoherente que sigue un enlace simbólico fuera del destino, lo que acaba sobrescribiendo un archivo arbitrario en el host — incluido el binario `runc`. La superficie: todo VPS que ejecute `docker cp` desde un contenedor cuyo contenido usted no controla. La corrección está disponible en **Docker Engine ≥ 29.7.2** y **Docker Desktop ≥ 4.86.0**. Compruebe su versión con `docker version` y actualice antes de exponer un nuevo servicio. Si no puede actualizar de inmediato, evite `docker cp` desde contenedores no confiables y aplique el principio de mínimo privilegio (`--cap-drop ALL`).",{"type":35,"title":146,"body":147},"Gestión de secretos de Docker: rotación sin downtime","Las variables de entorno en claro dentro de un archivo Compose son la primera fuga de secretos en producción: aparecen en `docker inspect`, en los logs de error y en los volcados de proceso. El mecanismo `secrets:` de Docker — o un gestor externo como \u003Ca href=\"https:\u002F\u002Fmarkaicode.com\u002Fdocker-secrets-production-compose\u002F\">Vault o Infisical\u003C\u002Fa> — monta los secretos en forma de archivos en `\u002Frun\u002Fsecrets\u002F`, fuera del alcance de `inspect`. Para una **rotación sin downtime**, el método recomendado consiste en versionar el secreto (crear un nuevo secreto `db_password_v2` en paralelo al `v1`), actualizar el servicio para que lea `v2`, redesplegar en rolling update (`docker compose up -d --no-deps service`) y después eliminar `v1` una vez validado el despliegue. Ninguna interrupción de servicio, ninguna ventana de secreto expuesto entre las dos versiones.",{"type":35,"title":149,"body":150},"Hacer copias de seguridad de los volúmenes sin corrupción","Copiar los archivos de un volumen PostgreSQL o MySQL **en caliente** con `rsync` o `tar` produce casi con toda seguridad una copia de seguridad corrupta: el motor escribe de forma continua durante la copia y las páginas de datos se capturan en puntos de control distintos. La regla es **hacer siempre un dump SQL antes del snapshot del volumen**: `pg_dump` o `mysqldump` producen un estado coherente que usted puede archivar o transferir. Para automatizar este enfoque en un VPS con Docker, herramientas como \u003Ca href=\"https:\u002F\u002Fpistack.xyz\u002Fposts\u002F2026-05-11-self-hosted-docker-volume-backup-offen-nautical-loomchild-guide\u002F\">Restic y Offen Docker Backup\u003C\u002Fa> orquestan la congelación de la base de datos, el dump SQL, el snapshot cifrado y el envío a un almacenamiento remoto. Documente cada volumen con nombre (paso 5 de la checklist) y asócielo a una estrategia de restauración probada: una copia de seguridad sin prueba de restauración es un dato no respaldado.",{"type":35,"title":152,"body":153},"Conclusión","Estos diez ajustes convierten un archivo Compose de desarrollo en una stack de producción capaz de sobrevivir a los reinicios, a los picos de carga y a las noches sin vigilancia. Ninguno exige una herramienta adicional: todo cabe en el YAML que usted ya tiene. Adquiera la costumbre de recorrer esta checklist antes de cada puesta en línea, idealmente en forma de revisión de `docker compose config` integrada en su despliegue. Una vez asentados estos cimientos, puede añadir un reverse proxy como Traefik o Caddy, o una capa de orquestación como Coolify, con total confianza.","Despliegue su stack Compose en producción","Un VPS ServOrbit le da el acceso root, la RAM y el control de red necesarios para hacer funcionar una stack Docker Compose endurecida. Elija su configuración y despliegue en unos minutos.","Desplegar en un VPS ServOrbit","\u002Fvps-cloud",[159,173,191],{"id":160,"slug":161,"slugs":162,"title":166,"excerpt":167,"readTime":23,"views":18,"isPinned":19,"publishedAt":168,"updatedAt":21,"category":169,"categories":170,"featuredImage":29,"bgImage":30,"posterImage":172,"relatedSolution":29},38,"desplegar-con-traefik",{"fr":163,"en":164,"ar":165,"es":161},"deployer-avec-traefik","deploy-your-applications-with-traefik-on-a-vps","انشر-تطبيقاتك-باستخدام-traefik-على-خادم-vps","Desplegar sus aplicaciones con Traefik en un VPS","Despliegue Traefik como reverse proxy en su VPS: enrutamiento automático de los contenedores Docker, certificados SSL Let's Encrypt y balanceo de carga.","2026-05-13T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[171],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-traefik-poster.svg",{"id":174,"slug":175,"slugs":176,"title":180,"excerpt":181,"readTime":23,"views":182,"isPinned":19,"publishedAt":183,"updatedAt":21,"category":184,"categories":185,"featuredImage":29,"bgImage":30,"posterImage":187,"relatedSolution":188},39,"desplegar-con-caddy",{"fr":177,"en":178,"ar":179,"es":175},"deployer-avec-caddy","deploy-your-applications-with-caddy-on-a-vps","انشر-تطبيقاتك-باستخدام-caddy-على-خادم-vps","Desplegar sus aplicaciones con Caddy en un VPS","Despliegue Caddy en su VPS: servidor web y reverse proxy con HTTPS automático. Un Caddyfile de pocas líneas basta para pasar a producción.",1,"2026-05-12T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[186],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-caddy-poster.svg",{"categorySlug":189,"appSlug":190},"despliegue-de-aplicaciones-devops","caddy",{"id":192,"slug":193,"slugs":194,"title":198,"excerpt":199,"readTime":200,"views":182,"isPinned":19,"publishedAt":201,"updatedAt":21,"category":202,"categories":203,"featuredImage":29,"bgImage":30,"posterImage":205,"relatedSolution":206},41,"desplegar-aplicaciones-con-coolify-en-un-vps",{"fr":195,"en":196,"ar":197,"es":193},"deployer-avec-coolify","deploy-your-applications-with-coolify-on-a-vps","نشر-تطبيقاتك-باستخدام-coolify-على-vps","Desplegar sus aplicaciones con Coolify en un VPS","Despliegue Coolify en un VPS: instalación, configuración HTTPS, conexión Git, primera aplicación, bases de datos, copias de seguridad y diagnóstico.",9,"2026-05-10T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[204],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-coolify-poster.svg",{"categorySlug":189,"appSlug":207},"coolify",1789665009286]