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/.envabsent 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
docker exec pch_backend php bin/console messenger:failed:show: messages en échec et motif.- En préproduction, c'est normal : le SMTP est injoignable volontairement.
535 Authentication failed: mot de passe du comptenoreply@ucp-pch.orgchangé 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.confsi 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).