kirche-einfach/CHANGELOG.md
Jonas Miederer 0b03399c1a
Some checks failed
/ test (push) Has been cancelled
/ build (push) Has been cancelled
/ validate (push) Has been cancelled
chore: LLM provider env for Langflow, persistent sessions, Fernet key doc
2026-09-27 09:14:57 +02:00

82 lines
4.7 KiB
Markdown

# Changelog
All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
### Added
- Flow-Sync ist jetzt ein manueller Full-Pass: `POST /api/flows/sync`
(Button "Aus Langflow synchronisieren" in der Verwaltung) holt erst alle
Flows aus Langflow nach `backend/flows/*.json` und deployed sie danach
automatisch (Report mit `pulled`-Liste). Der Hintergrund-Beobachter und der
Startup-Sync bleiben dateibasiert. Die Verwaltung zeigt eine deutsche
Schritt-Anleitung direkt beim Sync-Button.
- LLM-Provider-Umgebung für Langflow: `OPENAI_API_KEY` + `OPENAI_BASE_URL`
in `.env` (OpenAI-kompatible Endpoints) erzeugen automatisch
restart-feste Global Variables in Langflow; LFX liest dieselben Werte.
- Langflow-Sitzungen halten länger: `LANGFLOW_REFRESH_TOKEN_EXPIRE_SECONDS`
(Default weiter 7 Tage, Dev-Beispiel 90) + stabile JWT-Signatur via
`LANGFLOW_SECRET_KEY` — kein Re-Login nach Container-Restarts.
### Fixed
- Flow-Sync aus Langflow: neue Flows blieben unsichtbar, weil LFX-Uploads
mit `Permission denied` scheiterten (named Volume root-owned, LFX läuft
rootless). `lfx-entrypoint.sh` chownt `/flows` per gosu vor dem Start;
zusätzlich Pull-Dedup (wiederverwendet gleichnamige/identische Dateien
statt Bindestrich-Duplikate wie `simple-rule.json`, die jede Sync-Meldung
mit Namenskonflikten füllten).
- Sync-Dateinamen behalten die Langflow-Namen (`test_flow.json` statt
`test-flow.json`; nur dateisystem-reservierte Zeichen werden ersetzt).
- Gezogene Flow-Dateien sind world-readable (0o644): `mkstemp` erzeugte
0o600-Dateien, die Langflow beim Start abstürzen ließen
(`Permission denied` in `/app/flows`, Crash-Loop) und der API Fehler
(`unreadable`) verursachten.
- `LANGFLOW_SECRET_KEY` muss ein gültiger Fernet-Key sein (44 Zeichen,
urlsafe-base64): ein Hex-String brach die Variablen-Verschlüsselung mit
`Fernet key must be 32 url-safe base64-encoded bytes` (500 beim Anlegen
von Global Variables — Provider-Keys ließen sich nicht speichern).
`.env.example` dokumentiert die Erzeugung.
- LFX runtime user gets a home directory (`useradd -m`, `HOME` set):
without one every flow run failed with "Settings service not found".
### Security
- Production ops: `scripts/check_prod.py` validates `.env` secrets and
modes before deploy (with tests); README production checklist
(proxy gates for Langflow, secret rotation, upgrade runbook).
### Security
- API authorization: flow management is admin-only, runs and run/approval
reads require login with strict session-tenant scoping, approval
decisions record the session user, and flow callbacks authenticate with
a shared `X-Callback-Token` (`CALLBACK_TOKEN`). Request-controlled
`tenant_id`, `callback_base_url` and `continuation_flow_id` were
removed (SSRF / cross-tenant / flow-chaining hardening);
continuations now resolve from the admin-authored definition.
- Frontend: `/app/*` routes require login; approver is the session user.
- Edge hardening: interactive API docs only with debug, security headers
(nosniff/frame/Referrer-Policy), 2 MiB body cap, per-IP run throttle,
generic upstream-error responses, magic links never logged.
- Containers run rootless (api/vite as uid 1000, lfx as `lfx` user);
frontend fails closed to preview mode unless `FRONTEND_MODE=dev`.
### Added
- Landing page: status-quo problem block, 5-step process with quote,
portal overview with admin areas, AI platform parts, exception tiers,
quantified benefits, integrations, use-case examples, pilot-program
section, expanded FAQ (8 items incl. KI data usage, price model,
responsibility).
### Changed
- Landing page copy overhauled after 3 reviewer rounds (church-admin
compliance wording: "entwickelt nach DSG-EKD/DSGVO" + AVV/TOMs,
human release responsibility, honest pilot framing instead of
invented testimonials; CTA now "Pilotgespräch vereinbaren").
- New photo `pilot-meeting.webp` (consultation scene, self-hosted).
- Backend lint + format standards via ruff (pinned dev dependency,
enforced in CI): `uv run ruff check .`, `uv run ruff format`.
## [0.1.0] - 2026-09-13
### Added
- Repo scaffold: docker-compose dev/prod, version-pinned images, devcontainer.
- Magic-link auth, access requests, RBAC, frontend access-management UI.
- File-based flow source of truth + sync engine + LFX runtime.
- RJSF dynamic forms, router, Mantine dark-mode design system.
- Conversion landing page, automated screenshots, bell-tower favicon.
- Email-first login, branded multipart HTML magic-link mails.
- lfx level-4 validation on all canonical flows + regression test.