# eBook Library (Go + templ) Minimalistische eBook-Bibliothek für den Tolino-Webbrowser. ## Features (MVP) - Listet EPUB/PDF-Dateien aus `books/` - Detailseite pro Buch - Download-Link pro Buch (für Tolino) - Schlichtes, kontrastreiches UI ohne JavaScript-Abhängigkeit - Login-Pflicht (Session-Cookie, 30 Tage) - Optionaler Buch-Upload für berechtigte Benutzer ## Voraussetzungen - Go 1.22+ - [templ](https://github.com/a-h/templ) Templ CLI installieren: ```bash go install github.com/a-h/templ/cmd/templ@latest ``` ## Start 1. Abhängigkeiten laden: ```bash go mod tidy ``` 2. Templates generieren: ```bash templ generate ``` 3. Ersten Benutzer anlegen: ```bash go run ./cmd/admin user add # mit Upload-Recht: go run ./cmd/admin user add --upload ``` 4. Server starten: ```bash go run ./cmd/server ``` 5. Browser öffnen: - `http://localhost:8080` ## Bücher hinzufügen Lege deine Dateien in den Ordner `books/`: - `.epub` (bevorzugt) - `.pdf` (optional) Alternativ können Benutzer mit Upload-Recht Bücher direkt im Browser hochladen. ## Benutzerverwaltung (CLI) Rollen (aufsteigend): `reader` → `uploader` → `admin` ```bash go run ./cmd/admin user add [--role reader|uploader|admin] go run ./cmd/admin user list go run ./cmd/admin user delete go run ./cmd/admin user set-role ``` ## Docker / docker-compose Deployment Beispiel `docker-compose.yml`: ```yaml version: '3' networks: web: external: true services: app: image: git.arnef.de/arnef/ebooks:latest restart: always networks: - web volumes: - ./data:/data - /etc/timezone:/etc/timezone:ro - /etc/localtime:/etc/localtime:ro labels: traefik.enable: 'true' traefik.http.routers.ebooks.rule: Host(`books.arnef.de`) traefik.http.routers.ebooks.entrypoints: websecure traefik.http.routers.ebooks.tls.certresolver: letsencrypt traefik.http.services.ebooks.loadbalancer.server.port: 8080 ``` Der Container läuft als nicht-root Benutzer `ebooks` (UID `100`, GID `101`). `BOOKS_DIR` (`/data/books`) und `USERS_DB` (`/data/users.db`) liegen im Volume `./data`. Der Server legt `BOOKS_DIR` beim Start automatisch an, falls es fehlt — gehört das Host-Verzeichnis `./data` aber nicht dem passenden UID/GID, schlägt das Anlegen fehl bzw. `users.db` kann nicht geöffnet werden (`unable to open database file`) und Uploads schlagen mit "Datei konnte nicht gespeichert werden" fehl. 1. Datenverzeichnis anlegen und Rechte setzen: ```bash mkdir -p data sudo chown -R 100:101 data ``` 2. Container starten: ```bash docker compose up -d ``` 3. Ersten Benutzer über die im Image enthaltene Admin-CLI anlegen (der Server muss dafür nicht gestoppt werden, `--role admin` empfohlen für den ersten Account): ```bash docker compose exec app /app/admin user add --role admin docker compose exec app /app/admin user list ``` `USERS_DB` ist im Image bereits auf `/data/users.db` gesetzt, daher ist kein zusätzlicher Parameter nötig. ## Konfiguration Umgebungsvariablen: | Variable | Standard | Beschreibung | |------------|------------|---------------------------------| | `ADDR` | `:8080` | Listen-Adresse des Servers | | `BOOKS_DIR`| `books` | Verzeichnis mit Büchern | | `USERS_DB` | `users.db` | Pfad zur SQLite-Benutzerdatenbank |