# OPENCLAW-PROMPT: Bygg & deploya matplattformen > Kopiera ALLT nedanför linjen och klistra in som uppdrag till OpenClaw-agenten. > Zip-arkivet med källkoden ska finnas på servern (eller ge agenten nedladdningsvägen). --- ## UPPDRAG Du ska bygga och driftsätta en komplett applikationsplattform (API + worker + adminpanel, PostgreSQL + Redis) från ett källkodsarkiv. Arbetet är förberett så att ETT skript gör hela jobbet med inbyggda verifieringsgrindar. Din uppgift är att köra det disciplinerat, verifiera varje grind och rapportera exakt utfall. ## HÅRDA REGLER (bryt aldrig mot dessa) 1. **Skriv aldrig ut hemligheter** (innehåll i `.env`, tokens, lösenord) i din rapport, i loggar du citerar eller i kommandohistorik du visar. Referera dem som ``. 2. **Ändra ingen kod.** Om något failar: samla felet, följ felsökningslistan nedan, och rapportera. Du får ändra `.env`-VÄRDEN enligt instruktion, aldrig källkod. Rör ALDRIG `brand.config.json`. 3. **Kör aldrig destruktiva kommandon** (`DROP DATABASE`, `rm -rf` utanför temp, `git push`, `git reset`). Skriptet hanterar allt som behövs. 4. **Avbryt och rapportera** i stället för att improvisera om en grind är röd efter felsökningslistan. En halvfärdig deploy lämnas ALDRIG igång: kör då `pkill -f "apps/api/dist" ; pkill -f "apps/worker/dist"` och rapportera. 5. **Produktion**: kör ALDRIG produktionsläge utan att människan uttryckligen bekräftat att `.env` innehåller riktiga produktionsvärden. ## FÖRUTSÄTTNINGAR (kontrollera först, installera vid behov) ```bash node --version # >= 22 (installera: https://nodejs.org eller nvm) corepack enable && corepack prepare pnpm@10 --activate pnpm --version # >= 10 docker --version # VALFRITT – behövs INTE om Postgres 16 + Redis 7 redan kör ``` **Docker är valfritt.** Skriptet använder Docker enbart som reservstart av Postgres/Redis i staging. Kör tjänsterna redan nativt (t.ex. WSL med `sudo service postgresql start` och `sudo service redis-server start`, systemd, eller en molndatabas) passerar Grind 0 och 2 utan Docker – installera inget och skapa inga shims. Grind 2 avgör på faktisk nåbarhet. ## STEG 1 – Packa upp och gå in i repot ```bash unzip -q plattform-*.zip -d ~/app-platform && cd ~/app-platform ls brand.config.json infrastructure/deployment/first-deploy.sh || echo "FEL: fel arkiv" ``` ## VAD ZIPEN INNEHÅLLER (komplett – inget mer behövs utom dina nycklar) All källkod (API, worker, adminpanel, mobilapp, 13 paket), databas-migrationer och seed (101 ingredienser, 22 recept, 12 språk), deploy-skriptet med grindar, AI-utvärderingssviten, alla runbooks (`docs/21-lanseringsplan.md`, `docs/25-testguide.md`, `docs/namnbyte.md`). Det ENDA som inte ligger i zipen är hemligheter/nycklar – de fylls i nedan (avsiktligt: hemligheter checkas aldrig in). ## PÅ RIKTIGT FRÅN START (rekommenderat – inga mockar) Plattformen har tre externa integrationer. Ange människans värden som miljövariabler vid FÖRSTA körningen så skrivs de in i `.env` och allt kör äkta från start – ingen mockdata: | Integration | Variabler | Var värdena kommer ifrån | | ----------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------- | | AAMOS (AI) | `AAMOS_API_URL`, `AAMOS_API_KEY` | Er egen AAMOS-plattform | | E-post | `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`, `MAIL_FROM` | Valfri SMTP-leverantör (SES/Postmark/Resend/Brevo/egen server) – transporten är leverantörsoberoende och verifierad med riktig rundtur | | Fillagring | `S3_BUCKET`, `S3_REGION`, ev. `S3_ENDPOINT` + `S3_ACCESS_KEY_ID`/`S3_SECRET_ACCESS_KEY` | AWS S3 eller S3-kompatibel (MinIO/R2/Hetzner). Tomma nycklar = IAM-roll. Verifierad med äkta presign→PUT→GET-rundtur | Exempel (allt äkta, en rad): ```bash AAMOS_API_URL=https://aamos.er-doman.se AAMOS_API_KEY= \ SMTP_HOST=smtp.er-leverantor.se SMTP_USER= SMTP_PASS= MAIL_FROM=noreply@er-doman.se \ S3_BUCKET=er-staging-bucket S3_REGION=eu-north-1 \ DEPLOY_MODE=staging REQUIRE_REAL=1 ./infrastructure/deployment/first-deploy.sh ``` `REQUIRE_REAL=1` gör äktheten till en GRIND: deployen UNDERKÄNNS med exakt lista över vad som saknas om någon integration fortfarande kör mock. Skriptets slututskrift visar alltid INTEGRATIONSSTATUS (RIKTIG/mock per rad) – citera den i rapporten. Utelämnas värdena faller staging tillbaka till mock (fungerar, men människan har bett om äkta drift – fråga hellre efter värdena). ## STEG 2 – Kör första-deployen (STAGING är default och säkert) ```bash DEPLOY_MODE=staging ./infrastructure/deployment/first-deploy.sh ``` Skriptet är idempotent (säkert att köra om) och går igenom 8 grindar: | Grind | Vad | Förväntat i utskrift | | ----- | ---------------------------------------------------------------------------- | ---------------------- | | 0 | node/pnpm (docker valfritt – noteras bara) | `GRIND 0 OK` | | 1 | .env (skapas med genererade hemligheter i staging) | `GRIND 1 OK` | | 2 | Postgres + Redis nåbara (Docker endast som reservstart i staging) | `GRIND 2 OK` | | 3 | Varumärkesvakt + typecheck + 100+ tester + build | `GRIND 3 OK` | | 4 | Databasmigrationer (+ seed i staging: 101 ingredienser, 22 recept, 12 språk) | `GRIND 4 OK` | | 5 | AI-utvärderingssvit: 6 fall, 30 kontroller | `GRIND 5 OK … GODKÄND` | | 6 | API + worker startar; `/healthz` och `/readyz` svarar | `GRIND 6 OK` | | 7 | Funktionsrök: registrera konto → logga in → läsa recept | `GRIND 7 OK` | Slutraden ska vara: `ALLA GRINDAR GRÖNA – staging är uppe.` ## STEG 3 – Egen verifiering (lita aldrig blint på skriptet) ```bash curl -fsS http://127.0.0.1:4000/healthz # {"ok":true,...} curl -fsS http://127.0.0.1:4000/readyz # {"ok":true,...} tail -5 logs/api.log # inga rader med "level":50 tail -5 logs/worker.log # innehåller "Worker igång" ``` Adminpanelen (valfritt att exponera): statiska filer i `apps/admin/dist/` – servera t.ex. `cd apps/admin/dist && python3 -m http.server 5173`. ## STEG 4 – Rapportera Rapportera EXAKT detta format: ``` DEPLOY-RAPPORT Läge: staging|production Alla grindar: GRÖNA / RÖD på grind N healthz: readyz: Tester: Eval-svit: GODKÄND/UNDERKÄND Integrationer: AAMOS=RIKTIG/mock, E-post=RIKTIG/log, Fillagring=RIKTIG/mock Avvikelser: Kvarstående: ``` ## FELSÖKNINGSLISTA (i ordning, max ett försök per punkt) 1. **Grind 2 röd, ingen databas svarar**: starta tjänsterna – nativt (`sudo service postgresql start; sudo service redis-server start` på WSL, eller systemd-motsvarigheter) ELLER starta Docker-daemonen (`sudo systemctl start docker`). Kör om skriptet. Bygg aldrig shims. 2. **Grind 2 röd, port 5432 upptagen**: en annan Postgres kör redan – sätt `DATABASE_URL` i `.env` till den, kör om. 3. **Grind 3 röd**: kör `pnpm typecheck` och `pnpm test` separat, citera de FÖRSTA 20 felraderna i rapporten. ÄNDRA INTE KOD – rapportera. (Testerna är tidszonsoberoende – verifierade under Stockholm/Auckland/Los Angeles – så sätt ALDRIG TZ som workaround.) 4. **Grind 6 röd**: citera `tail -30 logs/api.log`. Vanligast: fel `DATABASE_URL`/`REDIS_URL` i `.env` – rätta värdet, kör om skriptet. 5. **Port 4000 upptagen**: `pkill -f "apps/api/dist"` och kör om skriptet. 6. Allt annat: avbryt enligt hård regel 4. ## PRODUKTION (körs ENDAST efter explicit mänskligt godkännande) Skillnader mot staging – människan ska ha gjort detta FÖRE ditt körande: 1. `.env` ifylld med riktiga värden (databas/RDS, riktiga hemligheter, `AAMOS_MODE=http` + URL/nyckel, ev. `EMAIL_MODE=smtp`). Skriptet vägrar dev-värden och vägrar starta databaser i produktion. 2. Databasen skapad via `infrastructure/deployment/create-database.sql` (som master). Sedan: ```bash DEPLOY_MODE=production ./infrastructure/deployment/first-deploy.sh ``` Skriptet tar automatiskt backup före migrationer och seedar ALDRIG i produktion. Efteråt: peka reverse proxy med TLS mot `127.0.0.1:4000` och kör STEG 3 igen utifrån (`curl https:///healthz`). **Rollback** om produktionen är trasig efter deploy: stoppa processerna (`pkill -f "apps/api/dist"; pkill -f "apps/worker/dist"`), återställ databasen från senaste dumpen i `backups/` med `pg_restore --clean --dbname="" backups/.dump`, starta föregående kända version. Rapportera att rollback skett. ## VAD SOM MEDVETET INTE INGÅR (rapportera som "Kvarstående", försök inte lösa) - Reverse proxy/TLS-konfiguration (miljöspecifik) - Mobilappens butiksbyggen (kräver EAS + butikskonton) - E-postleverantör i produktion (EMAIL_MODE=smtp implementeras vid leverantörsval) - Namnbyte (styrs av `brand.config.json` – rörs aldrig av dig)