# Автор: Сергей Антропов, сайт: https://devops.org.ru # Назначение: Управление инфраструктурой SensusAgent и SensusWorker через Docker Compose SHELL := /bin/bash PROJECT_NAME := sensus-infra COMPOSE_FILE := docker-compose.yml .PHONY: help setup up down restart status logs clean .PHONY: kafka-topics kafka-ui postgres-cli clickhouse-cli .PHONY: health-check backup restore ssl-generate ssl-clean ssl-info # ============================================================================= # ОСНОВНЫЕ КОМАНДЫ # ============================================================================= help: ## Показать справку по командам @echo "Инфраструктура SensusAgent и SensusWorker" @echo "Автор: Сергей Антропов, сайт: https://devops.org.ru" @echo "" @echo "Доступные команды:" @awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_-]+:.*?##/ { printf "\033[36m%-20s\033[0m %s\n", $$1, $$2 }' $(MAKEFILE_LIST) setup: ## Первоначальная настройка инфраструктуры @echo "🔧 Настройка инфраструктуры Sensus..." @if [ ! -f .env ]; then \ echo "⚠️ Файл .env не найден. Создайте его на основе env.example"; \ echo " cp env.example .env"; \ echo " # Отредактируйте .env с вашими значениями"; \ exit 1; \ fi @echo "✅ Файл .env найден" @echo "🔐 Генерация SSL сертификатов..." @$(MAKE) ssl-generate @echo "🚀 Запуск инфраструктуры..." @$(MAKE) up @echo "⏳ Ожидание готовности сервисов..." @sleep 30 @$(MAKE) health-check @echo "✅ Инфраструктура готова к работе!" # ============================================================================= # УПРАВЛЕНИЕ ИНФРАСТРУКТУРОЙ # ============================================================================= up: ## Запустить всю инфраструктуру (Kafka, PostgreSQL, ClickHouse) @echo "🚀 Запуск инфраструктуры..." docker compose -f $(COMPOSE_FILE) up -d zookeeper kafka kafka-ui postgres clickhouse-1 clickhouse-2 clickhouse-lb @echo "✅ Инфраструктура запущена" down: ## Остановить всю инфраструктуру @echo "🛑 Остановка инфраструктуры..." docker compose -f $(COMPOSE_FILE) down @echo "✅ Инфраструктура остановлена" restart: ## Перезапустить всю инфраструктуру @echo "🔄 Перезапуск инфраструктуры..." @$(MAKE) down @sleep 5 @$(MAKE) up # ============================================================================= # МОНИТОРИНГ И ДИАГНОСТИКА # ============================================================================= status: ## Показать статус всех сервисов @echo "📊 Статус всех сервисов:" docker compose -f $(COMPOSE_FILE) ps logs: ## Показать логи всех сервисов docker compose -f $(COMPOSE_FILE) logs -f health-check: ## Проверить здоровье сервисов @echo "🏥 Проверка здоровья сервисов..." @echo "Zookeeper:" @docker exec sensus-zookeeper bash -c "echo 'ruok' | nc localhost 2181" || echo "❌ Zookeeper недоступен" @echo "Kafka:" @docker exec sensus-kafka kafka-broker-api-versions --bootstrap-server localhost:9092 >/dev/null 2>&1 && echo "✅ Kafka доступен" || echo "❌ Kafka недоступен" @echo "PostgreSQL:" @docker exec sensus-postgres pg_isready -U sensus -d sensus >/dev/null 2>&1 && echo "✅ PostgreSQL доступен" || echo "❌ PostgreSQL недоступен" @echo "ClickHouse-1:" @docker exec sensus-clickhouse-1 wget --no-verbose --tries=1 --spider http://localhost:8123/ping >/dev/null 2>&1 && echo "✅ ClickHouse-1 доступен" || echo "❌ ClickHouse-1 недоступен" @echo "ClickHouse-2:" @docker exec sensus-clickhouse-2 wget --no-verbose --tries=1 --spider http://localhost:8123/ping >/dev/null 2>&1 && echo "✅ ClickHouse-2 доступен" || echo "❌ ClickHouse-2 недоступен" @echo "ClickHouse Load Balancer:" @docker exec sensus-clickhouse-lb wget --no-verbose --tries=1 --spider http://localhost:80/health >/dev/null 2>&1 && echo "✅ ClickHouse LB доступен" || echo "❌ ClickHouse LB недоступен" # ============================================================================= # РАБОТА С KAFKA # ============================================================================= kafka-topics: ## Показать список топиков Kafka @echo "📋 Список топиков Kafka:" docker exec sensus-kafka kafka-topics --bootstrap-server localhost:9092 --list kafka-ui: ## Открыть Kafka UI в браузере @echo "🌐 Kafka UI доступен по адресу: http://localhost:8080" # ============================================================================= # РАБОТА С БАЗАМИ ДАННЫХ # ============================================================================= postgres-cli: ## Подключиться к PostgreSQL @echo "🐘 Подключение к PostgreSQL..." docker exec -it sensus-postgres psql -U sensus -d sensus clickhouse-cli: ## Подключиться к ClickHouse (реплика 1) @echo "🦆 Подключение к ClickHouse..." docker exec -it sensus-clickhouse-1 clickhouse-client clickhouse-cli-2: ## Подключиться к ClickHouse (реплика 2) @echo "🦆 Подключение к ClickHouse (реплика 2)..." docker exec -it sensus-clickhouse-2 clickhouse-client clickhouse-cli-lb: ## Подключиться к ClickHouse через балансировщик @echo "⚖️ Подключение к ClickHouse через балансировщик нагрузки..." docker exec -it sensus-clickhouse-lb sh -c "echo 'SELECT version()' | nc localhost 9000" # ============================================================================= # ОЧИСТКА И ОБСЛУЖИВАНИЕ # ============================================================================= clean: ## Очистить все контейнеры и volumes @echo "🧹 Очистка всех контейнеров и volumes..." docker compose -f $(COMPOSE_FILE) down -v --remove-orphans docker system prune -f @echo "✅ Очистка завершена" clean-volumes: ## Очистить только volumes (данные) @echo "🧹 Очистка volumes..." docker compose -f $(COMPOSE_FILE) down -v @echo "✅ Volumes очищены" # ============================================================================= # РЕЗЕРВНОЕ КОПИРОВАНИЕ # ============================================================================= backup: ## Создать резервную копию данных @echo "💾 Создание резервной копии..." @mkdir -p ./backups @echo "PostgreSQL backup..." docker exec sensus-postgres pg_dump -U sensus sensus > ./backups/postgres_$(shell date +%Y%m%d_%H%M%S).sql @echo "ClickHouse backup..." docker exec sensus-clickhouse-1 clickhouse-backup create backup_$(shell date +%Y%m%d_%H%M%S) @echo "✅ Резервная копия создана в ./backups/" restore: ## Восстановить данные из резервной копии (укажите BACKUP_FILE) @if [ -z "$(BACKUP_FILE)" ]; then \ echo "❌ Укажите BACKUP_FILE=имя_файла"; \ exit 1; \ fi @echo "🔄 Восстановление из $(BACKUP_FILE)..." @if [ -f "./backups/$(BACKUP_FILE)" ]; then \ docker exec -i sensus-postgres psql -U sensus -d sensus < ./backups/$(BACKUP_FILE); \ echo "✅ Данные восстановлены"; \ else \ echo "❌ Файл ./backups/$(BACKUP_FILE) не найден"; \ fi # ============================================================================= # SSL СЕРТИФИКАТЫ # ============================================================================= ssl-generate: ## Генерация SSL сертификатов для Kafka и PostgreSQL @echo "🔐 Генерация SSL сертификатов для Kafka..." @mkdir -p ./kafka-ssl @docker build -t sensus-kafka-ssl ./kafka-ssl/ @docker run --rm -v $$PWD:/workspace \ -e KAFKA_SSL_KEYSTORE_PASSWORD=$${KAFKA_SSL_KEYSTORE_PASSWORD:-kafka123} \ -e KAFKA_SSL_TRUSTSTORE_PASSWORD=$${KAFKA_SSL_TRUSTSTORE_PASSWORD:-kafka123} \ -e KAFKA_SSL_KEY_PASSWORD=$${KAFKA_SSL_KEY_PASSWORD:-kafka123} \ sensus-kafka-ssl @echo "✅ SSL сертификаты Kafka созданы в ./kafka-ssl/" @echo "🔐 Генерация SSL сертификатов для PostgreSQL..." @mkdir -p ./postgres-ssl @chmod +x ./postgres-ssl/generate-ssl.sh @./postgres-ssl/generate-ssl.sh @echo "✅ SSL сертификаты PostgreSQL созданы в ./postgres-ssl/" ssl-clean: ## Очистка SSL сертификатов @echo "🧹 Очистка SSL сертификатов..." @rm -rf ./kafka-ssl/*.jks ./kafka-ssl/ca-* 2>/dev/null || true @rm -rf ./postgres-ssl/*.crt ./postgres-ssl/*.key 2>/dev/null || true @echo "✅ SSL сертификаты очищены" ssl-info: ## Информация о SSL сертификатах @echo "📋 Информация о SSL сертификатах:" @echo "" @echo "🔐 Kafka SSL сертификаты:" @if [ -f "./kafka-ssl/kafka.server.keystore.jks" ]; then \ echo "✅ Серверный keystore найден"; \ docker run --rm -v $$PWD:/workspace -w /workspace openjdk:11-jre-slim keytool -list -keystore /workspace/kafka-ssl/kafka.server.keystore.jks -storepass kafka123 -v | head -20; \ else \ echo "❌ Kafka SSL сертификаты не найдены"; \ fi @echo "" @echo "🔐 PostgreSQL SSL сертификаты:" @if [ -f "./postgres-ssl/server.crt" ]; then \ echo "✅ PostgreSQL сертификаты найдены:"; \ ls -la ./postgres-ssl/; \ echo ""; \ echo "📋 Информация о сертификате сервера:"; \ openssl x509 -in ./postgres-ssl/server.crt -text -noout | grep -E "(Subject:|Issuer:|Not Before|Not After)"; \ else \ echo "❌ PostgreSQL SSL сертификаты не найдены"; \ fi @echo "" @echo "💡 Для генерации сертификатов выполните: make ssl-generate"