Files
template-web-backend-python/helm/APP_NAME/values.yaml
ilopez 5a215ed293
Some checks failed
__APP_NAME__ — build & deploy / Calidad + build + push (push) Failing after 1m19s
__APP_NAME__ — build & deploy / Helm upgrade --install (push) Has been skipped
feat: AddonClaim + InitContainer wait-for-secret en chart helm
Cierra GOLDEN-PATH-ADDONCLAIM-MISSING (P0 hands-off pipeline).

Cambios:
- helm/APP_NAME/templates/addonclaim.yaml (NEW): hook pre-install/pre-upgrade
  weight -10, SIN delete-policy (sobrevive upgrades, evita disparar finalizer
  cleanup-logical). Gated por .Values.database.enabled (default true).
- helm/APP_NAME/templates/role-db-secret-reader.yaml (NEW): Role + RoleBinding
  weight -7 que permite al SA leer el Secret <release>-db-creds. Lo consume
  el InitContainer wait-for-secret del Job Alembic.
- helm/APP_NAME/templates/job-alembic-upgrade.yaml: gated por
  database.enabled, anade InitContainer wait-for-secret (48x5s=240s) que
  espera a que addon-provisioner publique el Secret tras reconciliar el
  AddonClaim. Absorbe la latencia del @kopf.timer (RECONCILE_INTERVAL 300s
  + initial_delay 60s) sin tocar el operator.
- helm/APP_NAME/values.yaml: bloque database completo (enabled, addonType,
  databaseName, user.permissions, deletionPolicy Retain). Opt-out con
  database.enabled=false + alembic.enabled=false.
- .gitea/workflows/APP_NAME-build.yaml: helm timeout 5m -> 7m (margen para
  reconcile addon-provisioner + StatefulSet ready + DDL Job + Alembic).
- claim-mariadb.yaml (DELETED): obsoleto - estaba en la raiz del template
  y nunca se renderizaba por helm. Reemplazado por addonclaim.yaml dentro
  del chart helm.
- README.md: documenta nueva tabla de hook weights, opt-out database, y
  trade-off del orphan AddonClaim post-uninstall (cleanup explicito).

Decision arquitectural: Opcion D modificada (Opus 4.6 consult).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-25 07:56:42 -05:00

102 lines
3.1 KiB
YAML

# Defaults sensatos para tier startup. El CI inyecta tier/tenantId via --set
# leyendo valores del TenantProfile correspondiente.
replicaCount: 1
image:
# Proyecto Harbor dedicado del tenant: `t-<tenant-id-short>` (ADR-019 D-03).
repository: registry.coralsafety.com/t-__TENANT_ID_SHORT__/__APP_NAME__
tag: latest
pullPolicy: Always
pullSecret: harbor-tenant-pull
# Identidad del tenant — populated por --set desde el CI
tenantId: ""
tenantIdNodashes: ""
tier: startup
goldenPath: web-backend
goldenPathLang: python
database:
# Si enabled=false: no se aplica AddonClaim, no se crea Role/RoleBinding,
# ni corre el Job Alembic. El shape web-backend/python es BD-first por
# diseño, asi que el default es true. Para una app stateless, el dev
# opt-out poniendo database.enabled=false (y alembic.enabled=false).
enabled: true
# Tipo de add-on solicitado al addon-provisioner. R1 solo soporta mariadb.
addonType: mariadb
# Nombre del Secret a publicar en el ns `apps` con el connection string.
# El Job Alembic y el Deployment lo montan via envFrom.
secretName: __APP_NAME__-db-creds
# Nombre de la BD logica. Vacio -> addon-provisioner deriva del Release.Name
# (snake_case + "_db"). Ver template addonclaim.yaml.
databaseName: ""
user:
permissions: rw # rw | ro
# Retain (default) | Delete — ver ADR-052 §6.2. Retain preserva la BD
# logica si el claim se borra (recomendado para PoC/free-trial).
deletionPolicy: Retain
config:
logLevel: INFO
correlationIdHeader: X-Correlation-ID
openapiRequireAuth: false
keycloakIssuer: ""
staticDemoPath: /app/static/demo
resources:
requests:
cpu: 50m
memory: 128Mi
limits:
cpu: 500m
memory: 512Mi
probes:
liveness:
initialDelaySeconds: 20
periodSeconds: 10
readiness:
initialDelaySeconds: 5
periodSeconds: 5
failureThreshold: 3
service:
type: ClusterIP
port: 8000
ingress:
enabled: true
# className por defecto = nginx (rke2-ingress-nginx pre-instalado en cluster tenant).
# Cambiar solo si el tenant trae su propio IngressClass.
className: nginx
# Host con tenant-id CON guiones (formato canónico Cove): coincide con
# los A records que crea cloudflare-provisioner (Gap 5) y el wildcard
# cert apps-wildcard-tls (Gap 3).
host: __APP_NAME__-__TENANT_ID__.apps.coralware.cloud
# Secret TLS provisto por el wildcard *.apps.coralware.cloud sembrado
# en el cluster tenant por el agente cloudflare/cert-manager (Gap 3).
# NO se renombra por app — todas las apps del tenant lo comparten.
tlsSecretName: apps-wildcard-tls
# Body size para subidas/uploads de la app — ajustar según necesidad.
proxyBodySize: 10m
alembic:
enabled: true
command: ["alembic", "upgrade", "head"]
resources:
requests: {cpu: 50m, memory: 128Mi}
limits: {cpu: 200m, memory: 256Mi}
serviceMonitor:
enabled: true
interval: 30s
port: http
networkPolicy:
enabled: true
addonsNamespace: addons # ADR-054: namespace funcional fijo en cluster tenant
# Namespace donde corre el ingress controller del cluster tenant.
# RKE2 instala rke2-ingress-nginx en kube-system por default.
ingressControllerNamespace: kube-system