diff --git a/docker-compose.yml b/docker-compose.yml index 61c514f..a69a403 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -160,6 +160,7 @@ services: LOG_LEVEL: "${LOG_LEVEL}" KOKORO_URL: "${KOKORO_URL}" KOKORO_VOICE: "${KOKORO_VOICE}" + GLITCHTIP_DSN: "${GLITCHTIP_DSN}" healthcheck: test: ["CMD", "/healthcheck", "http://localhost:8080/health"] interval: 15s @@ -167,7 +168,11 @@ services: retries: 3 # ─── Runner (background task worker) ───────────────────────────────────────── + # profiles: [runner] prevents accidental restart on `docker compose up -d`. + # The homelab runner (192.168.0.109) is the sole worker in production. + # To start explicitly: doppler run -- docker compose --profile runner up -d runner runner: + profiles: [runner] image: kalekber/libnovel-runner:${GIT_TAG:-latest} build: context: ./backend @@ -211,6 +216,7 @@ services: # Kokoro-FastAPI TTS endpoint KOKORO_URL: "${KOKORO_URL}" KOKORO_VOICE: "${KOKORO_VOICE}" + GLITCHTIP_DSN: "${GLITCHTIP_DSN}" healthcheck: # The runner writes /tmp/runner.alive on every poll. # 120s = 2× the default 30s poll interval with generous headroom. @@ -256,6 +262,11 @@ services: PUBLIC_MINIO_PUBLIC_URL: "${MINIO_PUBLIC_ENDPOINT}" # Valkey VALKEY_ADDR: "valkey:6379" + # Umami analytics + PUBLIC_UMAMI_WEBSITE_ID: "${PUBLIC_UMAMI_WEBSITE_ID}" + PUBLIC_UMAMI_SCRIPT_URL: "${PUBLIC_UMAMI_SCRIPT_URL}" + # GlitchTip client + server-side error tracking + PUBLIC_GLITCHTIP_DSN: "${PUBLIC_GLITCHTIP_DSN}" healthcheck: test: ["CMD", "wget", "-qO-", "http://127.0.0.1:3000/health"] interval: 15s @@ -556,7 +567,7 @@ services: GOTIFY_DEFAULTUSER_PASS: "${GOTIFY_ADMIN_PASS}" GOTIFY_SERVER_PORT: "80" healthcheck: - test: ["CMD", "wget", "-qO-", "http://localhost:80/health"] + test: ["CMD", "curl", "-sf", "http://localhost:80/health"] interval: 15s timeout: 5s retries: 5 diff --git a/ui/src/routes/+layout.svelte b/ui/src/routes/+layout.svelte index fa2e357..793e86e 100644 --- a/ui/src/routes/+layout.svelte +++ b/ui/src/routes/+layout.svelte @@ -171,10 +171,10 @@ libnovel - {#if env.PUBLIC_UMAMI_WEBSITE_ID} + {#if env.PUBLIC_UMAMI_WEBSITE_ID && env.PUBLIC_UMAMI_SCRIPT_URL} {/if} diff --git a/ui/src/routes/glitchtip-test/+page.server.ts b/ui/src/routes/glitchtip-test/+page.server.ts new file mode 100644 index 0000000..54051fd --- /dev/null +++ b/ui/src/routes/glitchtip-test/+page.server.ts @@ -0,0 +1,10 @@ +import type { PageServerLoad } from './$types'; + +export const load: PageServerLoad = async ({ url }) => { + if (url.searchParams.get('server_error') === '1') { + // This unhandled throw is caught by handleError in hooks.server.ts, + // which forwards it to GlitchTip via Sentry.captureException. + throw new Error('GlitchTip server-side test error — ' + new Date().toISOString()); + } + return {}; +}; diff --git a/ui/src/routes/glitchtip-test/+page.svelte b/ui/src/routes/glitchtip-test/+page.svelte new file mode 100644 index 0000000..9234868 --- /dev/null +++ b/ui/src/routes/glitchtip-test/+page.svelte @@ -0,0 +1,48 @@ + + +
+

GlitchTip Test Page

+

+ Use the buttons below to fire test errors. Check + errors.libnovel.cc to confirm they arrive. +

+ +
+ + + + + + + + + Trigger server-side load error (navigate here with ?server_error=1) + +
+