← Zurück zur Startseite

Technisches Systemprotokoll & Entwicklungsdokumentation

Projekt: Archivarius – Self-hosted Collection Management System

Dokumententyp: Technisches Architektur- & Meilenstein-Protokoll (Stand: Meilenstein 5 in Arbeit)

Zielhardware: Raspberry Pi 5 Model B Rev 1.1 (Anwendung) + Raspberry Pi 4 (4GB, Reverse-Proxy/Pi-hole)

Laufzeitumgebung: Docker Engine & Docker Compose, Caddy als Reverse Proxy mit DuckDNS/Let's-Encrypt-Zertifikat (DNS-01, ohne offene Router-Ports)

Dokumentationsstand (PHP Live): 19.10.2026 - 14:30 Uhr

API-Status: ONLINE

Datenbank-Status: OK

1. Ursprüngliche Vision & Zielbild

Archivarius ist als lokal betriebenes, self-hosted Collection Management System (CMS) konzipiert, das die Erfassung, Katalogisierung, Suche und Organisation einer privaten Medien-Sammlung (Blu-rays, DVDs, VHS, Audio-CDs, Hörspiele, Bücher, Mangas, Comics u.a.) automatisiert und strukturiert.

1.1 Kernphilosophie

1.2 Funktionsumfang (Stand aktuell)

BereichFunktionStatus
DatenmodellWork/Item-Trennung, Many-to-Many Autoren, hierarchische StandorteFERTIG
Metadaten-ErfassungBarcode/ISBN-Lookup gegen Open Library & Discogs, manuelle Titelsuche gegen OMDb für FilmeFERTIG
StandorteBeliebig tiefe Verschachtelung mit rekursiver SucheFERTIG
AusfallsicherheitEnrichment-Cronjob trägt Metadaten nach, falls externe Dienste beim Scannen nicht erreichbar warenFERTIG
Web-OberflächeFormular zum Anlegen (Kamera-Scan, Foto-Upload) + durchsuchbares Sammlungs-DashboardIN ARBEIT
Externer ZugriffHTTPS über Caddy/DuckDNS, auch von außerhalb des HeimnetzesFERTIG
KI & ObjekterkennungKamerabasierte Erfassung/Identifikation von Sammlerstücken (OCR-gestützte Titelsuche)GEPLANT

2. Systemarchitektur & Laufzeitumgebung

Das System wird über Docker Compose orchestriert und läuft hinter einem Reverse Proxy für sicheren externen Zugriff.

2.1 Container-Setup

Container-Name Basis-Image Rolle
archivarius-postgres postgres:16-alpine Primäre Datenhaltung (nur lokal erreichbar, kein externer Zugriff).
archivarius-api python:3.12-slim FastAPI-Backend (Uvicorn, SQLAlchemy 2.0 Async, Alembic) UND serverseitig gerenderte Web-Oberfläche (Jinja2) im selben Prozess.

Externer Zugriff läuft über einen bestehenden Caddy-Reverse-Proxy (separates Gerät im Netzwerk), der per DuckDNS-DNS-01-Challenge ein echtes, browser-vertrauenswürdiges Let's-Encrypt-Zertifikat bezieht – ganz ohne offene Portweiterleitung am Router für die Anwendung selbst.

2.2 Tech-Stack

Python 3.12 FastAPI SQLAlchemy 2.0 (Async) PostgreSQL 16 Alembic Pydantic v2 Jinja2 html5-qrcode httpx Docker Compose Caddy / DuckDNS

2.3 Verzeichnisstruktur (Ausschnitt)

backend/
├── app/
│   ├── api/v1/endpoints/  # REST-Endpunkte (items, works, locations, lookup, omdb, ...)
│   ├── models/            # SQLAlchemy ORM-Modelle
│   ├── repositories/      # Data-Access-Layer mit Eager-Loading-Strategien
│   ├── schemas/           # Pydantic-Schemas (DTOs)
│   ├── templates/         # Jinja2-Seiten der Web-Oberflaeche
│   ├── static/             # Eigenes CSS/JS der Web-Oberflaeche
│   └── web/                # Routen der Web-Oberflaeche (getrennt von der REST-API)
├── services/              # Externe Metadaten-Provider (Open Library, Discogs, OMDb)
└── scripts/               # Enrichment-Cronjob

3. Web-Oberfläche (Meilenstein 5, in Arbeit)

Bewusste Architekturentscheidung: serverseitig gerenderte Seiten direkt über FastAPI/Jinja2, statt eines separaten JavaScript-Frontend-Projekts mit eigenem Build-Prozess – geringere Komplexität, eine einzige Codebasis.

3.1 "Neues Item anlegen"

3.2 Sammlungs-Dashboard

4. Barcode- & Metadaten-Erkennung

GET /api/v1/lookup/{barcode} prüft: eigener Bestand → Open Library (Bücher) → Discogs (Musik/Hörspiele). Antwort-Status: local · open_library · discogs · not_found · provider_unavailable.

Für Filme/Serien ergänzt GET /api/v1/omdb/search?title=... eine manuelle, titelbasierte Suche gegen die OMDb API – Barcode-basierte Filmdatenbanken existieren aktuell schlicht nicht zuverlässig als kostenloser Dienst (selbst TMDb pflegt keine Barcode-Daten).

Sind beim Scannen keine externen Dienste erreichbar, wird das Item trotzdem ohne Blockade angelegt; ein nächtlicher Cronjob trägt Metadaten automatisch nach, sobald die Dienste wieder erreichbar sind.

5. Qualitätssicherung

Automatisierte Test-Suite (isolierte SQLite-Testdatenbank) plus systematische manuelle End-to-End-Verifikation aller Entitäten gegen den laufenden Docker-Container – inklusive Fehlerfällen, Zeichenkodierung bei internationalen Metadaten und produktionsnahem Verhalten unter Docker Compose. Mehrere zuvor unentdeckte Inkonsistenzen zwischen Modellen, Schemas und Repositories (v.a. bei asynchronem Eager-Loading verschachtelter Beziehungen) wurden im Zuge dessen identifiziert und behoben.

6. Roadmap & Nächste Schritte

MeilensteinInhaltStatus
4Barcode-Lookup, Autoren-Modell, rekursive Standort-SucheABGESCHLOSSEN
5Web-Oberfläche: Item-Anlage, Dashboard, Mehrfach-Fotos, Detail-Ansicht, Dark ModeIN ARBEIT
6Security Hardening (Auth/JWT, Rate Limiting), finale Test-Coverage, Release 1.0GEPLANT

Status-Hinweis: Backend und Datenbank sind erreichbar und melden einen gesunden Zustand.