Сервис для отправки Telegram-уведомлений по ролям подписчиков на стеке aiogram, PostgreSQL и Docker.
Используется для внутренних рассылок в командах с разными ролями: программисты, директора, системные администраторы.
Приложение:
- запускает Telegram-бота на
aiogram; - хранит подписчиков и уведомления в PostgreSQL;
- позволяет пользователям подписываться, отписываться и выбирать роль;
- периодически проверяет новые сообщения в базе и отправляет их подходящим подписчикам.
- Python 3.11
- aiogram 3
- SQLAlchemy Async
- asyncpg
- PostgreSQL
- Docker / Docker Compose
Создайте файл .env в корне проекта:
DB_HOST=localhost
DB_PORT=5432
DB_USER=postgres
DB_PASSWORD=password
DB_NAME=notifier
TELEGRAM_BOT_TOKEN=your_telegram_bot_token
SLEEP_TIME=10Описание:
DB_HOST- адрес PostgreSQL;DB_PORT- порт PostgreSQL;DB_USER- пользователь базы данных;DB_PASSWORD- пароль пользователя;DB_NAME- имя базы данных;TELEGRAM_BOT_TOKEN- токен Telegram-бота от BotFather;SLEEP_TIME- интервал проверки новых уведомлений в секундах.
Если приложение запускается в Docker, а PostgreSQL работает на хост-машине, обычно можно использовать:
DB_HOST=host.docker.internalПеред запуском убедитесь, что PostgreSQL доступен и файл .env заполнен.
docker compose up --buildОстановить контейнер:
docker compose downУстановите зависимости:
python -m venv .venv
.venv\Scripts\activate
pip install -r requirements.txtЗапустите приложение:
python main.pyПри старте приложение создает таблицы через SQLAlchemy, если они еще не существуют.
/start- приветствие и краткая справка;/subscribe- подписаться на рассылку;/unsubscribe- отписаться от рассылки;/role- выбрать роль подписчика.
Доступные роли:
programmerdirectorsystem_administrator
Воркер отправляет записи из таблицы notify_messages, у которых sent_at равен NULL.
После обработки сообщение помечается как отправленное.
Пример вставки уведомления напрямую в PostgreSQL:
INSERT INTO notify_messages (text, roles, sent_at)
VALUES (
'Текст уведомления',
ARRAY['programmer', 'director']::role_enum[],
NULL
);Уведомление будет отправлено подписчикам, чья роль входит в массив roles.
main.py- точка входа, запуск базы, бота и воркера;telegram_bot.py- обработчики команд Telegram-бота;worker.py- периодическая отправка новых уведомлений;database_manager.py- операции с базой данных;models.py- SQLAlchemy-модели;config.py- загрузка настроек из.env;docker-compose.yml- запуск приложения в контейнере.
- Async Python с
aiogram 3иSQLAlchemy Async; - PostgreSQL с кастомными enum-типами;
- background worker с периодической проверкой базы;
- Docker Compose деплой.