Hoppa till innehållet

Devportalen /portal/dev

Startsideportalens ekosystem för människa och agent

Dokumentationen / Yta

Grindar och bygge

dok · bygge
id: bygge
namn: Grindar och bygge
sammanfattning: Grindarna och paketeringen: lint, test och typecheck över hela repot, och en container per applikation som Dokploy kan bygga (ADR-040).
uppdaterad: 2026-09-02

ansvar:
- Linta och testa hela monorepot från roten, så att ett nytt paket täcks utan att någon lägger till ett skript.
- Typkontrollera varje paket topologiskt.
- Bygga en standalone-image per app – projektportalen och startsideportalen – och köra dem rotlöst.
- Ge Dokploy en compose-fil med två tjänster, var sin healthcheck och Traefik-regler som delar trafiken på /portal.
- Hålla apparna isär: ingen fil i den ena importerar från den andra, och det gemensamma bor i packages/.

filer:
- eslint.config.mjs — Lintkonfiguration för hela repot. no-html-link-for-pages avstängd: App Router har ingen pages-katalog.
- eslint-rules/inga-hardkodade-designvarden.mjs — Egen lintregel: R4 som grind. Hex-färger och px i hakparentes i className. shadcn-grunden undantagen.
- vitest.config.mts — Tester plockas upp på filnamn: packages/**/test/**/*.test.ts. passWithNoTests.
- package.json — Rotskripten: dev (båda apparna), build (båda), start, lint, test, typecheck.
- apps/projekt/next.config.ts — Projektportalen: standalone, permanenta omledningar från startsideportalens gamla vägar till /portal, och i utveckling en omskrivning av /portal till startsideportalens server på 3010.
- apps/portal/next.config.ts — Startsideportalen: basePath /portal, NEXT_PUBLIC_BASE_PATH för medBas, standalone och modulerna i transpilePackages.
- apps/projekt/Dockerfile — Multi-stage mot Next standalone, med datavolymens ENV. Kör som icke-root.
- apps/portal/Dockerfile — Samma bygge för startsideportalen, utan datavolym.
- docker-compose.yml — Det Dokploy pekar på: start-web (projektportalen, med volymen) och start-portal (Host && PathPrefix(/portal)), Traefik-etiketter, dokploy-network och var sin healthcheck.
- apps/projekt/src/miljo.test.ts — Vaktar att varje process.env.X i projektportalen står under start-web.
- apps/portal/src/miljo.test.ts — Vaktar att varje process.env.X i startsideportalen och modulerna står under start-portal.

kontrakt:
- Ett nytt modulpaket måste läggas i transpilePackages i apps/portal/next.config.ts, annars faller bygget.
- En import mellan apparna fäller lint (no-restricted-imports). Det som båda behöver läggs i packages/ai eller packages/gemensamt.
- Modulpaket behöver varken lint- eller test-skript. Roten täcker dem.
- Modulpaketen kör noUncheckedIndexedAccess och verbatimModuleSyntax – typecheck är den grind som ser det.
- Grön logg betyder granskad kod först sedan grindarna flyttades till roten. Tidigare lintades bara appen (dåvarande apps/web).

Två fällor i Dokploy-uppsättningen, båda upptäckta vid första deployen och båda rättade. De ser likadana ut utifrån – sidan svarar inte – men har olika orsak.

Symptom | Orsak | Rättning
404 från Traefik på domänen, och TRAEFIK DEFAULT CERT i stället för Let's Encrypt | En Compose-tjänst får inga Traefik-etiketter automatiskt – det gör bara Dokploys Application-typ. Utan router finns inget att utfärda certifikat för. | Etiketter och dokploy-network deklareras i docker-compose.yml.
Containern blir aldrig frisk: wget: can't connect to remote host | Healthchecken pekade på localhost. Busybox wget provar ::1 först och Next lyssnar bara på IPv4. | 127.0.0.1 i healthchecken, plus start_period så uppstarten inte räknas som fel.
Allt fungerar, men AI-svaren är regelmotorns: svar på under en sekund och fält som ekar användarens ord ordagrant | En variabel som sätts i Dokploy men inte listas under environment i compose-filen når aldrig containern. Dokploys Environment fyller bara compose-interpolationen. ANTHROPIC_API_KEY saknades i listan, och adaptern föll tyst tillbaka på mock. | Varje process.env.X i koden har en rad under environment. Route handlern varnar dessutom en gång i loggen när providern är vald men nyckeln saknas.
COPY failed: stat app/apps/web/public | Tom katalog följer inte med i en git-klon. | apps/web/public/.gitkeep (i dag apps/portal/public/.gitkeep).

- Domänen sätts med DOMAIN i miljön; standard är start.sundsvall.dev.
- Lokalt kräver docker compose up att nätverket finns: docker network create dokploy-network. På servern skapar Dokploy det.
- Kontrollera alltid hälsan, inte bara att containern kör: docker inspect $(docker compose ps -q start-web) --format '{{.State.Health.Status}}'.
- Lägger du till en miljövariabel i koden måste den läggas till på tre ställen: .env.example, environment i docker-compose.yml, och Dokploys Environment. Glöms den mittersta faller appen tillbaka på sitt standardvärde utan att något syns.
- Tjänsten heter start-web, inte web. Prefixet skiljer stacken från andra på samma värd, och gäller även framtida start-bff, start-redis och start-db.
- Vid isolerad deploy ligger start-web i två nätverk. traefik.docker.network=dokploy-network talar om vilket Traefik ska ansluta över; utan den kan den välja stackens interna IP och få timeout. Övriga tjänster ska aldrig läggas i dokploy-network.

beroenden: skal, dokploy
beslut: ADR-010

kvarstår:
- Ingen CI. Grindarna körs manuellt före commit.
- Inget Playwright-röktest – det är fas 5.
- Ingen kontroll av att katalog och dokumentation är kompletta. Täckningen syns bara på /dev/docs.