| <h1 align="center"><em>Telegram bot template</em></h1> |
|
|
| <h3 align="center"> |
| Best way to create a scalable telegram bot with analytics |
| </h3> |
|
|
| <p align="center"> |
| <a href="https://github.com/donBarbos/telegram-bot-template/tags"><img alt="GitHub tag (latest SemVer)" src="https://img.shields.io/github/v/tag/donBarbos/telegram-bot-template"></a> |
| <a href="https://github.com/donBarbos/telegram-bot-template/actions/workflows/linters.yml"><img src="https://img.shields.io/github/actions/workflow/status/donBarbos/telegram-bot-template/linters.yml?label=linters" alt="Linters Status"></a> |
| <a href="https://github.com/donBarbos/telegram-bot-template/actions/workflows/docker-image.yml"><img src="https://img.shields.io/github/actions/workflow/status/donBarbos/telegram-bot-template/docker-image.yml?label=docker%20image" alt="Docker Build Status"></a> |
| <a href="https://www.python.org/downloads"><img src="https://img.shields.io/badge/python-3.10%2B-blue" alt="Python"></a> |
| <a href="https://github.com/donBarbos/telegram-bot-template/blob/main/LICENSE"><img src="https://img.shields.io/github/license/donbarbos/telegram-bot-template?color=blue" alt="License"></a> |
| <a href="https://github.com/astral-sh/ruff"><img src="https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json" alt="Code style"></a> |
| <p> |
|
|
| ## β¨ Features |
|
|
| - [x] Admin Panel based on [`Flask-Admin-Dashboard`](https://github.com/jonalxh/Flask-Admin-Dashboard/) ([`Flask-Admin`](https://flask-admin.readthedocs.io/) + [`AdminLTE`](https://adminlte.io/) = β€οΈ ) |
| - [x] Product Analytics System: using [`Amplitude`](https://amplitude.com/) or [`Posthog`](https://posthog.com/) or [`Google Analytics`](https://analytics.google.com) |
| - [x] Performance Monitoring System: using [`Prometheus`](https://prometheus.io/) and [`Grafana`](https://grafana.com/) |
| - [x] Tracking System: using [`Sentry`](https://sentry.io/) |
| - [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`](https://pypi.org/project/SQLAlchemy/) is used to communicate with the database |
| - [x] Database Migrations with [`Alembic`](https://pypi.org/project/alembic/) |
| - [x] Ability to cache using decorator |
| - [x] Convenient validation using [`Pydantic V2`](https://pypi.org/project/pydantic/) |
| - [x] Internationalization (i18n) using GNU gettex and [`Babel`](https://pypi.org/project/Babel/) |
|
|
| ## π How to Use |
|
|
| ### π³ Running in Docker _(recommended method)_ |
|
|
| - configure environment variables in `.env` file |
|
|
| - start services |
|
|
| ```bash |
| docker compose up -d --build |
| ``` |
| |
| ### π» Running on Local Machine |
|
|
| - install dependencies using [Poetry](https://python-poetry.org "python package manager") |
|
|
| ```bash |
| poetry install |
| ``` |
| |
| - start the necessary services (at least the database and redis) |
|
|
| - configure environment variables in `.env` file |
|
|
| - start telegram bot |
|
|
| ```bash |
| poetry run python -m bot |
| ``` |
| |
| - start admin panel |
|
|
| ```bash |
| poetry run gunicorn -c admin/gunicorn_conf.py |
| ``` |
| |
| - make migrations |
|
|
| ```bash |
| 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 |
|
|
| ```bash |
| . |
| βββ 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 |
|
|
| [](https://star-history.com/#donBarbos/telegram-bot-template&Date) |
|
|
| ## π· 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`](./LICENSE.md) for more information. |
|
|
| ## π’ Contact |
|
|
| [donbarbos](https://github.com/donBarbos): donbarbos@proton.me |
|
|