v0.2.34 — Convex in einen eigenen Dienst abspalten
TL;DR
Convex läuft jetzt als eigener Docker-Dienst (convex) statt eingebettet im platform-Container. Platform wird ein schlanker Vite/TanStack-Start-Client, der Schema und Env-Vars per HTTP an Convex pusht. Bestehende Deployments werden beim nächsten tale start / tale deploy nach tale upgrade automatisch migriert — es gibt kein separates tale migrate.
# Dev:
tale upgrade
tale start # erkennt offene Migrationen, fragt nach Bestätigung
# Produktion:
tale upgrade
tale deploy # erkennt offene Migrationen, fragt nach Bestätigung
# Oder nicht-interaktiv (CI):
tale deploy --yes
Nutzer älter als v0.2.33 sehen zwei Migrationen in einem einzigen Schritt: erst namespace-volumes (Umbenennung tale_* → ${projectId}_*), dann split-convex (dieses Release). Beide sind idempotent und können erneut ausgeführt werden.
Warum
Das alte All-in-One-Layout koppelte den Vite-Frontend-Lebenszyklus an Convex. Ein langsamer convex push oder ein transienter Rust-Crash ließ den Platform-Healthcheck scheitern und zog die ganze Site aus dem Load-Balancer — auch wenn Vite selbst in Ordnung war. Jeder Convex-Backend-Bump erzwang einen vollen Platform-Rebuild, und Blue-Green-Deployments mussten zwei gleichwertige Platform-Container koordinieren, die sich um dasselbe Convex-Daten-Volume stritten.
Das neue Layout behandelt Convex wie eine Datenbank — ein unabhängiger Dienst mit eigenem Image, eigenem Volume und eigenem Lebenszyklus. Code-Änderungen bauen nur das Platform-Image neu; der Convex-Container läuft weiter und WebSocket-Clients bleiben verbunden.
Was sich geändert hat
Architektur
- Neuer
convex-Dienst läuft convex-local-backend + Convex-Dashboard. Er hält das convex-data-Volume (aus platform-data migriert).
- Neues
tale-convex-Docker-Image (~485 MB komprimiert).
- Platform-Image von ~2,58 GB auf ~320 MB komprimiert verschlankt — behält die
generate_key-Binary aus dem convex-backend-Basis-Image (nötig zum Signieren von Admin-Tokens für den Remote-Push), aber ohne Backend-Daemon, Dashboard und Builtin-Seed-Assets.
- Caddys Upstream-Pfade (
/ws_api, /http_api, /api/storage, /convex-dashboard, /api/*/sync, …) werden von platform:* auf convex:* umgeroutet.
- Die Dienste
rag und crawler lesen ihre gemeinsame Anbieter-Konfiguration jetzt aus convex-data:/app/platform-config:ro statt aus platform-data.
Der Platform-Entrypoint:
- wartet auf
http://convex:3210/version (den Geschwister-Convex-Dienst);
- pusht 24 Env-Vars via
bunx convex env set (Secrets, URLs, Datei-Pfad-Semantik);
- führt
bunx convex deploy --url http://convex:3210 mit 300 s Default-Timeout aus;
- klassifiziert Deploy-Fehler in die Stufen
start_push / wait_for_schema / finish_push mit zugeschnittener Diagnose;
- legt
/tmp/platform-ready an — der Compose-Healthcheck-Gate, der Traffic bis zum erfolgreichen Deploy blockiert.
Env-Vars werden in Convex’ eigener Datenbank persistiert, sodass ein Convex-Neustart keinen erneuten Push erfordert.
Migrations-Framework
Das Migrations-Subsystem der CLI (eingeführt in v0.2.33) ist jetzt eine generische, version-agnostische Pipeline. Jede Migration ist ein Registrier-Eintrag mit detect-, requiredStops- und apply-Hooks; tale start und tale deploy errechnen zur Laufzeit den offenen Satz und fragen vor der Anwendung nach.
- Kein neues nutzerseitiges Flag in diesem Release. Die Pipeline führt alles Offene in Registrier-Reihenfolge aus.
tale deploy --yes akzeptiert offene Migrationen nicht-interaktiv (ersetzt das veraltete --migrate-volumes, das noch als Alias funktioniert).
- Persistierter Zustand liegt in
.tale/migrations.json (nur-hinzufügendes applied[]); der Legacy-Marker .tale/migration-pending wird beim ersten Lauf automatisch migriert.
Dev-Workflow
- Standard-
bun run dev funktioniert weiter (startet bunx convex dev lokal auf 127.0.0.1:3210).
- Neuer Modus
CONVEX_EXTERNAL=true bun run dev für Vite gegen ein containerisiertes Convex (docker compose up convex).
vite.config.ts liest CONVEX_URL / CONVEX_SITE_PROXY_URL für Proxy-Ziele.
Upgrade-Anleitung
Wichtig: Die Migration erzeugt kein automatisches Backup deiner Daten — sie erhält das Legacy-Volume ${projectId}_platform-data an Ort und Stelle, nachdem sie seinen Inhalt in das neue ${projectId}_convex-data kopiert hat. Willst du vor dem Upgrade ein hartes Backup, snapshott das Volume selbst (z. B. docker run --rm -v ${projectId}_platform-data:/src:ro -v $(pwd):/out alpine tar -C /src -czf /out/platform-data-backup.tgz .).
Es gibt kein separates tale migrate. Migrationen sind Teil des normalen Start-/Deploy-Flows:
tale upgrade # schreibt nichts Destruktives; zeigt, welche Migrationen offen sind
tale start # Dev: erkennt offene Migrationen, fragt [y/N], dann Start
# oder in Produktion:
tale deploy # erkennt offene Migrationen, fragt [y/N], dann Deploy
# Nicht-interaktiv (CI):
tale deploy --yes # nimmt offene Migrationen ohne Nachfrage an
Der Migration-Runner:
- erkennt jede offene Migration im Register (aktuelles Set:
split-convex, plus namespace-volumes für Nutzer pre-v0.2.33);
- druckt den Plan: welche Migrationen, welche Container kurz gestoppt werden, geschätzte Auswirkungen;
- fragt
[y/N] (Default: Nein). Ablehnen → sauberer Exit mit Code 2; nichts geändert.
- Bei Bestätigung: stoppt betroffene Container, kopiert Daten mit
cp -a --user 1001:1001, verifiziert strikte Datei-Zählung (src + 1 Sentinel == dst), protokolliert die Migration in .tale/migrations.json.
- Lässt das alte Volume unangetastet.
Sobald das neue Setup funktioniert, gibst du den Platz frei:
docker volume rm <projectId>_platform-data
docker volume rm <projectId>-dev_platform-data # falls du Dev-Mode genutzt hast
Inkompatible Änderungen
- Der
platform-Container mountet /app/data nicht mehr read-write. Wenn du eigene Bind-Mounts in platform-data hattest, schreibe sie auf convex-data um.
platform exponiert die Ports 3210, 3211, 6791 nicht mehr — die liegen jetzt auf convex. Caddys Routing übernimmt den Übergang transparent; nur eigene Test-Harnesses, die direkt auf die Ports gehen, brauchen ein Update.
platform-data:/app/platform-config:ro-Mounts auf rag / crawler werden zu convex-data:/app/platform-config:ro. Wenn du diese Dienste eigenständig mit handgeschriebenen Compose-Files betreibst, die Mount-Quelle anpassen.
- Der Docker-Healthcheck des Platform-Containers prüft jetzt nur Vite (
/api/health) — Convex muss nicht mehr gesund sein. Convex hat einen eigenen, unabhängigen Healthcheck.
Rollback
tale rollback --version 0.2.x funktioniert, solange platform-data erhalten ist. Das alte Image erwartet platform-data:/app/data, das die Migration nicht anfasst. Nach dem Rollback:
# Optionales Cleanup: ungenutztes convex-data-Volume entfernen
docker volume rm <projectId>_convex-data
Siehe Produktions-Deployment → Schema-Kompatibilität und Rollback für den Umgang mit Schema-Änderungen über Versionen hinweg.
Bekannte Einschränkungen
- Blue-Green-Übergangsfenster (~10–30 s): während des Cutovers bedient
blue-Platform noch Nutzer, während green bereits neue Convex-Functions deployed hat. Entfernt oder benennt der neue Deploy eine Function, sehen Blue-Clients in diesem Fenster 404. Nutze Expand-Contract für Breaking Changes.
- Nur-Vorwärts-Schema:
tale rollback tauscht Container-Images, aber nicht Convex-Daten. Pflichtfeld-Erweiterungen, Umbenennungen und Typ-Änderungen folgen dem Zwei-Release-Expand-Contract-Muster aus Schema-Kompatibilität und Rollback.
- Der erste Deploy nach der Migration dauert länger als die folgenden, weil die Convex-Env-Vars alle “neu” sind — rechne mit ~30–60 s für Env-Sync + Deploy-Abschluss beim ersten Boot.
Last modified on April 20, 2026