Files
vps-docs/hestiacp/chapitres/10-deployer-symfony.md
Zana 2e18724685 Ajout du guide PDF HestiaCP réutilisable (HestiaCP 1.10.4)
- 14 chapitres + annexe en Markdown (chapitres/), 99 étapes
- Générateur WeasyPrint (build/build.py) : PDF générique ou
  personnalisé via --vars fichier.conf
- PDF générique + PDF personnalisé srv1.skglobalinstitute.com
- Commandes v-* vérifiées contre le code source HestiaCP 1.10.4
- 03-bis-hestiacp.md pointe vers le nouveau guide

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018J2PsVQ28oW4xEkWJpcU9G
2026-09-10 20:01:59 +02:00

158 lines
5.7 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Déployer un projet Symfony
Exemple : déployer depuis GitHub un projet Symfony sur {{SITE}}, avec sa base `{{CLIENT}}_app`.
Avec HestiaCP, PHP-FPM, le cron et SSH tournent **tous** sous {{CLIENT}}. Il n'y a donc plus de cron de permissions sur `var/cache`, plus d'ACL et plus de `chmod 777`.
> [!NOTE] Prérequis
> - Le site {{SITE}} existe, avec SSL (chapitre 7).
> - La base `{{CLIENT}}_app` existe (chapitre 8).
> - La boîte `noreply` existe (chapitre 9).
## Se connecter en tant que {{CLIENT}}
Depuis votre ordinateur :
```bash
ssh -p {{SSH_PORT}} {{CLIENT}}@{{IP}}
```
Toutes les commandes de ce chapitre se lancent **en {{CLIENT}}**, sauf mention contraire.
## Créer une clé de déploiement GitHub
```bash
ssh-keygen -t ed25519 -f ~/.ssh/github_deploy -N "" -C "deploy@{{SITE}}"
cat >> ~/.ssh/config << 'EOF'
Host github.com
IdentityFile ~/.ssh/github_deploy
IdentitiesOnly yes
EOF
chmod 600 ~/.ssh/config
cat ~/.ssh/github_deploy.pub
```
Sur GitHub, dans le dépôt : **Settings › Deploy keys › Add deploy key**. Collez la clé affichée et laissez « Allow write access » **décoché**.
> [!CHECK]
> `ssh -T git@github.com` répond `Hi <compte>/<dépôt>! You've successfully authenticated…` (tapez `yes` à la première connexion).
## Cloner le projet
Le dossier `public_html` contient une page d'accueil HestiaCP par défaut : videz-le, puis clonez le projet dedans.
```bash
cd ~/web/{{SITE}}/public_html
rm -f index.html robots.txt
# Remplacez COMPTE/PROJET par votre dépôt GitHub
git clone git@github.com:COMPTE/PROJET.git .
ls
```
> [!CHECK]
> Vous voyez `bin/`, `config/`, `public/`, `src/`, `composer.json`…
> [!WARNING] Le fichier .htaccess de Symfony
> Apache a besoin de `public/.htaccess` pour router les URL vers `index.php`. S'il n'existe pas dans votre dépôt, ajoutez-le **sur votre poste** avec `composer require symfony/apache-pack`, puis commitez-le.
## Configurer l'environnement de production
Générez un secret :
```bash
php -r 'echo bin2hex(random_bytes(16)), PHP_EOL;'
```
Relevez la version exacte de MariaDB :
```bash
mariadb --version
```
Créez `.env.local` avec vos valeurs. `serverVersion` reprend la version affichée, par exemple `11.8.3-MariaDB` :
```bash
cat > .env.local << 'EOF'
APP_ENV=prod
APP_DEBUG=0
APP_SECRET=collez_le_secret_ici
DATABASE_URL="mysql://{{CLIENT}}_app:MOT_DE_PASSE_BDD@127.0.0.1:3306/{{CLIENT}}_app?serverVersion=11.8.3-MariaDB&charset=utf8mb4"
MAILER_DSN=smtp://noreply%40{{DOMAINE}}:MOT_DE_PASSE_NOREPLY@mail.{{DOMAINE}}:587
EOF
chmod 600 .env.local
```
## Installer les dépendances et la base
```bash
composer install --no-dev --optimize-autoloader
php bin/console doctrine:migrations:migrate --no-interaction
php bin/console cache:clear
```
> [!CHECK]
> `php bin/console about` affiche `Environment: prod` et `Debug: false`.
## Pointer le site sur le dossier public/
À faire **avec {{USER}}** (dans une autre session SSH). Le dernier argument `yes` est indispensable : sans lui, PHP n'aurait plus accès à `vendor/`, `var/` ni `config/`, et le site planterait.
```bash
sudo v-change-web-domain-docroot {{CLIENT}} {{SITE}} {{SITE}} public yes
```
> [!CHECK]
> `curl -sI https://{{SITE}} | head -1` renvoie `HTTP/2 200`, et la page d'accueil de l'application s'affiche dans le navigateur.
> [!TIP]
> Dans le panel, c'est **Modifier le domaine › Options avancées › Racine de document personnalisée**, avec **Pointer vers** = {{SITE}} et **Répertoire** = `public`.
## Créer le script de déploiement
En {{CLIENT}}, créez `~/deploy-{{SITE}}.sh`. Il utilise des chemins complets, car les alias (`composer`, `php`) ne fonctionnent pas dans un script.
```bash
cat > ~/deploy-{{SITE}}.sh << 'EOF'
#!/bin/bash
set -euo pipefail
PHP=/usr/bin/php8.4
COMPOSER="$PHP $HOME/.composer/composer"
cd "$HOME/web/{{SITE}}/public_html"
git pull --ff-only
$COMPOSER install --no-dev --optimize-autoloader --no-interaction
$PHP bin/console doctrine:migrations:migrate --no-interaction --allow-no-migration
$PHP bin/console cache:clear
echo "Déploiement terminé : $(git log -1 --format='%h %s')"
EOF
chmod 700 ~/deploy-{{SITE}}.sh
```
Pour déployer une nouvelle version, depuis votre ordinateur :
```bash
ssh -p {{SSH_PORT}} {{CLIENT}}@{{IP}} ./deploy-{{SITE}}.sh
```
> [!NOTE]
> OPcache vérifie la date des fichiers : le nouveau code est pris en compte en quelques secondes, sans redémarrer PHP-FPM.
## Ajouter les tâches planifiées
À faire avec {{USER}}. Les `*` doivent être entre guillemets. Exemple : une commande toutes les 5 minutes, et le worker Messenger, relancé toutes les 5 minutes pendant 4 min 50 s.
```bash
sudo v-add-cron-job {{CLIENT}} '*/5' '*' '*' '*' '*' "/usr/bin/php8.4 /home/{{CLIENT}}/web/{{SITE}}/public_html/bin/console app:ma-commande"
sudo v-add-cron-job {{CLIENT}} '*/5' '*' '*' '*' '*' "/usr/bin/php8.4 /home/{{CLIENT}}/web/{{SITE}}/public_html/bin/console messenger:consume async --time-limit=290 --quiet"
sudo v-list-cron-jobs {{CLIENT}}
```
## Connaître les limites de PHP-FPM
Pour la sécurité, HestiaCP désactive certaines fonctions dans le PHP **web** (PHP-FPM) : `exec`, `system`, `shell_exec`, `passthru`, `proc_open`, `popen`. Tout ce qui lance un processus depuis une page web échouera, par exemple le composant Process ou le transport mail `sendmail://`. Faites ces traitements en console (cron, Messenger), où ces fonctions restent disponibles.
Les chemins accessibles à PHP-FPM (`open_basedir`) se limitent à `public_html/`, `private/`, `~/tmp` et `~/.composer`. Gardez `var/` (cache, logs) **dans** le projet. Pour les fichiers envoyés par les utilisateurs, `public_html/public/uploads` ou `private/` conviennent.
> [!TIP] Journaux
> Erreurs Symfony : `~/web/{{SITE}}/public_html/var/log/prod.log`. Erreurs Apache/PHP : `~/web/{{SITE}}/logs/`.