Reviewed-on: #1
Epub-Converter
Kleine Web-App für den privaten Gebrauch: Upload → Konvertierung → EPUB-Download.
Unterstützte Eingaben: PDF, Markdown (.md), TXT, HTML, DOCX.
Stack: FastAPI + Pandoc (+ PyMuPDF für PDF). Läuft als Docker-Container; CI/CD deployt nach Unraid.
Lokal starten
docker compose up --build
Dann im Browser: http://127.0.0.1:8000
Ohne Docker (Dev):
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
# System: pandoc muss installiert sein
uvicorn app.main:app --host 127.0.0.1 --port 8000
Health-Check: GET /api/health
Optionen im UI
- Metadaten: Titel, Autor, Sprache
- Bilder einbetten, max. Bildbreite, JPEG-Qualität
- Fonts (.ttf / .otf / .woff) und Cover-Bild
- Inhaltsverzeichnis, Kapitel-Split (h1/h2), CSS-Preset „Leserlich“
- KI (PDF): optionale OpenRouter-Nachbereitung (Absätze/Überschriften), danach HTML-Vorschau und EPUB-Download
Gescannte PDFs ohne Textlayer werden in v1 nicht unterstützt (kein OCR). Upload-Limit: 80 MB.
OpenRouter (optional)
In der Unraid-.env bzw. lokal in der Compose-Umgebung:
OPENROUTER_API_KEY=sk-or-...
OPENROUTER_MODEL=google/gemini-2.5-flash
Ohne Key bleibt die Konvertierung wie bisher; die LLM-Checkbox ist deaktiviert, bis /api/health openrouter_configured: true meldet.
Deployment auf Unraid (Gitea CI/CD)
Angelehnt an das Muster von pkv-beihilfe-tool (ohne Datenbank).
| Komponente | Wert |
|---|---|
| Gitea | https://gitea.elpatron.me |
| Repository | elpatron/epub-converter |
| Image | gitea.elpatron.me/elpatron/epub-converter |
| Runner | Gitea-Runner auf Unraid (Label unraid) |
| Appdata | /mnt/user/appdata/epub-converter |
| Port | 8088 (Host) → 8000 (Container) |
Ablauf
Push auf main → Gitea Actions (ubuntu-latest)
→ Docker-Image bauen & in Gitea Container Registry pushen
→ Job auf Label unraid: compose pull + up
Workflow: .gitea/workflows/deploy-unraid.yml
Einmalige Einrichtung
1. Gitea Actions aktivieren — Repository → Einstellungen → Aktionen.
2. Container-Registry / Packages — Site-Administration und Repo-Pakete erlauben.
3. Secret REGISTRY_TOKEN
- Gitea → Einstellungen → Anwendungen → Zugriffstoken (
write:package) - Repository → Actions → Secrets →
REGISTRY_TOKEN
4. Appdata auf Unraid
# Repo einmalig nach Appdata klonen oder Dateien kopieren, dann:
bash /mnt/user/appdata/epub-converter/repo/scripts/setup-unraid-appdata.sh \
/mnt/user/appdata/epub-converter/repo
Oder manuell:
mkdir -p /mnt/user/appdata/epub-converter
cp docker-compose.unraid.yml /mnt/user/appdata/epub-converter/docker-compose.yml
cp scripts/deploy-unraid.sh /mnt/user/appdata/epub-converter/deploy.sh
cp .env.unraid.example /mnt/user/appdata/epub-converter/.env
chmod 600 /mnt/user/appdata/epub-converter/.env
chmod 755 /mnt/user/appdata/epub-converter/deploy.sh
5. Erster Push auf main oder Workflow manuell starten.
Der Runner-Label unraid:docker://docker:28.1-cli ist bereits über das PKV-Projekt eingerichtet.
Manuelles Deploy
export APP_IMAGE=gitea.elpatron.me/elpatron/epub-converter:latest
/mnt/user/appdata/epub-converter/deploy.sh
Dateien
| Datei | Zweck |
|---|---|
Dockerfile |
App-Image (Python + Pandoc) |
docker-compose.yml |
Lokaler Stack |
docker-compose.unraid.yml |
Produktions-Compose |
scripts/setup-unraid-appdata.sh |
Ersteinrichtung Appdata |
scripts/deploy-unraid.sh |
Pull + Neustart |
.gitea/workflows/deploy-unraid.yml |
CI/CD |
.env.unraid.example |
Beispiel-.env |
Kein öffentlicher Port / Funnel — Zugriff nur intern (LAN / Tailscale).
Remote
https://gitea.elpatron.me/elpatron/epub-converter.git