telegram bot template

πŸ€– Template for telegram bot using postgres, pgbouncer, redis, docker, amplitude, prometheus, grafana, CI with admin panel

282
53
Python

Telegram bot template

Best way to create a scalable telegram bot with analytics

GitHub tag (latest SemVer) Linters Status Docker Build Status Python License Code style

✨ Features

  • [x] Admin Panel based on Flask-Admin-Dashboard (Flask-Admin + AdminLTE = ❀️ )
  • [x] Product Analytics System: using Amplitude or Posthog or Google Analytics
  • [x] Performance Monitoring System: using Prometheus and Grafana
  • [x] Tracking System: using Sentry
  • [x] Seamless use of Docker and Docker Compose
  • [x] Export all users in .csv (or .xlsx, .json, yaml from admin panel)
  • [x] Configured CI pipeline from git hooks to github actions
  • [x] SQLAlchemy V2 is used to communicate with the database
  • [x] Database Migrations with Alembic
  • [x] Ability to cache using decorator
  • [x] Convenient validation using Pydantic V2
  • [x] Internationalization (i18n) using GNU gettex and Babel

πŸš€ How to Use

🐳 Running in Docker (recommended method)

  • configure environment variables in .env file

  • start services

    docker compose up -d --build
    

πŸ’» Running on Local Machine

  • install dependencies using Poetry

    poetry install
    
  • start the necessary services (at least the database and redis)

  • configure environment variables in .env file

  • start telegram bot

    poetry run python -m bot
    
  • start admin panel

    poetry run gunicorn -c admin/gunicorn_conf.py
    
  • make migrations

    poetry run alembic upgrade head
    

🌍 Environment variables

to launch the bot you only need a token bot, database and redis settings, everything else can be left out

name description
BOT_TOKEN Telegram bot API token
RATE_LIMIT Maximum number of requests allowed per minute for rate limiting
DEBUG Enable or disable debugging mode (e.g., True or False)
USE_WEBHOOK Flag to indicate whether the bot should use a webhook for updates (e.g., True or False)
WEBHOOK_BASE_URL Base URL for the webhook
WEBHOOK_PATH Path to receive updates from Telegram
WEBHOOK_SECRET Secret key for securing the webhook communication
WEBHOOK_HOST Hostname or IP address for the main application
WEBHOOK_PORT Port number for the main application
ADMIN_HOST Hostname or IP address for the admin panel
ADMIN_PORT Port number for the admin panel
DEFAULT_ADMIN_EMAIL Default email for the admin user
DEFAULT_ADMIN_PASSWORD Default password for the admin user
SECURITY_PASSWORD_HASH Hashing algorithm for user passwords (e.g., bcrypt)
SECURITY_PASSWORD_SALT Salt value for user password hashing
DB_HOST Hostname or IP address of the PostgreSQL database
DB_PORT Port number for the PostgreSQL database
DB_USER Username for authenticating with the PostgreSQL database
DB_PASS Password for authenticating with the PostgreSQL database
DB_NAME Name of the PostgreSQL database
REDIS_HOST Hostname or IP address of the Redis database
REDIS_PORT Port number for the Redis database
REDIS_PASS Password for authenticating with the Redis database
SENTRY_DSN Sentry DSN (Data Source Name) for error tracking
AMPLITUDE_API_KEY API key for Amplitude analytics
POSTHOG_API_KEY API key for PostHog analytics
PROMETHEUS_PORT Port number for the Prometheus monitoring system
GRAFANA_PORT Port number for the Grafana monitoring and visualization platform
GRAFANA_ADMIN_USER Admin username for accessing Grafana
GRAFANA_ADMIN_PASSWORD Admin password for accessing Grafana

πŸ“‚ Project Folder Structure

.
β”œβ”€β”€ admin # Source code for admin panel
β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”œβ”€β”€ app.py # Main application module for the admin panel
β”‚Β Β  β”œβ”€β”€ config.py # Configuration module for the admin panel
β”‚Β Β  β”œβ”€β”€ Dockerfile # Dockerfile for admin panel
β”‚Β Β  β”œβ”€β”€ gunicorn_conf.py # Gunicorn configuration file for serving admin panel
β”‚Β Β  β”œβ”€β”€ static # Folder for static assets
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ css/
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ fonts/
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ img/
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ js/
β”‚Β Β  β”‚Β Β  └── plugins/
β”‚Β Β  β”œβ”€β”€ templates # HTML templates for the admin panel
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ admin/
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ index.html
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ my_master.html
β”‚Β Β  β”‚Β Β  └── security/
β”‚Β Β  └── views # Custom View modules for handling web requests
β”‚Β Β      β”œβ”€β”€ __init__.py
β”‚Β Β      └── users.py
β”‚
β”œβ”€β”€ bot # Source code for Telegram Bot
β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”œβ”€β”€ __main__.py # Main entry point to launch the bot
β”‚Β Β  β”œβ”€β”€ analytics/ # Interaction with analytics services (e.g., Amplitude or Google Analytics)
β”‚Β Β  β”œβ”€β”€ cache/ # Logic for using Redis cache
β”‚Β Β  β”œβ”€β”€ core/ # Settings for application and other core components
β”‚Β Β  β”œβ”€β”€ database/ # Database functions and SQLAlchemy Models
β”‚Β Β  β”œβ”€β”€ filters/ # Filters for processing incoming messages or updates
β”‚Β Β  β”œβ”€β”€ handlers/ # Handlers for processing user commands and interactions
β”‚Β Β  β”œβ”€β”€ keyboards # Modules for creating custom keyboards
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ default_commands.py # Default command keyboards
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”‚Β Β  β”œβ”€β”€ inline/ # Inline keyboards
β”‚Β Β  β”‚Β Β  └── reply/ # Reply keyboards
β”‚Β Β  β”œβ”€β”€ locales/ # Localization files for supporting multiple languages
β”‚Β Β  β”œβ”€β”€ middlewares/ # Middleware modules for processing incoming updates
β”‚Β Β  β”œβ”€β”€ services/ # Business logic for application
β”‚Β Β  └── utils/ # Utility functions and helper modules
β”‚
β”œβ”€β”€ migrations # Database Migrations managed by Alembic
β”‚Β Β  β”œβ”€β”€ env.py # Environment setup for Alembic
β”‚Β Β  β”œβ”€β”€ __init__.py
β”‚Β Β  β”œβ”€β”€ README
β”‚Β Β  β”œβ”€β”€ script.py.mako # Script template for generating migrations
β”‚Β Β  └── versions/ # Folder containing individual migration scripts
β”‚
β”œβ”€β”€ configs # Config folder for Monitoring (Prometheus, Node-exporter and Grafana)
β”‚Β Β  β”œβ”€β”€ grafana # Configuration files for Grafana
β”‚Β Β  β”‚Β Β  └── datasource.yml
β”‚Β Β  └── prometheus # Configuration files for Prometheus
β”‚Β Β      └── prometheus.yml
β”‚
β”œβ”€β”€ scripts/ # Sripts folder
β”œβ”€β”€ Makefile # List of commands for standard
β”œβ”€β”€ alembic.ini # Configuration file for migrations
β”œβ”€β”€ docker-compose.yml # Docker Compose configuration file for orchestrating containers
β”œβ”€β”€ Dockerfile # Dockerfile for Telegram Bot
β”œβ”€β”€ LICENSE.md # License file for the project
β”œβ”€β”€ poetry.lock # Lock file for Poetry dependency management
β”œβ”€β”€ pyproject.toml # Configuration file for Python projects, including build tools, dependencies, and metadata
└── README.md # Documentation

πŸ”§ Tech Stack

  • sqlalchemy β€” object-relational mapping (ORM) library that provides a set of high-level API for interacting with relational databases
  • asyncpg β€” asynchronous PostgreSQL database client library
  • aiogram β€” asynchronous framework for Telegram Bot API
  • flask-admin β€” simple and extensible administrative interface framework
  • loguru β€” third party library for logging in Python
  • poetry β€” development workflow
  • docker β€” to automate deployment
  • postgres β€” powerful, open source object-relational database system
  • pgbouncer β€” connection pooler for PostgreSQL database
  • redis β€” in-memory data structure store used as a cache and FSM
  • prometheus β€” time series database for collecting metrics from various systems
  • grafana β€” visualization and analysis from various sources, including Prometheus

⭐ Star History

Star History Chart

πŸ‘· Contributing

First off, thanks for taking the time to contribute! Contributions are what makes the open-source community such an amazing place to learn, inspire, and create. Any contributions you make will benefit everybody else and are greatly appreciated.

If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag β€œenhancement”. Don’t forget to give the project a star! Thanks again!

  1. Fork this repository
  2. Create a branch
  3. Commit your changes
  4. Push your commits to the branch
  5. Submit a pull request

πŸ“ License

Distributed under the LGPL-3.0 license. See LICENSE for more information.

πŸ“’ Contact

donbarbos: [email protected]