Aller au contenu principal

Dépannage

Chaque cas ci-dessous a déjà été rencontré en production ou en préproduction.

Diagnostic rapide​

cd ~/pch-sig
F=docker-compose.prod.yml # ou docker-compose.preprod.yml
docker compose -f $F ps
docker exec pch_backend curl -s http://127.0.0.1:8000/api/health
docker logs pch_backend --since 15m 2>&1 | grep -iE "error|exception" | tail -20
df -h / && free -m

Toutes les requêtes répondent 500​

Après un cache:clear lancé avec docker exec (root). Le cache est recréé avec root pour propriétaire et php-fpm (www-data) ne peut plus écrire les proxies Doctrine :

Your proxy directory "/app/var/cache/prod/doctrine/orm/Proxies" must be writable

La commande avait pourtant affiché [OK], et toute vérification faite en root fonctionne : c'est trompeur.

docker compose -f $F up -d --no-deps backend # l'entrypoint vide le cache et remet les droits
# ou
docker exec pch_backend sh -c 'chown -R www-data:www-data /app/var'

Règle : toute commande console se lance avec docker exec -u www-data, et toute vérification se fait sous l'utilisateur réel.

500 à la connexion (« Unable to create a signed JWT ») : la clé JWT privée n'est pas lisible par www-data, ou la passphrase de .env.prod ne l'ouvre pas. Les clés sont montées en lecture seule depuis ~/pch-sig/backend/config/jwt : corriger les droits sur l'hôte (propriétaire 82:82, c'est-à-dire www-data de l'image, et mode 600 pour la clé privée), pas dans le conteneur. Voir Authentification JWT.

Le correctif déployé n'est pas actif​

Un build Docker en échec laisse l'ancien conteneur en place, sain. Vérifier dans le conteneur une chaîne propre au nouveau code (docker exec pch_backend grep -c "…" /app/src/…) et lire ~/build-backend.log. Le build se lance détaché (nohup) pour qu'une coupure SSH ne l'interrompe pas.

Conteneurs inattendus (pch-sig-database-1, pch-sig-mailer-1)​

docker compose a été lancé sans -f : il a démarré le squelette Symfony (compose.yaml). Les arrêter avec docker compose -f compose.yaml down puis relancer l'application avec le bon -f.

Backend en redémarrage permanent​

docker logs pch_backend --tail 50
  • exec /usr/local/bin/docker-entrypoint.sh: no such file or directory : fins de ligne Windows dans le script. sed -i 's/\r$//' backend/docker/*.sh, puis reconstruire.
  • Unable to read the "/app/.env" environment file : backend/.env absent au moment du build.
  • Migration en échec : le message SQL est dans le journal ; corriger la migration et redéployer.

KeyError: 'ContainerConfig'​

Compose v1 (docker-compose) avec Docker Engine 28. Installer le plugin v2 (docker-compose-plugin) et utiliser docker compose.

Certificat invalide (« TRAEFIK DEFAULT CERT »)​

Le DNS du nom n'existait pas quand Traefik a demandé le certificat. Vérifier nslookup <nom>, puis docker restart pch_traefik pour relancer la demande. Lire docker logs pch_traefik | grep -i acme.

E-mails non reçus​

  1. docker exec pch_backend php bin/console messenger:failed:show : messages en échec et motif.
  2. En préproduction, c'est normal : le SMTP est injoignable volontairement.
  3. 535 Authentication failed : mot de passe du compte noreply@ucp-pch.org changé chez OVH sans mettre à jour .env.prod.

KoboToolbox (préproduction) : ses e-mails passent par le relais de la production. docker logs smtp_relay sur la production indique status=sent ou le motif. Si le relais a démarré une fois avec un mauvais mot de passe, il le garde en double : docker compose -f docker-compose.yml down -v && … up -d dans ~/smtp-relay.

Écran vide ou ancienne version après déploiement​

  • Forcer le rechargement (Ctrl+Maj+R) ; le service worker se met à jour au rechargement suivant.
  • Vérifier que les fichiers servis contiennent la modification (chercher dans tous les chunks de frontend/build/static/js).
  • Console du navigateur : une ressource bloquée par la CSP apparaît comme « Refused to connect » ; ajouter le domaine à nginx/frontend.conf si l'appel est légitime.

Un utilisateur ne voit aucune donnée​

Ce n'est presque jamais un bug : le compte n'est rattaché à aucune institution ou à aucun projet (cloisonnement). Vérifier dans Paramètres → Utilisateurs. Un compte peut être autorisé (permissions) sans être rattaché.

L'assistant Bemba ne cite pas la documentation​

docker exec -u www-data pch_backend php bin/console app:assistant:indexer --etat

Index vide : le build de la documentation n'est pas monté (/app/documentation-build) ou l'indexation n'a pas tourné. Relancer app:assistant:indexer.

Survey Solutions ne synchronise plus​

La connexion est lue dans la table survey_solutions_config (pas dans les variables d'environnement). Vérifier le mot de passe stocké, puis Tester la connexion depuis l'écran de synchronisation.

Disque plein​

docker system df
docker image prune -f && docker builder prune -af
du -sh ~/backups

Informations à joindre à un signalement​

Heure précise, utilisateur concerné, écran, message affiché, et l'extrait de docker logs pch_backend correspondant (sans mot de passe ni jeton).