Two problems found while verifying the pagination fix on the live stack: 1. fetch_listings() did state['SearchListing']['listingCards'] with no guard. Carousell serves HTTP 200 with listingCards=null under soft rate limiting, so the tick died with TypeError: 'NoneType' object is not iterable -> ok:false -> container unhealthy, repeatedly. 2. run_tick() set ok = (no failures at all), so a single soft-blocked watch out of 7 marked the whole monitor failed. That flaps on transient blocks and (now that failures alert) would spam Telegram. - fetch_listings: explicit null check -> clear retryable RuntimeError - add FAILURE_RATIO_THRESHOLD (default 1.0 = all watches must fail); partial failures are reported as '[partial n/N] ...' without failing the tick - health gains failed_watches - wire the knob into compose/.env.example/DOCUMENTATION/COMPOSE-SETUP - 15 new checks: null vs empty cards, real card still parses, threshold edges
37 lines
1.1 KiB
YAML
37 lines
1.1 KiB
YAML
# Carousell new-listing monitor -> NocoDB archive + Telegram alerts.
|
|
# Deployed via Portainer on DSM. Secrets come from the stack's environment
|
|
# (see .env.example); operational knobs (enabled / notify / interval) live in
|
|
# the NocoDB "Settings" table.
|
|
|
|
services:
|
|
carousell-monitor:
|
|
build: .
|
|
image: carousell-monitor:latest
|
|
container_name: carousell-monitor
|
|
restart: unless-stopped
|
|
extra_hosts:
|
|
- "api.telegram.org:149.154.166.110"
|
|
environment:
|
|
NOCODB_URL: ${NOCODB_URL:-http://nocodb:10380}
|
|
NOCODB_TOKEN: ${NOCODB_TOKEN}
|
|
NOCODB_BASE_ID: ${NOCODB_BASE_ID:-poqw1zjw3hnsk37}
|
|
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
|
|
TELEGRAM_CHAT_ID: ${TELEGRAM_CHAT_ID}
|
|
TICK_SECONDS: ${TICK_SECONDS:-60}
|
|
FETCH_GAP_SECONDS: ${FETCH_GAP_SECONDS:-1}
|
|
HEALTH_STALE_SECONDS: ${HEALTH_STALE_SECONDS:-600}
|
|
ERROR_ALERT_AFTER: ${ERROR_ALERT_AFTER:-3}
|
|
FAILURE_RATIO_THRESHOLD: ${FAILURE_RATIO_THRESHOLD:-1.0}
|
|
TZ: Asia/Kuala_Lumpur
|
|
volumes:
|
|
- carousell-data:/data
|
|
networks:
|
|
- bridge_hoelee
|
|
|
|
volumes:
|
|
carousell-data:
|
|
|
|
networks:
|
|
bridge_hoelee:
|
|
external: true
|