From ddfe99f9f2a921ceca113f933086ba4a1ee9be57 Mon Sep 17 00:00:00 2001 From: Bernt Date: Thu, 2 Jul 2026 17:10:09 +0000 Subject: [PATCH] Go Live Checklist + Version Endpoint - Go Live Checklist for LandveX Internal Pilot deployment - Version endpoint: /version returns environment, version, commit, build - Ready for Internal Pilot deployment Next: Deploy with Docker Compose --- docs/GO_LIVE_CHECKLIST.md | 93 ++++++++++++++++++++++++++++++ packages/api/src/index.ts | 2 + packages/api/src/routes/version.ts | 23 ++++++++ 3 files changed, 118 insertions(+) create mode 100644 docs/GO_LIVE_CHECKLIST.md create mode 100644 packages/api/src/routes/version.ts diff --git a/docs/GO_LIVE_CHECKLIST.md b/docs/GO_LIVE_CHECKLIST.md new file mode 100644 index 000000000..321ccfcf5 --- /dev/null +++ b/docs/GO_LIVE_CHECKLIST.md @@ -0,0 +1,93 @@ +# Go Live Checklist — LandveX Internal Pilot + +> **Mål:** Deploya LandveX Internal Pilot. Inte "Pilot Environment" — detta är vår dagliga arbetsmiljö och ska behandlas nästan som produktion. + +--- + +## Git & Versionshantering + +- [ ] All kod ligger i Git +- [ ] Alla ändringar går via PR +- [ ] Commit SHA visas i UI (`/version` eller footer) +- [ ] Versionsnummer visas tydligt + +## Kubernetes + +- [ ] GitOps styr deployment +- [ ] Helm/Kustomize (eller motsvarande) är versionshanterade +- [ ] Inga manuella ändringar i klustret +- [ ] Secrets hanteras via valda secret manager, inte i Git + +## Observability + +- [ ] OpenTelemetry aktiverat +- [ ] Strukturerad JSON-loggning +- [ ] Korrelations-ID genom hela kedjan +- [ ] `/health`, `/ready`, `/live`, `/metrics` fungerar för alla tjänster + +## Storage + +- [ ] Artifact Registry fungerar +- [ ] Objektlagring fungerar +- [ ] Checksummor verifieras +- [ ] Metadata extraheras + +## Säkerhet + +- [ ] RBAC fungerar +- [ ] Feature Flags fungerar +- [ ] Developer Mode endast för behöriga +- [ ] Audit-loggning för administrativa åtgärder + +--- + +## Platform Readiness + +| Modul | Status | +|-------|--------| +| Mission Import | ☐ | +| Artifact Registry | ☐ | +| Storage | ☐ | +| Metadata | ☐ | +| Operations | ☐ | +| Developer Mode | ☐ | +| Replay | — (senare) | +| Decision Pipeline | — (senare) | +| Learning | — (senare) | + +--- + +## Pilot 001 Uppdrag + +> **Bryt systemet.** + +Testa: +- [ ] Dålig täckning +- [ ] Stora videofiler +- [ ] Avbruten upload +- [ ] Flera telefonmodeller +- [ ] Dålig GPS +- [ ] Mörker +- [ ] Regn +- [ ] Dålig belysning + +Ju tidigare ni hittar gränserna, desto bättre blir plattformen. + +--- + +## Efter Varje Pilotdag (30 min) + +1. Vad fungerade bäst? +2. Vad blockerade oss? +3. Vad lärde vi oss om användarna? +4. Vad ska in i nästa sprint? + +Inga längre diskussioner — bara konkreta observationer och prioriteringar. + +--- + +## Status + +- **Version:** 1.0 +- **Date:** 2026-07-02 +- **Next:** Deploy Internal Pilot diff --git a/packages/api/src/index.ts b/packages/api/src/index.ts index c698f96be..9659148ff 100644 --- a/packages/api/src/index.ts +++ b/packages/api/src/index.ts @@ -12,6 +12,7 @@ import cors from 'cors'; import helmet from 'helmet'; import missionImportRoutes from './routes/mission-import'; +import versionRoutes from './routes/version'; const app = express(); const PORT = process.env.PORT || 3000; @@ -23,6 +24,7 @@ app.use(express.json()); // Routes app.use('/api/v1/missions', missionImportRoutes); +app.use('/version', versionRoutes); // Health check app.get('/health', (_req, res) => { diff --git a/packages/api/src/routes/version.ts b/packages/api/src/routes/version.ts new file mode 100644 index 000000000..b7660a49a --- /dev/null +++ b/packages/api/src/routes/version.ts @@ -0,0 +1,23 @@ +/** + * Version endpoint + * + * Returns current version, commit SHA, and build info. + * Used by Readiness Dashboard and debugging. + */ + +import { Router } from 'express'; + +const router = Router(); + +const VERSION = { + environment: process.env.NODE_ENV || 'development', + version: process.env.npm_package_version || '0.1.0', + commit: process.env.GIT_COMMIT || 'unknown', + build: new Date().toISOString(), +}; + +router.get('/', (_req, res) => { + res.json(VERSION); +}); + +export default router;