Files
homelab/k8s/security/ci-cd/forgejo-values.yaml
T
Story Crater Bot d76caf2b5a fix(longhorn): add spec.name field to talos-cp-2/cp-3 Node CRDs
Root cause: Longhorn refuses to schedule replicas on nodes without spec.name
field. talos-cp-1 was auto-discovered (has spec.name), but cp-2/cp-3 were
manually created CRDs without it.

Error: 'no node name provided to check node down or deleted'

Fix: Add spec.name matching metadata.name for both nodes.
2026-08-18 15:08:03 -07:00

188 lines
7.3 KiB
YAML

# k8s/security/ci-cd/forgejo-values.yaml
# Forgejo deployed via the gitea-charts/gitea Helm chart with image override,
# as an ArgoCD Application with an inline Helm source (k8s/argocd/apps/forgejo.yaml).
# Admin password set via --set at install time (FORGEJO_ADMIN_PASSWORD in .env).
# DB: CNPG (k8s/data/ddb-cluster.yaml + forgejo-database.yaml), not SQLite.
# Cache/session/queue: dedicated Redis (forgejo-redis.yaml), not in-memory —
# required once replicaCount > 1, since in-memory state isn't shared across pods.
#
# Chart docs: https://gitea.com/gitea/helm-chart
# ── Image (Forgejo replaces Gitea — drop-in compatible) ──────────────────────
image:
repository: codeberg.org/forgejo/forgejo
tag: "13" # pin exact release — check codeberg.org/forgejo/forgejo/releases
pullPolicy: IfNotPresent
# ── Bootstrap admin (provisioned by a post-install Job inside the chart) ──────
gitea:
admin:
username: rock
email: [email protected]
# password: injected via helmfile --set (FORGEJO_ADMIN_PASSWORD from .env)
config:
server:
PROTOCOL: http # nginx ingress handles TLS; pod serves plain HTTP
DOMAIN: forgejo.riotpiao.com
ROOT_URL: https://forgejo.riotpiao.com/
HTTP_PORT: 3000
START_SSH_SERVER: true
SSH_DOMAIN: forgejo.riotpiao.com
SSH_PORT: 2222
SSH_LISTEN_PORT: 2222
database:
DB_TYPE: postgres
HOST: ddb-cluster-rw.ddb.svc:5432
NAME: forgejo
USER: app
repository:
ROOT: /data/git
ENABLE_PUSH_CREATE_USER: true
ENABLE_PUSH_CREATE_ORG: true
actions:
ENABLED: true
packages:
ENABLED: true # built-in OCI registry
metrics:
ENABLED: true # Prometheus at /metrics
service:
DISABLE_REGISTRATION: true # no self-signup; Authentik OAuth2 auto-creates accounts
oauth2:
ENABLED: true
PROVIDER: openidconnect
OPENID_CONNECT_DISCOVERY_URL: https://authentik.riotpiao.com/application/o/forgejo/.well-known/openid-configuration
CLIENT_ID: forgejo
AUTO_DISCOVER_URL: https://authentik.riotpiao.com/application/o/forgejo/.well-known/openid-configuration
# CLIENT_SECRET was missing entirely before - oauth2 login could never
# have worked. Value comes from the forgejo-oidc Secret (created by the
# authentik-provision PostSync hook, see k8s/security/iam/authentik-
# provision-job.yaml) via extraEnv below, since this oauth2: map is
# rendered directly into plain env vars and can't reference a Secret
# inline the way envFromSecret/extraEnv can.
cache:
ADAPTER: redis
HOST: redis://forgejo-redis.cicd.svc:6379/0
session:
PROVIDER: redis
PROVIDER_CONFIG: redis://forgejo-redis.cicd.svc:6379/1
queue:
TYPE: redis
CONN_STR: redis://forgejo-redis.cicd.svc:6379/2
metrics:
enabled: true
serviceMonitor:
enabled: true # kube-prometheus-stack discovers ServiceMonitors cluster-wide
# ── Persistence (Longhorn RWX — git repo data shared across replicas) ────────
persistence:
enabled: true
storageClass: longhorn
size: 20Gi
accessModes:
- ReadWriteMany
# ── Replicas ──────────────────────────────────────────────────────────────────
# Postgres (CNPG) + Redis (session/cache/queue) + RWX storage means replicas
# no longer need to serialize on a single pod like the old SQLite setup did.
replicaCount: 2
# ── Deployment strategy ────────────────────────────────────────────────────────
deployment:
strategy:
type: RollingUpdate
env:
- name: SSL_CERT_DIR
value: /homelab-ca
- name: GITEA__database__PASSWD
valueFrom:
secretKeyRef:
name: ddb-cluster-app
key: password
# ── Cert / CA auto-reload ─────────────────────────────────────────────────────
# nginx serves the wildcard-tls cert — Forgejo itself never reads a TLS secret.
# The only reload trigger is homelab-ca: if the root CA rotates, the mounted
# ConfigMap changes and Forgejo must restart to pick up the new CA bundle for OIDC.
podAnnotations:
configmap.reloader.stakater.com/reload: "homelab-ca"
# ── Services (Cilium LB-IPAM pins both to 192.168.1.165) ─────────────────────
service:
http:
type: LoadBalancer
port: 3000
targetPort: 3000
annotations:
io.cilium/lb-ipam-ips: "192.168.1.165"
io.cilium/lb-ipam-sharing-key: "forgejo"
ssh:
type: LoadBalancer
port: 2222
targetPort: 2222
annotations:
io.cilium/lb-ipam-ips: "192.168.1.165"
io.cilium/lb-ipam-sharing-key: "forgejo"
# ── Resources ─────────────────────────────────────────────────────────────────
resources:
requests:
cpu: 250m
memory: 512Mi
limits:
cpu: "1"
memory: 1Gi
# ── Node resilience ───────────────────────────────────────────────────────────
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
# ── CA trust ─────────────────────────────────────────────────────────────────
# Go reads SSL_CERT_DIR as an additional cert directory ON TOP OF the default
# cert files (ca-certificates.crt stays intact — no init container needed).
# Setting SSL_CERT_DIR=/homelab-ca makes Go also read homelab-ca.crt from there,
# trusting both the standard Mozilla bundle and our homelab CA.
# Required for OIDC: Forgejo fetches Authentik's discovery endpoint which
# presents a cert signed by homelab-ca.
# CLIENT_SECRET for the oauth2 block above - gitea's own config map (oauth2:)
# can only hold plain values, so the Secret-backed one is injected as
# GITEA__oauth2__CLIENT_SECRET, following the chart's standard
# GITEA__<section>__<KEY> env-var-to-ini-config convention.
extraEnv:
- name: GITEA__oauth2__CLIENT_SECRET
valueFrom:
secretKeyRef:
name: forgejo-oidc
key: CLIENT_SECRET
extraVolumes:
- name: homelab-ca
configMap:
name: homelab-ca
extraVolumeMounts:
- name: homelab-ca
mountPath: /homelab-ca
readOnly: true
# ── Ingress: disabled — rule lives in k8s/ingress/ingress.yaml ───────────────
ingress:
enabled: false
# ── Bundled databases + cache: all disabled — SQLite + memory is the chosen backend ──
postgresql:
enabled: false
postgresql-ha:
enabled: false
mysql:
enabled: false
redis-cluster:
enabled: false # 6-node cluster is overkill for single-replica SQLite Forgejo
# ── Act runner subchart: disabled — managed by the forgejo-runner helmfile release
act_runner:
enabled: false