Infrastructure as Code — docker-compose Stacks, Configs, Architektur-Docs und ADRs für die Electric Horses / Richter & Zech Hetzner-Cloud-Infrastruktur.
Find a file
Benjamin Weinlich 09925f7eda docs(adr): add ADR-0007 on OIDC avatar data-URL gotcha
When a new user logs in via Authentik OIDC for the first time,
Forgejo tries to fetch the 'picture' claim as an avatar — but
Authentik delivers a 'data:image/svg+xml;base64,...' URL that
Forgejo can't store. Result: DB has an avatar hash but no file,
so /avatars/<hash> returns 404, the <img> is in broken state,
and the activity page's canvas renderer crashes with
'drawImage on broken state'.

Fix (per user, after first login):
  UPDATE "user" SET avatar = '', use_custom_avatar = false
  WHERE lower_name = '<name>';

Triggers Forgejo's default identicon generation, which works.

This commit:
- Adds ADR-0007 with full root cause + three rejected alternatives
- Updates docs/adr/README.md index
- Extends stacks/forgejo/Agent.md 'Known Gotchas' with the fix
- Appends the fix to docs/runbooks/forgejo-admin-recovery.md

Applied for user 'bw' already on 2026-04-12.

Refs OP#1119
2026-04-12 04:47:25 +02:00
docs docs(adr): add ADR-0007 on OIDC avatar data-URL gotcha 2026-04-12 04:47:25 +02:00
stacks docs(adr): add ADR-0007 on OIDC avatar data-URL gotcha 2026-04-12 04:47:25 +02:00
.gitignore chore(repo): initialize infrastructure-as-code repository 2026-04-11 22:19:10 +02:00
Agent.md chore(agent): update briefings to reflect M7.3 doc mirror 2026-04-11 22:26:24 +02:00
README.md chore(repo): initialize infrastructure-as-code repository 2026-04-11 22:19:10 +02:00

electric-horses-infra

Infrastructure as Code für Electric Horses / Richter & Zech.

Dieses Repository enthält die versionierten Docker-Compose-Stacks, Reverse-Proxy-Configs, Architektur-Dokumentation und Architecture Decision Records (ADRs) für unsere Hetzner-Cloud-Infrastruktur.

Was lebt hier?

electric-horses-infra/
├── Agent.md                   # AI-Briefing für jede Session
├── README.md                  # diese Datei
├── .gitignore                 # was NICHT commitet wird
│
├── stacks/                    # Docker-Compose Stacks (1:1 was auf den Servern läuft)
│   ├── forgejo/               # code.sdda.eu — dieses Git-Hosting
│   └── eh-search/             # electric-horses.de Site-Search
│
└── docs/                      # Dokumentation
    └── architecture/          # Topologie-Snapshots, Stack-Inventories

Konvention: Jeder Stack-Ordner spiegelt den Stack auf dem tatsächlichen Server — aber ohne Secrets. Die .env mit echten Werten lebt auf dem Server (mode 600), hier ist nur die .env.example als Template.

Was gehört hier REIN

  • docker-compose.yml Dateien
  • Dockerfiles
  • Nginx-Configs
  • Python / Shell Scripts die Teil der Infra sind
  • SQL-Migrationen / Schema-Dumps (nicht Datenbank-Inhalte!)
  • .env.example mit Platzhaltern
  • Markdown-Dokumentation, Diagramme (Mermaid), ADRs, Runbooks

Was gehört hier NICHT REIN

  • Niemals echte .env Dateien, Passwörter, API-Keys, Zertifikate
  • Runtime-Daten (Datenbank-Inhalte, Git-Repos im Git-Repo, uploaded files)
  • Build-Artefakte (node_modules/, dist/, __pycache__/)
  • Logs
  • Backup-Dumps mit Nutzerdaten (DSGVO)

Wenn du unsicher bist: Lass es lieber raus. Es ist einfacher eine fehlende Datei nachzureichen als ein Secret aus der Git-History zu entfernen.

Mitarbeit

Du als Human: Du schreibst Wünsche und Feedback in Claude-Code / OpenProject, reviewst Commits im Web-UI (code.sdda.eu).

Die AI: Liest Agent.md am Sessionstart, macht Änderungen in bestehenden Stacks, committet mit Referenzen auf OpenProject-Work-Packages (Refs OP#1234).

OpenProject Referenz