Some checks failed
CI / Test backend (pull_request) Failing after 11s
CI / Check ui (pull_request) Failing after 11s
CI / Docker / backend (pull_request) Has been skipped
CI / Docker / runner (pull_request) Has been skipped
CI / Docker / ui (pull_request) Has been skipped
CI / Docker / caddy (pull_request) Successful in 2m53s
Release / Test backend (push) Successful in 19s
Release / Check ui (push) Successful in 33s
Release / Docker / caddy (push) Failing after 1m26s
Release / Docker / ui (push) Failing after 11s
Release / Docker / backend (push) Successful in 2m2s
Release / Docker / runner (push) Successful in 2m24s
Release / Gitea Release (push) Has been skipped
- Add email/email_verified/verification_token/verification_token_exp fields
to app_users PocketBase schema (pb-init-v3.sh)
- Add SMTP env vars to UI service in docker-compose.yml
- New email.ts: raw TLS SMTP mailer via Node tls module, sendVerificationEmail()
- createUser() now takes email param, stores verification token (24h TTL)
- loginUser() throws 'Email not verified' when email_verified is false
- New /verify-email route: validates token, verifies user, auto-logs in
- Login page: email field in register form, check-inbox state after register
- /api/auth/register (iOS): returns { pending_verification, email } instead of token
- Add pb.libnovel.cc and storage.libnovel.cc Caddy virtual hosts for homelab runner
- Add homelab runner docker-compose and libnovel.sh helper script
59 lines
2.9 KiB
YAML
59 lines
2.9 KiB
YAML
# LibNovel homelab runner
|
|
#
|
|
# Connects to production PocketBase and MinIO via public subdomains.
|
|
# All secrets come from Doppler (project=libnovel, config=prd).
|
|
# Run with: doppler run -- docker compose up -d
|
|
#
|
|
# Differs from prod runner:
|
|
# - RUNNER_WORKER_ID=homelab-runner-1 (unique, avoids task claiming conflicts)
|
|
# - MINIO_ENDPOINT/USE_SSL → storage.libnovel.cc over HTTPS
|
|
# - POCKETBASE_URL → https://pb.libnovel.cc
|
|
# - MEILI_URL/VALKEY_ADDR → unset (not exposed publicly; not needed by runner)
|
|
# - RUNNER_SKIP_INITIAL_CATALOGUE_REFRESH=true
|
|
|
|
services:
|
|
runner:
|
|
image: kalekber/libnovel-runner:latest
|
|
restart: unless-stopped
|
|
stop_grace_period: 135s
|
|
environment:
|
|
# ── PocketBase ──────────────────────────────────────────────────────────
|
|
POCKETBASE_URL: "https://pb.libnovel.cc"
|
|
POCKETBASE_ADMIN_EMAIL: "${POCKETBASE_ADMIN_EMAIL}"
|
|
POCKETBASE_ADMIN_PASSWORD: "${POCKETBASE_ADMIN_PASSWORD}"
|
|
|
|
# ── MinIO (S3 API via public subdomain) ─────────────────────────────────
|
|
MINIO_ENDPOINT: "storage.libnovel.cc"
|
|
MINIO_ACCESS_KEY: "${MINIO_ROOT_USER}"
|
|
MINIO_SECRET_KEY: "${MINIO_ROOT_PASSWORD}"
|
|
MINIO_USE_SSL: "true"
|
|
MINIO_PUBLIC_ENDPOINT: "${MINIO_PUBLIC_ENDPOINT}"
|
|
MINIO_PUBLIC_USE_SSL: "${MINIO_PUBLIC_USE_SSL}"
|
|
|
|
# ── Meilisearch / Valkey — not exposed, disabled ────────────────────────
|
|
MEILI_URL: ""
|
|
VALKEY_ADDR: ""
|
|
|
|
# ── Kokoro TTS ──────────────────────────────────────────────────────────
|
|
KOKORO_URL: "${KOKORO_URL}"
|
|
KOKORO_VOICE: "${KOKORO_VOICE}"
|
|
|
|
# ── Runner tuning ───────────────────────────────────────────────────────
|
|
RUNNER_WORKER_ID: "${RUNNER_WORKER_ID}"
|
|
RUNNER_POLL_INTERVAL: "${RUNNER_POLL_INTERVAL}"
|
|
RUNNER_MAX_CONCURRENT_SCRAPE: "${RUNNER_MAX_CONCURRENT_SCRAPE}"
|
|
RUNNER_MAX_CONCURRENT_AUDIO: "${RUNNER_MAX_CONCURRENT_AUDIO}"
|
|
RUNNER_TIMEOUT: "${RUNNER_TIMEOUT}"
|
|
RUNNER_METRICS_ADDR: "${RUNNER_METRICS_ADDR}"
|
|
RUNNER_SKIP_INITIAL_CATALOGUE_REFRESH: "true"
|
|
|
|
# ── Observability ───────────────────────────────────────────────────────
|
|
LOG_LEVEL: "${LOG_LEVEL}"
|
|
GLITCHTIP_DSN: "${GLITCHTIP_DSN}"
|
|
|
|
healthcheck:
|
|
test: ["CMD", "/healthcheck", "file", "/tmp/runner.alive", "120"]
|
|
interval: 60s
|
|
timeout: 5s
|
|
retries: 3
|