Aller au contenu

Déploiement

La production tourne sur Dokploy, dans le projet « todos », environnement production.

Source GitHub DuncanCos/todolist, branche main
Déploiement auto Activé : un push sur main déclenche un redéploiement
Composants 2 applications (« Backend », « frontend ») + 1 base Postgres gérée (« postgres »)
flowchart LR
    G["GitHub<br/>DuncanCos/todolist (main)"]
    subgraph D["Dokploy : projet todos / production"]
        B["Backend<br/>Nixpacks, /todoback/<br/>port 8080"]
        F["frontend<br/>Railpack, /todofront/<br/>port 80"]
        P[("postgres<br/>base todos")]
    end
    I["Internet"]

    G -- "push (autoDeploy)" --> B
    G -- "push (autoDeploy)" --> F
    B --> P
    I -- "https://api.todo.dunkan.xyz" --> B
    I -- "https://todo.dunkan.xyz" --> F

Applications

Backend frontend
Type de build Nixpacks Railpack
Build path /todoback/ /todofront/
Domaine https://api.todo.dunkan.xyz https://todo.dunkan.xyz
Port conteneur 8080 80
Variables TEST, DATABASE_URL, CLERK_SECRET_KEY VITE_CLERK_PUBLISHABLE_KEY, VITE_BACKEND_URL

Le rôle de chaque variable est décrit dans Développement.

Les Dockerfile ne servent pas en production

Dokploy construit les images avec Nixpacks et Railpack, qui détectent eux-mêmes le projet Rust et le projet Vite. todoback/Dockerfile, todofront/Dockerfile et todofront/nginx.conf ne sont utilisés que par docker-compose.yaml.

Backend

  • Le port d'écoute est codé en dur (0.0.0.0:8080) : le domaine Dokploy doit pointer sur le port 8080.
  • Les 3 variables sont obligatoires : s'il en manque une, le binaire panique au démarrage.
  • DATABASE_URL doit viser la base Dokploy « postgres » (base todos), de préférence via son URL de connexion interne.

frontend

  • VITE_BACKEND_URL doit contenir l'URL publique de l'API (https://api.todo.dunkan.xyz), puisque c'est le navigateur qui l'appelle.
  • VITE_CLERK_PUBLISHABLE_KEY doit appartenir à la même application Clerk que la CLERK_SECRET_KEY du backend, sinon toutes les requêtes finissent en 401.
  • Les variables VITE_* sont figées au build : après les avoir modifiées, il faut redéployer (rebuild) l'application, un simple redémarrage ne suffit pas.

Base de données

Nom Dokploy postgres
Image postgres:latest
Base todos
Accès externe Activé (port défini dans Dokploy)

Points d'attention

  • Base exposée sur Internet (port externe activé) : à garder uniquement si un accès distant est nécessaire, avec un mot de passe fort. Sinon, désactiver le port externe dans Dokploy.
  • Tag latest : un redéploiement de la base peut tirer une nouvelle version majeure de PostgreSQL, dont le format de données n'est pas compatible avec l'ancien. Mieux vaut figer la version majeure.
  • Migrations : l'API ne les applique pas. Toute évolution du schéma (migrations/) doit être appliquée à la main sur la base de prod avant de déployer le backend qui en dépend, par exemple avec sqlx migrate run via le port externe (voir Migrations).

À compléter

La méthode utilisée pour initialiser la base de production (sqlx-cli, psql, terminal Dokploy…) et l'éventuelle stratégie de sauvegarde ne sont pas documentées dans le dépôt.

CORS

Le front (todo.dunkan.xyz) et l'API (api.todo.dunkan.xyz) sont sur des origines différentes : le navigateur exige des en-têtes CORS. Ils sont définis dans todoback/src/routes/mod.rs :

Paramètre Valeur
Origines autorisées https://todo.dunkan.xyz, http://localhost:5173, http://127.0.0.1:5173, http://localhost:3000
Méthodes GET, POST, PUT, DELETE, OPTIONS
En-têtes Authorization, Accept, Content-Type
Identifiants (allow_credentials) true

Points importants :

  • L'origine doit correspondre exactement (schéma + hôte + port, sans / final). Changer le domaine du front impose de modifier cette liste et de redéployer le backend.
  • La couche CORS est ajoutée après ClerkLayer, elle s'exécute donc avant elle. Les requêtes préliminaires OPTIONS, envoyées sans jeton, reçoivent ainsi une réponse CORS au lieu d'un 401, et les 401 portent eux aussi les en-têtes CORS.
  • Avec allow_credentials(true), tower-http refuse les jokers (Any) pour les origines, méthodes et en-têtes, et panique au démarrage. Il faut des listes explicites.

Vérification du préflight :

curl -i -X OPTIONS https://api.todo.dunkan.xyz/todo/todo \
  -H "Origin: https://todo.dunkan.xyz" \
  -H "Access-Control-Request-Method: POST" \
  -H "Access-Control-Request-Headers: authorization,content-type"

Réponse attendue : 200 avec access-control-allow-origin: https://todo.dunkan.xyz, access-control-allow-credentials: true, access-control-allow-headers: authorization,accept,content-type et access-control-allow-methods: GET,POST,PUT,DELETE,OPTIONS.

Redéployer

Pousser sur main. Les deux applications suivent la même branche : sauf filtre de chemins configuré dans Dokploy, un push redéploie le backend et le frontend.

Projet « todos » → production → application → Deploy. C'est l'option à utiliser après une modification de variables d'environnement.

curl -X POST "<url-dokploy>/api/application.deploy" \
  -H "x-api-key: <jeton-api>" \
  -H "Content-Type: application/json" \
  -d '{"applicationId": "<id-de-l-application>"}'

Que redéployer ?

Changement Action
Code backend, CORS Redéployer Backend
Code frontend Redéployer frontend
VITE_BACKEND_URL, VITE_CLERK_PUBLISHABLE_KEY Redéployer frontend (rebuild obligatoire)
DATABASE_URL, CLERK_SECRET_KEY, TEST Redéployer Backend
Nouvelle migration SQL L'appliquer sur la base, puis redéployer Backend

Vérifier après un déploiement

# API en ligne : 401 attendu sans jeton
curl -i https://api.todo.dunkan.xyz/todo/todo

# Front en ligne : 200 attendu
curl -I https://todo.dunkan.xyz

Puis, dans le navigateur, se connecter sur https://todo.dunkan.xyz et créer une tâche de test.

Dépannage

Symptôme Piste
Erreur CORS dans la console du navigateur Origine absente de la liste CORS, ou API arrêtée (une erreur du proxy n'a pas d'en-têtes CORS)
401 sur toutes les requêtes Clés Clerk du front et du back issues d'applications différentes, ou jeton expiré
500 Unable to fetch users Erreur SQL : table absente, base injoignable, ligne avec description nulle. Voir les logs de l'application Backend
Backend qui ne démarre pas ou redémarre en boucle Variable manquante (TEST, DATABASE_URL, CLERK_SECRET_KEY) ou base injoignable au démarrage
Front qui appelle la mauvaise API VITE_BACKEND_URL modifiée sans rebuild du frontend

Les logs de l'API (requêtes, réponses et erreurs SQL) sont consultables dans l'onglet Logs de l'application Backend sur Dokploy.