epub2pdf: title-based export names, .pdf download headers, security hardening (68 tests green)

This commit is contained in:
BMad Master
2026-08-30 09:03:39 -04:00
commit 5580004aeb
22 changed files with 2351 additions and 0 deletions
+31
View File
@@ -0,0 +1,31 @@
# Deployment — Coolify
## Requirements
- A Coolify server (any host with Docker) and a git repository containing this project.
## Steps
1. **Coolify → Projects → Add Service → Dockerfile** (Git repository source).
2. Point it at this repo; Coolify detects the `Dockerfile` at the project root.
3. **Port:** publish container port `8030` (or set env `PORT` and publish that).
4. **Environment variables:** none required — sensible defaults are baked in:
- `PORT=8030`, `DATA_DIR=/app/data`.
5. **Persistence:** add a volume for path `/app/data` (Docker volume or S3/object
storage) so uploaded EPUBs and generated PDFs survive deploys/restarts.
6. **Healthcheck** (Coolify settings): `GET /health`, expect HTTP 200.
7. **Domain/HTTPS:** optional — attach a domain and Coolify's Traefik letsencrypt
will handle TLS. The app itself is plain HTTP and sends no cookies, so it
needs no special proxy config. Large uploads (up to 400 MB) work through the
default proxy; if you see timeouts on very large files, raise the Traefik
`proxy send timeout` for this service.
## Notes / gotchas
- **Single worker by design.** The job registry (`JOBS`) is in-memory; the
Dockerfile runs gunicorn with `--workers 1 --threads 8`. Do not scale to
multiple container instances unless you replace the in-memory registry with
a shared store — polling `/api/jobs/<id>` would 404 on other instances.
- WeasyPrint renders in-process, so CPU-heavy conversions occupy worker
threads; `--timeout 1200` keeps long books from being killed by gunicorn.
- CJK fonts (`fonts-noto-cjk`) are installed in the image, so Chinese/Japanese
/Korean books render correctly.
- CLI mode also works inside the container for one-shots:
`docker exec <container> python app