# ServiceDefinition: gitea # Source of truth: spec docs/13-service-catalog.md row 12; docs/15-identity-and-access.md; docs/05. # public git hosting | egress internet | repos+DB on Longhorn (irreplaceable, DR-critical) | auth oidc. # Bootstrapping-critical: self-hosts the platform's GitOps source + CI/CD, onboarded EARLY (docs/13 # "Gitea is bootstrapping-critical", WS-APPS step 2, right after PiHole). A cluster loss would take its # own git host with it, so repos/DB are backed up off-cluster + mirrored (R-STATE-03). # Single-container Gitea with the built-in SQLite datastore is sufficient at home scale; the repos and # DB live on one Longhorn PVC (/data), so no external PostgreSQL is required for this onboarding. # Validates against schemas/servicedefinition.schema.json. name: gitea kind: container source: image: gitea/gitea:1.24.3 # pinned recent stable tag (R-UPD-01); update.range governs advancement exposure: public # edge-forwarded git host at gitea.home.keithjackson.dev (docs/09; R-DNS/R-NET) egress: internet # normal WAN egress (docs/03; R-NET-05) storage: - name: data size: 10Gi class: longhorn # repos + SQLite DB on 3-replica Longhorn; irreplaceable (docs/04; R-STATE-02) mountPath: /data # Gitea keeps ALL state (repos, DB, app.ini, INTERNAL_TOKEN) directly under /data; # the default /data/ would strand real state on the ephemeral rootfs (R-STATE-01) dependencies: [] # default-deny: reaches only DNS; git clients reach it north-south via the Gateway (R-NET-01/02) ingressRoutes: - host: gitea.home.keithjackson.dev port: 3000 # Gitea HTTP web/API; TLS terminates at the shared Gateway (docs/08, docs/09) auth: mode: oidc # native Keycloak OIDC client (docs/13 SSO row, docs/15 "Native OIDC" set; R-IDP-02) groups: - platform-admins # access scoped to an authorized group (R-IDP-06) # NOTE (OIDC follow-up + break-glass): Gitea keeps a LOCAL admin as the break-glass path so an IdP # outage never locks the operator out of recovery tools (docs/15 "Availability caveat"). At initial # deploy Gitea comes up on that local admin; the Keycloak OIDC client (+ SOPS client secret) is wired # once Keycloak is live. This declaration records the target integration; it does not embed a secret. update: channel: stable # R-UPD-01 range: ">=1.22.0 <2.0.0" # stay on the 1.x stable line cadence: "0 4 * * *" autoRollbackOnFailedHealth: true # R-UPD-03 observability: metrics: true slis: - up # git host down is a critical alert (docs/10; R-OBS-01) backup: policy: daily-offcluster # DR-critical: repos/DB backed up off-cluster + mirrored (docs/13, docs/04; R-STATE-03)