[{"data":1,"prerenderedAt":187},["ShallowReactive",2],{"seo-verification":3,"blog-desplegar-con-caddy-ma-es":6,"promo-bar-likely":186},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-desplegar-con-caddy-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":27,"featuredImage":29,"bgImage":30,"posterImage":31,"relatedSolution":32,"intro":35,"sections":36,"ctaTitle":128,"ctaBody":129,"ctaButton":130,"ctaUrl":131,"relatedPosts":132},39,"desplegar-con-caddy",{"fr":12,"en":13,"ar":14,"es":10},"deployer-avec-caddy","deploy-your-applications-with-caddy-on-a-vps","انشر-تطبيقاتك-باستخدام-caddy-على-خادم-vps","Caddy como reverse proxy en VPS: guía completa","Instala y configura Caddy como reverse proxy en tu VPS: HTTPS automático con Let's Encrypt, múltiples apps, seguridad y solución de errores comunes.",8,4,false,"2026-05-12T00:00:00+00:00","2026-09-25T23:43:04+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\u002Fdeployer-avec-caddy-poster.svg",{"categorySlug":33,"appSlug":34},"despliegue-de-aplicaciones-devops","caddy","Caddy es un servidor web escrito en Go que gestiona todo el ciclo TLS — negociación ACME, renovación, redirección HTTP → HTTPS — sin ninguna configuración adicional. Donde Nginx necesita Certbot, un cron y un vhost por dominio, un único `Caddyfile` de diez líneas basta para exponer varias aplicaciones en el mismo VPS sobre HTTPS. Esta guía cubre la instalación, la configuración multi-aplicación, el hardening y los errores más frecuentes.",[37,41,51,54,79,82,118,121,125],{"type":38,"title":39,"body":40},"h2","¿Por qué elegir Caddy como reverse proxy en tu VPS?","La mayoría de los reverse proxies delegan la gestión TLS a una herramienta externa — Certbot, acme.sh o un script cron propio. Caddy integra este mecanismo de extremo a extremo: en cuanto se declara un nombre de dominio en el `Caddyfile`, contacta con Let's Encrypt, obtiene el certificado y lo renueva antes de que caduque, sin intervención manual. El resultado es una configuración que se lee en pocas líneas y se despliega de forma idéntica en todos tus VPS, sin estado externo que sincronizar.",{"type":42,"title":43,"items":44},"ul","Lo que Caddy aporta en producción",[45,46,47,48,49,50],"**HTTPS automático**: Let's Encrypt ACME HTTP-01 activado en cuanto se declara un nombre de dominio — sin cron, sin plugin que instalar","**Sintaxis concisa**: un bloque de cinco líneas reemplaza un vhost de Nginx de cuarenta líneas con su archivo de configuración de Certbot","**Recarga sin corte**: `caddy reload` aplica el nuevo `Caddyfile` sin interrumpir las conexiones en curso","**HTTP\u002F2 y HTTP\u002F3 (QUIC) por defecto**: activados sin configuración adicional en todas las versiones 2.x","**JSON API**: la configuración puede modificarse en caliente vía REST API, útil para entornos dinámicos o en contenedores","**Imagen Docker oficial ligera**: `caddy:2-alpine` pesa menos de 20 MB y cubre la mayoría de los casos de producción",{"type":38,"title":52,"body":53},"Requisitos previos","Antes de empezar, verifica que tu VPS cumple los siguientes requisitos.\n\n**Recursos mínimos**: 512 MB de RAM y 1 vCPU son suficientes para Caddy solo. Cuenta con 1 GB de RAM y 2 vCPU si alojas varias aplicaciones detrás.\n\n**Puertos 80 y 443 libres**: Caddy los ocupa para ACME HTTP-01 (puerto 80) y para el tráfico HTTPS (puerto 443). Comprueba que ningún otro proceso los esté usando:\n```bash\nss -tlnp | grep -E ':80|:443'\n```\n\n**Nombre de dominio apuntando al VPS**: Let's Encrypt valida la propiedad del dominio consultando el puerto 80 de tu IP. Tu registro DNS `A` debe estar activo y propagado antes de arrancar Caddy.\n\n**Sistema operativo**: Debian 11\u002F12 o Ubuntu 22.04\u002F24.04. Los comandos de esta guía están probados en estas distribuciones.\n\n**Docker (opcional)**: si despliegas Caddy en un contenedor, se necesitan Docker Engine 24+ y Docker Compose v2.",{"type":55,"title":56,"steps":57},"steps","Desplegar Caddy como reverse proxy",[58,61,64,67,70,73,76],{"title":59,"body":60},"Método 1 — Instalación desde el repositorio APT oficial","Caddy ofrece un repositorio APT firmado. Añádelo e instala el paquete:\n```bash\napt install -y debian-keyring debian-archive-keyring apt-transport-https curl\ncurl -1sLf 'https:\u002F\u002Fdl.cloudsmith.io\u002Fpublic\u002Fcaddy\u002Fstable\u002Fgpg.key' \\\n  | gpg --dearmor -o \u002Fusr\u002Fshare\u002Fkeyrings\u002Fcaddy-stable-archive-keyring.gpg\ncurl -1sLf 'https:\u002F\u002Fdl.cloudsmith.io\u002Fpublic\u002Fcaddy\u002Fstable\u002Fdebian.deb.txt' \\\n  | tee \u002Fetc\u002Fapt\u002Fsources.list.d\u002Fcaddy-stable.list\napt update && apt install caddy\n```\nVerifica la versión instalada: `caddy version` debe mostrar `v2.9.x` o superior.",{"title":62,"body":63},"Método 2 — Despliegue con Docker Compose","Si tus aplicaciones ya corren con Docker, añadir un servicio Caddy al mismo `compose.yml` es el enfoque más sencillo. Crea un archivo `compose.yml` en la raíz de tu proyecto:\n```bash\nservices:\n  caddy:\n    image: caddy:2-alpine\n    restart: unless-stopped\n    ports:\n      - \"80:80\"\n      - \"443:443\"\n      - \"443:443\u002Fudp\"\n    volumes:\n      - .\u002FCaddyfile:\u002Fetc\u002Fcaddy\u002FCaddyfile\n      - caddy_data:\u002Fdata\n      - caddy_config:\u002Fconfig\n    networks:\n      - proxy\n\nvolumes:\n  caddy_data:\n  caddy_config:\n\nnetworks:\n  proxy:\n    external: true\n```\nCrea la red compartida una sola vez: `docker network create proxy`. Tus otros servicios se unen a esta red para ser accesibles por Caddy.",{"title":65,"body":66},"Crear el Caddyfile básico","El `Caddyfile` es el archivo de configuración central. Para una instalación APT se encuentra en `\u002Fetc\u002Fcaddy\u002FCaddyfile`. Para Docker, colócalo junto a tu `compose.yml`.\n\nEjemplo mínimo que expone una aplicación en el puerto 3000:\n```bash\nmyapp.com {\n    reverse_proxy localhost:3000\n}\n```\nEso es todo. Caddy detecta que `myapp.com` es un nombre de dominio, contacta con Let's Encrypt vía ACME HTTP-01, obtiene un certificado y redirige automáticamente todo el tráfico HTTP a HTTPS. Los certificados se almacenan en `~\u002F.local\u002Fshare\u002Fcaddy\u002F` (APT) o en el volumen `caddy_data` (Docker).",{"title":68,"body":69},"Configuración multi-aplicación (multi-vhost)","Alojar varias aplicaciones en el mismo VPS solo requiere bloques adicionales en el mismo archivo:\n```bash\napp1.tudominio.com {\n    reverse_proxy localhost:3000\n}\n\napp2.tudominio.com {\n    reverse_proxy localhost:4000\n}\n\nblog.tudominio.com {\n    reverse_proxy localhost:8080\n}\n```\nCada bloque obtiene su propio certificado de Let's Encrypt. Caddy gestiona las renovaciones de forma independiente para cada dominio, en paralelo, sin interrupción de servicio.",{"title":71,"body":72},"Aplicar el Caddyfile sin interrupción","Para APT, recarga la configuración sin cortar conexiones:\n```bash\nsystemctl reload caddy\n# o si modificaste el archivo fuera de \u002Fetc\u002Fcaddy\u002F:\ncaddy reload --config \u002Fruta\u002Fal\u002FCaddyfile\n```\nPara Docker:\n```bash\ndocker compose exec caddy caddy reload --config \u002Fetc\u002Fcaddy\u002FCaddyfile\n```\nVerifica que la sintaxis es correcta antes de recargar: `caddy validate --config \u002Fetc\u002Fcaddy\u002FCaddyfile`.",{"title":74,"body":75},"Añadir cabeceras de seguridad y rate limiting","Caddy soporta cabeceras de seguridad nativas mediante la directiva `header`. Aquí hay un bloque reforzado para una aplicación en producción:\n```bash\nmyapp.com {\n    reverse_proxy localhost:3000\n\n    header {\n        Strict-Transport-Security \"max-age=31536000; includeSubDomains; preload\"\n        X-Content-Type-Options \"nosniff\"\n        X-Frame-Options \"SAMEORIGIN\"\n        Referrer-Policy \"strict-origin-when-cross-origin\"\n        -Server\n    }\n\n    log {\n        output file \u002Fvar\u002Flog\u002Fcaddy\u002Fmyapp.log {\n            roll_size 10mb\n            roll_keep 5\n        }\n    }\n}\n```\nPara el rate limiting, el módulo `caddy-ratelimit` se instala con `xcaddy build` y se usa con la directiva `rate_limit`. La imagen oficial de Docker no lo incluye — construye tu propia imagen o usa un firewall de aplicaciones en capa superior si la necesidad es crítica.",{"title":77,"body":78},"Activar y verificar el servicio systemd (APT)","Tras la instalación con APT, el servicio se activa automáticamente. Controla su estado y los registros:\n```bash\nsystemctl status caddy\njournalctl -u caddy -f\n```\nPara que Caddy arranque en cada reinicio: `systemctl enable caddy` (ya hecho por el paquete). Comprueba que el certificado de Let's Encrypt se emitió correctamente:\n```bash\ncurl -sv https:\u002F\u002Fmyapp.com 2>&1 | grep -E 'subject|issuer|expire'\n```",{"type":38,"title":80,"body":81},"Cómo funciona el HTTPS automático de Caddy","Caddy implementa el protocolo ACME (Automated Certificate Management Environment) de forma nativa. En cuanto un bloque del `Caddyfile` contiene un nombre de dominio cualificado, Caddy activa automáticamente el desafío **ACME HTTP-01**: Let's Encrypt coloca un token de verificación en `http:\u002F\u002Ftudominio.com\u002F.well-known\u002Facme-challenge\u002F`, Caddy responde a esa petición y demuestra así que controla el servidor. Let's Encrypt emite entonces un certificado válido por 90 días.\n\nCaddy renueva este certificado por adelantado (a partir de 30 días antes de su caducidad) y recarga la configuración en caliente, sin interrupción de servicio. Los certificados y los datos ACME se conservan localmente — en `~\u002F.local\u002Fshare\u002Fcaddy\u002F` para una instalación APT, en el volumen `caddy_data` para Docker. **No elimines este volumen**: Caddy también almacena ahí el estado ACME, y demasiadas peticiones a Let's Encrypt activan límites de velocidad que pueden bloquear la emisión de nuevos certificados durante varias horas.\n\nPara **certificados wildcard** (`*.tudominio.com`), ACME HTTP-01 no funciona: se requiere el desafío **DNS-01**, que necesita acceso a la API de tu proveedor DNS. Caddy soporta nativamente varios proveedores mediante módulos (`caddy-dns\u002Fcloudflare`, `caddy-dns\u002Fovh`…) compilados con `xcaddy`.",{"type":83,"title":84,"headers":85,"rows":89},"comparison","Caddy vs Nginx: cuándo elegir uno u otro",[86,87,88],"Criterio","Caddy","Nginx",[90,94,98,102,106,110,114],[91,92,93],"Configuración TLS","Automática, cero configuración manual","Manual (Certbot o acme.sh requeridos)",[95,96,97],"Curva de aprendizaje","Baja — sintaxis legible, pocas directivas","Moderada — sintaxis verbosa, muchos contextos",[99,100,101],"Rendimiento bruto (req\u002Fs)","Excelente para la mayoría de cargas","Ligeramente superior bajo carga muy alta",[103,104,105],"Módulos y ecosistema","Creciente, xcaddy para compilar módulos","Muy amplio, numerosos módulos de terceros maduros",[107,108,109],"Recarga sin interrupción","Nativo (`caddy reload`)","Nativo (`nginx -s reload`), similar",[111,112,113],"Caso de uso ideal","VPS personal, proyectos de equipo, microservicios Docker","Grandes plataformas, frontal CDN, casos avanzados (GeoIP, Lua…)",[115,116,117],"Soporte HTTP\u002F3 (QUIC)","Activado por defecto desde Caddy 2.6","Experimental, requiere compilación con quiche o ngx_http_v3",{"type":38,"title":119,"body":120},"Solución de problemas: errores comunes","**Puerto 80 ya en uso.** Caddy necesita el puerto 80 para ACME HTTP-01. Si Apache o Nginx ya están corriendo, detenerlos antes de arrancar Caddy: `systemctl stop apache2` o `systemctl stop nginx`. Verifica después con `ss -tlnp | grep :80`.\n\n**Fallo ACME \u002F certificado no emitido.** Let's Encrypt no puede contactar con tu servidor. Comprueba: (1) tu registro DNS `A` apunta a la IP del VPS — `dig +short tu-dominio.com` debe devolver tu IP; (2) el puerto 80 es accesible desde el exterior — los firewalls del VPS (iptables, ufw) a veces bloquean este puerto aunque Caddy lo esté escuchando. Consulta los logs de Caddy con `journalctl -u caddy` para leer el mensaje de error ACME preciso.\n\n**`permission denied` en los puertos 80\u002F443.** Los puertos inferiores a 1024 están reservados en Linux. Para una instalación APT, el paquete configura automáticamente la capacidad `CAP_NET_BIND_SERVICE` en el binario de Caddy. Si compilaste Caddy manualmente, aplícala: `setcap cap_net_bind_service=+ep $(which caddy)`.\n\n**DNS no resuelto \u002F `no such host`.** Caddy resuelve los nombres de los backends declarados en `reverse_proxy`. Si tu aplicación se llama `app` en Docker Compose, asegúrate de que Caddy y la aplicación comparten la misma red Docker. Verifica con: `docker compose exec caddy nslookup app`.\n\n**Volumen `caddy_data` eliminado por error.** Caddy debe renegociar todos los certificados desde cero. Let's Encrypt impone un límite de 5 certificados por dominio en 7 días. Si alcanzas este límite, usa el entorno de staging ACME (`acme_ca https:\u002F\u002Facme-staging-v02.api.letsencrypt.org\u002Fdirectory` en el `Caddyfile`) para pruebas, y vuelve a producción una vez que haya pasado la ventana.",{"type":122,"title":123,"body":124},"tip","Para alojar múltiples aplicaciones en el mismo VPS","Crea una red Docker compartida (`docker network create proxy`) y conecta cada servicio a esa red. El `Caddyfile` referencia entonces los servicios por su nombre de contenedor en lugar de `localhost:PORT` — la configuración no cambia al añadir o quitar aplicaciones. Ejemplo: `reverse_proxy mi-servicio:3000` en lugar de `reverse_proxy localhost:3000`.",{"type":122,"title":126,"body":127},"Documentación oficial","La referencia completa de directivas, módulos y JSON API está disponible en `\u003Ca href=\"https:\u002F\u002Fcaddyserver.com\u002Fdocs\u002F\">caddyserver.com\u002Fdocs\u003C\u002Fa>`. El foro de la comunidad (`\u003Ca href=\"https:\u002F\u002Fcaddy.community\">caddy.community\u003C\u002Fa>`) es el mejor recurso para preguntas avanzadas — los mantenedores responden directamente.","Tu VPS, listo para Caddy","Despliega Caddy en un VPS de ServOrbit y benefíciate de un entorno Debian 12, puertos 80 y 443 abiertos y acceso SSH inmediato.","Ver los planes VPS","\u002Fvps-cloud",[133,149,169],{"id":134,"slug":135,"slugs":136,"title":140,"excerpt":141,"readTime":142,"views":23,"isPinned":19,"noindex":19,"publishedAt":143,"updatedAt":144,"category":145,"categories":146,"featuredImage":29,"bgImage":30,"posterImage":148,"relatedSolution":29},38,"desplegar-con-traefik",{"fr":137,"en":138,"ar":139,"es":135},"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.",11,"2026-05-13T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[147],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdeployer-avec-traefik-poster.svg",{"id":150,"slug":151,"slugs":152,"title":156,"excerpt":157,"readTime":17,"views":158,"isPinned":19,"noindex":19,"publishedAt":159,"updatedAt":160,"category":161,"categories":166,"featuredImage":29,"bgImage":30,"posterImage":168,"relatedSolution":29},116,"certificados-ssl-gratis-con-lets-encrypt-en-un-vps",{"fr":153,"en":154,"ar":155,"es":151},"certificats-ssl-lets-encrypt-vps","free-ssl-certificates-with-lets-encrypt-on-a-vps","شهادات-ssl-مجانية-باستخدام-lets-encrypt-على-خادم-vps","Certificados SSL gratis con Let's Encrypt en un VPS","Guía completa de Let's Encrypt para VPS: certbot nginx, wildcard DNS-01, renovación systemd, hardening TLS, rate-limits y comparativa certbot vs acme.sh vs Caddy.",0,"2026-02-24T00:00:00+00:00","2026-09-30T11:20:34+00:00",{"id":17,"name":162,"slug":163,"color":164,"icon":165},"Seguridad y monitorización","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[167],{"id":17,"name":162,"slug":163,"color":164,"icon":165},"\u002Fblog\u002Fcovers\u002Fcertificats-ssl-lets-encrypt-vps-poster.svg",{"id":170,"slug":171,"slugs":172,"title":176,"excerpt":177,"readTime":178,"views":179,"isPinned":19,"noindex":19,"publishedAt":180,"updatedAt":181,"category":182,"categories":183,"featuredImage":29,"bgImage":30,"posterImage":185,"relatedSolution":29},229,"checklist-docker-compose-en-produccion",{"fr":173,"en":174,"ar":175,"es":171},"docker-compose-production-checklist","docker-compose-in-production-10-point-checklist","docker-compose-في-الإنتاج-قائمة-التحقق-من-10-نقاط","Docker Compose en producción: checklist de 10 puntos","Docker Compose en producción: 10 ajustes, health checks, secretos, rollback, solución de errores y paso de docker-compose v1 a docker compose en Ubuntu 26.04.",12,1,"2026-08-06T00:00:00+00:00","2026-10-23T13:27:09+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":25},[184],{"id":23,"name":24,"slug":25,"color":26,"icon":25},"\u002Fblog\u002Fcovers\u002Fdocker-compose-production-checklist-poster.svg",true,1794270589324]