Wdrożenia — Convex, Windmill, Dashboard¶
Trzy niezależne ścieżki wdrożeniowe — każda dla innej warstwy systemu. Łączna deploy-skrypt bash scripts/deploy-all.sh all (lub just deploy) uruchamia je sekwencyjnie: Convex → Dashboard → Windmill.
Krótko
- Convex (
convex/) — schema + queries/mutations/actions. Komenda:npx convex deploy -ylubjust deploy-convex. - Dashboard (
dashboard/) — obraz Dockera SvelteKit, build → push → restart kontenerapanel. Komenda:just deploy-dashboard. - Windmill (
windmill/) — skrypty + flowy + harmonogramy. Komenda:just wmill-push "TASK-XXX: opis"(NIE rawwmill sync push). - Pełnowymiarowa deploy-skrypt:
just deploy— łączy całość.
Przed wdrożeniem — bramy walidacji¶
Zawsze uruchom lokalnie zanim wypchniesz:
Co to robi:
| Krok | Polecenie | Co weryfikuje |
|---|---|---|
| Convex typecheck | npx convex typecheck |
Schema + funkcje TS w convex/ kompilują się bez błędów |
| Dashboard check | cd dashboard && npm run check |
svelte-check + TS strict mode |
| Convex string-paths | python3 scripts/validate-convex-paths.py |
Każdy convex.run("module:fn") w skryptach Windmilla wskazuje na realną funkcję (TASK-307) |
| Windmill helpers | bash scripts/check-windmill-helpers.sh |
Kod dashboardu nie ma hand-rolled /api/w/<ws>/jobs/run/... URL-i (TASK-309) |
Walidacja Windmilla — wmill generate-metadata przed pushem
just check NIE odpala wmill generate-metadata. Jeśli edytowałeś jakiś .py / .ts w windmill/, uruchom cd windmill && wmill generate-metadata przed pushem — to regeneruje .script.yaml + .script.lock ze świeżych importów. Pominięcie tego kroku produkuje ostrzeżenia w wmill sync push --dry-run ("Stale scripts metadata found...") i może wypchnąć stare zależności.
Convex — npx convex deploy¶
Convex deploy podmienia schema + funkcje atomowo. Stan bazy nie jest dotykany (poza migracjami schema, które Convex wymusza per-pole).
Komenda kanoniczna¶
Skrypt:
- Wczytuje sekrety prod z
convex/.env.prod.sops.yaml(decrypt SOPS w locie). npx convex typecheck.npx convex deploy -y— flaga-yjest konieczna (brak TTY → interaktywne potwierdzenie schema-change zawiesza deploy, patrzscripts/deploy-convex.sh).
Co się dzieje pod spodem¶
- Convex sprawdza diff schema. Jeśli nowe wymagane pole bez
v.optional()→ deploy odmawia (zerwałby istniejące dokumenty). Rozwiązanie: dodaj jakov.optional()najpierw, backfill, potem usuńoptional(). - Funkcje są wymieniane atomowo — nie ma okna „pół deploya".
- Stare funkcje znikające z tego deploya wypadają z runtime'u natychmiast — wszystko, co je woła z innych domen (Windmill, Dashboard), poleci. Zsynchronizuj zmiany breaking-API w jednym sprincie.
Kiedy ręcznie¶
Albo just prod-convex-query <path> / just prod-convex-run <path> dla pojedynczych odczytów / mutacji bez pełnego deploya — patrz justfile w korzeniu repo.
Dashboard — build obrazu + restart kontenera¶
Najbardziej skomplikowana ścieżka, bo dotyka żywego kontenera produkcyjnego.
Komenda kanoniczna¶
Skrypt (scripts/deploy-dashboard.sh):
docker buildx build --output type=docker --load -t panel-dashboard:latest -f dashboard/Dockerfile .— build z kontekstem repo-root (Dockerfile importujeconvex/convex/support/nodeCatalog.tsjako SSoT).- Zapisuje
Createdtimestamp lokalnego obrazu (freshness guard, TASK-191). docker save | gzip > /tmp/panel-image.tar.gz→scp→aio-dad:/tmp/.- SSH do
aio-dad→incus file pushdo kontenerapanel→docker load. - Sprawdza, czy
Createdna zdalnym =Createdlokalny. Jeśli różny — abort (stary obraz). docker compose up -d --no-deps --force-recreate panelw kontenerzepanel.sleep 3+docker ps— sanity check.
Pułapki¶
buildx + containerd snapshotter
Pod containerd snapshotterem zwykły docker build zostawia stary obraz w docker-store i docker save eksportuje stary tag. Stąd buildx --output type=docker --load — wymusza zapis do docker-store (TASK-191).
stdin w heredoc + incus
Każdy sudo incus exec ... wewnątrz heredoc-a SSH potrzebuje `