v0.2.34 — Séparer Convex dans son propre service
TL;DR
Convex tourne désormais comme son propre service Docker (convex) au lieu d’être intégré au conteneur platform. Platform devient un client léger Vite/TanStack Start qui pousse schéma et variables d’env à Convex en HTTP. Les déploiements existants sont migrés automatiquement au prochain tale start / tale deploy après tale upgrade — pas de commande tale migrate séparée.
# Dev :
tale upgrade
tale start # détecte les migrations en attente, demande confirmation
# Production :
tale upgrade
tale deploy # détecte les migrations en attente, demande confirmation
# Ou non-interactif (CI) :
tale deploy --yes
Les utilisateurs pré-v0.2.33 voient deux migrations appliquées en un seul passage : d’abord namespace-volumes (renommage tale_* → ${projectId}_*), puis split-convex (ce release). Les deux sont idempotentes et relançables.
Pourquoi
L’ancien layout tout-en-un liait le cycle de vie du frontend Vite à Convex. Un convex push lent ou un crash Rust transitoire faisait échouer le health check platform et tirait tout le site hors du load balancer — même quand Vite allait bien. Chaque bump de version du backend Convex forçait un rebuild complet de platform, et les déploiements blue-green devaient coordonner deux conteneurs platform se disputant le même volume Convex.
Le nouveau layout traite Convex comme une base — un service indépendant avec sa propre image, son volume et son cycle de vie. Les changements de code rebuild uniquement l’image platform ; le conteneur Convex continue à tourner et les clients WebSocket restent connectés.
Ce qui change
Architecture
- Nouveau service
convex qui fait tourner convex-local-backend + Convex Dashboard. Il possède le volume convex-data (migré depuis platform-data).
- Nouvelle image Docker
tale-convex (~485 Mo compressé).
- Image platform allégée de ~2,58 Go à ~320 Mo compressé — garde le binaire
generate_key de la base convex-backend (nécessaire pour signer les tokens admin du push distant) mais sans le daemon backend, le Dashboard ni les assets builtin de seed.
- Les chemins upstream Caddy (
/ws_api, /http_api, /api/storage, /convex-dashboard, /api/*/sync, …) sont re-routés de platform:* vers convex:*.
- Les services
rag et crawler lisent leur config provider partagée depuis convex-data:/app/platform-config:ro au lieu de platform-data.
L’entrypoint platform :
- attend
http://convex:3210/version (le service convex voisin) ;
- pousse 24 variables d’env via
bunx convex env set (secrets, URLs, sémantique de chemins de fichiers) ;
- lance
bunx convex deploy --url http://convex:3210 avec un timeout par défaut de 300 s ;
- classifie les échecs de deploy en étapes
start_push / wait_for_schema / finish_push avec diagnostics adaptés ;
- pose
/tmp/platform-ready — le gate du health check compose qui empêche le trafic jusqu’au deploy réussi.
Les variables d’env sont persistées dans la base Convex, donc un redémarrage Convex n’exige pas de re-push.
Framework de migration
Le sous-système de migration du CLI (introduit en v0.2.33) est maintenant un pipeline générique, agnostique aux versions. Chaque migration est une entrée de registry avec hooks detect, requiredStops et apply ; tale start et tale deploy calculent à l’exécution le set en attente et demandent avant application.
- Pas de nouveau flag utilisateur dans ce release. Le pipeline lance tout ce qui est en attente, dans l’ordre du registry.
tale deploy --yes accepte toutes les migrations en attente de manière non-interactive (remplace --migrate-volumes déprécié, qui fonctionne encore comme alias pour un release).
- L’état persistant vit dans
.tale/migrations.json (applied[] append-only) ; le marqueur legacy .tale/migration-pending est auto-migré au premier run.
Workflow dev
bun run dev par défaut marche toujours (spawn bunx convex dev localement sur 127.0.0.1:3210).
- Nouveau mode
CONVEX_EXTERNAL=true bun run dev pour faire tourner Vite contre un convex containerisé (docker compose up convex).
vite.config.ts lit CONVEX_URL / CONVEX_SITE_PROXY_URL comme cibles proxy.
Instructions d’upgrade
Important : la migration ne crée pas de backup automatique — elle préserve le volume legacy ${projectId}_platform-data tel quel après avoir copié son contenu dans le nouveau ${projectId}_convex-data. Pour un backup dur avant l’upgrade, snapshot le volume toi-même (ex. docker run --rm -v ${projectId}_platform-data:/src:ro -v $(pwd):/out alpine tar -C /src -czf /out/platform-data-backup.tgz .).
Pas de commande tale migrate séparée. Les migrations font partie du flow normal start / deploy :
tale upgrade # n'écrit rien de destructif ; log les migrations en attente
tale start # dev : détecte les migrations, demande [y/N], puis démarre
# ou en production :
tale deploy # détecte, demande [y/N], puis déploie
# Non-interactif (CI) :
tale deploy --yes # accepte les migrations sans demande
Le runner de migration :
- détecte chaque migration en attente du registry (set actuel :
split-convex, plus namespace-volumes pour les utilisateurs encore en pré-v0.2.33) ;
- imprime le plan : quelles migrations, quels conteneurs seront brièvement arrêtés, impact estimé ;
- demande
[y/N] (défaut Non). Refus → exit propre avec code 2 ; rien n’a changé.
- Sur confirmation : arrête les conteneurs impactés, copie les données avec
cp -a --user 1001:1001, vérifie strictement le compteur de fichiers (src + 1 sentinelle == dst), enregistre la migration dans .tale/migrations.json.
- Laisse l’ancien volume intact.
Une fois le nouveau setup validé, libère l’espace :
docker volume rm <projectId>_platform-data
docker volume rm <projectId>-dev_platform-data # si dev mode utilisé
Breaking changes
- Le conteneur
platform ne monte plus /app/data en lecture-écriture. Si tu avais des bind mounts custom vers platform-data, réécris-les vers convex-data.
platform n’expose plus les ports 3210, 3211, 6791 — ils vivent sur convex maintenant. Le routage Caddy gère la transition de façon transparente ; seuls les test harnesses custom qui tapent les ports directement doivent être mis à jour.
- Les mounts
platform-data:/app/platform-config:ro sur rag / crawler deviennent convex-data:/app/platform-config:ro. Si tu lances ces services en standalone avec des compose files écrits à la main, mets à jour la source du mount.
- Le health check Docker du conteneur platform ne sonde plus que Vite (
/api/health) — il n’exige plus Convex sain. Convex a son propre health check indépendant.
Rollback
tale rollback --version 0.2.x marche tant que platform-data est préservé. L’ancienne image attend platform-data:/app/data, intact par la migration. Après rollback :
# Cleanup optionnel : retirer le volume convex-data inutile
docker volume rm <projectId>_convex-data
Voir Déploiement en production → Compatibilité de schéma et rollback pour la gestion des changements de schéma entre versions.
Limitations connues
- Fenêtre transitoire blue-green (~10–30 s) : pendant le cutover,
blue platform sert encore des utilisateurs alors que green a déjà déployé de nouvelles fonctions Convex. Si le nouveau deploy retire ou renomme une fonction, les clients blue peuvent voir des 404 pendant la fenêtre. Utilise expand-contract pour les breaking changes.
- Schéma forward-only :
tale rollback revient aux images mais pas aux données Convex. Ajouts de champs requis, renommages et changements de types suivent le pattern expand-contract deux-releases documenté dans Compatibilité de schéma et rollback.
- Premier deploy après migration plus long que les suivants parce que les variables d’env Convex sont toutes “nouvelles” — compte ~30–60 s pour l’env sync + la complétion du deploy au premier boot.
Last modified on April 20, 2026