Sube tu proyecto Symfony sin vendor, instala las dependencias desde PHP Composer en el panel, apunta la raíz del documento a public y sírvelo en producción.
Symfony no necesita nada especial del servidor: PHP, una carpeta public como raíz de la web y sus dependencias instaladas con Composer. Lo que sí necesita es ejecutar composer install en el servidor, y en un hosting sin SSH eso lo hace la extensión PHP Composer de Plesk, que está en todos los planes. Esta guía sigue un despliegue real de Symfony 8.1 en un subdominio; si usas Laravel, tienes su propio camino en Cómo instalar Laravel en tu hosting con Laravel Toolkit.
Antes de empezar
- Un subdominio para la aplicación, por ejemplo
symfony.tudominio.es(Cómo crear un subdominio y qué puedes montar en él). Al crearlo, en Raíz del documento escribesymfony, en vez de la carpeta larga que propone el panel. Y su certificado (Cómo activar un certificado Let's Encrypt gratis en tu dominio). - La versión de PHP que pida tu proyecto (Cómo cambiar la versión de PHP de tu web): Symfony 8 exige PHP 8.4, y la fija el
"php": ">=8.4"de tucomposer.json. - Tu proyecto con
composer.jsonycomposer.locken la raíz. El.lockes importante: con él, el servidor instala exactamente las mismas versiones que tienes en tu ordenador. - Un
.htaccessenpublic. Si en tu ordenador ejecutascomposer require symfony/apache-pack, te lo crea; si no, lo escribes en el paso 6.
Paso a paso
-
Sube el proyecto sin las carpetas
vendornivara la carpetasymfony: un zip desde Archivos y Extraer archivos (Cómo publicar una web Astro en tu hosting sin Node en el servidor), o tu repositorio Git (Cómo desplegar tu web desde GitHub, GitLab o Bitbucket). Borra elindex.htmlde bienvenida de Plesk. Al terminar,composer.jsontiene que estar directamente ensymfony, no en una subcarpeta. -
En Archivos, dentro de
symfony, crea el archivo.env.localcon el entorno de producción y una clave propia de 32 caracteres hexadecimales:
APP_ENV=prod
APP_SECRET=cambia-esto-por-32-caracteres-hex
El .env que viene en el proyecto se queda en dev; .env.local lo sobrescribe solo en el servidor y no viaja con el código.
- En la ficha del subdominio, pulsa PHP Composer y después Analizar. La extensión busca
composer.jsonen la raíz del documento y en sus subcarpetas, y enseña las dependencias de tu proyecto, todas en No instalado. Comprueba que arriba pone Modo: Producción: es el que instala sin los paquetes de desarrollo.
- Pulsa Instalar. Composer descarga los paquetes del
composer.locky ejecuta los scripts de Symfony Flex; tarda un minuto. Al terminar, cada dependencia pasa a Actualizado con su versión.
- Cambia la raíz del documento: en la ficha del subdominio, Configuración de hosting, pon Raíz del documento en
symfony/publicy guarda. A partir de ahí el servidor sirve solo la carpetapublic; el código,vendory.env.localquedan fuera del alcance del navegador.
- Si no subiste el
.htaccessde apache-pack, créalo ensymfony/publiccon este contenido. Sin él, solo responde la página principal y cualquier otra ruta da 404:
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_URI}::$0 ^(/.+)/(.*)::\2$
RewriteRule .* - [E=BASE:%1]
RewriteCond %{HTTP:Authorization} .+
RewriteRule ^ - [E=HTTP_AUTHORIZATION:%0]
RewriteCond %{ENV:REDIRECT_STATUS} =""
RewriteRule ^index\.php(?:/(.*)|$) %{ENV:BASE}/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^ - [L]
RewriteRule ^ %{ENV:BASE}/index.php [L]
</IfModule>
- Abre
https://symfony.tudominio.es. La primera petición tarda un par de segundos: Symfony compila su caché envar/cache/prod. Las siguientes salen al momento.
- Para actualizar: sube el código nuevo y, si cambió
composer.lock, vuelve a PHP Composer → Instalar. Cuando cambies configuración o rutas, borra la carpetavar/cachedesde Archivos para que Symfony la regenere.
Cómo comprobar que ha funcionado
La página principal responde, y una ruta distinta de / también (una que exista en tus controladores): eso prueba el .htaccess. En PHP Composer, todas las dependencias están en Actualizado. Y https://symfony.tudominio.es/.env.local da 404: la raíz del documento está en public.
Si algo falla
- Analizar no encuentra nada:
composer.jsonno está en la raíz del documento. Si extrajiste un zip que traía la carpeta del proyecto dentro, mueve su contenido asymfony. - Instalar falla por la versión de PHP («your php version does not satisfy that requirement»): el subdominio corre una versión más baja de la que pide
composer.json. Cámbiala en PHP (Cómo cambiar la versión de PHP de tu web) y repite. - Error 500 al abrir la web: mira el registro de errores del subdominio en Registros (Cómo leer los registros de tu web para encontrar un error); si tu proyecto lleva Monolog, también en
var/log/prod.log. Lo más habitual es que falte.env.local(Symfony arranca endevy busca paquetes que el modo Producción no instaló) o queAPP_SECRETesté vacío. - La portada funciona y el resto de rutas dan 404: falta el
.htaccessdel paso 6 ensymfony/public. - Tu aplicación usa base de datos: crea una en Bases de datos (Cómo gestionar tu base de datos) y pon el
DATABASE_URLen.env.local, con el formatomysql://usuario:contraseña@localhost:3306/nombre. Las migraciones se lanzan conbin/consoledesde una tarea programada de tipo Ejecutar un script PHP (Cómo crear tareas programadas en tu hosting y dispararlas desde fuera). - Tus assets van con Webpack Encore: construye en tu ordenador y sube
public/buildya hecho; el Composer del panel no ejecuta npm. - Cualquier otra cosa: abre un ticket desde tu área de cliente (Cómo abrir un ticket de soporte y que se resuelva a la primera) con el error de PHP Composer o las últimas líneas del registro de errores.