Hoppa till innehållet

Devportalen /portal/dev

Startsideportalens ekosystem för människa och agent

Dokumentationen / Yta

Grindar och bygge

YtaGemensam

Grindarna 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

Tabell: Sökväg, Roll
SökvägRoll
eslint.config.mjsLintkonfiguration för hela repot. no-html-link-for-pages avstängd: App Router har ingen pages-katalog.
eslint-rules/inga-hardkodade-designvarden.mjsEgen lintregel: R4 som grind. Hex-färger och px i hakparentes i className. shadcn-grunden undantagen.
vitest.config.mtsTester plockas upp på filnamn: packages/**/test/**/*.test.ts. passWithNoTests.
package.jsonRotskripten: dev (båda apparna), build (båda), start, lint, test, typecheck.
apps/projekt/next.config.tsProjektportalen: 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.tsStartsideportalen: basePath /portal, NEXT_PUBLIC_BASE_PATH för medBas, standalone och modulerna i transpilePackages.
apps/projekt/DockerfileMulti-stage mot Next standalone, med datavolymens ENV. Kör som icke-root.
apps/portal/DockerfileSamma bygge för startsideportalen, utan datavolym.
docker-compose.ymlDet 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.tsVaktar att varje process.env.X i projektportalen står under start-web.
apps/portal/src/miljo.test.tsVaktar 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.

Tabell: Symptom, Orsak, Rättning
SymptomOrsakRättning
404 från Traefik på domänen, och TRAEFIK DEFAULT CERT i stället för Let's EncryptEn 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 hostHealthchecken 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 ordagrantEn 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/publicTom 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.