Erreur 500 après mise en production (variable d'environnement manquante)
```text KeyError: 'DATABASE_URL' sqlite3.OperationalError: unable to open database file ```
Détecter
Juste après une mise en production, certaines pages renvoient 500 ; la page d'accueil fonctionne. Aucune erreur en préproduction.
Symptômes
Juste après une mise en production, certaines pages renvoient 500 ; la page d'accueil fonctionne. Aucune erreur en préproduction.
Environnement
Application Python (Flask/Gunicorn) derrière NGINX, configuration par variables d'environnement dans un fichier EnvironmentFile systemd.
Cause racine
La nouvelle version lit une variable introduite dans le code mais absente du fichier d'environnement de production (ajoutée seulement en préproduction), ou pointe vers un chemin inaccessible au compte de service.
Diagnostic
- Journaux applicatifs (
journalctl -u webapp) : trace complète de l'exception. - Environnement effectif du processus :
sudo cat /proc/$(pgrep -f gunicorn | head -1)/environ | tr '\0' '\n'. - Comparer les fichiers d'environnement préproduction / production.
Solution
Ajouter la variable manquante, vérifier droits et chemin de la ressource, redémarrer le service et rejouer les parcours en erreur.
Commandes
systemctl cat webapp | grep EnvironmentFile
sudo -u webapp test -w /var/lib/webapp/app.db && echo ok
systemctl restart webapp && curl -s -o /dev/null -w "%{http_code}\n" localhost:8000/orders
Prévention
Validation de la configuration au démarrage (l'application refuse de démarrer si une variable obligatoire manque), .env.example à jour, parité des environnements, smoke tests post-déploiement.