SensusInfra/Makefile
Sergey Antropoff 7877590440 feat: Initial infrastructure setup for SensusAgent and SensusWorker
- Add Kafka with SSL support and KafkaUI with authentication
- Add PostgreSQL with initialization scripts
- Add ClickHouse cluster with 2 replicas and load balancer
- Add Nginx load balancer for ClickHouse
- Add comprehensive Makefile for infrastructure management
- Add SSL certificate generation for Kafka
- Add complete documentation and quickstart guide
- Add environment configuration with real values

Author: Сергей Антропов
Site: https://devops.org.ru
2025-09-10 11:20:47 +03:00

181 lines
9.4 KiB
Makefile
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Автор: Сергей Антропов, сайт: 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
@echo "🔐 Генерация SSL сертификатов для Kafka..."
@mkdir -p ./kafka-ssl
@docker run --rm -v $$PWD:/workspace -w /workspace openjdk:11-jre-slim bash -c "apt-get update && apt-get install -y openssl && chmod +x /workspace/kafka-ssl/generate-ssl.sh && /workspace/kafka-ssl/generate-ssl.sh"
@echo "✅ SSL сертификаты созданы в ./kafka-ssl/"
ssl-clean: ## Очистка SSL сертификатов
@echo "🧹 Очистка SSL сертификатов..."
@rm -rf ./kafka-ssl/*.jks ./kafka-ssl/ca-* 2>/dev/null || true
@echo "✅ SSL сертификаты очищены"
ssl-info: ## Информация о SSL сертификатах
@echo "📋 Информация о 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 "❌ SSL сертификаты не найдены. Выполните: make ssl-generate"; \
fi