The stall watchdog now runs inside the scraper (ScraperService.checkStalls, every 30 s from the work loop): same rule as before, one checkpoint-safe restart, quarantine on the second stall, missing checkpoint is no evidence, and paused time no longer counts. Stalls are recorded as scraper incidents (failure.kind 'stall'). The private /api/recovery endpoint is gone. Dropped with the service: reader/scraper-unreachable incidents (supervisor and Docker handle crashes; the health page shows "Scraper: unreachable"), duplicate job-failure incidents and the unused /metrics endpoint. The stack is now reader + scraper (+ optional peer-gateway). The supervisor test moved to runtime/test (npm run test:runtime stays). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
14 lines
440 B
YAML
14 lines
440 B
YAML
# Controlled service reloads preserve checkpoints; public assets update immediately.
|
|
services:
|
|
reader:
|
|
volumes:
|
|
- ./public:/app/public:ro
|
|
- ./server.js:/app/server.js:ro
|
|
- ./catalog.js:/app/catalog.js:ro
|
|
- ./reading-analytics.js:/app/reading-analytics.js:ro
|
|
- ./reading-access.js:/app/reading-access.js:ro
|
|
- ./library.js:/app/library.js:ro
|
|
scraper:
|
|
volumes:
|
|
- ./scraper:/app/scraper:ro
|