FastAPI service that subscribes to nearle/# on the MQTT broker and forwards rider status, periodic logs, and profile updates to the Jupiter webhook API. Includes fixes for a failure mode that took the bridge down silently for ~3.8 days in June 2026, during which it served HTTP 200 on / while forwarding zero events: - Retry MQTT connection with backoff instead of letting a single failed connect kill the background thread permanently. - Subscribe inside on_connect so subscriptions are restored after an automatic reconnect; the session is clean, so a reconnect previously came back subscribed to nothing. - Add /healthz returning 503 when MQTT is disconnected, so a monitor can distinguish a live bridge from a dead one. - Replace thread-per-message forwarding with a bounded worker pool, which keeps memory flat when the upstream API stalls on its 5s timeout. - Pin requirements.txt to the versions verified in production; it was unpinned and had already drifted to paho-mqtt 2.1.0. - Set PYTHONUNBUFFERED so container logs are not block-buffered. - Name the compose image nearle-api-image to match the deployed tag. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
32 lines
1.2 KiB
YAML
32 lines
1.2 KiB
YAML
services:
|
|
nearle-api:
|
|
build: .
|
|
# Pinned so `docker compose up -d --build` rebuilds the SAME tag the running
|
|
# container was created from (it was started with `docker run`, not compose).
|
|
# Without this, compose would build `nearleapi-nearle-api` and leave a
|
|
# confusing second image behind.
|
|
image: nearle-api-image
|
|
container_name: nearle_api
|
|
restart: unless-stopped
|
|
ports:
|
|
- "8000:8000"
|
|
environment:
|
|
- MQTT_BROKER=66.116.225.226
|
|
- API_STATUS_URL=https://jupiter.nearle.app/live/api/v1/utils/createriderstatus
|
|
- API_LOGS_URL=https://jupiter.nearle.app/live/api/v1/utils/createriderperiodiclog
|
|
- API_PROFILE_URL=https://jupiter.nearle.app/live/api/v1/utils/createuserredis
|
|
# /healthz returns 503 whenever the MQTT side is down, so `docker ps` shows
|
|
# "unhealthy" instead of the container looking fine while forwarding nothing.
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "python -c \"import urllib.request,sys; sys.exit(0 if urllib.request.urlopen('http://127.0.0.1:8000/healthz', timeout=3).status==200 else 1)\""]
|
|
interval: 60s
|
|
timeout: 10s
|
|
retries: 3
|
|
start_period: 30s
|
|
networks:
|
|
- nearle-net
|
|
|
|
networks:
|
|
nearle-net:
|
|
external: true
|