Passer au contenu principal
Tale tourne comme six conteneurs Docker gérés par Docker Compose. Chacun a une seule responsabilité et communique sur un réseau bridge interne.
Architecture split phase 2 (depuis v0.2.34) : Convex tourne comme son propre service (convex) au lieu d’être intégré au conteneur platform. Platform devient un client Vite léger qui pousse schéma + env à Convex en HTTP. Voir Upgrade depuis pre-split-convex (pre-v0.2.34) pour l’étape de migration unique.

Vue des services

Détails des images

ServiceImage de baseTaille optimiséeStratégie de build
Platformghcr.io/get-convex/convex-backend (pour le binaire glibc generate_key)~320 Mo compressé5 stages : deps → builder → pruner → runner → squash
Convexghcr.io/get-convex/convex-backend~485 Mo compressé2 stages : dashboard → runner (Dashboard COPY depuis image upstream)
Crawlerpython:3.11-slim~650 Mo compressé3 stages : builder → runtime → squash. Chromium headless_shell uniquement
RAGpython:3.11-slim~515 Mo3 stages : builder → runtime → squash. libpq5 uniquement
DBparadedb/paradedb:0.22.5-pg16~1,06 Go3 stages : cleanup → runtime → squash
Proxycaddy:2.11-alpine~88 Moun seul stage
Séparer Convex de platform a réduit l’image platform de ~2,58 Go à ~320 Mo compressé ; le service convex est une nouvelle image ~485 Mo. Le disque total est similaire mais le layer platform rebuild bien plus vite pour des changements app-only.

Mapping des ports

Ports dev (compose.yml)

ServicePort hôtePort conteneurProtocole
DB54325432TCP (PostgreSQL)
Crawler80028002HTTP
RAG80018001HTTP
Convex3210, 3211, 6791WS/HTTP (via proxy)
Platform3000HTTP (via proxy)
Proxy80, 44380, 443HTTP/HTTPS

Ports test (compose.test.yml)

ServicePort hôtePort conteneur
DB154325432
Crawler180028002
RAG180018001
Convex13210, 13211, 167913210, 3211, 6791
Platform130003000
Proxy10080, 1044380, 443

Mapping des volumes

VolumeMonté dansCheminBut
db-dataDB/var/lib/postgresql/datarépertoire de données PostgreSQL.
db-backupDB/var/lib/postgresql/backupbackups DB.
rag-dataRAG/app/datafichiers temp, traitement de documents.
crawler-dataCrawler/app/dataregistre de sites, bases URL.
convex-dataConvex/app/dataDB Convex (SQLite/pg-local), index de recherche, fichiers, JSON agents/workflows/integrations/providers.
convex-dataPlatform/app/data (read-only)watcher SSE de config + serveur d’images branding.
convex-dataCrawler, RAG/app/platform-config (read-only)config provider partagée.
caddy-dataProxy, Convex/data, /caddy-datacertificats TLS.
caddy-configProxy/configconfiguration Caddy.
platform-data(legacy, non monté)préservé après upgrade pour la sécurité du rollback ; à retirer manuellement après validation : docker volume rm <projectId>_platform-data
Important : Ne lance jamais docker compose down -v. Le flag -v supprime tous les volumes Docker, effaçant définitivement ta base et toutes les données plateforme.

Arguments de build

ArgumentDéfautUtilisé parDescription
VERSIONdevtoustag de version d’image (posé par CI depuis le tag git).
INSTALL_CJK_FONTSfalseCrawlerinstaller le support des polices CJK (~100 Mo).

Stratégie multi-stage

Tous les services utilisent un squash FROM scratch en stage final. Ça aplati les layers Docker pour que les suppressions de fichiers dans les étapes de cleanup libèrent vraiment du disque, au lieu d’ajouter des layers masquants. Ça garde les outils de build (gcc, build-essential, libpq-dev) hors de l’image finale.

Platform (5 stages, post-split)

  1. bun-bin — extrait le binaire Bun.
  2. workspace-deps — installe toutes les dépendances npm (dont devDependencies).
  3. builder — lance vite build pour produire la SPA.
  4. pruner — réinstalle uniquement les prod deps, retire les paquets dev (@vitest, @storybook, typescript, etc.).
  5. runner — runtime finale sur l’image base convex-backend (conservée pour le binaire glibc generate_key qui signe les tokens admin Convex). SPA Vite + serveur Bun seulement — pas de backend Convex.
  6. squashFROM scratch + COPY --from=runner. Tourne en root, bascule sur user app via gosu dans l’entrypoint.

Convex (2 stages, nouveau en phase 2)

  1. convex-dashboardFROM ghcr.io/get-convex/convex-dashboard pour copier le build Next.js standalone.
  2. runnerFROM ghcr.io/get-convex/convex-backend. Contient le daemon convex-local-backend, le Dashboard, les assets builtin de seed (agents/workflows/integrations/providers/branding) et l’entrypoint. Retire LLVM/Clang (~155 Mo).

Crawler (3 stages)

  1. builder — installe les deps Python via uv, télécharge Chromium headless_shell, cleanup profond (retire Chrome complet, FFmpeg, pip, __pycache__, symboles debug .so, répertoires de test).
  2. runtimepython:3.11-slim propre avec seulement les libs système runtime (deps Chromium, tini, curl). Retire LLVM/icônes Adwaita.
  3. squashFROM scratch + COPY --from=runtime. Pré-crée les mountpoints de volume pour /app/data et /app/platform-config.

RAG (3 stages)

  1. builder — installe deps Python avec build-essential + libpq-dev pour compiler les paquets natifs, puis retire pip/setuptools.
  2. runtimepython:3.11-slim propre avec seulement libpq5 + curl. Pré-crée les mountpoints.
  3. squashFROM scratch + COPY --from=runtime.

DB (3 stages)

  1. cleanup — retire les symboles debug (~888 Mo), les libs LLVM partagées (~127 Mo), les fichiers d’extension PostGIS, les locales et docs de l’image ParadeDB de base.
  2. runtimeFROM scratch + COPY --from=cleanup. Layer frais avec seulement les fichiers nettoyés.
  3. squash — redéclare PGDATA, PATH et autres ENV perdus lors de FROM scratch.

Health checks

ServiceEndpointProtocoleDémarrage
DBpg_isready -U tale -d taleCLI60 s
CrawlerGET /health sur :8002HTTP40 s
RAGGET /health sur :8001HTTP40 s
ConvexGET :3210/version + [ -f /tmp/convex-ready ]HTTP + fichier60 s
PlatformGET :3000/api/health + [ -f /tmp/platform-ready ]HTTP + fichier180 s
ProxyGET /health sur :2020 (interne)HTTP10 s
Les marqueurs /tmp/<service>-ready sont posés par l’entrypoint de chaque service après ses tâches d’init one-shot (Convex : backend up + seed builtin ; Platform : env sync + convex deploy). Ça empêche le trafic d’être routé avant que le service soit vraiment prêt.

Tests conteneurs

Tale inclut trois scripts de tests :
ScriptCommandeCe qui est testé
tests/container-smoke-test.shbun run docker:testbuild, start, health checks, endpoints HTTP, connectivité inter-services.
tests/container-image-test.shbun run docker:test:imagelabels OCI, user non-root, absence de secrets, instruction HEALTHCHECK, budgets de taille.
tests/container-vulnerability-scan.shbun run docker:test:vulnerabilityscan Trivy (HIGH + CRITICAL).
Voir le guide de contribution Docker pour la modification des Dockerfiles et le lancement des tests.
Last modified on April 19, 2026