Skip to content

jirafa27/Notifier

Repository files navigation

Notifier

Сервис для отправки 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

Запуск через Docker Compose

Перед запуском убедитесь, что 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 - выбрать роль подписчика.

Доступные роли:

  • programmer
  • director
  • system_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 деплой.

About

Telegram notification service with role-based subscriber management. Stack: aiogram, PostgreSQL, Docker

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors