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

  1. Gitea → Einstellungen → Anwendungen → Zugriffstoken (write:package)
  2. 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
S
Description
No description provided
Readme
103 KiB
Languages
Python 62.1%
JavaScript 12.8%
HTML 10.5%
CSS 8.6%
Shell 4.6%
Other 1.4%