SensusInfra/Makefile
Sergey Antropoff 4db3e01513 feat: Add PostgreSQL SSL support with sslmode=require
- Add SSL configuration to PostgreSQL in docker-compose.yml
- Create PostgreSQL SSL certificate generation script
- Add PostgreSQL SSL environment variables to env.example and .env
- Update Makefile with PostgreSQL SSL commands (ssl-generate, ssl-clean, ssl-info)
- Update .gitignore to exclude PostgreSQL SSL certificates
- Update documentation in README.md and QUICKSTART.md
- Test PostgreSQL SSL certificate generation

Features:
- PostgreSQL SSL mode: require (mandatory encryption)
- Self-signed certificates for development
- Automatic certificate generation via make ssl-generate
- SSL certificate management via Makefile commands

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

202 lines
10 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 и PostgreSQL
@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 созданы в ./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"