- Bottling quality: water content above the legal limit (strict >) answers 409 CONFIRMATION_REQUIRED bound to the measured value; prefill for jar size, best-before (shelfLifeMonths, month-end clamping) and water content; impossible dates give 400; water-content checks in src/common/quality. - Frontend phenology: "Entwicklung melden" sheet, IndexedDB v4 queue, season header on the apiary page, confirmed revoke for all apiaries. - Frontend honey chain: "Vorschlag aus …" hints with explicit take-over, prefill status note, movement ledger with withdraw/correct dialogs. - Telegram: link tokens (hashed, single use), private-chat receiver with lease and offset CAS, bounded poison-update skip, Retry-After, pending deliveries skipped on disconnect; system API for deliveries and retry; worker-only secret wiring and manifest policy tests. - ARCHITECTURE.md §7, §9, §10, §11.11–11.13, Annahmen 51–55. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
58 lines
3.0 KiB
YAML
58 lines
3.0 KiB
YAML
# Vorlage – keine echten Werte. Kopieren, echte Werte setzen, per `kubectl apply` außerhalb
|
||
# der Versionskontrolle anwenden (oder ueber Secret-Manager/Sealed-Secrets im Cluster).
|
||
apiVersion: v1
|
||
kind: Secret
|
||
metadata:
|
||
name: apicore-backend-secret
|
||
type: Opaque
|
||
stringData:
|
||
# Host ist der In-Cluster-Service aus deploy/k8s/base/postgres/service.yaml.
|
||
# Anderer Namespace als das Backend? Dann FQDN nutzen:
|
||
# apicore-postgres.<namespace>.svc.cluster.local
|
||
DATABASE_URL: "postgresql://apicore:change-me-postgres-password@apicore-postgres:5432/apicore?schema=public"
|
||
# Mindestens 32 Zeichen (server-seitig erzwungen, Start bricht sonst ab) -
|
||
# signiert jedes Access-/MFA-/SSO-Token. TOTP- und Webhook-Secrets aus der
|
||
# Zeit vor den eigenen Schluesseln (unten) sind noch damit verschluesselt:
|
||
# erst nach dem rekey-Job rotieren. Erzeugen z.B. mit: openssl rand -hex 32
|
||
JWT_ACCESS_SECRET: "change-me-to-a-random-value-at-least-32-characters-long"
|
||
JWT_REFRESH_SECRET: "change-me-refresh-secret"
|
||
# One encryption key per purpose (TOTP secrets, webhook signing secrets,
|
||
# backup files). Required in production: at least 32 characters each, all
|
||
# three different from each other and from both JWT secrets.
|
||
# BACKUP_ENCRYPTION_KEY (with MFA_/WEBHOOK_ENCRYPTION_KEY for MFA and webhook
|
||
# secrets) is needed to restore backups on another deployment.
|
||
# Rotation: old value to <NAME>_PREVIOUS, new <NAME>, run the rekey job,
|
||
# then remove <NAME>_PREVIOUS (backup files are not resealed: keep
|
||
# BACKUP_ENCRYPTION_KEY_PREVIOUS while older files must restore).
|
||
MFA_ENCRYPTION_KEY: "change-me-to-a-third-random-value-at-least-32-characters"
|
||
WEBHOOK_ENCRYPTION_KEY: "change-me-to-a-fourth-random-value-at-least-32-characters"
|
||
BACKUP_ENCRYPTION_KEY: "change-me-to-another-random-value-at-least-32-characters"
|
||
# MFA_ENCRYPTION_KEY_PREVIOUS: ""
|
||
# WEBHOOK_ENCRYPTION_KEY_PREVIOUS: ""
|
||
# BACKUP_ENCRYPTION_KEY_PREVIOUS: ""
|
||
# Entra ID App-Registrierung (SSO). Siehe configmap.example.yaml
|
||
# fuer OIDC_ISSUER_URL/OIDC_REDIRECT_URI. Wird auch fuer die
|
||
# M365-Kalender-Synchronisation wiederverwendet - dafuer in der
|
||
# App-Registrierung zusaetzlich die Application-Permission
|
||
# "Calendars.ReadWrite" hinzufuegen (Admin-Consent noetig).
|
||
OIDC_CLIENT_ID: "change-me-entra-client-id"
|
||
OIDC_CLIENT_SECRET: "change-me-entra-client-secret"
|
||
# Optionaler Schluessel der Open-Meteo-API (kommerzieller Tarif). Leer
|
||
# lassen, solange die freie API genutzt wird; dann wird kein apikey gesendet.
|
||
OPEN_METEO_API_KEY: ""
|
||
|
||
# Telegram-Bot-Token (optional) - NICHT in diesem Secret, sondern im eigenen
|
||
# Secret apicore-telegram, das nur der Worker einbindet (Secret mit
|
||
# TELEGRAM_BOT_TOKEN; einzelne secretKeyRef-Variable (optional: true), kein
|
||
# envFrom, kein Volume). Der API-Pod
|
||
# darf es nicht einbinden. Der Inhaber legt den Bot bei BotFather und das
|
||
# Secret selbst an; ohne Token laeuft Telegram nicht, alles andere schon.
|
||
#
|
||
# apiVersion: v1
|
||
# kind: Secret
|
||
# metadata:
|
||
# name: apicore-telegram
|
||
# type: Opaque
|
||
# stringData:
|
||
# TELEGRAM_BOT_TOKEN: "<token-from-botfather>"
|