187 lines
9.8 KiB
Markdown
187 lines
9.8 KiB
Markdown
# 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 `<REDACTED>`.
|
||
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=<REDACTED> \
|
||
SMTP_HOST=smtp.er-leverantor.se SMTP_USER=<REDACTED> SMTP_PASS=<REDACTED> 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: <svar>
|
||
readyz: <svar>
|
||
Tester: <antal ur skriptets utskrift>
|
||
Eval-svit: GODKÄND/UNDERKÄND
|
||
Integrationer: AAMOS=RIKTIG/mock, E-post=RIKTIG/log, Fillagring=RIKTIG/mock
|
||
Avvikelser: <inga | lista>
|
||
Kvarstående: <t.ex. "reverse proxy + TLS ej konfigurerat">
|
||
```
|
||
|
||
## 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://<api-domän>/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="<DATABASE_URL>" backups/<senaste>.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)
|