[{"data":1,"prerenderedAt":188},["ShallowReactive",2],{"seo-verification":3,"blog-deployer-symfony-vps-ma-fr":6,"promo-bar-likely":187},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-deployer-symfony-vps-ma-fr",{"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":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":35,"sections":36,"ctaTitle":128,"ctaBody":129,"ctaButton":130,"ctaUrl":131,"relatedPosts":132},48,"deployer-symfony-vps",{"fr":10,"en":12,"ar":13,"es":14},"deploy-a-symfony-application-on-a-vps","نشر-تطبيق-symfony-على-vps","desplegar-symfony-en-un-vps","Déployer Symfony sur VPS : guide complet 2024","Installez, configurez et sécurisez une application Symfony sur VPS Ubuntu avec PHP 8.3, Deployer PHP, nginx, Supervisor et Redis. Guide étape par étape.",9,3,false,"2026-05-03T00:00:00+00:00","2026-11-08T01:13:13+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},4,"Développement","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":25,"appSlug":34},"symfony-stack","Un VPS vous donne le contrôle total que Symfony mérite : PHP 8.3, extensions natives, workers asynchrones et accès root complet. Ce guide couvre l'installation de PHP 8.3, le déploiement automatisé avec Deployer PHP, la configuration nginx et Supervisor pour les queues, ainsi que le durcissement de sécurité. En fin d'article, découvrez comment le Marketplace ServOrbit automatise tout ce socle en quelques clics.",[37,41,52,55,83,110,113,116,119,122,125],{"type":38,"title":39,"body":40},"h2","Pourquoi Symfony sur VPS plutôt que sur mutualisé ?","Un hébergement mutualisé impose la version PHP du serveur, désactive les extensions jugées « dangereuses » et interdit l'installation de processus persistants. Symfony 7.4 LTS requiert PHP 8.2 au minimum et Symfony 8 PHP 8.4 — des versions que de nombreux mutualisés ne proposent pas encore. Sur VPS, vous choisissez PHP 8.3 dès le premier jour, activez OPcache avec une configuration fine, et installez ext-redis, ext-intl ou ext-amqp selon vos besoins.\n\nLes workers asynchrones (Symfony Messenger) exigent un processus qui tourne en fond, géré par Supervisor ou systemd. Sur mutualisé, ce processus est tout simplement impossible. Sur VPS, il démarre en une commande et redémarre automatiquement après un crash. Pour une application Symfony qui traite des emails transactionnels, des notifications push ou de l'import de fichiers, c'est une différence non négociable.",{"type":42,"title":43,"items":44},"ul","Ce que le VPS débloque pour Symfony",[45,46,47,48,49,50,51],"**Accès root complet** — installez n'importe quelle extension PHP, configurez OPcache à la ligne près et modifiez php.ini sans ticket support","**PHP 8.3 natif** — profitez des typed class constants, et de l'attribut `#[Override]` sans attendre la migration du serveur partagé","**Supervisor et workers persistants** — faites tourner `messenger:consume` en continu, avec redémarrage automatique et rotation des logs, pour traiter vos queues sans cron hacké","**Redis en local** — installez Redis sur le même VPS pour les sessions, le cache Doctrine et les transports Messenger, éliminant ainsi la latence réseau vers un service externe","**Multi-version PHP via ondrej\u002Fphp** — maintenez PHP 8.1 pour une app legacy et PHP 8.3 pour la nouvelle, sur le même hôte, avec des pools FPM séparés","**Xdebug et profiling en staging** — activez Blackfire ou Xdebug sur l'environnement de recette sans impacter la prod, dans le même datacenter","**Déploiements atomiques avec Deployer** — zéro downtime grâce aux symlinks, rollback en une commande, hooks `dep deploy` intégrés dans votre pipeline CI\u002FCD",{"type":38,"title":53,"body":54},"Prérequis chiffrés — ressources et logiciels","**Système d'exploitation** : Ubuntu 24.04 LTS ou Debian 12. Ces deux distributions bénéficient du dépôt PHP d'Ondřej Surý (PPA `ondrej\u002Fphp` sur Ubuntu, `packages.sury.org` sur Debian) et d'un support long terme compatible avec les cycles de maintenance de Symfony.\n\n**PHP** : version 8.3 recommandée pour Symfony 7.4 LTS (minimum 8.2). Symfony 8 exige PHP 8.4 : remplacez alors `8.3` par `8.4` dans les noms de paquets. Extensions requises : `php8.3-cli`, `php8.3-fpm`, `php8.3-mbstring`, `php8.3-xml`, `php8.3-curl`, `php8.3-zip`, `php8.3-intl`, `php8.3-opcache`. Ajoutez `php8.3-redis` si vous utilisez Redis, `php8.3-pgsql` pour PostgreSQL.\n\n**Composer** : version 2.x obligatoire. Packagist.org ne sert plus les métadonnées de paquets à Composer 1.x.\n\n**Base de données** : MySQL 8.0+ ou PostgreSQL 16+. Pour une app Symfony standard, 1 Go de RAM suffit généralement pour MySQL comme pour PostgreSQL.\n\n**Nginx** : 1.24+ depuis les dépôts officiels Ubuntu ou nginx.org.\n\n**RAM minimale** :\n- 1 Go : développement ou app légère sans queues\n- 2 Go : production avec Symfony Messenger et un transport Redis\n- 4 Go : workers multiples, Redis, sessions haute fréquence\n\n**Ports à ouvrir** : 80 (HTTP), 443 (HTTPS), 22 (SSH). Fermez tout le reste.",{"type":56,"title":57,"steps":58},"steps","Installer PHP 8.3 et Symfony CLI sur VPS Ubuntu",[59,62,65,68,71,74,77,80],{"title":60,"body":61},"Mettre à jour le système et installer les dépendances préalables","`apt update && apt upgrade -y && apt install -y curl git unzip software-properties-common`",{"title":63,"body":64},"Ajouter le dépôt ondrej\u002Fphp (Ubuntu 24.04 fournit déjà PHP 8.3 ; le dépôt est nécessaire pour PHP 8.4 ou plusieurs versions)","`add-apt-repository ppa:ondrej\u002Fphp && apt update`",{"title":66,"body":67},"Installer PHP 8.3-FPM et les extensions requises par 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":69,"body":70},"Vérifier la version installée et l'état du service FPM","`php --version && systemctl status php8.3-fpm`",{"title":72,"body":73},"Installer Composer 2.x globalement","`curl -sS https:\u002F\u002Fgetcomposer.org\u002Finstaller | php -- --install-dir=\u002Fusr\u002Flocal\u002Fbin --filename=composer && composer --version`",{"title":75,"body":76},"Installer la Symfony CLI pour créer des projets et vérifier les prérequis","`curl -1sLf 'https:\u002F\u002Fdl.cloudsmith.io\u002Fpublic\u002Fsymfony\u002Fstable\u002Fsetup.deb.sh' | bash && apt install -y symfony-cli`",{"title":78,"body":79},"Vérifier que tous les prérequis Symfony sont satisfaits","`symfony check:requirements`",{"title":81,"body":82},"Installer nginx et Redis","`apt install -y nginx redis-server && systemctl enable --now nginx redis-server`",{"type":56,"title":84,"steps":85},"Déployer une app Symfony en production avec Deployer PHP",[86,89,92,95,98,101,104,107],{"title":87,"body":88},"Dans votre projet Symfony local, ajouter Deployer comme dépendance de développement","`composer require deployer\u002Fdeployer --dev`",{"title":90,"body":91},"Initialiser la configuration Deployer (choisir le recette `symfony` à la question)","`.\u002Fvendor\u002Fbin\u002Fdep init`",{"title":93,"body":94},"Éditer `deploy.php` à la racine du projet — adapter host, chemin de déploiement et branches","require 'recipe\u002Fsymfony.php';\nset('repository', 'git@github.com:votre-org\u002Fvotre-app.git');\nhost('votre-vps.example.com')\n    ->set('remote_user', 'deploy')\n    ->set('deploy_path', '\u002Fvar\u002Fwww\u002Fsymfony-app');",{"title":96,"body":97},"Sur le VPS, créer l'utilisateur de déploiement et lui donner accès à nginx","`useradd -m -s \u002Fbin\u002Fbash deploy && usermod -aG www-data deploy`",{"title":99,"body":100},"Créer le fichier `.env.local` sur le VPS dans `{{deploy_path}}\u002Fshared\u002F` — il sera partagé entre toutes les releases","APP_ENV=prod\nAPP_DEBUG=false\nAPP_SECRET=\u003Csecret-aleatoire-32-chars>\nDATABASE_URL=mysql:\u002F\u002Fuser:pass@127.0.0.1:3306\u002Fsymfony_db",{"title":102,"body":103},"Lancer le premier déploiement depuis votre machine locale","`.\u002Fvendor\u002Fbin\u002Fdep deploy votre-vps.example.com`",{"title":105,"body":106},"Vérifier que le symlink `current\u002F` pointe bien vers la dernière release","`ls -la \u002Fvar\u002Fwww\u002Fsymfony-app\u002F`",{"title":108,"body":109},"En cas de problème, effectuer un rollback immédiat vers la release précédente","`.\u002Fvendor\u002Fbin\u002Fdep rollback votre-vps.example.com`",{"type":38,"title":111,"body":112},"Configuration nginx pour Symfony","Créez le fichier `\u002Fetc\u002Fnginx\u002Fsites-available\u002Fsymfony-app` avec ce bloc server minimal, puis activez-le avec un symlink vers `sites-enabled\u002F`. Seul `index.php` est transmis à PHP-FPM : un fichier `.php` déposé ailleurs dans `public\u002F` répond 404 au lieu d'être exécuté.\n\n```nginx\nserver {\n    listen 80;\n    server_name votre-domaine.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 ~ ^\u002Findex\\.php(\u002F|$) {\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        internal;\n    }\n\n    # tout autre fichier .php de public\u002F : 404, jamais exécuté\n    location ~ \\.php$ {\n        return 404;\n    }\n\n    location ~ \u002F\\.ht {\n        deny all;\n    }\n}\n```\n\nActivez le site et testez la configuration avant de recharger nginx :\n`ln -s \u002Fetc\u002Fnginx\u002Fsites-available\u002Fsymfony-app \u002Fetc\u002Fnginx\u002Fsites-enabled\u002F && nginx -t && systemctl reload nginx`\n\nPour HTTPS, utilisez Certbot : `certbot --nginx -d votre-domaine.com`. Certbot modifie automatiquement le bloc server pour rediriger HTTP vers HTTPS et configurer les certificats Let's Encrypt.",{"type":38,"title":114,"body":115},"Variables d'environnement et sécurité","Symfony lit `.env`, puis `.env.local`, puis `.env.prod.local`. En production, toute valeur sensible doit être dans `.env.local` — jamais commitée dans le dépôt git.\n\nVariables essentielles en production :\n\n```dotenv\nAPP_ENV=prod\nAPP_DEBUG=false\nAPP_SECRET=\u003C64-chars-hex-aléatoire>\nDATABASE_URL=\"mysql:\u002F\u002Fdbuser:motdepasse@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\n`APP_SECRET` doit être généré aléatoirement : `openssl rand -hex 32`. Ne jamais réutiliser la valeur par défaut du projet.\n\n`APP_DEBUG=false` est critique : en mode debug, Symfony expose les traces de pile complètes, les variables de template et les requêtes SQL dans le navigateur — une fuite d'information sévère en production.\n\nAvec le coffre de secrets de Symfony (`config\u002Fsecrets\u002Fprod\u002F`), les secrets chiffrés peuvent être committés sans risque ; seule la clé de déchiffrement (`prod.decrypt.private.php`, ou son contenu en base64 dans la variable d'environnement `SYMFONY_DECRYPTION_SECRET`) reste hors du dépôt, sur le serveur.",{"type":38,"title":117,"body":118},"Queues asynchrones avec Symfony Messenger et Supervisor","Symfony Messenger permet de différer les tâches lourdes (envoi d'email, génération PDF, webhooks) dans une queue traitée de façon asynchrone. Sur VPS, Supervisor garantit que le worker tourne en permanence et redémarre après un crash.\n\nInstallez Supervisor :\n`apt install -y supervisor`\n\nCréez `\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\nstdout_logfile_maxbytes=10MB\nstdout_logfile_backups=5\n```\n\nL'option `--time-limit=3600` force le worker à se relancer toutes les heures, libérant la mémoire accumulée. Supervisor s'occupe du redémarrage automatique.\n\nActivez et démarrez le worker :\n`supervisorctl reread && supervisorctl update && supervisorctl start symfony-messenger`\n\nPour surveiller l'état : `supervisorctl status symfony-messenger`\n\nCôté Symfony, configurez le transport Redis dans `config\u002Fpackages\u002Fmessenger.yaml` :\n```yaml\nframework:\n    messenger:\n        transports:\n            async:\n                dsn: '%env(MESSENGER_TRANSPORT_DSN)%'\n                retry_strategy:\n                    max_retries: 3\n                    delay: 1000\n```",{"type":120,"body":121},"tip","**Hardening en 3 commandes.** Bloquez l'accès à `.git\u002F` dans nginx (ajoutez `location ~ \u002F\\.git { deny all; }` à votre bloc server). Installez fail2ban pour bloquer les scans SSH et les tentatives de connexion répétées : `apt install -y fail2ban`. Restreignez les permissions du répertoire de déploiement : `chmod 750 \u002Fvar\u002Fwww\u002Fsymfony-app && chown -R deploy:www-data \u002Fvar\u002Fwww\u002Fsymfony-app`. Enfin, configurez le cache OPcache dans `\u002Fetc\u002Fphp\u002F8.3\u002Ffpm\u002Fconf.d\u002F10-opcache.ini` : `opcache.enable=1`, `opcache.memory_consumption=256`, `opcache.validate_timestamps=0` (désactivez la validation en prod pour les performances maximales — invalidez manuellement après chaque déploiement avec `cachetool opcache:reset`).",{"type":38,"title":123,"body":124},"Dépannage — les 4 erreurs les plus fréquentes","**1. `The environment variable \"APP_SECRET\" is not set.`**\nAPP_SECRET est absent du fichier `.env.local` sur le serveur. Vérifiez que le fichier existe dans `{{deploy_path}}\u002Fshared\u002F` et qu'il contient bien cette variable. Deployer crée un symlink vers ce fichier partagé à chaque release — si le symlink est cassé, Symfony ne lit pas `.env.local`.\n\n**2. Erreur 500 silencieuse — logs vides**\nAvec `APP_DEBUG=false`, Symfony n'affiche rien dans le navigateur et écrit dans `var\u002Flog\u002Fprod.log`. Lisez ce fichier en temps réel : `tail -f \u002Fvar\u002Fwww\u002Fsymfony-app\u002Fcurrent\u002Fvar\u002Flog\u002Fprod.log`. Une permission refusée sur `var\u002Fcache\u002F` ou `var\u002Flog\u002F` est la cause la plus fréquente — corrigez avec `chown -R deploy:www-data var\u002F` depuis le répertoire de la release courante.\n\n**3. `Connection refused` sur la base de données**\nDATABASE_URL pointe vers `127.0.0.1` mais MySQL écoute sur `localhost` (socket Unix) — ou l'inverse. Testez la connexion directement : `mysql -u dbuser -p -h 127.0.0.1 symfony_db`. Si MySQL n'écoute pas sur TCP, ajoutez `bind-address = 127.0.0.1` dans `\u002Fetc\u002Fmysql\u002Fmysql.conf.d\u002Fmysqld.cnf` et redémarrez.\n\n**4. `Unable to write in the \"cache\" directory`**\nCe message signifie que Symfony ne peut pas écrire dans `var\u002Fcache\u002F`. Le processus PHP-FPM tourne sous `www-data`, mais le répertoire appartient à `deploy` sans permissions d'écriture pour le groupe. Solution : `chmod -R 775 var\u002Fcache var\u002Flog && chown -R deploy:www-data var\u002F`.",{"type":38,"title":126,"body":127},"Déployer depuis le Marketplace ServOrbit","Si vous préférez éviter les heures de configuration manuelle, le template **symfony-stack** du Marketplace ServOrbit installe automatiquement le socle logiciel de ce guide sur Ubuntu 24.04 : PHP 8.3-FPM et ses extensions, Composer, nginx, PostgreSQL 16, Redis et Supervisor. Il n'y a pas d'interface web : vous disposez d'un accès SSH root pour configurer le bloc server nginx, le worker Supervisor et les permissions comme décrit plus haut.\n\nLe template installe PostgreSQL et non MySQL : écrivez une `DATABASE_URL` en `postgresql:\u002F\u002F…` dans `.env.local`, avec un `APP_SECRET` généré par `openssl rand -hex 32`, ou installez MySQL et `php8.3-mysql` si votre application en dépend.\n\nVous gardez un contrôle total : le VPS vous appartient, il n'y a aucun lock-in, et vous pouvez utiliser Deployer PHP exactement comme décrit ci-dessus dès la première connexion SSH.","Symfony opérationnel en 5 minutes","Commandez un VPS pré-configuré avec PHP 8.3, nginx, Redis et Supervisor — le stack Symfony complet installé et sécurisé, sans configuration manuelle.","Déployer Symfony sur VPS","\u002Fapplications\u002Fdeveloppement\u002Fsymfony-stack",[133,151,169],{"id":134,"slug":135,"slugs":136,"title":140,"excerpt":141,"readTime":23,"views":142,"isPinned":19,"noindex":19,"publishedAt":143,"updatedAt":144,"category":145,"categories":146,"featuredImage":30,"bgImage":31,"posterImage":148,"relatedSolution":149},5,"deployer-laravel-vps",{"fr":135,"en":137,"ar":138,"es":139},"deploying-laravel-on-a-vps-a-production-guide","نشر-laravel-على-خادم-vps-دليل-الإنتاج","desplegar-laravel-en-un-vps","Déployer Laravel sur un VPS : guide production","Passez Laravel en production sur VPS : PHP, workers, cache, base de données, reverse proxy et HTTPS proprement configurés.",1,"2026-02-09T00:00:00+00:00","2026-09-07T11:26:10+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":142,"isPinned":19,"noindex":19,"publishedAt":161,"updatedAt":162,"category":163,"categories":164,"featuredImage":30,"bgImage":31,"posterImage":166,"relatedSolution":167},43,"deployer-nodejs-vps",{"fr":153,"en":155,"ar":156,"es":157},"deploy-a-nodejs-application-on-a-vps","نشر-تطبيق-nodejs-على-vps","desplegar-una-aplicacion-nodejs-en-un-vps","Déployer une application Node.js sur un VPS","Déployez une application Node.js en production sur un VPS : PM2, reverse proxy Nginx, SSL Let's Encrypt et démarrage automatique au boot.",8,"2026-05-08T00:00:00+00:00","2026-11-08T01:13:12+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[165],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-nodejs-vps-poster.svg",{"categorySlug":25,"appSlug":168},"nodejs-stack",{"id":170,"slug":171,"slugs":172,"title":176,"excerpt":177,"readTime":18,"views":178,"isPinned":19,"noindex":19,"publishedAt":179,"updatedAt":180,"category":181,"categories":182,"featuredImage":30,"bgImage":31,"posterImage":184,"relatedSolution":185},44,"deployer-django-vps",{"fr":171,"en":173,"ar":174,"es":175},"deploy-a-django-application-on-a-vps","نشر-تطبيق-django-على-vps","desplegar-una-aplicacion-django-en-un-vps","Déployer une application Django sur un VPS","Déployez Django sur un VPS : Gunicorn, Nginx, PostgreSQL, Docker et SSL. Guide complet pour développeurs Python qui veulent self-héberger.",7,"2026-05-07T00:00:00+00:00","2026-11-04T16:30:25+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[183],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fdeployer-django-vps-poster.svg",{"categorySlug":25,"appSlug":186},"django",true,1794270699861]