The image gets the docker client and compose plugin (static, pinned by digest from docker:28.5.2-cli). The driver reads the compose projects read-only and talks to docker-proxy (tecnativa/docker-socket-proxy 0.3.0, GET on containers only) over an internal network; nothing in the driver can start, stop or change a container. DEPLOY.md describes the dry run, its limits and the one-time switch from demo data. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2.7 KiB
Rozwój lokalny
Stan: fundamenty plus tryb „na sucho” (DEMO nieustawione): prawdziwe, tylko-odczytowe handlery plan, status, image_tags, image_resolve (src/app/dry-run/) i konfiguracja aplikacji z config/apps.json. Z DEMO=1 działają fałszywe handlery demo. Nic nie zmienia Dockera, nie używa modelu ani skryptów starego repo.
Uruchomienie
. ~/.nvm/nvm.sh && nvm use # Node 24 (.nvmrc)
npm ci
npm run check # typecheck + lint + testy: musi być zielone przed commitem
Dwa procesy z jednego kodu, wspólna baza SQLite (WAL):
npm run build:web # frontend do dist/web (serwer go serwuje)
DEMO=1 npm run start:driver # driver: bierze kroki z kolejki; bez DEMO=1 odmawia startu
npm run start:server # appka: http://127.0.0.1:8080
Podczas pracy nad frontendem: npm run dev:web (Vite, proxy /api na port 8080).
Zmiany w kodzie backendu: npm run dev:driver / npm run dev:server (node --watch).
Backend działa bez kroku budowania: Node 24 uruchamia .ts natywnie (importy z rozszerzeniem .ts, bez enum i parametrów-właściwości; pilnuje tego erasableSyntaxOnly).
Zmienne środowiskowe
| Zmienna | Domyślnie | Znaczenie |
|---|---|---|
DB_PATH |
./data/queue.sqlite |
plik bazy (współdzielony przez oba procesy) |
HOST / PORT |
127.0.0.1 / 8080 |
adres serwera; w kontenerze ustaw HOST=0.0.0.0 |
WEB_DIR |
dist/web |
zbudowany frontend |
DRIVER_IDLE_MS |
60000 |
jak często driver sprawdza pustą kolejkę (w dev np. 1000) |
DEMO |
0 |
1 = uruchom fałszywe handlery i zasiej konfigurację demo |
Wartości zmiennych o nazwach kończących się na TOKEN, SECRET, PASSWORD, API_KEY, _KEY driver maskuje dosłownie w każdym detail.
Układ kodu
src/domain typy, reguły, porty (bez I/O) -> nic
src/app driver, przypadki użycia, demo handlery -> domain
src/infra SQLite (node:sqlite), zegar, logger -> domain, app
src/http Fastify, kontrakt zod, SSE -> domain, app, infra
src/web Preact (przeglądarka) -> domain, http/contract.ts
src/main punkty wejścia procesów, e2e -> wszystko
src/testing fejki portów i baza w pamięci (tylko testy)
Granice pilnuje ESLint (tools/layer-rules.ts, przetestowane w tools/layer-rules.test.ts). src/main, src/testing i *.test.* są z reguły wyłączone, bo składają warstwy.
Wersje narzędzi
TypeScript jest przypięty do ~6.0.3: typescript-eslint 8.70 deklaruje typescript <6.1.0, więc 7.x zepsułoby lint. Do ponownego sprawdzenia przy aktualizacji typescript-eslint.