[{"data":1,"prerenderedAt":184},["ShallowReactive",2],{"seo-verification":3,"blog-desplegar-symfony-en-un-vps-es":6},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-desplegar-symfony-en-un-vps-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":129,"ctaBody":130,"ctaButton":131,"ctaUrl":132,"relatedPosts":133},48,"desplegar-symfony-en-un-vps",{"fr":12,"en":13,"ar":14,"es":10},"deployer-symfony-vps","deploy-a-symfony-application-on-a-vps","نشر-تطبيق-symfony-على-vps","Desplegar Symfony en VPS: guía completa 2024","Instala, configura y asegura una aplicación Symfony en VPS Ubuntu con PHP 8.3, Deployer PHP, nginx, Supervisor y Redis. Guía paso a paso.",8,2,false,"2026-05-03T00:00:00+00:00","2026-09-07T11:26:10+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"Desarrollo","developpement","bg-warning\u002F10 text-warning","dev",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fdeployer-symfony-vps-poster.svg",{"categorySlug":34,"appSlug":35},"desarrollo","symfony-stack","Un VPS te da el control total que Symfony merece: PHP 8.3, extensiones nativas, workers asíncronos y acceso root completo. Esta guía cubre la instalación de PHP 8.3, el despliegue automatizado con Deployer PHP, la configuración de nginx y Supervisor para colas, y el endurecimiento de seguridad. Al final, descubre cómo el Marketplace de ServOrbit automatiza toda la infraestructura en pocos minutos.",[38,42,53,56,84,111,114,117,120,123,126],{"type":39,"title":40,"body":41},"h2","¿Por qué Symfony en VPS en lugar de hosting compartido?","El hosting compartido te obliga a usar la versión de PHP del servidor, deshabilita extensiones consideradas 'peligrosas' e impide ejecutar procesos persistentes en segundo plano. Symfony 7 requiere PHP 8.2 como mínimo — un requisito que muchos hostings compartidos aún no cumplen. En un VPS, eliges PHP 8.3 desde el primer día, configuras OPcache con precisión e instalas ext-redis, ext-intl o ext-amqp según tus necesidades.\n\nLos workers asíncronos (Symfony Messenger) requieren un proceso persistente gestionado por Supervisor o systemd. En hosting compartido, esto es simplemente imposible. En un VPS, arranca con un comando y se reinicia automáticamente tras un fallo.",{"type":43,"title":44,"items":45},"ul","Lo que un VPS desbloquea para Symfony",[46,47,48,49,50,51,52],"**Acceso root completo** — instala cualquier extensión PHP, configura OPcache línea por línea y modifica php.ini sin abrir un ticket de soporte","**PHP 8.3 nativo** — aprovecha las typed class constants, el atributo `#[Override]` y el JIT mejorado sin esperar la migración del servidor compartido","**Supervisor y workers persistentes** — ejecuta `messenger:consume` de forma continua con reinicio automático y rotación de logs para procesar tus colas","**Redis local** — instala Redis en el mismo VPS para sesiones, caché de Doctrine y transportes de Messenger, eliminando la latencia de red hacia un servicio externo","**Multi-versión PHP con ondrej\u002Fphp** — mantén PHP 8.1 para una app legacy y PHP 8.3 para la nueva en el mismo host con pools FPM separados","**Xdebug y profiling en staging** — activa Blackfire o Xdebug en el entorno de review sin afectar la producción, e instala la herramienta en producción solo cuando sea necesario","**Despliegues atómicos con Deployer** — cero tiempo de inactividad gracias a symlinks, rollback en un comando integrado en tu pipeline CI\u002FCD",{"type":39,"title":54,"body":55},"Requisitos concretos — recursos y software","**Sistema operativo**: Ubuntu 24.04 LTS o Debian 12.\n\n**PHP**: 8.3 recomendado (mínimo 8.2 para Symfony 7). Extensiones requeridas: `php8.3-cli`, `php8.3-fpm`, `php8.3-mbstring`, `php8.3-xml`, `php8.3-curl`, `php8.3-zip`, `php8.3-intl`, `php8.3-opcache`.\n\n**Composer**: versión 2.x obligatoria.\n\n**Base de datos**: MySQL 8.0+ o PostgreSQL 16+.\n\n**RAM mínima**:\n- 1 GB: desarrollo o app ligera sin colas\n- 2 GB: producción con Symfony Messenger y un transporte Redis\n- 4 GB: workers múltiples, Redis, sesiones de alta frecuencia\n\n**Puertos a abrir**: 80, 443, 22. Cierra todo lo demás.",{"type":57,"title":58,"steps":59},"steps","Instalar PHP 8.3 y Symfony CLI en Ubuntu VPS",[60,63,66,69,72,75,78,81],{"title":61,"body":62},"Actualizar el sistema e instalar dependencias previas","`apt update && apt upgrade -y && apt install -y curl git unzip software-properties-common`",{"title":64,"body":65},"Agregar el repositorio ondrej\u002Fphp","`add-apt-repository ppa:ondrej\u002Fphp && apt update`",{"title":67,"body":68},"Instalar PHP 8.3-FPM y las extensiones requeridas por Symfony","`apt install -y php8.3-fpm php8.3-cli php8.3-mbstring php8.3-xml php8.3-curl php8.3-zip php8.3-intl php8.3-opcache php8.3-redis php8.3-mysql`",{"title":70,"body":71},"Verificar la versión instalada y el estado del servicio FPM","`php --version && systemctl status php8.3-fpm`",{"title":73,"body":74},"Instalar Composer 2.x de forma global","`curl -sS https:\u002F\u002Fgetcomposer.org\u002Finstaller | php -- --install-dir=\u002Fusr\u002Flocal\u002Fbin --filename=composer && composer --version`",{"title":76,"body":77},"Instalar la Symfony CLI","`curl -1sLf 'https:\u002F\u002Fdl.cloudsmith.io\u002Fpublic\u002Fsymfony\u002Fstable\u002Fsetup.deb.sh' | bash && apt install -y symfony-cli`",{"title":79,"body":80},"Verificar que se cumplen todos los requisitos de Symfony","`symfony check:requirements`",{"title":82,"body":83},"Instalar nginx y Redis","`apt install -y nginx redis-server && systemctl enable --now nginx redis-server`",{"type":57,"title":85,"steps":86},"Desplegar una app Symfony en producción con Deployer PHP",[87,90,93,96,99,102,105,108],{"title":88,"body":89},"En tu proyecto Symfony local, agrega Deployer como dependencia de desarrollo","`composer require deployer\u002Fdeployer --dev`",{"title":91,"body":92},"Inicializar la configuración de Deployer (elegir la receta `symfony`)","`.\u002Fvendor\u002Fbin\u002Fdep init`",{"title":94,"body":95},"Editar `deploy.php` en la raíz del proyecto","require 'recipe\u002Fsymfony.php';\nset('repository', 'git@github.com:tu-org\u002Ftu-app.git');\nhost('tu-vps.example.com')\n    ->set('remote_user', 'deploy')\n    ->set('deploy_path', '\u002Fvar\u002Fwww\u002Fsymfony-app');",{"title":97,"body":98},"En el VPS, crear el usuario de despliegue","`useradd -m -s \u002Fbin\u002Fbash deploy && usermod -aG www-data deploy`",{"title":100,"body":101},"Crear `.env.local` en el VPS en `{{deploy_path}}\u002Fshared\u002F`","APP_ENV=prod\nAPP_DEBUG=false\nAPP_SECRET=\u003Csecreto-aleatorio-32-chars>\nDATABASE_URL=mysql:\u002F\u002Fuser:pass@127.0.0.1:3306\u002Fsymfony_db",{"title":103,"body":104},"Ejecutar el primer despliegue desde tu máquina local","`.\u002Fvendor\u002Fbin\u002Fdep deploy production`",{"title":106,"body":107},"Verificar que el symlink `current\u002F` apunta a la última release","`ls -la \u002Fvar\u002Fwww\u002Fsymfony-app\u002F`",{"title":109,"body":110},"Si algo falla, hacer rollback inmediato","`.\u002Fvendor\u002Fbin\u002Fdep rollback production`",{"type":39,"title":112,"body":113},"Configuración de nginx para Symfony","Crea `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fsymfony-app` con este bloque server mínimo:\n\n```nginx\nserver {\n    listen 80;\n    server_name tu-dominio.com;\n    root \u002Fvar\u002Fwww\u002Fsymfony-app\u002Fcurrent\u002Fpublic;\n    index index.php;\n\n    location \u002F {\n        try_files $uri \u002Findex.php$is_args$args;\n    }\n\n    location ~ \\.php$ {\n        fastcgi_pass unix:\u002Frun\u002Fphp\u002Fphp8.3-fpm.sock;\n        fastcgi_split_path_info ^(.+\\.php)(\u002F.*)$;\n        include fastcgi_params;\n        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;\n        fastcgi_param DOCUMENT_ROOT $realpath_root;\n    }\n\n    location ~ \u002F\\.ht {\n        deny all;\n    }\n}\n```\n\nActiva el sitio y prueba la configuración antes de recargar nginx:\n`ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fsymfony-app \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F && nginx -t && systemctl reload nginx`\n\nPara HTTPS usa Certbot: `certbot --nginx -d tu-dominio.com`.",{"type":39,"title":115,"body":116},"Variables de entorno y seguridad","Symfony lee `.env`, luego `.env.local`, luego `.env.prod.local`. En producción, todos los valores sensibles deben estar en `.env.local` — nunca commitados en git.\n\nVariables esenciales en producción:\n\n```dotenv\nAPP_ENV=prod\nAPP_DEBUG=false\nAPP_SECRET=\u003C64-chars-hex-aleatorio>\nDATABASE_URL=\"mysql:\u002F\u002Fdbuser:contraseña@127.0.0.1:3306\u002Fsymfony_prod\"\nMAILER_DSN=smtp:\u002F\u002Fuser:pass@smtp.example.com:587\nMESSENGER_TRANSPORT_DSN=redis:\u002F\u002F127.0.0.1:6379\u002Fmessages\n```\n\nGenera APP_SECRET aleatoriamente: `openssl rand -hex 32`. Nunca reutilices el valor por defecto del proyecto.\n\n`APP_DEBUG=false` es crítico: en modo debug, Symfony expone trazas de pila completas y consultas SQL en el navegador — una filtración grave en producción.",{"type":39,"title":118,"body":119},"Colas asíncronas con Symfony Messenger y Supervisor","Symfony Messenger difiere las tareas pesadas (envío de emails, generación de PDFs, webhooks) a una cola procesada de forma asíncrona. En un VPS, Supervisor garantiza que el worker funcione continuamente y se reinicie tras un fallo.\n\nInstala Supervisor:\n`apt install -y supervisor`\n\nCrea `\u002Fetc\u002Fsupervisor\u002Fconf.d\u002Fsymfony-messenger.conf`:\n\n```ini\n[program:symfony-messenger]\ncommand=\u002Fvar\u002Fwww\u002Fsymfony-app\u002Fcurrent\u002Fbin\u002Fconsole messenger:consume async --time-limit=3600\nuser=deploy\nautostart=true\nautorestart=true\nstartretries=3\nredirect_stderr=true\nstdout_logfile=\u002Fvar\u002Flog\u002Fsupervisor\u002Fsymfony-messenger.log\n```\n\nActiva e inicia el worker:\n`supervisorctl reread && supervisorctl update && supervisorctl start symfony-messenger`\n\nMonitorea el estado: `supervisorctl status symfony-messenger`",{"type":121,"body":122},"tip","**Hardening en 3 comandos.** Bloquea el acceso a `.git\u002F` en nginx (agrega `location ~ \u002F\\.git { deny all; }` a tu bloque server). Instala fail2ban para bloquear escaneos SSH: `apt install -y fail2ban`. Restringe los permisos del directorio de despliegue: `chmod 750 \u002Fvar\u002Fwww\u002Fsymfony-app && chown -R deploy:www-data \u002Fvar\u002Fwww\u002Fsymfony-app`. Configura OPcache con `opcache.validate_timestamps=0` en producción para máximo rendimiento.",{"type":39,"title":124,"body":125},"Resolución de problemas — los 4 errores más frecuentes","**1. `The environment variable \"APP_SECRET\" is not set.`**\nAPP_SECRET falta en `.env.local` en el servidor. Verifica que el archivo existe en `{{deploy_path}}\u002Fshared\u002F` y contiene esta variable.\n\n**2. Error 500 silencioso — logs vacíos**\nCon `APP_DEBUG=false`, Symfony escribe en `var\u002Flog\u002Fprod.log`. Lee este archivo en tiempo real: `tail -f \u002Fvar\u002Fwww\u002Fsymfony-app\u002Fcurrent\u002Fvar\u002Flog\u002Fprod.log`. Un error de permisos en `var\u002Fcache\u002F` o `var\u002Flog\u002F` es la causa más frecuente — corrígelo con `chown -R deploy:www-data var\u002F`.\n\n**3. `Connection refused` en la base de datos**\nDATABASE_URL apunta a `127.0.0.1` pero MySQL escucha en `localhost` (socket Unix) — o al revés. Prueba directamente: `mysql -u dbuser -p -h 127.0.0.1 symfony_db`.\n\n**4. No hay comandos definidos en el namespace \"cache\"**\nSymfony no puede escribir en `var\u002Fcache\u002F`. Solución: `chmod -R 775 var\u002Fcache var\u002Flog && chown -R deploy:www-data var\u002F`.",{"type":39,"title":127,"body":128},"Desplegar desde el Marketplace de ServOrbit","Si prefieres evitar horas de configuración manual, la plantilla **symfony-stack** del Marketplace de ServOrbit instala y configura automáticamente toda la infraestructura descrita en esta guía: PHP 8.3-FPM, Composer, nginx optimizado para Symfony, Redis, Supervisor y los permisos correctos. El VPS está operativo en menos de 5 minutos, con acceso SSH root inmediato para personalizar tu despliegue.\n\nMantienes el control total: el VPS es tuyo, no hay lock-in, y puedes usar Deployer PHP exactamente como se describe arriba desde la primera conexión SSH.","Symfony operativo en 5 minutos","Pide un VPS preconfigurado con PHP 8.3, nginx, Redis y Supervisor — el stack completo de Symfony instalado y asegurado, sin configuración manual.","Desplegar Symfony en VPS","\u002Fmarketplace\u002Fdesarrollo\u002Fsymfony-stack",[134,151,168],{"id":135,"slug":136,"slugs":137,"title":141,"excerpt":142,"readTime":23,"views":143,"isPinned":19,"publishedAt":144,"updatedAt":21,"category":145,"categories":146,"featuredImage":30,"bgImage":31,"posterImage":148,"relatedSolution":149},5,"desplegar-laravel-en-un-vps",{"fr":138,"en":139,"ar":140,"es":136},"deployer-laravel-vps","deploying-laravel-on-a-vps-a-production-guide","نشر-laravel-على-خادم-vps-دليل-الإنتاج","Desplegar Laravel en un VPS: guía de producción","Ponga Laravel en producción en un VPS: PHP, workers, caché, base de datos, reverse proxy y HTTPS bien configurados.",0,"2026-02-09T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[147],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-laravel-vps-poster.svg",{"categorySlug":27,"appSlug":150},"laravel-stack",{"id":152,"slug":153,"slugs":154,"title":158,"excerpt":159,"readTime":160,"views":143,"isPinned":19,"publishedAt":161,"updatedAt":21,"category":162,"categories":163,"featuredImage":30,"bgImage":31,"posterImage":165,"relatedSolution":166},43,"desplegar-una-aplicacion-nodejs-en-un-vps",{"fr":155,"en":156,"ar":157,"es":153},"deployer-nodejs-vps","deploy-a-nodejs-application-on-a-vps","نشر-تطبيق-nodejs-على-vps","Desplegar una aplicación Node.js en un VPS","Despliegue una aplicación Node.js en producción en un VPS: PM2, reverse proxy Nginx, SSL Let's Encrypt y arranque automático con el sistema.",3,"2026-05-08T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[164],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-nodejs-vps-poster.svg",{"categorySlug":34,"appSlug":167},"nodejs-stack",{"id":169,"slug":170,"slugs":171,"title":175,"excerpt":176,"readTime":160,"views":135,"isPinned":19,"publishedAt":177,"updatedAt":21,"category":178,"categories":179,"featuredImage":30,"bgImage":31,"posterImage":181,"relatedSolution":182},44,"desplegar-una-aplicacion-django-en-un-vps",{"fr":172,"en":173,"ar":174,"es":170},"deployer-django-vps","deploy-a-django-application-on-a-vps","نشر-تطبيق-django-على-vps","Desplegar una aplicación Django en un VPS","Despliegue Django en un VPS: Gunicorn, Nginx, PostgreSQL, Docker y SSL. Guía completa para desarrolladores Python que quieren autoalojar.","2026-05-07T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[180],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-django-vps-poster.svg",{"categorySlug":34,"appSlug":183},"django",1789665016918]