diff --git a/.env.example b/.env.example index 91d8f38..965f537 100644 --- a/.env.example +++ b/.env.example @@ -52,6 +52,11 @@ PORTAINER_ENV_ID= # Root directory exposed in the FileBrowser web UI FILEBROWSER_PATH=/mnt/data +# Calibre-Web +# Used by the Homepage dashboard widget +CALIBREWEB_USERNAME=admin +CALIBREWEB_PASSWORD= + # Media and sync paths (change when external HDD is mounted) MEDIA_PATH=/mnt/media # Jellyfin media library root (mounted read-only) SYNC_PATH=/mnt/sync # Syncthing data directory diff --git a/.light/sessions/2026-04-19-add-calibre-web-execution.md b/.light/sessions/2026-04-19-add-calibre-web-execution.md new file mode 100644 index 0000000..fd071a2 --- /dev/null +++ b/.light/sessions/2026-04-19-add-calibre-web-execution.md @@ -0,0 +1,14 @@ +# Execution Log — add-calibre-web — 2026-04-19 + +[DISPATCHED] phase-1-docker-compose — agent type: no-test, mode: sync +[GATE PASS] phase-1-docker-compose — GREEN gate passed +[CLOSED] phase-1-docker-compose +[DISPATCHED] phase-2-services-yaml — agent type: no-test, mode: sync +[GATE PASS] phase-2-services-yaml — GREEN gate passed +[CLOSED] phase-2-services-yaml +[DISPATCHED] phase-3-env-example — agent type: no-test, mode: sync +[GATE PASS] phase-3-env-example — GREEN gate passed +[CLOSED] phase-3-env-example +[DISPATCHED] phase-4-lint-validation — agent type: no-test, mode: sync +[GATE PASS] phase-4-lint-validation — GREEN gate passed +[CLOSED] phase-4-lint-validation diff --git a/.light/sessions/2026-04-19-add-calibre-web.manifest.json b/.light/sessions/2026-04-19-add-calibre-web.manifest.json new file mode 100644 index 0000000..cdd2040 --- /dev/null +++ b/.light/sessions/2026-04-19-add-calibre-web.manifest.json @@ -0,0 +1,20 @@ +{ + "session": "2026-04-19-add-calibre-web", + "date": "2026-04-19", + "topic": "add-calibre-web", + "workflow_steps": ["research", "plan", "implement"], + "files_created": [], + "files_modified": [ + "docker-compose.yml", + "homepage/config/services.yaml", + ".env.example" + ], + "gates": { + "red": 0, + "green": 4, + "validate": 0 + }, + "phases_completed": 4, + "total_phases": 4, + "test_suite_passed": true +} diff --git a/.light/sessions/2026-04-19-add-calibre-web.md b/.light/sessions/2026-04-19-add-calibre-web.md new file mode 100644 index 0000000..d83b4ba --- /dev/null +++ b/.light/sessions/2026-04-19-add-calibre-web.md @@ -0,0 +1,59 @@ +# Session Artifact — Add Calibre-Web — 2026-04-19 + +## Research Summary + +Researched codebase patterns for adding a new service. Key findings: + +- Services follow a standard skeleton with `container_name`, `image`, `environment`, `volumes`, `networks`, `labels`, `restart` +- Read-only mounts use `:ro` (confirmed from Jellyfin pattern) — critical to prevent `metadata.db` corruption when desktop Calibre and Calibre-Web run concurrently +- Homepage env vars use `${VAR:-}` empty-default pattern (no fallback value for credentials) +- Widget internal URL uses container name (`http://calibre-web:8083`), not host IP — all services share the `proxy` bridge network +- New "Books" group inserts between Media and Files groups in `services.yaml` + +## Plan Summary + +**Goal:** Add `calibre-web` Docker service behind Traefik, wire into Homepage dashboard with Books group, document env vars. + +**Phases:** + +1. Add `calibre-web` service + homepage env vars to `docker-compose.yml` +2. Add Books group with calibreweb widget to `homepage/config/services.yaml` +3. Add `CALIBRE_PATH`, `CALIBREWEB_USERNAME`, `CALIBREWEB_PASSWORD` to `.env.example` +4. Lint validation via `./scripts/lint-config.sh` + +**Acceptance criteria (all met):** + +- `calibre-web` service using `lscr.io/linuxserver/calibre-web:latest` +- `/books:ro` mount, `PUID: 1000` / `PGID: 1000` +- Traefik routes `calibre-web.woggles.work` → port 8083 +- `HOMEPAGE_VAR_CALIBREWEB_USERNAME` and `HOMEPAGE_VAR_CALIBREWEB_PASSWORD` in homepage env block +- Books group between Media and Files in `services.yaml` +- Three new vars in `.env.example` with comments +- `./scripts/lint-config.sh` exits 0 + +## Execution Log + +``` +[DISPATCHED] phase-1-docker-compose — agent type: no-test, mode: sync +[GATE PASS] phase-1-docker-compose — GREEN gate passed +[CLOSED] phase-1-docker-compose +[DISPATCHED] phase-2-services-yaml — agent type: no-test, mode: sync +[GATE PASS] phase-2-services-yaml — GREEN gate passed +[CLOSED] phase-2-services-yaml +[DISPATCHED] phase-3-env-example — agent type: no-test, mode: sync +[GATE PASS] phase-3-env-example — GREEN gate passed +[CLOSED] phase-3-env-example +[DISPATCHED] phase-4-lint-validation — agent type: no-test, mode: sync +[GATE PASS] phase-4-lint-validation — GREEN gate passed +[CLOSED] phase-4-lint-validation +``` + +## Outcome + +All 4 phases passed. `./scripts/lint-config.sh` exits 0 — 8 homepage config var checks and 13 docker-compose env var checks all green. No remediations required. + +**Files modified:** + +- `docker-compose.yml` — calibre-web service + homepage env vars +- `homepage/config/services.yaml` — Books group with calibreweb widget +- `.env.example` — CALIBRE_PATH, CALIBREWEB_USERNAME, CALIBREWEB_PASSWORD diff --git a/.light/sessions/add-calibre-web-plan.md b/.light/sessions/add-calibre-web-plan.md new file mode 100644 index 0000000..edd11a5 --- /dev/null +++ b/.light/sessions/add-calibre-web-plan.md @@ -0,0 +1,222 @@ +# Plan: Add Calibre-Web Ebook Service + +**tracker:** yaks + +--- + +## Context + +Issue #19 requests Calibre-Web as a browser-based frontend for an existing Calibre ebook library synced to the server via Syncthing. The library mount must be **read-only** to prevent `metadata.db` corruption when desktop Calibre and Calibre-Web run concurrently. Research confirmed all patterns against the codebase — no ambiguity. + +--- + +## Goal + +Add a `calibre-web` Docker service behind Traefik, wire it into the Homepage dashboard with a Books group, and document the three new env vars in `.env.example`. + +--- + +## Acceptance Criteria + +- [ ] `calibre-web` service defined in `docker-compose.yml` using `lscr.io/linuxserver/calibre-web:latest` +- [ ] `/books` mount has `:ro` flag; `PUID: 1000` / `PGID: 1000` set +- [ ] Traefik labels route `calibre-web.woggles.work` → port 8083 +- [ ] `HOMEPAGE_VAR_CALIBREWEB_USERNAME` and `HOMEPAGE_VAR_CALIBREWEB_PASSWORD` in homepage env block +- [ ] Books group inserted between Media and Files groups in `services.yaml` +- [ ] `CALIBRE_PATH`, `CALIBREWEB_USERNAME`, `CALIBREWEB_PASSWORD` added to `.env.example` with comments +- [ ] `./scripts/lint-config.sh` exits 0 + +--- + +## Files to Modify + +| File | Change | +| ------------------------------- | --------------------------------------------- | +| `docker-compose.yml` | Add `calibre-web` service + homepage env vars | +| `homepage/config/services.yaml` | Add Books group between Media and Files | +| `.env.example` | Add three new vars with comments | + +--- + +## Implementation Phases + +### Phase 1 — docker-compose.yml changes + +**Goal:** Add the calibre-web service and homepage env vars. + +**Tasks:** + +- Add `calibre-web` service block after existing services (before the `networks:` section) +- Append `HOMEPAGE_VAR_CALIBREWEB_USERNAME` and `HOMEPAGE_VAR_CALIBREWEB_PASSWORD` to the homepage service `environment:` block + +**Verification:** + +- `/books:ro` present in volumes +- `PUID: 1000` / `PGID: 1000` in environment +- `networks: [proxy]` present +- Traefik labels use `calibre-web.woggles.work` and port `8083` +- Homepage env block contains both new `HOMEPAGE_VAR_*` entries + +#### Agent Context + +``` +Files to modify: + - docker-compose.yml + +Changes: + 1. Add calibre-web service: + calibre-web: + container_name: calibre-web + image: lscr.io/linuxserver/calibre-web:latest + environment: + PUID: 1000 + PGID: 1000 + TZ: ${TZ:-America/New_York} + volumes: + - ./calibre-web/config:/config + - ${CALIBRE_PATH:-/mnt/calibre}:/books:ro + networks: + - proxy + labels: + - "traefik.enable=true" + - "traefik.http.routers.calibre-web.rule=Host(`calibre-web.woggles.work`)" + - "traefik.http.routers.calibre-web.entrypoints=websecure" + - "traefik.http.routers.calibre-web.tls.certresolver=cloudflare" + - "traefik.http.services.calibre-web.loadbalancer.server.port=8083" + restart: unless-stopped + + 2. In the homepage service environment block, append: + - HOMEPAGE_VAR_CALIBREWEB_USERNAME=${CALIBREWEB_USERNAME:-} + - HOMEPAGE_VAR_CALIBREWEB_PASSWORD=${CALIBREWEB_PASSWORD:-} + +Test command: docker compose config --quiet && echo "compose valid" +RED gate: N/A (no-test phase) +GREEN gate: docker compose config exits 0 +Constraints: mount must use :ro; widget URL must use container name not host IP +``` + +--- + +### Phase 2 — homepage/config/services.yaml Books group + +**Goal:** Add Books group with Calibre-Web widget between Media and Files groups. + +**Tasks:** + +- Insert Books group with calibreweb widget between the Media and Files groups + +**Verification:** + +- Group order: Network → Infrastructure → Media → Books → Files → Reading +- Widget uses `http://calibre-web:8083` (container name) +- `fields` includes `["books", "authors", "categories", "series"]` +- `{{HOMEPAGE_VAR_CALIBREWEB_USERNAME}}` / `{{HOMEPAGE_VAR_CALIBREWEB_PASSWORD}}` template vars used + +#### Agent Context + +``` +Files to modify: + - homepage/config/services.yaml + +Change: + Insert between Media group and Files group: + - Books: + - Calibre-Web: + href: https://calibre-web.woggles.work + description: Ebook library + icon: calibre-web + widget: + type: calibreweb + url: http://calibre-web:8083 + username: "{{HOMEPAGE_VAR_CALIBREWEB_USERNAME}}" + password: "{{HOMEPAGE_VAR_CALIBREWEB_PASSWORD}}" + fields: ["books", "authors", "categories", "series"] + +Test command: docker compose config --quiet && echo "compose valid" +RED gate: N/A (no-test phase) +GREEN gate: docker compose config exits 0 +Constraints: widget URL must use container name (http://calibre-web:8083), not host IP +``` + +--- + +### Phase 3 — .env.example documentation + +**Goal:** Document the three new env vars with explanatory comments. + +**Tasks:** + +- Add Calibre-Web section to `.env.example` after the FileBrowser section (before "Media and sync paths") + +**Verification:** + +- Three vars present: `CALIBRE_PATH`, `CALIBREWEB_USERNAME`, `CALIBREWEB_PASSWORD` +- `CALIBRE_PATH` has multi-line comment explaining Syncthing sync requirement +- `CALIBREWEB_PASSWORD` has empty value (not a default) + +#### Agent Context + +``` +Files to modify: + - .env.example + +Change: + After the FileBrowser section, insert: + # Calibre-Web + # Set CALIBRE_PATH to the Syncthing-synced Calibre library on the server (must contain metadata.db) + CALIBRE_PATH=/mnt/sync/calibre-library + # Used by the Homepage dashboard widget + CALIBREWEB_USERNAME=admin + CALIBREWEB_PASSWORD= + +RED gate: N/A (no-test phase) +GREEN gate: ./scripts/lint-config.sh exits 0 +Constraints: use empty default for CALIBREWEB_PASSWORD (no value); match existing section style +``` + +--- + +### Phase 4 — Lint validation + +**Goal:** Confirm all three files are consistent and lint-config.sh passes. + +**Tasks:** + +- Run `./scripts/lint-config.sh` and verify exit 0 + +**Verification:** + +- All HOMEPAGE*VAR*\* references in services.yaml are wired in docker-compose.yml +- All `${VAR:-}` vars in docker-compose.yml are present in .env.example +- Script exits 0 + +#### Agent Context + +``` +Files to read: + - docker-compose.yml + - homepage/config/services.yaml + - .env.example + +Test command: ./scripts/lint-config.sh +RED gate: N/A (no-test phase) +GREEN gate: ./scripts/lint-config.sh exits 0 +``` + +--- + +## Constraints & Considerations + +- **Read-only mount is critical:** `/books:ro` — omitting this risks metadata.db corruption +- **linuxserver image:** requires `PUID: 1000` / `PGID: 1000` for file permission matching +- **Widget URL uses container name:** `http://calibre-web:8083` — all services share the `proxy` network +- **Homepage env pattern:** `${VAR:-}` empty default (not `${VAR:-somevalue}`) +- **No new networks or volumes sections needed** — proxy network already exists + +--- + +## Out of Scope + +- Calibre-Web initial setup / first-run configuration (done manually after deploy) +- Syncthing configuration for the library sync path +- KOReader sync integration with Calibre-Web diff --git a/.light/sessions/add-calibre-web-research.md b/.light/sessions/add-calibre-web-research.md new file mode 100644 index 0000000..4fab7cc --- /dev/null +++ b/.light/sessions/add-calibre-web-research.md @@ -0,0 +1,203 @@ +# Research: Add Calibre-Web Ebook Service (Issue #19) + +## Feature Summary + +Add Calibre-Web as a new service for browser-based access to an existing Calibre ebook library. The library is synced to the server via Syncthing and mounted **read-only** to prevent `metadata.db` corruption while both the desktop Calibre app and Calibre-Web have concurrent access. + +Files affected: + +- `docker-compose.yml` — new service + homepage env vars +- `.env.example` — three new vars +- `homepage/config/services.yaml` — new "Books" group + +--- + +## Codebase Findings + +### docker-compose.yml patterns + +**Service skeleton (from jellyfin/portainer):** + +```yaml +: + container_name: + image: : + environment: + KEY: ${ENV_VAR:-default} + volumes: + - ./local/path:/container/path + - ${HOST_PATH:-/mnt/fallback}:/mount/point:ro # :ro for read-only + networks: + - proxy + labels: + - "traefik.enable=true" + - "traefik.http.routers..rule=Host(`.woggles.work`)" + - "traefik.http.routers..entrypoints=websecure" + - "traefik.http.routers..tls.certresolver=cloudflare" + - "traefik.http.services..loadbalancer.server.port=" + restart: unless-stopped +``` + +**Jellyfin uses read-only media mount** — same pattern required for Calibre: + +```yaml +- ${MEDIA_PATH:-/mnt/media}:/media:ro +``` + +**Homepage env block (lines ~86-95) — existing pattern:** + +```yaml +environment: + - HOMEPAGE_VAR_PIHOLE_API_KEY=${PIHOLE_API_KEY:-} + - HOMEPAGE_VAR_JELLYFIN_API_KEY=${JELLYFIN_API_KEY:-} + - HOMEPAGE_VAR_TRAEFIK_USERNAME=${TRAEFIK_USERNAME:-} + - HOMEPAGE_VAR_TRAEFIK_PASSWORD=${TRAEFIK_PASSWORD:-} +``` + +New vars append to this block using the same `${VAR:-}` empty-default pattern. + +**Proxy network:** `driver: bridge, name: proxy` — used by all services except pihole. + +--- + +### homepage/config/services.yaml patterns + +**Current group order:** + +1. Network +2. Infrastructure +3. Media +4. Files +5. Reading + +**Insertion point for "Books":** Between Media (group 3) and Files (group 4), per issue spec. + +**Widget with username/password (Traefik — existing pattern):** + +```yaml +widget: + type: traefik + url: https://traefik.woggles.work + username: "{{HOMEPAGE_VAR_TRAEFIK_USERNAME}}" + password: "{{HOMEPAGE_VAR_TRAEFIK_PASSWORD}}" +``` + +**Calibre-Web widget** will follow the same username/password pattern plus a `fields` array — this matches the calibreweb widget type supported by Homepage. + +Internal URL uses container name on proxy network: `http://calibre-web:8083` (not host IP). + +--- + +### .env.example patterns + +Sections separated by blank lines, each with a `# ServiceName` header comment. Multi-line explanatory comments above complex vars. + +**Style to match:** + +```bash +# Calibre-Web +# CALIBRE_PATH: Syncthing-synced library on the server — must contain metadata.db +CALIBRE_PATH=/mnt/sync/calibre-library +# Homepage dashboard credentials +CALIBREWEB_USERNAME=admin +CALIBREWEB_PASSWORD= +``` + +**Insertion point:** After FileBrowser section, before "Media and sync paths" section. + +--- + +## Implementation Plan (from issue #19) + +All details are pre-specified in the issue. No ambiguity detected. + +### 1. `docker-compose.yml` — new service + +```yaml +calibre-web: + container_name: calibre-web + image: lscr.io/linuxserver/calibre-web:latest + environment: + PUID: 1000 + PGID: 1000 + TZ: ${TZ:-America/New_York} + volumes: + - ./calibre-web/config:/config + - ${CALIBRE_PATH:-/mnt/calibre}:/books:ro + networks: + - proxy + labels: + - "traefik.enable=true" + - "traefik.http.routers.calibre-web.rule=Host(`calibre-web.woggles.work`)" + - "traefik.http.routers.calibre-web.entrypoints=websecure" + - "traefik.http.routers.calibre-web.tls.certresolver=cloudflare" + - "traefik.http.services.calibre-web.loadbalancer.server.port=8083" + restart: unless-stopped +``` + +### 2. `docker-compose.yml` — homepage env additions + +```yaml +HOMEPAGE_VAR_CALIBREWEB_USERNAME: ${CALIBREWEB_USERNAME:-} +HOMEPAGE_VAR_CALIBREWEB_PASSWORD: ${CALIBREWEB_PASSWORD:-} +``` + +### 3. `homepage/config/services.yaml` — new Books group + +Insert between Media and Files groups: + +```yaml +- Books: + - Calibre-Web: + href: https://calibre-web.woggles.work + description: Ebook library + icon: calibre-web + widget: + type: calibreweb + url: http://calibre-web:8083 + username: "{{HOMEPAGE_VAR_CALIBREWEB_USERNAME}}" + password: "{{HOMEPAGE_VAR_CALIBREWEB_PASSWORD}}" + fields: ["books", "authors", "categories", "series"] +``` + +### 4. `.env.example` additions + +```bash +# Calibre-Web +# Set CALIBRE_PATH to the Syncthing-synced Calibre library on the server (must contain metadata.db) +CALIBRE_PATH=/mnt/sync/calibre-library +# Used by the Homepage dashboard widget +CALIBREWEB_USERNAME=admin +CALIBREWEB_PASSWORD= +``` + +--- + +## Constraints & Risks + +| Constraint | Detail | +| ---------------------------------------- | ------------------------------------------------------------------------------- | +| **Read-only mount is critical** | `/books:ro` prevents metadata.db corruption when desktop Calibre is also active | +| **linuxserver image needs PUID/PGID** | Must be set to `1000` to match server user permissions | +| **Widget URL uses container name** | `http://calibre-web:8083` — NOT the host IP; services share the proxy network | +| **Homepage env uses `:-` empty default** | `${CALIBREWEB_USERNAME:-}` not `${CALIBREWEB_USERNAME:-somevalue}` | +| **lint-config.sh gate** | Must pass before PR — checks HOMEPAGE*VAR*\* wiring and .env.example coverage | + +--- + +## Open Questions + +None — issue #19 provides a complete, unambiguous implementation recipe. All patterns confirmed against existing codebase. + +--- + +## Validation Checklist (pre-PR) + +1. `./scripts/lint-config.sh` exits 0 +2. `/books` mount has `:ro` flag +3. `PUID: 1000` / `PGID: 1000` in calibre-web environment +4. `networks: [proxy]` present (not host network) +5. `HOMEPAGE_VAR_CALIBREWEB_USERNAME` and `HOMEPAGE_VAR_CALIBREWEB_PASSWORD` in homepage env block +6. All three vars in `.env.example` with explanatory comments +7. Widget URL uses `http://calibre-web:8083` (container name, not host IP) +8. Books group inserted between Media and Files groups diff --git a/README.md b/README.md index 9187e1b..b890e61 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,7 @@ Self-hosted home server stack running on Ubuntu Server (Lenovo ThinkCentre), man | Portainer | https://portainer.woggles.work | Container management | | FileBrowser | https://files.woggles.work | File manager | | KOReader Sync | https://kosync.woggles.work | Reading progress sync | +| Calibre-Web | https://calibre-web.woggles.work | Ebook library | ## Prerequisites @@ -147,7 +148,23 @@ docker compose up -d kosync Then in the KOReader app on each device: **Settings → Progress sync → Custom sync server** → enter `https://kosync.woggles.work` → Register with a username and password. Each device registers once and syncs automatically on open/close. -### 10. Enable remote access via Tailscale +### 10. Set up Calibre-Web + +Calibre-Web reads the Calibre library synced to the server via Syncthing. It mounts the same `SYNC_PATH` directory that Syncthing uses, so no extra path variable is needed. + +In the Syncthing UI, set your Calibre folder path to `/data1/Calibre_Library` (Syncthing's data mount inside the container). Then start the service: + +```bash +docker compose up -d calibre-web +``` + +**First-run setup:** + +1. Open `https://calibre-web.woggles.work` and complete the setup wizard +2. When prompted for the database path, enter `/sync/Calibre_Library` (adjust the subfolder name to match what you used in Syncthing) +3. Create an admin account — use these credentials as `CALIBREWEB_USERNAME` and `CALIBREWEB_PASSWORD` in `.env` (the Homepage widget uses them to show library stats) + +### 11. Enable remote access via Tailscale The setup script installs Tailscale automatically on Linux. To activate it, authenticate with your Tailscale account: diff --git a/docker-compose.yml b/docker-compose.yml index 2c72134..051f1ca 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -92,6 +92,8 @@ services: - HOMEPAGE_VAR_PORTAINER_ENV_ID=${PORTAINER_ENV_ID:-} - HOMEPAGE_VAR_TRAEFIK_USERNAME=${TRAEFIK_USERNAME:-} - HOMEPAGE_VAR_TRAEFIK_PASSWORD=${TRAEFIK_PASSWORD:-} + - HOMEPAGE_VAR_CALIBREWEB_USERNAME=${CALIBREWEB_USERNAME:-} + - HOMEPAGE_VAR_CALIBREWEB_PASSWORD=${CALIBREWEB_PASSWORD:-} - DOCKER_HOST=tcp://dockerproxy:2375 networks: - proxy @@ -230,6 +232,26 @@ services: - "traefik.http.routers.kosync.tls.certresolver=cloudflare" - "traefik.http.services.kosync.loadbalancer.server.port=3000" + calibre-web: + container_name: calibre-web + image: lscr.io/linuxserver/calibre-web:latest + environment: + - PUID=1000 + - PGID=1000 + - TZ=${TZ:-America/New_York} + volumes: + - ./calibre-web/config:/config + - ${SYNC_PATH:-/mnt/sync}:/sync:ro + networks: + - proxy + restart: unless-stopped + labels: + - "traefik.enable=true" + - "traefik.http.routers.calibre-web.rule=Host(`calibre-web.woggles.work`)" + - "traefik.http.routers.calibre-web.entrypoints=websecure" + - "traefik.http.routers.calibre-web.tls.certresolver=cloudflare" + - "traefik.http.services.calibre-web.loadbalancer.server.port=8083" + volumes: wallabag_images: kosync-data: diff --git a/homepage/config/services.yaml b/homepage/config/services.yaml index 935f122..32632fb 100644 --- a/homepage/config/services.yaml +++ b/homepage/config/services.yaml @@ -48,6 +48,18 @@ key: "{{HOMEPAGE_VAR_JELLYFIN_API_KEY}}" enableBlocks: true +- Books: + - Calibre-Web: + href: https://calibre-web.woggles.work + description: Ebook library + icon: calibre-web + widget: + type: calibreweb + url: http://calibre-web:8083 + username: "{{HOMEPAGE_VAR_CALIBREWEB_USERNAME}}" + password: "{{HOMEPAGE_VAR_CALIBREWEB_PASSWORD}}" + fields: ["books", "authors", "categories", "series"] + - Files: - Syncthing: href: https://syncthing.woggles.work diff --git a/scripts/setup.sh b/scripts/setup.sh index a92d9cd..9a88fd1 100755 --- a/scripts/setup.sh +++ b/scripts/setup.sh @@ -85,6 +85,7 @@ mkdir -p pihole/etc-dnsmasq.d mkdir -p jellyfin/config mkdir -p jellyfin/cache mkdir -p syncthing/config +mkdir -p calibre-web/config mkdir -p traefik/dynamic mkdir -p filebrowser/database mkdir -p filebrowser/config