Initial commit: Message Gateway project

- FastAPI приложение для отправки мониторинговых алертов в мессенджеры
- Поддержка Telegram и MAX/VK
- Интеграция с Grafana, Zabbix, AlertManager
- Автоматическое создание тикетов в Jira
- Управление группами мессенджеров через API
- Декораторы для авторизации и скрытия эндпоинтов
- Подробная документация в папке docs/

Автор: Сергей Антропов
Сайт: https://devops.org.ru
This commit is contained in:
2025-11-12 20:25:11 +03:00
commit b90def35ed
72 changed files with 10609 additions and 0 deletions

106
app/models/group.py Normal file
View File

@@ -0,0 +1,106 @@
"""
Модели данных для управления группами мессенджеров.
Автор: Сергей Антропов
Сайт: https://devops.org.ru
"""
from typing import Optional, Dict, Any, Union
from pydantic import BaseModel, Field
class GroupInfo(BaseModel):
"""Информация о группе."""
name: str = Field(..., description="Имя группы", examples=["monitoring", "alerts", "devops"])
messenger: Optional[str] = Field(None, description="Тип мессенджера (telegram, max)", examples=["telegram", "max"])
chat_id: Optional[Union[int, str]] = Field(None, description="Chat ID группы (отображается только при наличии пароля)", examples=[-1001234567890, "123456789", None])
thread_id: Optional[int] = Field(None, description="ID треда в группе (опционально, только для Telegram)", examples=[0, 123, 456])
model_config = {
"json_schema_extra": {
"examples": [
{
"name": "monitoring",
"messenger": "telegram",
"chat_id": -1001234567890,
"thread_id": 0
},
{
"name": "alerts_max",
"messenger": "max",
"chat_id": "123456789",
"thread_id": None
},
{
"name": "devops",
"messenger": None,
"chat_id": None,
"thread_id": None
}
]
}
}
class CreateGroupRequest(BaseModel):
"""Запрос на создание группы."""
group_name: str = Field(..., description="Имя группы", examples=["monitoring", "alerts", "devops"])
chat_id: Union[int, str] = Field(..., description="ID чата (может быть int для Telegram или str для MAX/VK)", examples=[-1001234567890, "123456789"])
messenger: str = Field("telegram", description="Тип мессенджера (telegram, max)", examples=["telegram", "max"])
thread_id: int = Field(0, description="ID треда в группе (по умолчанию 0, только для Telegram)", examples=[0, 123, 456])
config: Optional[Dict[str, Any]] = Field(None, description="Дополнительная конфигурация для мессенджера (опционально)", examples=[None, {"access_token": "..."}, {"api_version": "5.131"}])
model_config = {
"json_schema_extra": {
"examples": [
{
"group_name": "monitoring",
"chat_id": -1001234567890,
"messenger": "telegram",
"thread_id": 0,
},
{
"group_name": "alerts_max",
"chat_id": "123456789",
"messenger": "max",
"thread_id": 0,
"config": {
"access_token": "your_access_token",
"api_version": "5.131"
}
}
]
}
}
class UpdateGroupRequest(BaseModel):
"""Запрос на обновление группы."""
chat_id: Optional[Union[int, str]] = Field(None, description="Новый Chat ID группы (можно получить через @userinfobot для Telegram)", examples=[-1001234567891, "123456789"])
messenger: Optional[str] = Field(None, description="Новый тип мессенджера (telegram, max)", examples=["telegram", "max"])
thread_id: Optional[int] = Field(None, description="Новый ID треда в группе (опционально, только для Telegram)", examples=[0, 123, 456])
config: Optional[Dict[str, Any]] = Field(None, description="Новая дополнительная конфигурация для мессенджера (опционально)", examples=[None, {"access_token": "..."}, {"api_version": "5.131"}])
model_config = {
"json_schema_extra": {
"examples": [
{
"chat_id": -1001234567891,
"messenger": "telegram",
"thread_id": 0,
},
{
"chat_id": "123456789",
"messenger": "max",
"config": {
"access_token": "your_access_token",
"api_version": "5.131"
}
}
]
}
}
class DeleteGroupRequest(BaseModel):
"""Запрос на удаление группы."""
pass