Skip to content

Dépannage courant

Cette fiche compile les symptômes les plus fréquents rencontrés au démarrage, en base de données, sur les emails, sur la connexion et sur les uploads — avec, pour chacun, la cause la plus probable et l'action à mener. Elle ne couvre pas le dépannage propre à un fournisseur SMTP (Gmail, Brevo, OVH…) : voir Fournisseurs SMTP pour ces cas-là.

Où trouver les logs

La plupart des symptômes ci-dessous s'expliquent par une ligne d'erreur explicite dans les journaux applicatifs — c'est le premier réflexe avant toute autre vérification.

  • Développement local : npm run dev affiche dans le même terminal les journaux des trois processus (SHARED, CLIENT, SERVER), préfixés par leur nom respectif.

  • Docker (installation manuelle) :

    bash
    docker logs -f timepick

    Remplacer timepick par le nom donné au conteneur avec docker run --name (voir Installation en production (Docker)).

  • Coolify : sur la page de l'application TimePick, onglet Build Logs pendant un déploiement (erreurs de compilation) et onglet Application Logs (erreurs au démarrage ou en cours d'exécution — chercher les lignes [prepare-db] puis [migrate] juste après un déploiement).

Vérifier l'état du serveur avant de creuser

Deux endpoints de santé permettent un premier diagnostic sans consulter les logs :

  • GET /health (public, sans authentification) — statut binaire ok/degraded, incluant l'état du SMTP. Voir API — Endpoint de santé.
  • GET /api/admin/health (authentifié, rôle admin — en-tête Authorization: Bearer <token>) — statut détaillé incluant la base de données.
bash
curl https://timepick.example.org/health

Réponse sur une instance saine :

json
{ "status": "ok", "timestamp": "2026-07-13T08:00:00.000Z", "services": { "smtp": "ok" } }

Réponse quand le SMTP n'est pas (ou plus) fonctionnel — le code HTTP reste 200, seul le champ status change :

json
{ "status": "degraded", "timestamp": "2026-07-13T08:00:00.000Z", "services": { "smtp": "degraded" } }

Un status: "degraded" n'empêche pas l'application de répondre

Le SPA, l'authentification déjà établie et les créneaux restent utilisables : seuls les envois d'email échoueront tant que le SMTP n'est pas rétabli. C'est volontaire — un healthcheck d'orchestrateur configuré strictement sur ce champ redémarrerait le conteneur en boucle pour un simple problème SMTP, sans rien résoudre.

Pour une inspection directe de la base (par exemple confirmer qu'un administrateur existe, ou consulter les dernières migrations appliquées), voir Accès à la base de données en production et les requêtes de diagnostic en lecture seule de Modèle de données.

Tableau de dépannage

ThèmeSymptômeCause probableAction
DémarrageConteneur ne démarre pas / redémarre en boucleBootstrap ou migrations en échec au démarrage, ou DATABASE_URL incorrecte / base injoignableConsulter les logs applicatifs (voir ci-dessus), chercher une erreur après la ligne [prepare-db] ou [migrate] ; vérifier que DATABASE_URL pointe vers une base PostgreSQL démarrée et accessible depuis le conteneur
DémarrageLe build de l'image Docker échoue sur sharp ou bcryptModules natifs non compilés pour l'architecture cible de l'imageVérifier que l'étape de build utilise l'image node:22-bookworm-slim du Dockerfile fourni, sans modification de la base — voir Installation en production (Docker)
Démarrage502 Bad Gateway après un déploiementMauvais port exposé côté conteneur, ou healthcheck mal cibléVérifier que le conteneur écoute sur PORT=3000 (valeur par défaut) et que le healthcheck de l'orchestrateur pointe bien vers GET /health sur ce port
DémarrageGET /health répond 200 avec "status":"degraded"Aucune configuration SMTP fonctionnelle en base (services.smtp en échec)Configurer ou corriger le serveur d'email depuis Paramètres → Serveur d'email — voir Fournisseurs SMTP
Base de donnéespermission denied to create extension (lors de npm run init-db, ou au tout premier démarrage)Le rôle PostgreSQL désigné par DATABASE_URL n'a pas les droits nécessaires pour créer l'extension uuid-osspAccorder temporairement les droits superutilisateur (psql -c "ALTER USER <utilisateur> SUPERUSER"), ou faire préinstaller l'extension par un administrateur PostgreSQL — voir Installation locale
Base de données« Une création d'administrateur est déjà en cours » au clic sur le lien d'amorçageVerrou PostgreSQL (advisory lock) actif : une autre création du premier administrateur est en cours au même instant (double clic, deux onglets, deux personnes)Attendre quelques secondes et recliquer le lien — le verrou se libère automatiquement à la fin de la transaction. Voir Configuration initiale
Base de donnéesErreur SQL évoquant date_trunc à 3 arguments (tableau de bord)Version de PostgreSQL antérieure à 16Migrer vers PostgreSQL 16 ou supérieur (17 recommandé) — voir Prérequis
Base de donnéesLe serveur refuse de démarrer juste après une mise à jour, erreur liée à un modèle d'email manquantMigrations non appliquées avant le redémarrage : une migration qui étend le catalogue de modèles d'email doit s'exécuter avant que le nouveau code ne démarreAppliquer les migrations en attente (npm run migrate, ou automatique au démarrage du conteneur) avant de redémarrer le serveur — voir Mise à jour
EmailsMagic link (connexion ou invitation) jamais reçu, en productionConfiguration SMTP absente, incorrecte ou fournisseur indisponibleConsulter les logs serveur pour une erreur SMTP explicite ; tester la configuration depuis Paramètres → Serveur d'email (bouton Tester la connexion) — voir Fournisseurs SMTP et Délivrabilité email
EmailsMagic link jamais reçu, en développement localAucun serveur SMTP réel configuré — comportement attendu en développementUtiliser MailHog : port 1025 pour l'envoi (configuration SMTP de l'assistant ou de l'application), interface http://localhost:8025 pour consulter les emails interceptés — voir Fournisseurs SMTP — MailHog
EmailsEmail reçu mais classé en spamAbsence d'enregistrements SPF/DKIM/DMARC pour le domaine d'expéditionVoir Délivrabilité email
EmailsLes variables SMTP_* modifiées dans l'environnement (Coolify, .env) restent sans effetCes variables ne servent qu'au provisionnement initial en base ; une fois la configuration copiée au premier démarrage, le runtime lit exclusivement la base de donnéesModifier la configuration depuis Paramètres → Serveur d'email, dans l'application — jamais dans les variables d'environnement après le premier démarrage. Voir Variables d'environnement
ConnexionLe frontend affiche des erreurs réseau, ou appelle un mauvais domaine d'APIVITE_API_URL incorrecte : c'est une variable figée au moment du build, non modifiable au runtime une fois l'image construiteReconstruire l'image avec la bonne valeur (docker build --build-arg VITE_API_URL=...) et redéployer — voir Installation en production (Docker)
ConnexionLa page /setup n'apparaît pas, redirection directe vers /loginUn administrateur existe déjà en baseSe connecter normalement, ou confirmer via une requête psql en lecture seule — voir Modèle de données
ConnexionUne session (admin ou membre) expire trop vite, ou au contraire trop tardDurée de vie (TTL) mal ajustée dans les paramètresAjuster depuis Paramètres → Authentification — voir Paramètres in-app
UploadsImages utilisées dans les emails (logo, illustrations) disparues après un redéploiementLe volume /app/server/uploads n'était pas monté : ce chemin n'est pas persistant par défaut dans le conteneurConfigurer un volume persistant sur /app/server/uploads (onglet Storages dans Coolify, ou option -v en Docker) avant tout usage en production — voir Installation en production (Docker) — Volume persistant

Un symptôme absent de ce tableau ?

Commencer par les logs (section ci-dessus), puis par le healthcheck détaillé (GET /api/admin/health) : la plupart des pannes non listées ici se ramènent à une base de données injoignable, une configuration SMTP invalide, ou une variable de build (VITE_API_URL) désynchronisée d'un redéploiement récent.

Voir aussi

Publié sous licence FSL-1.1-MIT.