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

340
kubernetes.yaml Normal file
View File

@@ -0,0 +1,340 @@
---
apiVersion: v1
kind: Namespace
metadata:
name: message-gateway
---
apiVersion: v1
kind: Secret
metadata:
name: message-gateway-secret
namespace: message-gateway
type: Opaque
stringData:
telegram_bot_token: "" # Установите токен через kubectl create secret или SealedSecret
pushgateway_url: "" # URL Pushgateway (опционально)
pushgateway_job: "MessageGateway"
grafana_url: "" # URL Grafana (опционально)
zabbix_url: "" # URL Zabbix (опционально)
k8s_cluster_grafana_subdomain: "" # Поддомен Grafana для K8S кластеров (опционально)
k8s_cluster_prometheus_subdomain: "" # Поддомен Prometheus для K8S кластеров (опционально)
k8s_cluster_alertmanager_subdomain: "" # Поддомен AlertManager для K8S кластеров (опционально)
otel_enabled: "false" # Включить OpenTelemetry (true/false)
otel_service_name: "monitoring-message-gateway"
otel_exporter_otlp_endpoint: "" # Endpoint OpenTelemetry (опционально)
otel_exporter_otlp_protocol: "http/json"
otel_traces_exporter: "otlp_proto_http"
otel_exporter_otlp_insecure: "true"
otel_python_log_correlation: "false"
groups_admin_password: "" # Пароль для управления группами (опционально)
jira_enabled: "false" # Включить интеграцию с Jira (true/false)
jira_url: "" # URL Jira (опционально)
jira_email: "" # Email пользователя Jira (опционально)
jira_api_token: "" # API Token Jira (опционально)
jira_project_key: "" # Ключ проекта Jira (опционально)
jira_default_assignee: "" # Email исполнителя по умолчанию (опционально)
jira_default_issue_type: "Bug" # Тип задачи по умолчанию
jira_create_on_alert: "true" # Создавать тикет при алерте (true/false)
jira_create_on_resolved: "false" # Создавать тикет при resolved (true/false)
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: message-gateway
namespace: message-gateway
labels:
app: message-gateway
spec:
replicas: 1
selector:
matchLabels:
app: message-gateway
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
name: message-gateway
labels:
app: message-gateway
spec:
imagePullSecrets:
- name: cismharbor
nodeSelector:
gpushare: "false" # Нода с ГПУ (false/true)
nodestate: "working" # Состояние ноды (working/new)
containers:
- name: message-gateway
image: hub.cism-ms.ru/library/message-gateway:v0.2.0
imagePullPolicy: "Always"
ports:
- containerPort: 8000
env:
- name: TELEGRAM_BOT_TOKEN
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: telegram_bot_token
- name: GRAFANA_URL
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: grafana_url
optional: true
- name: ZABBIX_URL
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: zabbix_url
optional: true
- name: K8S_CLUSTER_GRAFANA_SUBDOMAIN
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: k8s_cluster_grafana_subdomain
optional: true
- name: K8S_CLUSTER_PROMETHEUS_SUBDOMAIN
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: k8s_cluster_prometheus_subdomain
optional: true
- name: K8S_CLUSTER_ALERTMANAGER_SUBDOMAIN
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: k8s_cluster_alertmanager_subdomain
optional: true
- name: PUSHGATEWAY_URL
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: pushgateway_url
optional: true
- name: PUSHGATEWAY_JOB
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: pushgateway_job
optional: true
- name: OTEL_ENABLED
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: otel_enabled
optional: true
- name: OTEL_SERVICE_NAME
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: otel_service_name
optional: true
- name: OTEL_EXPORTER_OTLP_ENDPOINT
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: otel_exporter_otlp_endpoint
optional: true
- name: OTEL_EXPORTER_OTLP_PROTOCOL
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: otel_exporter_otlp_protocol
optional: true
- name: OTEL_TRACES_EXPORTER
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: otel_traces_exporter
optional: true
- name: OTEL_EXPORTER_OTLP_INSECURE
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: otel_exporter_otlp_insecure
optional: true
- name: OTEL_PYTHON_LOG_CORRELATION
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: otel_python_log_correlation
optional: true
- name: GROUPS_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: groups_admin_password
optional: true
- name: JIRA_ENABLED
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_enabled
optional: true
- name: JIRA_URL
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_url
optional: true
- name: JIRA_EMAIL
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_email
optional: true
- name: JIRA_API_TOKEN
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_api_token
optional: true
- name: JIRA_PROJECT_KEY
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_project_key
optional: true
- name: JIRA_DEFAULT_ASSIGNEE
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_default_assignee
optional: true
- name: JIRA_DEFAULT_ISSUE_TYPE
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_default_issue_type
optional: true
- name: JIRA_CREATE_ON_ALERT
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_create_on_alert
optional: true
- name: JIRA_CREATE_ON_RESOLVED
valueFrom:
secretKeyRef:
name: message-gateway-secret
key: jira_create_on_resolved
optional: true
# Liveness проба
livenessProbe:
httpGet:
path: /api/v1/health
port: 8000
initialDelaySeconds: 15
periodSeconds: 30
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
# Readiness проба
readinessProbe:
httpGet:
path: /api/v1/health/ready
port: 8000
initialDelaySeconds: 10
periodSeconds: 10
timeoutSeconds: 5
successThreshold: 1
failureThreshold: 3
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256Mi
volumeMounts:
- name: groups-conf
mountPath: /app/config/groups.json
subPath: groups.json
readOnly: true
- name: jira-mapping-conf
mountPath: /app/config/jira_mapping.json
subPath: jira_mapping.json
readOnly: true
volumes:
- name: groups-conf
configMap:
name: message-gateway-groups-configmap
- name: jira-mapping-conf
configMap:
name: message-gateway-jira-mapping-configmap
optional: true
---
apiVersion: v1
kind: ConfigMap
metadata:
name: message-gateway-groups-configmap
namespace: message-gateway
data:
groups.json: |
{
"kubernetes": -1002108349725,
"monitoring": -1001997464975,
"oldmonitoring": -1001469966749
}
---
apiVersion: v1
kind: ConfigMap
metadata:
name: message-gateway-jira-mapping-configmap
namespace: message-gateway
data:
jira_mapping.json: |
{
"alertmanager": {
"default_project": "MON",
"mappings": []
},
"grafana": {
"default_project": "MON",
"mappings": []
},
"zabbix": {
"default_project": "MON",
"mappings": []
}
}
---
apiVersion: v1
kind: Service
metadata:
name: message-gateway-service
namespace: message-gateway
labels:
app: message-gateway
spec:
type: ClusterIP
selector:
app: message-gateway
ports:
- protocol: TCP
port: 8000
targetPort: 8000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: message-gateway-ingress
namespace: message-gateway
spec:
tls:
- hosts:
- monitoring.cism-ms.ru
secretName: ru-cism-kube-certs
rules:
- host: "monitoring.cism-ms.ru"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: message-gateway-service
port:
number: 8000