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 and component checkpoints reseed on the first poll.

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/....

S
Description
Telegram bot that polls OpenAI Status and sends Redis-backed status alerts
Readme 395 KiB
Languages
Go 99.7%
Dockerfile 0.3%