98 lines
5.0 KiB
Markdown
98 lines
5.0 KiB
Markdown
# Lanseringsplan – från namnbeslut till butik
|
||
|
||
> Körbar runbook. Allt som går att förbereda utan namn/konton är REDAN gjort
|
||
> och verifierat (se STATUS.md). Stegen nedan är i ordning; varje steg listar
|
||
> vem/vad som krävs. Kommandon körs från repo-roten om inget annat anges.
|
||
|
||
## Fas 0 – Namnbeslut (Johan)
|
||
|
||
1. Uppdatera `brand.config.json`: name, slug, urlScheme, iosBundleId,
|
||
androidPackage, apiDomain, adminDomain, supportEmail. (ENDA kodändringen.)
|
||
2. Lägg det gamla platshållarnamnet i `FORBIDDEN`-listan i
|
||
`scripts/brand-guard.sh` så CI vaktar även mot "Matappen".
|
||
3. Verifiera: `pnpm typecheck && pnpm test && pnpm build && ./scripts/brand-guard.sh`
|
||
4. Registrera domäner (apiDomain, adminDomain) + e-postdomän med SPF/DKIM/DMARC.
|
||
|
||
## Fas 1 – Infrastruktur (ops, ~en halvdag)
|
||
|
||
1. **RDS**: kör `infrastructure/deployment/create-database.sql` som master
|
||
(skapar databas, minsta-privilegie-användare och sök-extensions).
|
||
2. **Secrets**: generera och lägg i AWS Secrets Manager/SSM:
|
||
```bash
|
||
# Kör tre gånger – JWT_ACCESS_SECRET, JWT_REFRESH_SECRET, ENTITLEMENT_SIGNING_SECRET
|
||
node -e "console.log(require('crypto').randomBytes(48).toString('base64url'))"
|
||
```
|
||
Fyll `/opt/<slug>-platform/secrets/*.env` enligt `.env.example` (chmod 600).
|
||
Produktionen VÄGRAR starta med dev-hemligheter eller AAMOS_MODE=mock.
|
||
3. **S3**: skapa bucket `<slug>-production`, block public access, SSE-S3,
|
||
lifecycle: `temporary/` 7 dagar, `scans/` 90 dagar. IAM-roll `<slug>-app`
|
||
med åtkomst ENDAST till denna bucket (policy i infrastructure/security/).
|
||
4. **Server**: dedikerad Linux-användare, Docker, reverse proxy med TLS mot
|
||
`127.0.0.1:4100`. Deploy: `infrastructure/deployment/deploy.sh`
|
||
(kräver pg_dump-backup före migrationer – inbyggt).
|
||
5. **Larm**: sätt `ERROR_WEBHOOK_URL` (Slack/Discord-webhook) – 5xx och
|
||
fallerade jobb postas automatiskt.
|
||
6. **Backup-övning mot produktion**:
|
||
`DATABASE_URL=… ADMIN_DATABASE_URL=… ./infrastructure/deployment/backup-restore-test.sh`
|
||
(protokoll arkiveras i infrastructure/backups/; upprepa kvartalsvis).
|
||
|
||
## Fas 2 – AAMOS på riktigt (störst teknisk risk – gör tidigt)
|
||
|
||
1. Sätt `AAMOS_MODE=http`, `AAMOS_API_URL`, `AAMOS_API_KEY` mot AAMOS staging.
|
||
2. Kör utvärderingssviten: `pnpm eval:aamos`
|
||
– samma svit som körs mot mocken; resultatet loggas i ai_eval_runs och
|
||
syns i adminpanelen. UNDERKÄND = åtgärda innan vidare.
|
||
3. Regel därefter (spec §40): ingen modell-/promptändring i AAMOS tas i
|
||
produktion utan godkänd `pnpm eval:aamos`-körning.
|
||
4. Personuppgiftsbiträdesavtal med AAMOS-driften (juridik, fas 5).
|
||
|
||
## Fas 3 – E-postleverantör
|
||
|
||
1. Välj SES/Postmark/Resend. Implementera transporten i
|
||
`apps/api/src/lib/mailer.ts` (SmtpMailerPlaceholder – en klass, ~20 rader).
|
||
2. Sätt `EMAIL_MODE=smtp` + leverantörsnycklar. Mallar och flöden
|
||
(verifiering + lösenordsåterställning) är klara och E2E-testade i log-läge.
|
||
3. Verifiera DKIM/SPF på e-postdomänen; skicka testmejl till Gmail/Outlook.
|
||
|
||
## Fas 4 – Butikerna (kräver namn + konton)
|
||
|
||
1. Apple Developer Program + Play Console-konto.
|
||
2. App Store Connect/Play Console: skapa apparna med `iosBundleId`/`androidPackage`
|
||
och produkt-ID:n (`<iosBundleId>.<plan>_monthly` / `<plan>_monthly` – se
|
||
PLAN_DEFINITIONS; genereras ur brand-konfig).
|
||
3. Fyll i `apps/mobile/eas.json` submit-fälten; `eas build --profile production`.
|
||
4. Implementera butiksverifiering i produktionsläge
|
||
(`packages/subscriptions/src/stores.ts`: App Store Server API v2 +
|
||
Play Developer API – sandbox-flödet och entitlement-modellen är klara).
|
||
5. Push-notiser: `EXPO_PUSH_ENABLED=true` (tokenhantering + mallar klara).
|
||
6. Store-metadata per marknad: utkast i `docs/22-butiksmetadata.md`.
|
||
7. TestFlight/interna testare → rätta → skicka till granskning.
|
||
|
||
## Fas 5 – Juridik & innehåll (parallellt med fas 1–4)
|
||
|
||
1. Integritetspolicy + användarvillkor: UTKAST i `docs/23-juridik-utkast.md`
|
||
– **kräver granskning av jurist före publicering**.
|
||
2. Biträdesavtal: AWS + AAMOS-driften.
|
||
3. Recept: fler än dagens 22 seedade – M3-flödet (AI-utkast → granska →
|
||
publicera per språk) är byggt för att skala innehållet.
|
||
4. Licensgranskning innan Livsmedelsverket/OFF-connectorerna aktiveras.
|
||
|
||
## Fas 6 – Genrep & lansering
|
||
|
||
1. `pnpm typecheck && pnpm test && pnpm build` grönt i CI (inkl. varumärkesvakt).
|
||
2. Lasttest mot produktionsmiljön: `API_BASE_URL=https://<apiDomain> node scripts/loadtest.mjs`
|
||
(lokala referensvärden i docs/24-lasttest.md).
|
||
3. `pnpm eval:aamos` mot produktions-AAMOS – GODKÄND.
|
||
4. Aktivera admin-2FA för samtliga admin-konton (adminpanelen → 2FA).
|
||
5. Soft launch: Sverige först (spec-fas i7), sedan marknader per
|
||
marknadsprofilerna (EU/GB/US/CA är seedade och verifierade).
|
||
|
||
## Checklista "dagen före"
|
||
|
||
- [ ] Backup-restore-protokoll < 3 månader gammalt
|
||
- [ ] ERROR_WEBHOOK_URL testad (kasta ett testfel i staging)
|
||
- [ ] healthz/readyz gröna bakom TLS
|
||
- [ ] Admin-2FA aktiverat för alla admins
|
||
- [ ] eval:aamos GODKÄND mot produktion
|
||
- [ ] Butiksgranskningen godkänd i båda butikerna
|