Files
Cibello-app/docs/21-lanseringsplan.md
T

98 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 återinträde.
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 14)
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