Отказоустойчивый сервис уведомлений с поддержкой нескольких каналов и fallback-механизмом.
A fault-tolerant notification service with support for multiple channels and a fallback mechanism.
- Отказоустойчивость: Если один канал (например, Email) не срабатывает, сервис автоматически пытается отправить уведомление через следующий канал в цепочке (например, SMS).
- Расширяемость: Легко добавить новые каналы доставки (например, WhatsApp, Slack), реализовав простой интерфейс
NotificationProvider. - Асинхронность: Использует FastAPI и
asyncioдля неблокирующей обработки запросов. Отправка уведомлений происходит в фоновом режиме. - Готовность к Production: Упакован в Docker-контейнер с использованием multi-stage builds и запускается от не-рутового пользователя.
- Конфигурация через окружение: Все настройки и секреты управляются через
.envфайл, следуя лучшим практикам.
- Python 3.12
- FastAPI: Веб-фреймворк
- Uvicorn: ASGI-сервер
- Pydantic: Валидация данных и управление настройками
- uv: Менеджер пакетов
- Twilio: Для отправки SMS
- python-telegram-bot: Для отправки сообщений в Telegram
- Docker & Docker Compose: Контейнеризация
- Git
- Docker и Docker Compose
- Python 3.12+ и
uv(для локального запуска)
git clone https://github.com/IvanFoksha/system_notifications.git
cd system_notificationsВсе секретные ключи и настройки хранятся в файле .env.
-
Создайте копию файла-шаблона:
cp .env.example .env
-
Откройте
.envи заполните его вашими реальными данными.EMAIL_*: Для Gmail вам понадобится Пароль приложения.TWILIO_*: Данные можно найти в вашей консоли Twilio. Вам понадобятсяAccount SID,Auth TokenиMessaging Service SID.TELEGRAM_BOT_TOKEN: Получите токен у @BotFather в Telegram.
# Создать виртуальное окружение и установить зависимости
make setup && source .venv/bin/activate && make install
# Запустить приложение в режиме разработки
make runСервис будет доступен по адресу http://127.0.0.1:8000.
# Собрать образ и запустить контейнер в фоновом режиме
make docker-build && make docker-up
# Посмотреть логи
make docker-logs
# Остановить и удалить контейнер
make docker-downСервис будет доступен по адресу http://127.0.0.1:8000.
Сервис предоставляет один эндпоинт для отправки уведомлений. Документация Swagger UI доступна по адресу http://127.0.0.1:8000/docs.
Тело запроса:
{
"recipient": "string",
"message": "string"
}Примеры curl запросов:
# Отправка Email
curl -X 'POST' \
'http://127.0.0.1:8000/v1/send' \
-H 'Content-Type: application/json' \
-d '{
"recipient": "your.email@example.com",
"message": "Это тестовое email-уведомление!"
}'
# Отправка SMS (номер в формате E.164)
curl -X 'POST' \
'http://127.0.0.1:8000/v1/send' \
-H 'Content-Type: application/json' \
-d '{
"recipient": "+79123456789",
"message": "Это тестовое SMS-уведомление!"
}'
# Отправка в Telegram (получатель - Chat ID)
curl -X 'POST' \
'http://127.0.0.1:8000/v1/send' \
-H 'Content-Type: application/json' \
-d '{
"recipient": "123456789",
"message": "Это тестовое уведомление в Telegram!"
}'- Fault Tolerance: If one channel (e.g., Email) fails, the service automatically attempts to send the notification through the next channel in the chain (e.g., SMS).
- Extensibility: Easily add new delivery channels (e.g., WhatsApp, Slack) by implementing a simple
NotificationProviderinterface. - Asynchronous: Uses FastAPI and
asynciofor non-blocking request handling. Notifications are sent in the background. - Production-Ready: Packaged in a Docker container using multi-stage builds and runs as a non-root user.
- Environment-based Configuration: All settings and secrets are managed via an
.envfile, following best practices.
- Python 3.12
- FastAPI: Web framework
- Uvicorn: ASGI server
- Pydantic: Data validation and settings management
- uv: Package manager
- Twilio: For sending SMS
- python-telegram-bot: For sending Telegram messages
- Docker & Docker Compose: Containerization
- Git
- Docker and Docker Compose
- Python 3.12+ and
uv(for local development)
git clone https://github.com/IvanFoksha/system_notifications.git
cd system_notificationsAll secret keys and settings are stored in an .env file.
-
Create a copy of the template file:
cp .env.example .env
-
Open
.envand fill it with your actual credentials.EMAIL_*: For Gmail, you will need an App Password.TWILIO_*: Credentials can be found in your Twilio Console. You'll need theAccount SID,Auth Token, andMessaging Service SID.TELEGRAM_BOT_TOKEN: Get your token from @BotFather in Telegram.
# Create a virtual environment and install dependencies
make setup && source .venv/bin/activate && make install
# Run the application in development mode
make runThe service will be available at http://127.0.0.1:8000.
# Build the image and start the container in the background
make docker-build && make docker-up
# View logs
make docker-logs
# Stop and remove the container
make docker-downThe service will be available at http://127.0.0.1:8000.
The service provides a single endpoint for sending notifications. Swagger UI documentation is available at http://127.0.0.1:8000/docs.
Request Body:
{
"recipient": "string",
"message": "string"
}curl Examples:
# Send an Email
curl -X 'POST' \
'http://127.0.0.1:8000/v1/send' \
-H 'Content-Type: application/json' \
-d '{
"recipient": "your.email@example.com",
"message": "This is a test email notification!"
}'
# Send an SMS (recipient in E.164 format)
curl -X 'POST' \
'http://127.0.0.1:8000/v1/send' \
-H 'Content-Type: application/json' \
-d '{
"recipient": "+15551234567",
"message": "This is a test SMS notification!"
}'
# Send to Telegram (recipient is a Chat ID)
curl -X 'POST' \
'http://127.0.0.1:8000/v1/send' \
-H 'Content-Type: application/json' \
-d '{
"recipient": "123456789",
"message": "This is a test Telegram notification!"
}'