Add the container image and compose file

Gunicorn runs one worker with threads, because the job threads run
inside it. The compose file mounts only CWA's ingest folder and the
config folder.
This commit is contained in:
tim
2026-09-27 23:38:28 +02:00
parent 2f4271314b
commit 7c61bbd1e4
3 changed files with 76 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
services:
bindery:
build: .
image: bindery:latest
# The user and group that own ./config and can write CWA's ingest folder. Usually the same as CWA's.
user: "1000:1000"
environment:
# The address of CWA, as the Bindery container reaches it, and the CWA account that Bindery uses.
CWA_URL: http://calibre-web-automated:8083
CWA_USERNAME: bindery
CWA_PASSWORD: change-me
# none, cwa (log in with a CWA user) or proxy (a reverse proxy sets a user header)
AUTH_METHOD: cwa
# Optional and independent. app.db is for logins, metadata.db is for book IDs.
# CWA_DB_PATH: /cwa-config/app.db
# CALIBRE_DB_PATH: /calibre-library/metadata.db
# URL_BASE: /bindery
# true only if clients reach Bindery through a reverse proxy alone. The login lockout then uses X-Forwarded-For.
# TRUST_PROXY: "true"
# BINDERY_API_KEY: a-long-random-string
ports:
- 8085:8085
restart: unless-stopped
# /api/health needs no login, and works with and without URL_BASE.
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8085/api/health', timeout=5)"]
interval: 60s
timeout: 10s
start_period: 30s
retries: 3
volumes:
# CWA's ingest folder. New stories and updates go here.
- /path/to/cwa/ingest:/cwa-book-ingest
# The story database and personal.ini. Create the folder before the first start.
- ./config:/config
# Optional read-only folders. Include SQLite journal files beside each database.
# Mount the library that receives the ingest files, not a copy or another library.
# - /path/to/cwa/config:/cwa-config:ro
# - /path/to/calibre/library:/calibre-library:ro