- 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
181 lines
9.4 KiB
Makefile
181 lines
9.4 KiB
Makefile
# Автор: Сергей Антропов, сайт: 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
|