From 8e595bf7f21d8e3b47a1bea1d88dde76ed8a25a6 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 25 Jan 2026 19:02:46 +0300 Subject: [PATCH 1/5] chore: remove outdated monitoring documentation files - Deleted FIX_PROMLEMS.md and MONITORING_AUTH.md as they contained obsolete information regarding Prometheus and Alertmanager configurations. - This cleanup helps streamline the documentation and focuses on current setup practices. --- .cursor/rules/my-custom-rule.mdc | 409 ++++++++++++++++++++++++ .cursor/rules/release-notes-template.md | 124 +++++++ FIX_PROMLEMS.md | 92 ------ MONITORING_AUTH.md | 127 -------- 4 files changed, 533 insertions(+), 219 deletions(-) create mode 100644 .cursor/rules/my-custom-rule.mdc create mode 100644 .cursor/rules/release-notes-template.md delete mode 100644 FIX_PROMLEMS.md delete mode 100644 MONITORING_AUTH.md diff --git a/.cursor/rules/my-custom-rule.mdc b/.cursor/rules/my-custom-rule.mdc new file mode 100644 index 0000000..555b9e8 --- /dev/null +++ b/.cursor/rules/my-custom-rule.mdc @@ -0,0 +1,409 @@ +--- +name: prod-project-rules +description: Правила работы с проектом prod - инфраструктура, боты, CI/CD +--- + +# Правила работы с проектом prod + +## 📋 Обзор проекта + +**prod** — проект для управления Telegram ботами и мониторинга инфраструктуры в продакшене. + +### Основные компоненты: +- **Инфраструктура мониторинга**: Prometheus, Grafana, Alertmanager, Uptime Kuma +- **Telegram боты**: telegram-helper-bot, AnonBot (в отдельных поддиректориях) +- **CI/CD**: GitHub Actions с автоматическим тестированием, созданием PR и деплоем +- **Контейнеризация**: Docker Compose для оркестрации сервисов + +--- + +## 🌿 Работа с ветками и Git + +### Структура веток: +- **`main`** — продакшен ветка, защищена, только через PR +- **`develop`** — ветка разработки (опционально) +- **`dev-*`** — ветки для разработки (например, `dev-4`) +- **`feature/**`** — ветки для новых фич + +### Workflow разработки: + +1. **Создание ветки для разработки:** + ```bash + git checkout -b dev-4 # или feature/my-feature + ``` + +2. **Перед коммитом - проверка качества кода:** + ```bash + make code-quality # Проверяет форматирование, импорты, линтинг + # Или автоматически исправить: + make format # Исправить форматирование + make import-fix # Исправить сортировку импортов + ``` + +3. **Коммит и пуш:** + ```bash + git add . + git commit -m "feat: описание изменений" + git push -u origin dev-4 + ``` + +4. **Автоматические действия после push:** + - ✅ Запускаются тесты (Black, isort, flake8, pytest) + - ✅ При успешных тестах автоматически создается/обновляется PR в `main` + - ✅ Отправляется уведомление в Telegram + +5. **После мержа PR в `main`:** + - ✅ Автоматически запускается деплой в продакшен (`deploy.yml`) + - ✅ Проверяются токены ботов + - ✅ Выполняется деплой на сервер + - ✅ Запускаются health checks и smoke tests + - ✅ При падении smoke tests — автоматический rollback + +--- + +## 🎨 Стандарты кода + +### Форматирование (Black): +- **Обязательно**: Все Python файлы должны быть отформатированы через Black +- **Проверка**: `make format-check` или `black --check .` +- **Исправление**: `make format` или `black .` +- **Правила**: + - Двойные кавычки `"` вместо одинарных `'` + - 2 пустые строки между импортами и определениями функций/классов + - Автоматический перенос длинных строк + +### Сортировка импортов (isort): +- **Обязательно**: Импорты должны быть отсортированы +- **Проверка**: `make import-check` или `isort --check-only .` +- **Исправление**: `make import-fix` или `isort .` +- **Порядок**: стандартная библиотека → сторонние → локальные + +### Линтинг (flake8): +- **Критические ошибки** (E9, F63, F7, F82) — блокируют пайплайн +- **Предупреждения** (F821, F822, F824) — игнорируются в CI +- **Проверка**: `make lint-check` +- **Исключения**: `.venv`, `venv`, `__pycache__`, `.git` + +### Перед коммитом: +```bash +make code-quality # Проверяет всё сразу +``` + +--- + +## 🧪 Тестирование + +### Структура тестов: +- **`tests/`** — тесты инфраструктуры проекта +- **`bots/*/tests/`** — тесты ботов (в их репозиториях) + +### Запуск тестов: +```bash +make test # Все тесты +make test-infra # Только тесты инфраструктуры +make test-coverage # С отчетом о покрытии +make test-clean # Очистить кэш и отчеты +``` + +### Конфигурация pytest: +- Файл: `pytest.ini` в корне проекта +- Автоматическое обнаружение тестов в `tests/` +- Маркеры: `slow`, `integration`, `unit` +- Asyncio режим: автоматический + +### Правила написания тестов: +- Используй описательные имена: `test_prometheus_config_is_valid` +- Группируй связанные тесты в классы +- Используй фикстуры для общих setup/teardown +- Тесты должны быть независимыми и идемпотентными + +--- + +## 🐳 Docker и контейнеризация + +### Структура: +- **`docker-compose.yml`** — основной файл оркестрации +- **`Dockerfile`** — базовый образ (если нужен) +- **`bots/*/Dockerfile`** — Dockerfile для каждого бота + +### Сервисы в docker-compose: +- `prometheus` — сбор метрик (порт 9090) +- `grafana` — дашборды (порт 3000) +- `alertmanager` — управление алертами (порт 9093) +- `uptime-kuma` — мониторинг доступности (порт 3001) +- `telegram-bot` — Telegram Helper Bot (порт 8080) +- `anon-bot` — AnonBot (порт 8081) + +### Команды: +```bash +make build # Собрать все контейнеры +make up # Запустить все сервисы +make down # Остановить все сервисы +make restart # Перезапустить все сервисы +make logs # Логи всех сервисов +make logs-bot # Логи Telegram бота +``` + +### Важные правила: +- **Токены ботов**: Используются из GitHub Secrets через переменные окружения +- **Формат**: `TELEGRAM_BOT_TOKEN=${TELEGRAM_BOT_TOKEN:-${BOT_TOKEN}}` (Secrets имеют приоритет) +- **Build**: Используй `docker-compose build --pull` (не `--no-cache`) для оптимизации +- **Graceful shutdown**: `docker-compose down -t 30` для корректного завершения + +--- + +## 🔐 Безопасность и секреты + +### GitHub Secrets (обязательные): +- `TELEGRAM_BOT_TOKEN` — токен Telegram Helper Bot +- `TELEGRAM_TEST_BOT_TOKEN` — токен тестового бота (опционально) +- `ANON_BOT_TOKEN` — токен AnonBot +- `SSH_PRIVATE_KEY` — приватный ключ для SSH доступа к серверу +- `SERVER_HOST`, `SERVER_USER`, `SSH_PORT` — данные сервера +- `TELEGRAM_CHAT_ID` — ID чата для уведомлений + +### Локальная разработка: +- Используй `.env` файлы для локальных переменных +- `.env` файлы в `.gitignore` — никогда не коммить! +- Токены из Secrets имеют приоритет над `.env` в продакшене + +### Правила: +- ❌ **НЕ коммить** токены, пароли, секреты +- ❌ **НЕ коммить** `.env` файлы +- ✅ Используй `env.template` как шаблон +- ✅ Все секреты храни в GitHub Secrets + +--- + +## 🚀 CI/CD Pipeline + +### Два основных workflow: + +#### 1. `pipeline.yml` (CI): +- **Триггер**: Push в `main`, `develop`, `dev-*`, `feature/**` +- **Jobs**: + - `test` — проверка качества кода и тесты + - `create-pr` — автоматическое создание/обновление PR (только для `dev-*` и `feature/**`) + - `rollback` — ручной откат через `workflow_dispatch` + +#### 2. `deploy.yml` (CD): +- **Триггер**: Мерж PR в `main` +- **Jobs**: + - `deploy` — деплой на сервер + - `smoke-tests` — проверка работоспособности ботов + - `auto-rollback` — автоматический откат при падении smoke tests + +### Правила работы с пайплайном: + +1. **Перед push** — всегда запускай `make code-quality` локально +2. **После успешных тестов** — PR создастся/обновится автоматически +3. **После мержа PR** — деплой запустится автоматически +4. **При проблемах** — используй manual rollback через Actions → Run workflow + +--- + +## 📁 Структура проекта + +``` +prod/ +├── .github/workflows/ # CI/CD пайплайны +│ ├── pipeline.yml # CI: тесты, создание PR +│ └── deploy.yml # CD: деплой, smoke tests, rollback +├── bots/ # Директория для ботов (submodules) +│ ├── telegram-helper-bot/ # Telegram Helper Bot +│ └── AnonBot/ # AnonBot +├── infra/ # Инфраструктура +│ ├── prometheus/ # Конфигурация Prometheus +│ ├── grafana/ # Дашборды и provisioning Grafana +│ ├── alertmanager/ # Конфигурация Alertmanager +│ ├── nginx/ # Nginx конфигурация +│ └── ansible/ # Ansible playbooks +├── scripts/ # Скрипты развертывания +├── tests/ # Тесты инфраструктуры +│ └── infra/ # Тесты инфраструктуры +├── docker-compose.yml # Docker Compose конфигурация +├── Makefile # Команды для управления проектом +├── pytest.ini # Конфигурация pytest +└── README.md # Документация проекта +``` + +### Важные файлы: +- **`docker-compose.yml`** — основная конфигурация сервисов +- **`Makefile`** — команды для разработки и управления +- **`pytest.ini`** — конфигурация тестов +- **`.gitignore`** — исключает `.env`, `.venv`, логи, кэш + +--- + +## 🔧 Разработка + +### Локальная настройка: + +1. **Клонирование и настройка:** + ```bash + git clone + cd prod + cp env.template .env + # Отредактируй .env с локальными значениями + ``` + +2. **Установка зависимостей:** + ```bash + python3 -m venv .venv + source .venv/bin/activate + pip install black isort flake8 pytest + ``` + +3. **Проверка перед коммитом:** + ```bash + make code-quality + ``` + +### Работа с ботами: + +- Боты находятся в `bots/` как отдельные репозитории (submodules или клоны) +- Каждый бот имеет свой Dockerfile +- Токены ботов передаются через environment variables в docker-compose + +--- + +## 📝 Коммиты и PR + +### Формат коммитов: +Используй понятные сообщения: +``` +feat: добавлена функция X +fix: исправлена ошибка Y +chore: обновлены зависимости +docs: обновлена документация +refactor: рефакторинг модуля Z +``` + +### Pull Request: +- **Автоматическое создание**: Для веток `dev-*` и `feature/**` после успешных тестов +- **Обновление**: PR автоматически обновляется при новых коммитах в той же ветке +- **Мерж**: После мержа в `main` запускается автоматический деплой + +--- + +## 🚨 Деплой и Rollback + +### Автоматический деплой: +1. Мерж PR в `main` → запуск `deploy.yml` +2. Валидация токенов ботов +3. Деплой на сервер (SSH) +4. Пересборка контейнеров с `--pull` +5. Health checks с экспоненциальным retry +6. Smoke tests (отправка сообщений в Telegram) +7. При успехе — обновление истории деплоев + +### Автоматический rollback: +- Срабатывает при падении smoke tests +- Откатывается к последнему успешному коммиту из истории +- Пересобираются контейнеры +- Проверяются health checks + +### Ручной rollback: +- Actions → CI & CD pipeline → Run workflow +- Выбери `rollback` и опционально укажи commit hash +- Если commit не указан — используется последний успешный деплой + +--- + +## 🛠️ Полезные команды Makefile + +### Качество кода: +```bash +make code-quality # Все проверки (Black, isort, flake8) +make format # Автоисправление форматирования +make import-fix # Автоисправление импортов +make format-diff # Показать что будет изменено +``` + +### Docker: +```bash +make build # Собрать контейнеры +make up # Запустить сервисы +make down # Остановить сервисы +make restart # Перезапустить +make logs # Логи всех сервисов +make logs-bot # Логи бота +``` + +### Тестирование: +```bash +make test # Все тесты +make test-infra # Тесты инфраструктуры +make test-coverage # С покрытием +make test-clean # Очистить кэш +``` + +### Мониторинг: +```bash +make monitoring # Открыть Grafana +make prometheus # Открыть Prometheus +make status # Статус контейнеров +make health # Health checks +``` + +--- + +## ⚠️ Важные замечания + +### НЕ делай: +- ❌ Коммить `.env` файлы с секретами +- ❌ Коммить токены ботов в код +- ❌ Использовать `docker-compose build --no-cache` без необходимости +- ❌ Пуш в `main` напрямую (только через PR) +- ❌ Игнорировать ошибки форматирования перед коммитом + +### Всегда делай: +- ✅ Запускай `make code-quality` перед коммитом +- ✅ Используй ветки `dev-*` или `feature/**` для разработки +- ✅ Проверяй, что тесты проходят локально +- ✅ Используй GitHub Secrets для токенов в продакшене +- ✅ Проверяй логи после деплоя + +--- + +## 📚 Дополнительные ресурсы + +- **README.md** — основная документация проекта +- **`.cursor/rules/release-notes-template.md`** — шаблон для Release Notes +- **`pytest.ini`** — конфигурация тестов +- **`Makefile`** — все доступные команды (`make help`) + +--- + +## 🔄 Workflow схема + +``` +1. Создание ветки (dev-* или feature/**) + ↓ +2. Разработка + локальные тесты (make code-quality) + ↓ +3. Git commit + push + ↓ +4. GitHub Actions: автоматические тесты + ↓ +5. При успехе: автоматическое создание/обновление PR + ↓ +6. Ручной review и мерж PR в main + ↓ +7. GitHub Actions: автоматический деплой + ↓ +8. Health checks + Smoke tests + ↓ +9. При успехе: ✅ Деплой завершен + При падении: 🔄 Автоматический rollback +``` + +--- + +## 💡 Советы + +1. **Используй Makefile** — все команды там, не запоминай длинные команды +2. **Проверяй локально** — запускай `make code-quality` перед каждым коммитом +3. **Следи за уведомлениями** — Telegram уведомления показывают статус деплоя +4. **Используй правильные ветки** — `dev-*` для автоматического создания PR +5. **Читай логи** — при проблемах смотри логи в GitHub Actions и на сервере diff --git a/.cursor/rules/release-notes-template.md b/.cursor/rules/release-notes-template.md new file mode 100644 index 0000000..ebde57e --- /dev/null +++ b/.cursor/rules/release-notes-template.md @@ -0,0 +1,124 @@ +# Инструкция по оформлению Release Notes + +## Назначение +Этот документ описывает структуру и формат для создания файлов Release Notes (например, `docs/RELEASE_NOTES_DEV-XX.md`). + +## Структура документа + +### 1. Заголовок +```markdown +# Release Notes: [название-ветки] +``` + +### 2. Обзор +Краткий абзац (1-2 предложения), описывающий: +- Количество коммитов в ветке +- Основные направления изменений + +**Формат:** +```markdown +## Обзор +Ветка [название] содержит [N] коммитов с ключевыми улучшениями: [краткое перечисление основных изменений]. +``` + +### 3. Ключевые изменения +Основной раздел с пронумерованными подразделами для каждого значимого изменения. + +**Структура каждого подраздела:** +```markdown +### [Номер]. [Название изменения] + +**Коммит:** `[hash]` + +**Что сделано:** +- [Краткое описание изменения 1] +- [Краткое описание изменения 2] +- [Краткое описание изменения 3] +``` + +**Правила:** +- Каждое изменение = отдельный подраздел +- Название должно быть кратким и понятным +- В разделе "Что сделано" используй маркированные списки +- НЕ перечисляй затронутые файлы +- НЕ указывай статистику строк кода +- Фокусируйся на сути изменений, а не на технических деталях +- Разделяй подразделы горизонтальной линией `---` + +### 4. Основные достижения +Раздел с чекбоксами, подводящий итоги релиза. + +**Формат:** +```markdown +## 🎯 Основные достижения + +✅ [Достижение 1] +✅ [Достижение 2] +✅ [Достижение 3] +``` + +**Правила:** +- Используй эмодзи ✅ для каждого достижения +- Каждое достижение на отдельной строке +- Краткие формулировки (3-5 слов) +- Фокусируйся на ключевых фичах и улучшениях + +### 5. Временная шкала разработки +Раздел с информацией о сроках разработки. + +**Формат:** +```markdown +## 📅 Временная шкала разработки + +**Последние изменения:** [дата] +**Основная разработка:** [период] +**Предыдущие улучшения:** [контекст предыдущих веток/изменений] + +**Хронология коммитов:** +- `[hash]` - [дата и время] - [краткое описание] +- `[hash]` - [дата и время] - [краткое описание] +``` + +**Правила:** +- Используй реальные даты из коммитов +- Формат даты: "DD месяц YYYY" (например, "25 января 2026") +- Для времени используй формат "HH:MM" +- Хронология должна быть в хронологическом порядке (от старых к новым) + +## Стиль написания + +### Общие правила: +- **Краткость**: Фокусируйся на сути, избегай избыточных деталей +- **Ясность**: Используй простые и понятные формулировки +- **Структурированность**: Информация должна быть легко читаемой и сканируемой +- **Без технических деталей**: Не перечисляй файлы, классы, методы (только если это ключевая фича) +- **Без статистики**: Не указывай количество строк кода, файлов и т.д. + +### Язык: +- Используй прошедшее время для описания изменений ("Добавлена", "Реализована", "Обновлена") +- Избегай технического жаргона, если это не необходимо +- Используй активный залог + +### Эмодзи: +- 🔥 для раздела "Ключевые изменения" +- 🎯 для раздела "Основные достижения" +- 📅 для раздела "Временная шкала разработки" +- ✅ для чекбоксов достижений + +## Пример использования + +При создании Release Notes для новой ветки: + +1. Получи список коммитов: `git log [base-branch]..[target-branch] --oneline` +2. Для каждого значимого коммита создай подраздел в "Ключевые изменения" +3. Собери основные достижения в раздел "Основные достижения" +4. Добавь временную шкалу с реальными датами коммитов +5. Проверь, что документ следует структуре и стилю + +## Важные замечания + +- **НЕ включай** информацию о коммитах, которые уже были в базовой ветке (master/main) +- **НЕ перечисляй** все файлы, которые были изменены +- **НЕ указывай** статистику строк кода +- **Фокусируйся** на функциональных изменениях, а не на технических деталях реализации +- Используй **реальные даты** из коммитов, а не предполагаемые diff --git a/FIX_PROMLEMS.md b/FIX_PROMLEMS.md deleted file mode 100644 index 1e11e0a..0000000 --- a/FIX_PROMLEMS.md +++ /dev/null @@ -1,92 +0,0 @@ -# FIX_PROBLEMS.md - -## Текущий статус Prometheus - -### ✅ Что работает: -- Prometheus доступен по `https://188.68.223.37/prometheus/` -- Nginx проксирование настроено правильно -- Другие таргеты работают (Node Exporter, боты) -- Grafana работает по `https://188.68.223.37/grafana/` - -### ❌ Что не работает: - -#### 1. Самомониторинг Prometheus -- **Статус:** `"health":"down"` с ошибкой 404 -- **Проблема:** Prometheus не может получить доступ к своим метрикам по `/metrics` -- **Ошибка:** `"server returned HTTP status 404 Not Found"` -- **Причина:** Prometheus не экспортирует метрики по эндпоинту `/metrics` внутри контейнера - -#### 2. Редирект в Prometheus -- **Проблема:** Редирект с `https://188.68.223.37/prometheus/` на `https://188.68.223.37/prometheus/prometheus/query` -- **Причина:** Неправильная конфигурация Nginx proxy_pass -- **Статус:** ТРЕБУЕТ ИСПРАВЛЕНИЯ - -### 🔧 Быстрые исправления: - -#### Исправление редиректа Prometheus: -Проблема в конфигурации Nginx - нужно убрать слэш в `proxy_pass`: -```nginx -# Было: -proxy_pass http://prometheus_backend/; - -# Должно быть: -proxy_pass http://prometheus_backend; -``` - -#### Исправление самомониторинга: -Проблема в том, что Prometheus не экспортирует метрики. Возможные решения: -1. Убрать job 'prometheus' из конфигурации -2. Добавить параметры для экспорта метрик -3. Использовать другой подход для самомониторинга - -### 📋 Следующие шаги: -1. ✅ Исправить редирект Prometheus -2. ❌ Решить проблему с самомониторингом (пропущено) -3. ✅ Исправить главную страницу -4. ✅ Исправить Alertmanager -5. 🔄 Настроить безопасность -6. 🔄 Настроить Uptime Kuma - ---- - -## Этап 5: Настройка безопасности - -### План действий: -1. **Добавить базовую аутентификацию для Prometheus** - - Создать файл с логином/паролем - - Настроить Nginx для запроса аутентификации - - Проверить, что теперь требуется логин/пароль - -2. **Добавить базовую аутентификацию для Alertmanager** - - Создать файл с логином/паролем - - Настроить Nginx для запроса аутентификации - - Проверить, что теперь требуется логин/пароль - -3. **Перезагрузить Nginx** - - Применить новые настройки безопасности - -4. **Проверить, что теперь требуется логин/пароль** - - Убедиться, что Prometheus и Alertmanager защищены - -**Цель:** Сейчас Prometheus и Alertmanager доступны без аутентификации, что небезопасно. Нужно добавить базовую HTTP аутентификацию. - ---- - -## Этап 6: Настройка Uptime Kuma - -### План действий: -1. **Проверить статус Uptime Kuma** - - Убедиться, что контейнер запущен - - Проверить логи на наличие ошибок - -2. **Настроить мониторинг основных сервисов** - - Добавить мониторинг Grafana - - Добавить мониторинг Prometheus - - Добавить мониторинг Alertmanager - - Добавить мониторинг ботов - -3. **Проверить доступность `/status/`** - - Убедиться, что страница работает - - Проверить отображение статуса сервисов - -**Цель:** Uptime Kuma должен показывать статус всех сервисов и их доступность. diff --git a/MONITORING_AUTH.md b/MONITORING_AUTH.md deleted file mode 100644 index 4810e49..0000000 --- a/MONITORING_AUTH.md +++ /dev/null @@ -1,127 +0,0 @@ -# 🔐 Авторизация для мониторинга - -## Что было добавлено - -Добавлена HTTP Basic Authentication для следующих сервисов мониторинга: - -- **Prometheus** (`/prometheus/`) - метрики и мониторинг -- **Alertmanager** (`/alerts/` и `/api/v1/`) - управление алертами - -## Быстрый старт - -### 1. Автоматическая настройка через Ansible - -```bash -# Развертывание с паролями по умолчанию -ansible-playbook -i infra/ansible/inventory.ini infra/ansible/playbook.yml - -# Развертывание с кастомными паролями -ansible-playbook -i infra/ansible/inventory.ini infra/ansible/playbook.yml \ - -e monitoring_username=myuser \ - -e monitoring_password=mypassword -``` - -### 2. Ручная настройка - -```bash -# Настроить авторизацию -make auth-setup - -# Добавить пользователя -make auth-add-user USER=admin - -# Добавить еще одного пользователя -make auth-add-user USER=operator -``` - -## Управление пользователями - -### Добавление пользователя -```bash -make auth-add-user USER=username -``` - -### Сброс пароля -```bash -make auth-reset USER=username -``` - -### Просмотр пользователей -```bash -make auth-list -``` - -## Доступ к сервисам - -После настройки авторизации: - -- **Prometheus**: `https://your-server/prometheus/` -- **Alertmanager**: `https://your-server/alerts/` -- **Alertmanager API**: `https://your-server/api/v1/` - -При первом обращении браузер запросит логин и пароль. - -## Health Check endpoints - -Следующие endpoints остаются доступными без авторизации: - -- `https://your-server/prometheus/-/healthy` - проверка состояния Prometheus -- `https://your-server/nginx-health` - проверка состояния nginx - -## Файлы конфигурации - -### Nginx конфигурации -- `infra/nginx/conf.d/prometheus.conf` - авторизация для Prometheus -- `infra/nginx/conf.d/alertmanager.conf` - авторизация для Alertmanager - -### Ansible -- `infra/ansible/playbook.yml` - автоматическая настройка авторизации -- `infra/ansible/group_vars/all.yml` - переменные по умолчанию - -### Скрипты -- `scripts/generate_auth_passwords.sh` - генерация паролей -- `infra/nginx/AUTH_SETUP.md` - подробная документация - -## Безопасность - -- Пароли хранятся в зашифрованном виде в `/etc/nginx/passwords/monitoring.htpasswd` -- Файл доступен только для чтения пользователю root и группе www-data -- Используется HTTPS для всех соединений -- Настроена защита от брутфорса через fail2ban - -## Устранение проблем - -### Проверка конфигурации nginx -```bash -sudo nginx -t -``` - -### Проверка файла паролей -```bash -make auth-list -``` - -### Проверка логов -```bash -sudo tail -f /var/log/nginx/error.log -sudo tail -f /var/log/nginx/access.log -``` - -### Перезапуск nginx -```bash -sudo systemctl reload nginx -``` - -## Переменные Ansible - -В файле `infra/ansible/group_vars/all.yml`: - -```yaml -monitoring_username: "admin" # Имя пользователя по умолчанию -monitoring_password: "admin123" # Пароль по умолчанию -``` - -Можно переопределить через: -- Переменные окружения -- `--extra-vars` в ansible-playbook -- Vault файлы для безопасного хранения паролей From 5e57e5214c2f0d72916ef0d067a1a5dfd2751ba4 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 25 Jan 2026 19:08:24 +0300 Subject: [PATCH 2/5] some fix CI --- .github/workflows/pipeline.yml | 117 ++++++++++++++++++++------------- 1 file changed, 73 insertions(+), 44 deletions(-) diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 732bd8a..6fb3bdc 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -91,21 +91,21 @@ jobs: htmlcov/ retention-days: 7 - - name: Send test results notification - if: always() + - name: Send test failure notification + if: failure() uses: appleboy/telegram-action@v1.0.0 with: to: ${{ secrets.TELEGRAM_CHAT_ID }} token: ${{ secrets.TELEGRAM_BOT_TOKEN }} message: | - ${{ job.status == 'success' && '✅' || '❌' }} CI Tests: ${{ job.status }} + ❌ CI Tests Failed 📦 Repository: prod 🌿 Branch: ${{ github.ref_name }} 📝 Commit: ${{ github.sha }} 👤 Author: ${{ github.actor }} - ${{ job.status == 'success' && '✅ All tests passed! Pull request will be created.' || '❌ Tests failed! Deployment blocked.' }} + ❌ Tests failed! Deployment blocked. Please fix the issues and try again. 🔗 View details: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} continue-on-error: true @@ -174,49 +174,78 @@ jobs: - name: Create Pull Request if: steps.check-pr.outputs.exists == 'false' id: create-pr - uses: peter-evans/create-pull-request@v5 - with: - token: ${{ secrets.GITHUB_TOKEN }} - branch: ${{ github.ref_name }} - base: main - title: "Merge ${{ github.ref_name }} into main" - body: | - ## Changes - - This PR was automatically created after successful CI tests. - - - Branch: `${{ github.ref_name }}` - - Commit: `${{ github.sha }}` - - Author: @${{ github.actor }} - - ## Test Results - - ✅ All tests passed successfully! - - Please review the changes and merge when ready. - labels: | - automated - ready-for-review - draft: false - - - name: Get created PR number - if: steps.check-pr.outputs.exists == 'false' && steps.create-pr.outcome == 'success' - id: get-pr-number uses: actions/github-script@v6 with: script: | const branchName = context.ref.replace('refs/heads/', ''); - const { data: prs } = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - head: `${context.repo.owner}:${branchName}`, - base: 'main', - state: 'open' - }); - if (prs.length > 0) { - core.setOutput('number', prs[0].number); - core.setOutput('url', prs[0].html_url); + console.log(`📝 Creating PR from ${branchName} to main...`); + + try { + const { data: pr } = await github.rest.pulls.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title: `Merge ${branchName} into main`, + head: branchName, + base: 'main', + body: `## Changes + +This PR was automatically created after successful CI tests. + +- Branch: \`${branchName}\` +- Commit: \`${{ github.sha }}\` +- Author: @${{ github.actor }} + +## Test Results + +✅ All tests passed successfully! + +Please review the changes and merge when ready.`, + draft: false + }); + + // Добавляем labels + try { + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: pr.number, + labels: ['automated', 'ready-for-review'] + }); + } catch (labelError) { + console.log(`⚠️ Could not add labels: ${labelError.message}`); + } + + core.setOutput('number', pr.number.toString()); + core.setOutput('url', pr.html_url); + console.log(`✅ PR #${pr.number} created successfully: ${pr.html_url}`); + + } catch (error) { + console.error(`❌ Failed to create PR: ${error.message}`); + if (error.status === 422) { + console.log('⚠️ PR might already exist or branch is up to date with base'); + // Пробуем найти существующий PR + const { data: prs } = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + head: `${context.repo.owner}:${branchName}`, + base: 'main', + state: 'open' + }); + + if (prs.length > 0) { + const pr = prs[0]; + core.setOutput('number', pr.number.toString()); + core.setOutput('url', pr.html_url); + console.log(`✅ Found existing PR #${pr.number}: ${pr.html_url}`); + } else { + core.setOutput('number', ''); + core.setOutput('url', `${{ github.server_url }}/${{ github.repository }}/pulls`); + throw error; + } + } else { + throw error; + } } - name: Send PR notification - PR exists @@ -252,9 +281,9 @@ jobs: 📝 Commit: ${{ github.sha }} 👤 Author: ${{ github.actor }} - ✅ All tests passed! Pull request #${{ steps.get-pr-number.outputs.number }} has been created and is ready for review. + ${{ steps.create-pr.outputs.number != '' && format('✅ All tests passed! Pull request #{0} has been created and is ready for review.', steps.create-pr.outputs.number) || '✅ All tests passed! Pull request has been created and is ready for review.' }} - 🔗 View PR: ${{ steps.get-pr-number.outputs.url }} + ${{ steps.create-pr.outputs.url != '' && format('🔗 View PR: {0}', steps.create-pr.outputs.url) || format('🔗 View PRs: {0}/{1}/pulls', github.server_url, github.repository) }} continue-on-error: true rollback: From 6c51a82dcea909b7e4d90d6945743df9f4d0ef39 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 25 Jan 2026 19:14:07 +0300 Subject: [PATCH 3/5] some fix 2 --- .github/workflows/pipeline.yml | 62 +++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 6fb3bdc..3714185 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -161,15 +161,27 @@ jobs: const prNumber = parseInt('${{ steps.check-pr.outputs.number }}'); const branchName = context.ref.replace('refs/heads/', ''); + const commitSha = '${{ github.sha }}'; + const author = '${{ github.actor }}'; + + const updateBody = '## Updated Changes\n\n' + + 'PR updated with new commits after successful CI tests.\n\n' + + '- Latest commit: ' + commitSha + '\n' + + '- Branch: `' + branchName + '`\n' + + '- Author: @' + author + '\n\n' + + '## Test Results\n\n' + + '✅ All tests passed successfully!\n\n' + + 'Please review the changes and merge when ready.'; + await github.rest.pulls.update({ owner: context.repo.owner, repo: context.repo.repo, pull_number: prNumber, - title: `Merge ${branchName} into main`, - body: `## Updated Changes\n\nPR updated with new commits after successful CI tests.\n\n- Latest commit: ${{ github.sha }}\n- Branch: \`${branchName}\`\n- Author: @${{ github.actor }}\n\n## Test Results\n\n✅ All tests passed successfully!\n\nPlease review the changes and merge when ready.` + title: 'Merge ' + branchName + ' into main', + body: updateBody }); - console.log(`✅ PR #${prNumber} updated successfully`); + console.log('✅ PR #' + prNumber + ' updated successfully'); - name: Create Pull Request if: steps.check-pr.outputs.exists == 'false' @@ -179,28 +191,28 @@ jobs: script: | const branchName = context.ref.replace('refs/heads/', ''); - console.log(`📝 Creating PR from ${branchName} to main...`); + console.log('📝 Creating PR from ' + branchName + ' to main...'); try { + const commitSha = '${{ github.sha }}'; + const author = '${{ github.actor }}'; + + const prBody = '## Changes\n\n' + + 'This PR was automatically created after successful CI tests.\n\n' + + '- Branch: `' + branchName + '`\n' + + '- Commit: `' + commitSha + '`\n' + + '- Author: @' + author + '\n\n' + + '## Test Results\n\n' + + '✅ All tests passed successfully!\n\n' + + 'Please review the changes and merge when ready.'; + const { data: pr } = await github.rest.pulls.create({ owner: context.repo.owner, repo: context.repo.repo, - title: `Merge ${branchName} into main`, + title: 'Merge ' + branchName + ' into main', head: branchName, base: 'main', - body: `## Changes - -This PR was automatically created after successful CI tests. - -- Branch: \`${branchName}\` -- Commit: \`${{ github.sha }}\` -- Author: @${{ github.actor }} - -## Test Results - -✅ All tests passed successfully! - -Please review the changes and merge when ready.`, + body: prBody, draft: false }); @@ -213,22 +225,22 @@ Please review the changes and merge when ready.`, labels: ['automated', 'ready-for-review'] }); } catch (labelError) { - console.log(`⚠️ Could not add labels: ${labelError.message}`); + console.log('⚠️ Could not add labels: ' + labelError.message); } core.setOutput('number', pr.number.toString()); core.setOutput('url', pr.html_url); - console.log(`✅ PR #${pr.number} created successfully: ${pr.html_url}`); + console.log('✅ PR #' + pr.number + ' created successfully: ' + pr.html_url); } catch (error) { - console.error(`❌ Failed to create PR: ${error.message}`); + console.error('❌ Failed to create PR: ' + error.message); if (error.status === 422) { console.log('⚠️ PR might already exist or branch is up to date with base'); // Пробуем найти существующий PR const { data: prs } = await github.rest.pulls.list({ owner: context.repo.owner, repo: context.repo.repo, - head: `${context.repo.owner}:${branchName}`, + head: context.repo.owner + ':' + branchName, base: 'main', state: 'open' }); @@ -237,10 +249,12 @@ Please review the changes and merge when ready.`, const pr = prs[0]; core.setOutput('number', pr.number.toString()); core.setOutput('url', pr.html_url); - console.log(`✅ Found existing PR #${pr.number}: ${pr.html_url}`); + console.log('✅ Found existing PR #' + pr.number + ': ' + pr.html_url); } else { core.setOutput('number', ''); - core.setOutput('url', `${{ github.server_url }}/${{ github.repository }}/pulls`); + const serverUrl = '${{ github.server_url }}'; + const repo = '${{ github.repository }}'; + core.setOutput('url', serverUrl + '/' + repo + '/pulls'); throw error; } } else { From 07982ee0f2eb5b1ece738010d7c18820dc8e1ad1 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 25 Jan 2026 19:24:55 +0300 Subject: [PATCH 4/5] some fix 3 --- .github/workflows/pipeline.yml | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 3714185..9532aa4 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -120,27 +120,32 @@ jobs: github.ref_name != 'main' && github.ref_name != 'develop' && (startsWith(github.ref_name, 'dev-') || startsWith(github.ref_name, 'feature/')) + # Примечание: Для создания PR из той же ветки нужен PAT (Personal Access Token) + # Создайте PAT с правами repo и добавьте в Secrets как PAT permissions: contents: write pull-requests: write + issues: write steps: - name: Checkout code uses: actions/checkout@v4 with: fetch-depth: 0 - token: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} + persist-credentials: true - name: Check if PR already exists id: check-pr uses: actions/github-script@v6 with: + github-token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} script: | const branchName = context.ref.replace('refs/heads/', ''); const { data: prs } = await github.rest.pulls.list({ owner: context.repo.owner, repo: context.repo.repo, - head: `${context.repo.owner}:${branchName}`, + head: context.repo.owner + ':' + branchName, base: 'main', state: 'open' }); @@ -157,6 +162,7 @@ jobs: if: steps.check-pr.outputs.exists == 'true' uses: actions/github-script@v6 with: + github-token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} script: | const prNumber = parseInt('${{ steps.check-pr.outputs.number }}'); const branchName = context.ref.replace('refs/heads/', ''); @@ -188,6 +194,7 @@ jobs: id: create-pr uses: actions/github-script@v6 with: + github-token: ${{ secrets.PAT || secrets.GITHUB_TOKEN }} script: | const branchName = context.ref.replace('refs/heads/', ''); From 60487b5488001f179a24d641b48c2a6b614804b8 Mon Sep 17 00:00:00 2001 From: Andrey Date: Sun, 25 Jan 2026 19:51:23 +0300 Subject: [PATCH 5/5] some fix agaaain --- .github/workflows/pipeline.yml | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 9532aa4..be698e9 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -3,8 +3,6 @@ name: CI & CD pipeline on: push: branches: [ main, 'develop', 'dev-*', 'feature/**' ] - pull_request: - branches: [ main, develop ] workflow_dispatch: inputs: action: @@ -68,18 +66,6 @@ jobs: run: | python -m pytest tests/infra/test_prometheus_config.py -v - - name: Check for merge conflicts - if: github.event_name == 'pull_request' - run: | - echo "🔍 Checking for merge conflicts..." - git fetch origin main - if ! git merge --no-commit --no-ff origin/main; then - echo "❌ Merge conflicts detected!" - git merge --abort || true - exit 1 - fi - git merge --abort || true - echo "✅ No merge conflicts detected" - name: Upload test results if: always()