4.3 KiB
openai-status-bot
Telegram bot that watches OpenAI Status every minute and sends updates to subscribed chats. State and subscriptions are stored in MongoDB.
Features
- Checks OpenAI status on a configurable interval, default
1m - Notifies subscribers about new incident updates
- Notifies subscribers when component status changes
- Supports incident-only, component-only, and component-filtered subscriptions
- Uses MongoDB for subscribers, delivery state, component checkpoints, and seen incident update versions
- Supports Telegram supergroup topics via
message_thread_id - Clears an existing Telegram webhook before long polling, for migration from webhook deployments
- Registers the Telegram command menu on startup
- Exposes a local health endpoint for container health checks
- Includes Docker Compose for the bot runtime (datastore is managed MongoDB Atlas)
Bot Commands
| Command | Description |
|---|---|
/start |
Subscribe current chat or topic |
/stop |
Unsubscribe current chat or topic |
/status [component] |
Show current OpenAI status, optionally for one component |
/components |
Show all OpenAI component statuses |
| `/subscribe <incident | component |
| `/subscribe component <name | id |
/history [count] |
Show recent incidents, default 5, max 10 |
/uptime |
Show component health overview |
/info |
Show chat ID and subscription settings |
/help |
Show command help |
Quick Start
There is no local datastore. Both Compose files run only the bot and connect to
a managed MongoDB Atlas cluster, so a reachable MONGODB_URI is required to
start. The development and production setups share one cluster and differ only
by database name (MONGODB_DATABASE).
Production runtime (default Compose file; uses the MONGODB_DATABASE from .env, default openai_status_bot):
cp .env.example .env
# edit .env and set TELEGRAM_BOT_TOKEN, MONGODB_URI, and MONGODB_DATABASE
docker compose up -d --build
Development runtime (targets the development database):
cp .env.example .env
# edit .env and set TELEGRAM_BOT_TOKEN and MONGODB_URI (Atlas connection string)
docker compose -f compose.dev.yaml up --build
For local development without Docker:
go mod tidy
go run ./cmd/openai-status-bot
Configuration
| Variable | Default | Description |
|---|---|---|
TELEGRAM_BOT_TOKEN |
required | Telegram bot token from BotFather |
MONGODB_URI |
required | MongoDB connection string, e.g. an Atlas mongodb+srv://user:pass@cluster/ URI |
MONGODB_DATABASE |
openai_status_bot |
Database name; use a separate name (e.g. development) to split dev and prod on one cluster |
POLL_INTERVAL |
1m |
Status check interval, valid 5s-1h |
HTTP_TIMEOUT |
10s |
HTTP request timeout, valid 1s-5m |
LOG_LEVEL |
info |
debug, info, warn/warning, or error |
Percent-encode MongoDB usernames or passwords that contain URL-reserved characters such as @, :, /, #, or %.
The bot always reads OpenAI status from https://status.openai.com.
Notes
The first successful poll seeds the database and does not send historical incidents. Notifications start from later changes.
Switching from a prior Redis deployment starts from empty state: there is no data migration, so subscribers must re-issue /start, component checkpoints reseed on the first poll, and the stored Telegram update offset is not migrated, so retained Telegram updates can be reprocessed once after cutover.
Incident update dedupe tracks the update content/version, so edited Statuspage updates can notify again. Each event is checkpointed independently once it has fully fanned out, so a retryable Telegram failure on one event only defers that event for retry on a later poll and never blocks checkpoints for other events delivered in the same poll.
A 7-day TTL index on the delivery collection expires per-event delivery markers automatically; the bot creates required indexes on startup.
Integration tests for the MongoDB store run a real mongod via testcontainers and are excluded from the default go test ./.... Run them with Docker available: go test -tags=integration ./internal/mongostore/....