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_URLdoit viser la base Dokploy « postgres » (basetodos), de préférence via son URL de connexion interne.
frontend¶
VITE_BACKEND_URLdoit contenir l'URL publique de l'API (https://api.todo.dunkan.xyz), puisque c'est le navigateur qui l'appelle.VITE_CLERK_PUBLISHABLE_KEYdoit appartenir à la même application Clerk que laCLERK_SECRET_KEYdu backend, sinon toutes les requêtes finissent en401.- 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 avecsqlx migrate runvia 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éliminairesOPTIONS, envoyées sans jeton, reçoivent ainsi une réponse CORS au lieu d'un401, et les401portent 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.
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.