395 lines
19 KiB
Makefile
395 lines
19 KiB
Makefile
.PHONY: help build up down logs clean restart status deploy backup restore update clean-monitoring monitoring check-deps check-bot-deps check-anonBot-deps auth-setup auth-add-user auth-reset format-check format format-diff import-check import-fix lint-check code-quality
|
||
|
||
help: ## Показать справку
|
||
@echo "🏗️ Production Infrastructure - Доступные команды:"
|
||
@echo ""
|
||
@echo "🔧 Основные команды:"
|
||
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-20s\033[0m %s\n", $$1, $$2}'
|
||
@echo ""
|
||
@echo "📊 Мониторинг:"
|
||
@echo " Prometheus: http://localhost:9090"
|
||
@echo " Grafana: http://localhost:3000 (admin/admin)"
|
||
@echo " Uptime Kuma: http://localhost:3001"
|
||
@echo " Alertmanager: http://localhost:9093"
|
||
@echo " Server Monitor: http://localhost:9091/health"
|
||
@echo " Bot Health: http://localhost:8080/health"
|
||
@echo " AnonBot Health: http://localhost:8081/health"
|
||
|
||
build: ## Собрать все контейнеры
|
||
docker-compose build
|
||
|
||
up: ## Запустить все сервисы
|
||
docker-compose up -d
|
||
|
||
down: ## Остановить все сервисы
|
||
docker-compose down
|
||
|
||
logs: ## Показать логи всех сервисов
|
||
docker-compose logs -f
|
||
|
||
logs-prometheus: ## Показать логи Prometheus
|
||
docker-compose logs -f prometheus
|
||
|
||
logs-grafana: ## Показать логи Grafana
|
||
docker-compose logs -f grafana
|
||
|
||
logs-bot: ## Показать логи Telegram бота
|
||
docker-compose logs -f telegram-bot
|
||
|
||
logs-anonBot: ## Показать логи AnonBot
|
||
docker-compose logs -f anon-bot
|
||
|
||
logs-uptime-kuma: ## Показать логи Uptime Kuma
|
||
docker-compose logs -f uptime-kuma
|
||
|
||
logs-alertmanager: ## Показать логи Alertmanager
|
||
docker-compose logs -f alertmanager
|
||
|
||
restart: ## Перезапустить все сервисы
|
||
docker-compose down
|
||
docker-compose build --no-cache
|
||
docker-compose up -d
|
||
|
||
restart-prometheus: ## Перезапустить только Prometheus
|
||
docker-compose restart prometheus
|
||
|
||
restart-grafana: ## Перезапустить только Grafana
|
||
docker-compose restart grafana
|
||
|
||
restart-bot: ## Перезапустить только Telegram бота
|
||
docker-compose restart telegram-bot
|
||
|
||
restart-anonBot: ## Перезапустить только AnonBot
|
||
docker-compose restart anon-bot
|
||
|
||
restart-uptime-kuma: ## Перезапустить только Uptime Kuma
|
||
docker-compose restart uptime-kuma
|
||
|
||
restart-alertmanager: ## Перезапустить только Alertmanager
|
||
docker-compose restart alertmanager
|
||
|
||
status: ## Показать статус контейнеров
|
||
docker-compose ps
|
||
|
||
health: ## Проверить здоровье сервисов
|
||
@echo "🏥 Checking service health..."
|
||
@curl -f http://localhost:8080/health || echo "❌ Bot health check failed"
|
||
@curl -f http://localhost:8081/health || echo "❌ AnonBot health check failed"
|
||
@curl -f http://localhost:9090/-/healthy || echo "❌ Prometheus health check failed"
|
||
@curl -f http://localhost:3000/api/health || echo "❌ Grafana health check failed"
|
||
@curl -f http://localhost:3001 || echo "❌ Uptime Kuma health check failed"
|
||
@curl -f http://localhost:9093/-/healthy || echo "❌ Alertmanager health check failed"
|
||
@curl -f http://localhost:9091/health || echo "❌ Server monitor health check failed"
|
||
|
||
deploy: ## Полный деплой на продакшен
|
||
@echo "🚀 Starting production deployment..."
|
||
@chmod +x scripts/deploy.sh
|
||
@./scripts/deploy.sh
|
||
|
||
backup: ## Создать backup данных
|
||
@echo "💾 Creating backup..."
|
||
@mkdir -p backups
|
||
@tar -czf "backups/backup-$(date +%Y%m%d-%H%M%S).tar.gz" \
|
||
infra/grafana/provisioning/ \
|
||
infra/prometheus/ \
|
||
.env \
|
||
docker-compose.yml
|
||
@echo "✅ Backup created in backups/"
|
||
|
||
restore: ## Восстановить из backup (указать файл: make restore FILE=backup.tar.gz)
|
||
@echo "🔄 Restoring from backup..."
|
||
@if [ -z "$(FILE)" ]; then echo "❌ Please specify backup file: make restore FILE=backup.tar.gz"; exit 1; fi
|
||
@tar -xzf "backups/$(FILE)" -C .
|
||
@echo "✅ Backup restored"
|
||
|
||
update: ## Обновить инфраструктуру (pull latest code and redeploy)
|
||
@echo "📥 Pulling latest changes..."
|
||
@git pull origin main
|
||
@echo "🔨 Rebuilding and restarting..."
|
||
@make restart
|
||
|
||
clean: ## Очистить все контейнеры и образы
|
||
docker-compose down -v --rmi all
|
||
docker system prune -f
|
||
|
||
clean-monitoring: ## Очистить только данные мониторинга
|
||
docker-compose down -v
|
||
docker volume rm prod_prometheus_data prod_grafana_data prod_uptime_kuma_data prod_alertmanager_data 2>/dev/null || true
|
||
|
||
security-scan: ## Сканировать образы на уязвимости
|
||
@echo "🔍 Scanning Docker images for vulnerabilities..."
|
||
@docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
|
||
-v $(PWD):/workspace \
|
||
--workdir /workspace \
|
||
anchore/grype:latest \
|
||
bots_telegram_bot:latest || echo "⚠️ Grype not available, skipping scan"
|
||
|
||
monitoring: ## Открыть мониторинг в браузере
|
||
@echo "📊 Opening monitoring dashboards..."
|
||
@open http://localhost:3000 || xdg-open http://localhost:3000 || echo "Please open manually: http://localhost:3000"
|
||
|
||
prometheus: ## Открыть Prometheus в браузере
|
||
@echo "📈 Opening Prometheus..."
|
||
@open http://localhost:9090 || xdg-open http://localhost:9090 || echo "Please open manually: http://localhost:9090"
|
||
|
||
start: build up ## Собрать и запустить все сервисы
|
||
@echo "🏗️ Production Infrastructure запущена!"
|
||
@echo "📊 Prometheus: http://localhost:9090"
|
||
@echo "📈 Grafana: http://localhost:3000 (admin/admin)"
|
||
@echo "📊 Uptime Kuma: http://localhost:3001"
|
||
@echo "🚨 Alertmanager: http://localhost:9093"
|
||
@echo "🤖 Bot Health: http://localhost:8080/health"
|
||
@echo "🔒 AnonBot Health: http://localhost:8081/health"
|
||
@echo "📡 Server Monitor: http://localhost:9091/health"
|
||
@echo "📝 Логи: make logs"
|
||
|
||
stop: down ## Остановить все сервисы
|
||
@echo "🛑 Все сервисы остановлены"
|
||
|
||
test: check-deps check-bot-deps check-anonBot-deps ## Запустить все тесты в проекте
|
||
@echo "🧪 Запускаю все тесты в проекте..."
|
||
@echo "📊 Тесты инфраструктуры..."
|
||
@python3 -m pytest tests/infra/ -q --tb=no
|
||
@echo "🤖 Тесты Telegram бота..."
|
||
@cd bots/telegram-helper-bot && source .venv/bin/activate && python3 -m pytest tests/ -q --tb=no
|
||
@echo "🔒 Тесты AnonBot..."
|
||
@cd bots/AnonBot && python3 -m pytest tests/ -q --tb=no
|
||
@echo "✅ Все тесты завершены!"
|
||
@echo "📈 Общая статистика:"
|
||
@echo " - Инфраструктура: $(shell python3 count_tests.py | head -1) тестов"
|
||
@echo " - Telegram бот: $(shell python3 count_tests.py | head -2 | tail -1) тестов"
|
||
@echo " - AnonBot: $(shell python3 count_tests.py | head -3 | tail -1) тестов"
|
||
@echo " - Всего: $(shell python3 count_tests.py | tail -1) тестов"
|
||
|
||
test-all: ## Запустить все тесты в одном процессе (только для разработчиков)
|
||
@echo "🧪 Запускаю все тесты в одном процессе..."
|
||
@echo "⚠️ Примечание: Эта команда может не работать из-за конфликтов импортов"
|
||
@echo "📊 Рекомендуется использовать 'make test' для обычного запуска"
|
||
@PYTHONPATH=$(PWD)/bots/telegram-helper-bot:$(PWD) python3 -m pytest tests/infra/ bots/telegram-helper-bot/tests/ -v
|
||
|
||
test-infra: check-deps ## Запустить тесты инфраструктуры
|
||
@echo "🏗️ Запускаю тесты инфраструктуры..."
|
||
@source .venv/bin/activate && python3 -m pytest tests/infra/ -v
|
||
|
||
test-bot: check-bot-deps ## Запустить тесты Telegram бота
|
||
@echo "🤖 Запускаю тесты Telegram бота..."
|
||
@cd bots/telegram-helper-bot && source .venv/bin/activate && python3 -m pytest tests/ -v
|
||
|
||
test-anonBot: check-anonBot-deps ## Запустить тесты AnonBot
|
||
@echo "🔒 Запускаю тесты AnonBot..."
|
||
@cd bots/AnonBot && python3 -m pytest tests/ -v
|
||
|
||
test-coverage: check-deps check-bot-deps check-anonBot-deps ## Запустить все тесты с отчетом о покрытии
|
||
@echo "📊 Запускаю все тесты с отчетом о покрытии..."
|
||
@echo "📈 Покрытие для инфраструктуры..."
|
||
@python3 -m pytest tests/infra/ --cov=infra --cov-report=term-missing --cov-report=html:htmlcov/infra
|
||
@echo "🤖 Покрытие для Telegram бота..."
|
||
@cd bots/telegram-helper-bot && source .venv/bin/activate && python3 -m pytest tests/ --cov=helper_bot --cov-report=term-missing --cov-report=html:htmlcov/bot
|
||
@echo "🔒 Покрытие для AnonBot..."
|
||
@cd bots/AnonBot && python3 -m pytest tests/ --cov=. --cov-report=term-missing --cov-report=html:htmlcov/anonbot
|
||
@echo "📊 Отчеты о покрытии сохранены в htmlcov/"
|
||
@echo "📈 Общая статистика:"
|
||
@echo " - Инфраструктура: $(shell python3 count_tests.py | head -1) тестов"
|
||
@echo " - Telegram бот: $(shell python3 count_tests.py | head -2 | tail -1) тестов"
|
||
@echo " - AnonBot: $(shell python3 count_tests.py | head -3 | tail -1) тестов"
|
||
@echo " - Всего: $(shell python3 count_tests.py | tail -1) тестов"
|
||
|
||
test-clean: ## Очистить все файлы тестирования и отчеты
|
||
@echo "🧹 Очищаю файлы тестирования..."
|
||
@rm -rf htmlcov/
|
||
@rm -rf .coverage
|
||
@rm -rf .pytest_cache/
|
||
@rm -rf tests/.pytest_cache/
|
||
@rm -rf bots/telegram-helper-bot/.pytest_cache/
|
||
@rm -rf bots/telegram-helper-bot/htmlcov/
|
||
@rm -rf bots/telegram-helper-bot/.coverage
|
||
@rm -rf bots/AnonBot/.pytest_cache/
|
||
@rm -rf bots/AnonBot/htmlcov/
|
||
@rm -rf bots/AnonBot/.coverage
|
||
@find . -name "*.pyc" -delete 2>/dev/null || true
|
||
@find . -name "__pycache__" -type d -exec rm -rf {} + 2>/dev/null || true
|
||
@echo "✅ Файлы тестирования очищены"
|
||
|
||
|
||
check-ports: ## Проверить занятые порты
|
||
@echo "🔍 Checking occupied ports..."
|
||
@echo "Port 3000 (Grafana):"
|
||
@lsof -i :3000 2>/dev/null || echo " Free"
|
||
@echo "Port 9090 (Prometheus):"
|
||
@lsof -i :9090 2>/dev/null || echo " Free"
|
||
@echo "Port 9091 (Server Monitor):"
|
||
@lsof -i :9091 2>/dev/null || echo " Free"
|
||
@echo "Port 8080 (Telegram Bot):"
|
||
@lsof -i :8080 2>/dev/null || echo " Free"
|
||
@echo "Port 8081 (AnonBot):"
|
||
@lsof -i :8081 2>/dev/null || echo " Free"
|
||
|
||
|
||
check-deps: ## Проверить зависимости инфраструктуры
|
||
@echo "🔍 Проверяю зависимости инфраструктуры..."
|
||
@source .venv/bin/activate && python3 -c "import pytest" 2>/dev/null || (echo "❌ Отсутствуют зависимости инфраструктуры. Установите: source .venv/bin/activate && pip install pytest" && exit 1)
|
||
@echo "✅ Зависимости инфраструктуры установлены"
|
||
|
||
check-bot-deps: ## Проверить зависимости Telegram бота
|
||
@echo "🔍 Проверяю зависимости Telegram бота..."
|
||
@cd bots/telegram-helper-bot && source .venv/bin/activate && python3 -c "import aiogram, aiosqlite, pytest" 2>/dev/null || (echo "❌ Отсутствуют зависимости бота. Установите: cd bots/telegram-helper-bot && source .venv/bin/activate && pip install -r requirements.txt" && exit 1)
|
||
@echo "✅ Зависимости Telegram бота установлены"
|
||
|
||
check-anonBot-deps: ## Проверить зависимости AnonBot
|
||
@echo "🔍 Проверяю зависимости AnonBot..."
|
||
@cd bots/AnonBot && python3 -c "import aiogram, aiosqlite, pytest, loguru, pydantic" 2>/dev/null || (echo "❌ Отсутствуют зависимости AnonBot. Установите: cd bots/AnonBot && pip install -r requirements.txt" && exit 1)
|
||
@echo "✅ Зависимости AnonBot установлены"
|
||
|
||
logs-tail: ## Показать последние логи всех сервисов
|
||
@echo "📝 Recent logs from all services:"
|
||
@docker-compose logs --tail=50
|
||
|
||
logs-errors: ## Показать только ошибки из логов
|
||
@echo "❌ Error logs from all services:"
|
||
@docker-compose logs | grep -i error
|
||
|
||
metrics: ## Показать текущие метрики
|
||
@echo "📊 Current metrics:"
|
||
@curl -s http://localhost:9091/metrics | head -20
|
||
@echo "..."
|
||
@echo "Full metrics: http://localhost:9091/metrics"
|
||
|
||
reload-prometheus: ## Перезагрузить конфигурацию Prometheus
|
||
@echo "🔄 Reloading Prometheus configuration..."
|
||
@curl -X POST http://localhost:9090/-/reload
|
||
|
||
reload-grafana: ## Перезагрузить конфигурацию Grafana
|
||
@echo "🔄 Reloading Grafana configuration..."
|
||
@docker-compose restart grafana
|
||
|
||
ssl-setup: ## Настроить SSL сертификаты (самоподписанный)
|
||
@echo "🔒 Setting up self-signed SSL certificates..."
|
||
@if [ -z "$(SERVER_IP)" ]; then echo "❌ Please set SERVER_IP variable in .env file"; exit 1; fi
|
||
@mkdir -p /etc/letsencrypt/live/$(SERVER_IP)
|
||
@openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
|
||
-keyout /etc/letsencrypt/live/$(SERVER_IP)/privkey.pem \
|
||
-out /etc/letsencrypt/live/$(SERVER_IP)/fullchain.pem \
|
||
-subj "/CN=$(SERVER_IP)"
|
||
@echo "✅ Self-signed certificate created for $(SERVER_IP)"
|
||
|
||
ssl-renew: ## Обновить SSL сертификаты
|
||
@echo "🔄 Renewing SSL certificates..."
|
||
@sudo /usr/local/bin/ssl-renewal.sh
|
||
|
||
ssl-status: ## Проверить статус SSL сертификатов
|
||
@echo "🔍 Checking SSL certificate status..."
|
||
@sudo certbot certificates
|
||
|
||
uptime-kuma: ## Открыть Uptime Kuma в браузере
|
||
@echo "📊 Opening Uptime Kuma..."
|
||
@open http://localhost:3001 || xdg-open http://localhost:3001 || echo "Please open manually: http://localhost:3001"
|
||
|
||
alertmanager: ## Открыть Alertmanager в браузере
|
||
@echo "🚨 Opening Alertmanager..."
|
||
@open http://localhost:9093 || xdg-open http://localhost:9093 || echo "Please open manually: http://localhost:9093"
|
||
|
||
monitoring-all: ## Открыть все мониторинг сервисы
|
||
@echo "📊 Opening all monitoring services..."
|
||
@echo " - Grafana: http://localhost:3000"
|
||
@echo " - Prometheus: http://localhost:9090"
|
||
@echo " - Uptime Kuma: http://localhost:3001"
|
||
@echo " - Alertmanager: http://localhost:9093"
|
||
@open http://localhost:3000 || xdg-open http://localhost:3000 || echo "Please open manually"
|
||
|
||
# ========================================
|
||
# 🔐 АВТОРИЗАЦИЯ МОНИТОРИНГА
|
||
# ========================================
|
||
|
||
auth-setup: ## Настроить авторизацию для мониторинга
|
||
@echo "🔐 Setting up monitoring authentication..."
|
||
@sudo mkdir -p /etc/nginx/passwords
|
||
@sudo cp scripts/generate_auth_passwords.sh /usr/local/bin/generate_auth_passwords.sh
|
||
@sudo chmod +x /usr/local/bin/generate_auth_passwords.sh
|
||
@echo "✅ Authentication setup complete!"
|
||
@echo "💡 Use 'make auth-add-user' to add users"
|
||
|
||
auth-add-user: ## Добавить пользователя для мониторинга (make auth-add-user USER=username)
|
||
@if [ -z "$(USER)" ]; then \
|
||
echo "❌ Please specify USER: make auth-add-user USER=username"; \
|
||
exit 1; \
|
||
fi
|
||
@echo "🔐 Adding user $(USER) for monitoring..."
|
||
@sudo /usr/local/bin/generate_auth_passwords.sh $(USER)
|
||
@echo "✅ User $(USER) added successfully!"
|
||
|
||
auth-reset: ## Сбросить пароль для пользователя (make auth-reset USER=username)
|
||
@if [ -z "$(USER)" ]; then \
|
||
echo "❌ Please specify USER: make auth-reset USER=username"; \
|
||
exit 1; \
|
||
fi
|
||
@echo "🔐 Resetting password for user $(USER)..."
|
||
@sudo htpasswd /etc/nginx/passwords/monitoring.htpasswd $(USER)
|
||
@echo "✅ Password reset for user $(USER)!"
|
||
|
||
auth-list: ## Показать список пользователей мониторинга
|
||
@echo "👥 Monitoring users:"
|
||
@sudo cat /etc/nginx/passwords/monitoring.htpasswd 2>/dev/null | cut -d: -f1 || echo "❌ No users found"
|
||
|
||
# ========================================
|
||
# Code Quality & Formatting
|
||
# ========================================
|
||
|
||
format-check: ## Проверить форматирование кода (Black)
|
||
@echo "🔍 Checking code formatting with Black..."
|
||
@if [ -f .venv/bin/python ]; then \
|
||
.venv/bin/python -m black --check . || (echo "❌ Code formatting issues found. Run 'make format' to fix." && exit 1); \
|
||
else \
|
||
python3 -m black --check . || (echo "❌ Code formatting issues found. Run 'make format' to fix." && exit 1); \
|
||
fi
|
||
@echo "✅ Code formatting is correct!"
|
||
|
||
format: ## Автоматически исправить форматирование кода (Black)
|
||
@echo "🎨 Formatting code with Black..."
|
||
@if [ -f .venv/bin/python ]; then \
|
||
.venv/bin/python -m black .; \
|
||
else \
|
||
python3 -m black .; \
|
||
fi
|
||
@echo "✅ Code formatted!"
|
||
|
||
format-diff: ## Показать что будет изменено Black (без применения)
|
||
@echo "📋 Showing Black diff (no changes applied)..."
|
||
@if [ -f .venv/bin/python ]; then \
|
||
.venv/bin/python -m black --diff .; \
|
||
else \
|
||
python3 -m black --diff .; \
|
||
fi
|
||
|
||
import-check: ## Проверить сортировку импортов (isort)
|
||
@echo "🔍 Checking import sorting with isort..."
|
||
@if [ -f .venv/bin/python ]; then \
|
||
.venv/bin/python -m isort --check-only . || (echo "❌ Import sorting issues found. Run 'make import-fix' to fix." && exit 1); \
|
||
else \
|
||
python3 -m isort --check-only . || (echo "❌ Import sorting issues found. Run 'make import-fix' to fix." && exit 1); \
|
||
fi
|
||
@echo "✅ Import sorting is correct!"
|
||
|
||
import-fix: ## Автоматически исправить сортировку импортов (isort)
|
||
@echo "📦 Fixing import sorting with isort..."
|
||
@if [ -f .venv/bin/python ]; then \
|
||
.venv/bin/python -m isort .; \
|
||
else \
|
||
python3 -m isort .; \
|
||
fi
|
||
@echo "✅ Imports sorted!"
|
||
|
||
lint-check: ## Проверить код линтером (flake8) - только критические ошибки
|
||
@echo "🔍 Running flake8 linter (critical errors only)..."
|
||
@if [ -f .venv/bin/python ]; then \
|
||
.venv/bin/python -m flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --exclude=".venv,venv,__pycache__,.git,*.pyc" || true; \
|
||
else \
|
||
python3 -m flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics --exclude=".venv,venv,__pycache__,.git,*.pyc" || true; \
|
||
fi
|
||
@echo "✅ Linting check completed (non-critical warnings in dependencies ignored)!"
|
||
|
||
code-quality: format-check import-check lint-check ## Проверить качество кода (все проверки)
|
||
@echo ""
|
||
@echo "✅ All code quality checks passed!"
|
||
@echo ""
|
||
@echo "ℹ️ Note: F821/F822/F824 warnings in bots/ are non-critical and ignored in CI"
|