send_pending_notifications() read Listings with ?limit=1000 and no paging. Once the table passed 1000 rows the newest records (highest Id, at the tail) fell outside page 1, so they were never sent and never marked notified -> notifications silently dead while health.json stayed ok:true. Found live 2026-09-22: Id 1007-1041 (35 rows, ~29h of listings) never alerted. - add nc_list_all(): offset-paged full-table read - use it for listings pending, seen, watches, settings, both ignore lists - add alert_on_health(): Telegram failure alert debounced over ERROR_ALERT_AFTER consecutive failed ticks, plus a recovery notice (container already reported unhealthy via healthcheck.py on ok:false) - new env knob ERROR_ALERT_AFTER wired into compose/.env.example/docs - test_pagination.py: 30 checks incl. the page-2 regression and alert edges
36 lines
1.1 KiB
YAML
36 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}
|
|
TZ: Asia/Kuala_Lumpur
|
|
volumes:
|
|
- carousell-data:/data
|
|
networks:
|
|
- bridge_hoelee
|
|
|
|
volumes:
|
|
carousell-data:
|
|
|
|
networks:
|
|
bridge_hoelee:
|
|
external: true
|