- Added port mapping to docker-compose for local development. - Modified the API to allow access from localhost without Telegram initData for local development. - Updated the web application to check for localhost before denying access based on initData.
Duty Teller (Telegram Bot)
A minimal Telegram bot boilerplate using python-telegram-bot v22 with the Application API.
Get a bot token
- Open Telegram and search for @BotFather.
- Send
/newbotand follow the prompts to create a bot. - Copy the token BotFather gives you.
Setup
-
Clone and enter the project
cd duty-teller -
Create a virtual environment (recommended)
python -m venv venv source venv/bin/activate # Linux/macOS # or: venv\Scripts\activate # Windows -
Install dependencies
pip install -r requirements.txt -
Configure the bot
cp .env.example .envEdit
.envand setBOT_TOKENto the token from BotFather. -
Miniapp access (calendar)
To allow access to the calendar miniapp, setALLOWED_USERNAMESto a comma-separated list of Telegram usernames (without@). Users inADMIN_USERNAMESalso have access; the admin role is reserved for future bot commands and API features. If both are empty, no one can open the calendar.
Run
python main.py
The bot runs in polling mode. Send /start or /help to your bot in Telegram to test.
Run with Docker
Ensure .env exists (e.g. cp .env.example .env) and contains BOT_TOKEN.
-
Dev (volume mount; code changes apply without rebuild):
docker compose -f docker-compose.dev.yml up --buildStop with
Ctrl+Cordocker compose -f docker-compose.dev.yml down. -
Prod (no volume; runs the built image; restarts on failure):
docker compose -f docker-compose.prod.yml up -d --buildFor production deployments you may use Docker secrets or your orchestrator’s env instead of a
.envfile.
Project layout
main.py– Builds theApplication, registers handlers, runs polling.config.py– LoadsBOT_TOKEN,ALLOWED_USERNAMES,ADMIN_USERNAMESfrom env; exits ifBOT_TOKENis missing.handlers/– Command and error handlers; add new handlers here.requirements.txt– Pinned dependencies (PTB with job-queue, python-dotenv).
To add commands, define async handlers in handlers/commands.py (or a new module) and register them in handlers/__init__.py.