Dokumentationen / Yta
Grindar och bygge
YtaGemensamGrindarna och paketeringen: lint, test och typecheck över hela repot, och en container per applikation som Dokploy kan bygga (ADR-040).
källa: eslint.config.mjs, vitest.config.mts, apps/projekt/next.config.ts, apps/projekt/Dockerfileuppdaterad: 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
| Sökväg | Roll |
|---|---|
| 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 och beslut
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.