Déploiement de l'application Symfony
Prérequis : stack web installée, vhosts configurés, TLS actif. Ce document couvre le premier déploiement et les mises à jour.
1. Deploy key GitHub — accès lecture seule
Le serveur a besoin d'accéder au dépôt GitHub pour les git pull. On utilise une deploy key : une clé SSH ED25519 propre au serveur, avec droits lecture seule sur le dépôt (pas les droits complets de votre compte).
Générer la clé sur le serveur
ssh-keygen -t ed25519 -C "telaria-vps-deploy" -f ~/.ssh/deploy_telaria -N "" cat ~/.ssh/deploy_telaria.pub # Copier la clé publique
Ajouter la deploy key sur GitHub
- Aller sur
github.com/<owner>/telaria-app→ Settings → Deploy keys - "Add deploy key" → coller la clé publique → Allow write access : NON
Configurer SSH sur le serveur
# ~/.ssh/config Host github-telaria HostName github.com User git IdentityFile ~/.ssh/deploy_telaria IdentitiesOnly yes
# Vérifier la connexion ssh -T github-telaria # Hi <owner>/telaria-app! You have successfully authenticated. # Ajouter GitHub aux known_hosts (évite le prompt interactif) ssh-keyscan github.com >> ~/.ssh/known_hosts
2. Clone initial
sudo git clone git@github-telaria:<owner>/telaria-app.git /var/www/telaria # OU si le remote est configuré avec l'alias SSH : sudo git -C /var/www/telaria remote set-url origin git@github-telaria:<owner>/telaria-app.git
3. Variables d'environnement — .env.local
Les secrets ne sont jamais dans le dépôt. Ils vivent dans .env.local sur le serveur.
sudo nano /var/www/telaria/.env.local
APP_ENV=prod APP_DEBUG=false APP_SECRET=<générer avec : openssl rand -hex 32> # Base de données DATABASE_URL="mysql://telaria_user:mot_de_passe@127.0.0.1:3306/telaria_db?serverVersion=8.4&charset=utf8mb4" # Mailer MAILER_DSN=smtp://localhost:25 # IA — génération (clés à ne jamais committer) ANTHROPIC_API_KEY=sk-ant-... OPENAI_API_KEY=sk-... GEMINI_API_KEY=... # RAG RAG_EMBEDDING_URL=http://127.0.0.1:8001 RAG_DB_PATH=%kernel.project_dir%/var/rag/index.sqlite RAG_SQLITE_VEC_PATH=/usr/local/lib/sqlite-vec/vec0.so
sudo chmod 640 /var/www/telaria/.env.local sudo chown ubuntu:www-data /var/www/telaria/.env.local
4. Composer — bundles privés
Les bundles Telaria (tlr-rag, tlr-symfony, tlr-codexia) sont dans des dépôts GitHub privés, consommés via VCS Composer.
Chaque bundle nécessite sa propre deploy key (lecture seule sur son dépôt).
// composer.json — dépôts privés (example) { "repositories": [ { "type": "vcs", "url": "git@github-tlr-rag:<owner>/tlr-rag.git", "no-api": true } ] }
"no-api": trueest obligatoire : sans token GitHub, l'API renvoie 404. La clé SSH suffit pour l'accès VCS, mais Composer essaie d'abord l'API —no-apiforce le mode git pur.
cd /var/www/telaria composer install --no-dev --optimize-autoloader
5. Permissions — le bon modèle
# Propriétaire de l'app : ubuntu (déploiement) + groupe www-data (web) sudo chown -R ubuntu:www-data /var/www/telaria sudo find /var/www/telaria -type d -exec chmod 750 {} \; sudo find /var/www/telaria -type f -exec chmod 640 {} \; # var/ — www-data doit écrire (cache, logs, sessions) sudo chown -R www-data:www-data /var/www/telaria/var sudo chmod -R ug+rwX /var/www/telaria/var # var/rag/ — setgid : les fichiers créés héritent du groupe www-data # (ingest lancé en ubuntu, lecture en www-data) sudo chgrp -R www-data /var/www/telaria/var/rag sudo chmod -R g+rwX /var/www/telaria/var/rag sudo chmod g+s /var/www/telaria/var/rag
6. Premier déploiement — ordre complet
cd /var/www/telaria # 1. Dépendances composer install --no-dev --optimize-autoloader # 2. Migrations (en www-data pour les droits SQLite) sudo -u www-data php bin/console doctrine:migrations:migrate --no-interaction # 3. Cache php bin/console cache:clear php bin/console cache:warmup # 4. ⚠️ Reload PHP-FPM — OBLIGATOIRE sudo systemctl reload php8.5-fpm # 5. Vérifier curl -s -o /dev/null -w "%{http_code}" https://telaria.dev # → 200
7. Mise à jour — ordre sûr
cd /var/www/telaria git pull origin develop # ou master selon le canal de déploiement # Si les dépendances ont changé composer install --no-dev --optimize-autoloader # Si des migrations sont présentes sudo -u www-data php bin/console doctrine:migrations:migrate --no-interaction php bin/console cache:clear php bin/console cache:warmup sudo systemctl reload php8.5-fpm # Vérification curl -I https://telaria.dev | head -3 sudo tail -20 /var/log/apache2/telaria.dev-error.log
Pourquoi sudo -u www-data pour les migrations ?
Si l'application utilise SQLite (index RAG, adoption-app), les fichiers créés par php bin/console appartiennent à l'utilisateur qui lance la commande. Si on lance en ubuntu, le fichier SQLite est owned ubuntu — et www-data (Apache/FPM) ne peut pas y écrire. D'où sudo -u www-data.
Pour MySQL, ce n'est pas un problème (Doctrine se connecte via un utilisateur BDD distinct).
8. Déploiement via Ansible (IaC)
Le déploiement manuel ci-dessus est automatisé dans tlr-ansible via le rôle symfony :
# roles/symfony/tasks/main.yml (résumé) - name: Clone ou pull le dépôt git: repo: "git@github-telaria:<owner>/telaria-app.git" dest: /var/www/telaria version: "{{ app_branch | default('develop') }}" - name: Composer install composer: command: install arguments: --no-dev --optimize-autoloader working_dir: /var/www/telaria - name: Migrations command: php bin/console doctrine:migrations:migrate --no-interaction become_user: www-data - name: Cache clear + warmup command: "{{ item }}" with_items: - php bin/console cache:clear - php bin/console cache:warmup - name: Reload PHP-FPM systemd: name: php8.5-fpm state: reloaded
9. Diagnostics courants
| Symptôme | Cause | Remède |
|---|---|---|
| HTTP 500 après déploiement | OPcache sert l'ancien code | sudo systemctl reload php8.5-fpm |
SQLSTATE Unknown column |
Migration passée, FPM pas rechargé | Idem |
Permission denied var/cache |
www-data ne peut pas écrire | sudo chown -R www-data:www-data var/ |
Composer 404 sur bundle privé |
Pas de no-api ou deploy key absente |
Vérifier no-api: true + SSH config |
git pull bloqué interactif |
known_hosts non peuplé | ssh-keyscan github.com >> ~/.ssh/known_hosts |
Étape suivante : 09-ia-embeddings.md