Zum Hauptinhalt springen
Tale läuft als sechs Docker-Container, die von Docker Compose verwaltet werden. Jeder Container hat genau eine Verantwortung und kommuniziert über ein internes Bridge-Netzwerk.
Phase-2-Split-Architektur (seit v0.2.34): Convex läuft als eigener Dienst (convex) statt im platform-Container. Platform wird ein schlanker Vite-Client, der Schema und Env über HTTP an Convex pusht. Siehe Upgrade von Pre-Split-Convex (vor v0.2.34) für den einmaligen Migrationsschritt.

Dienst-Übersicht

Image-Details

DienstBasis-ImageOptimierte GrößeBuild-Strategie
Platformghcr.io/get-convex/convex-backend (für die glibc-Binary generate_key)~320 MB komprimiert5-Stage: deps → builder → pruner → runner → squash
Convexghcr.io/get-convex/convex-backend~485 MB komprimiert2-Stage: dashboard → runner (Dashboard aus Upstream-Image kopiert)
Crawlerpython:3.11-slim~650 MB komprimiert3-Stage: builder → runtime → squash. Chromium headless_shell only
RAGpython:3.11-slim~515 MB3-Stage: builder → runtime → squash. libpq5 only
DBparadedb/paradedb:0.22.5-pg16~1.06 GB3-Stage: cleanup → runtime → squash
Proxycaddy:2.11-alpine~88 MBEinzel-Stage
Das Abspalten von Convex aus Platform hat das Platform-Image von ca. 2,58 GB auf ca. 320 MB komprimiert reduziert; der Convex-Dienst ist ein neues ca. 485 MB großes Image. In Summe ist der Plattenbedarf ähnlich, aber der Platform-Layer baut für reine App-Änderungen viel schneller.

Port-Mapping

Entwicklungs-Ports (compose.yml)

DienstHost-PortContainer-PortProtokoll
DB54325432TCP (PostgreSQL)
Crawler80028002HTTP
RAG80018001HTTP
Convex3210, 3211, 6791WS/HTTP (über Proxy)
Platform3000HTTP (über Proxy)
Proxy80, 44380, 443HTTP/HTTPS

Test-Ports (compose.test.yml)

DienstHost-PortContainer-Port
DB154325432
Crawler180028002
RAG180018001
Convex13210, 13211, 167913210, 3211, 6791
Platform130003000
Proxy10080, 1044380, 443

Volume-Mapping

VolumeEingebunden inPfadZweck
db-dataDB/var/lib/postgresql/dataPostgreSQL-Datenverzeichnis
db-backupDB/var/lib/postgresql/backupDatenbank-Backups
rag-dataRAG/app/dataTemp-Dateien, Dokument-Verarbeitung
crawler-dataCrawler/app/dataWebsite-Register, URL-Datenbanken
convex-dataConvex/app/dataConvex-DB (SQLite/pg-local), Such-Indizes, Dateien, agents/workflows/integrations/providers JSON
convex-dataPlatform/app/data (read-only)Config-SSE-Watcher + Branding-Bildausgabe
convex-dataCrawler, RAG/app/platform-config (read-only)gemeinsamer Anbieter-Config
caddy-dataProxy, Convex/data, /caddy-dataTLS-Zertifikate
caddy-configProxy/configCaddy-Konfiguration
platform-data(Legacy, nicht gemountet)Nach Upgrade zur Rollback-Sicherheit erhalten; nach Verifikation des Splits manuell entfernen: docker volume rm <projectId>_platform-data
Wichtig: Führe niemals docker compose down -v aus. Das Flag -v löscht alle Docker-Volumes und vernichtet damit unwiderruflich deine Datenbank und sämtliche Plattform-Daten.

Build-Argumente

ArgumentStandardGenutzt vonBeschreibung
VERSIONdevalleImage-Version-Tag (aus Git-Tag von CI gesetzt).
INSTALL_CJK_FONTSfalseCrawlerCJK-Font-Unterstützung installieren (~100 MB).

Multi-Stage-Build-Strategie

Alle Dienste nutzen als letzte Stage ein FROM scratch-Squash. Das flacht Docker-Layer ab, sodass Dateilöschungen in Cleanup-Stages wirklich Platz freigeben und nicht nur maskierende Layer ergänzen.

Platform (5 Stages, post-Split)

  1. bun-bin — extrahiert das Bun-Binary.
  2. workspace-deps — installiert alle npm-Abhängigkeiten (inkl. devDependencies).
  3. builder — läuft vite build zur SPA.
  4. pruner — reinstalliert nur Produktions-Deps, entfernt Dev-Pakete (@vitest, @storybook, typescript, etc.).
  5. runner — finale Runtime auf dem convex-backend-Basis-Image (bleibt wegen der glibc-Binary generate_key, die Convex-Admin-Tokens signiert). Nur Vite-SPA + Bun-Server — kein Convex-Backend-Prozess.
  6. squashFROM scratch + COPY --from=runner. Läuft als root, wechselt via gosu im Entrypoint zum User app.

Convex (2 Stages, neu in Phase 2)

  1. convex-dashboardFROM ghcr.io/get-convex/convex-dashboard, um den Next.js-Standalone-Build zu kopieren.
  2. runnerFROM ghcr.io/get-convex/convex-backend. Enthält den convex-local-backend-Daemon, das Dashboard, eingebaute Seed-Assets (agents/workflows/integrations/providers/branding) und Entrypoint. Entfernt LLVM/Clang (~155 MB).

Crawler (3 Stages)

  1. builder — Python-Deps per uv installieren, Chromium headless_shell laden, tiefes Cleanup (entfernt vollständiges Chrome, FFmpeg, pip, __pycache__, .so-Debug-Symbole, Test-Verzeichnisse).
  2. runtime — sauberes python:3.11-slim mit nur Runtime-System-Libs (Chromium-Deps, tini, curl). Entfernt LLVM/Adwaita-Icons.
  3. squashFROM scratch + COPY --from=runtime. Legt Volume-Mountpoints für /app/data und /app/platform-config im Voraus an.

RAG (3 Stages)

  1. builder — Python-Deps mit build-essential + libpq-dev zum Kompilieren nativer Pakete installieren, danach pip/setuptools entfernen.
  2. runtime — sauberes python:3.11-slim nur mit libpq5 + curl. Volume-Mountpoints im Voraus anlegen.
  3. squashFROM scratch + COPY --from=runtime.

DB (3 Stages)

  1. cleanup — entfernt Debug-Symbole (~888 MB), LLVM-Shared-Libraries (~127 MB), PostGIS-Extension-Files, Locales und Docs aus dem ParadeDB-Basis-Image.
  2. runtimeFROM scratch + COPY --from=cleanup. Frischer Layer nur mit bereinigten Dateien.
  3. squash — deklariert PGDATA, PATH und andere ENV-Vars neu, die bei FROM scratch verloren gingen.

Health-Checks

DienstEndpointProtokollStartfenster
DBpg_isready -U tale -d taleCLI60 s
CrawlerGET /health auf :8002HTTP40 s
RAGGET /health auf :8001HTTP40 s
ConvexGET :3210/version + [ -f /tmp/convex-ready ]HTTP + Datei60 s
PlatformGET :3000/api/health + [ -f /tmp/platform-ready ]HTTP + Datei180 s
ProxyGET /health auf :2020 (intern)HTTP10 s
Die Marker /tmp/<service>-ready werden vom Entrypoint jedes Dienstes gesetzt, sobald dessen Einmal-Init-Arbeit abgeschlossen ist (Convex: Backend läuft + Builtin-Seed; Platform: Env-Sync + convex deploy). Das verhindert, dass Traffic geroutet wird, bevor der Dienst wirklich bereit ist.

Container-Tests

Tale bringt drei Container-Testskripte mit:
SkriptKommandoPrüft
tests/container-smoke-test.shbun run docker:testbaut, startet, Health-Checks, HTTP-Endpoints, Inter-Service-Konnektivität.
tests/container-image-test.shbun run docker:test:imageOCI-Labels, Non-Root-User, keine Secrets, HEALTHCHECK-Instruktion, Size-Budgets.
tests/container-vulnerability-scan.shbun run docker:test:vulnerabilityTrivy-Vulnerability-Scan (HIGH + CRITICAL).
Siehe Contributing Docker guide für Details zum Ändern von Dockerfiles und Ausführen der Tests.
Last modified on April 19, 2026