03-comment-je-travaille/vps/08-application.md

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

  1. Aller sur github.com/<owner>/telaria-app → Settings → Deploy keys
  2. "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": true est 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-api force 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

Assistant documentaire

Posez une question sur la documentation. Les réponses citent leurs sources — un clic ouvre le document à gauche.

Loading…
Loading the web debug toolbar…
Attempt #