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 |
||
|---|---|---|
| docs | ||
| stacks | ||
| .gitignore | ||
| Agent.md | ||
| README.md | ||
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.ymlDateienDockerfiles- Nginx-Configs
- Python / Shell Scripts die Teil der Infra sind
- SQL-Migrationen / Schema-Dumps (nicht Datenbank-Inhalte!)
.env.examplemit Platzhaltern- Markdown-Dokumentation, Diagramme (Mermaid), ADRs, Runbooks
Was gehört hier NICHT REIN
- Niemals echte
.envDateien, 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
- Parent-Phase: M7 Operations & Documentation Foundation (#1118)
- Repo-Setup: M7.2 (dieser Commit)
- Nachschauen: https://openproject.sdda.eu/projects/www-dot-electric-horses-dot-de-relaunch/