# Makefile для Message Gateway # Автор: Сергей Антропов # Сайт: https://devops.org.ru .PHONY: help build up up-build down restart logs shell test clean clean-all lint format install dev stop status health ready version psql redis-cli .PHONY: docker docker-build docker-tag docker-push docker-run docker-stop docker-logs docker-shell .PHONY: env env-check env-create env-create-force .PHONY: git git-status git-pull git-push git-commit git-add git-branch .PHONY: k8s k8s-apply k8s-delete k8s-status k8s-logs k8s-shell k8s-contexts k8s-set-context # Цвета для вывода COLOR_RESET := \033[0m COLOR_BOLD := \033[1m COLOR_RED := \033[31m COLOR_GREEN := \033[32m COLOR_YELLOW := \033[33m COLOR_BLUE := \033[34m COLOR_MAGENTA := \033[35m COLOR_CYAN := \033[36m # Переменные DOCKER_COMPOSE := docker compose DOCKER := docker PYTHON := python3 APP_NAME := message-gateway IMAGE_NAME := message-gateway REGISTRY := hub.cism-ms.ru/library VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "v0.1.0") TAG := $(VERSION) KUBECTL := kubectl K8S_CONTEXT := $(shell $(KUBECTL) config current-context 2>/dev/null || echo "") K8S_NAMESPACE := message-gateway K8S_MANIFEST := kubernetes.yaml GIT := git # Проверка наличия .env файла ENV_FILE := .env ifeq ($(wildcard $(ENV_FILE)),) $(warning $(COLOR_YELLOW)Файл .env не найден. Создайте его на основе env.example$(COLOR_RESET)) endif # ============================================================================ # Помощь # ============================================================================ help: ## 📖 Показать справку по командам @echo "$(COLOR_BOLD)$(COLOR_CYAN)Message Gateway - Доступные команды:$(COLOR_RESET)" @echo "" @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Основные команды:$(COLOR_RESET)" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "^[[:space:]]*#" | awk 'BEGIN {FS = ":.*?## "}; {if ($$1 ~ /^(build|up-build|up|down|restart|logs|shell|stop|status|health|ready)$$/) printf " $(COLOR_GREEN)%-25s$(COLOR_RESET) %s\n", $$1, $$2}' @echo "" @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Разработка:$(COLOR_RESET)" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "^[[:space:]]*#" | awk 'BEGIN {FS = ":.*?## "}; {if ($$1 ~ /^(dev|test|lint|format|install|clean|clean-all)$$/) printf " $(COLOR_GREEN)%-25s$(COLOR_RESET) %s\n", $$1, $$2}' @echo "" @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Docker команды:$(COLOR_RESET)" @echo " $(COLOR_GREEN)make docker build$(COLOR_RESET) 🐳 Собрать Docker образ" @echo " $(COLOR_GREEN)make docker tag$(COLOR_RESET) 🏷️ Тегировать Docker образ" @echo " $(COLOR_GREEN)make docker push$(COLOR_RESET) 📤 Отправить образ в registry" @echo " $(COLOR_GREEN)make docker run$(COLOR_RESET) 🏃 Запустить контейнер" @echo " $(COLOR_GREEN)make docker stop$(COLOR_RESET) 🛑 Остановить контейнер" @echo " $(COLOR_GREEN)make docker logs$(COLOR_RESET) 📋 Показать логи контейнера" @echo " $(COLOR_GREEN)make docker shell$(COLOR_RESET) 🐚 Открыть shell в контейнере" @echo " $(COLOR_YELLOW)Использование: make docker CMD=build$(COLOR_RESET)" @echo "" @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Git команды:$(COLOR_RESET)" @echo " $(COLOR_GREEN)make git status$(COLOR_RESET) 📊 Показать статус репозитория" @echo " $(COLOR_GREEN)make git pull$(COLOR_RESET) ⬇️ Получить изменения из удаленного репозитория" @echo " $(COLOR_GREEN)make git push$(COLOR_RESET) ⬆️ Отправить изменения в удаленный репозиторий" @echo " $(COLOR_GREEN)make git add [file]$(COLOR_RESET) ➕ Добавить файлы в индекс" @echo " $(COLOR_GREEN)make git commit [msg]$(COLOR_RESET) 💾 Создать коммит" @echo " $(COLOR_GREEN)make git branch$(COLOR_RESET) 🌿 Показать список веток" @echo " $(COLOR_YELLOW)Использование: make git CMD=push ARGS=origin main$(COLOR_RESET)" @echo "" @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Kubernetes команды:$(COLOR_RESET)" @echo " $(COLOR_GREEN)make k8s contexts$(COLOR_RESET) 📋 Показать доступные контексты" @echo " $(COLOR_GREEN)make k8s set-context [name]$(COLOR_RESET) 🔄 Установить контекст" @echo " $(COLOR_GREEN)make k8s apply$(COLOR_RESET) ✅ Применить манифесты" @echo " $(COLOR_GREEN)make k8s delete$(COLOR_RESET) 🗑️ Удалить ресурсы" @echo " $(COLOR_GREEN)make k8s status$(COLOR_RESET) 📊 Показать статус подов" @echo " $(COLOR_GREEN)make k8s logs$(COLOR_RESET) 📋 Показать логи подов" @echo " $(COLOR_GREEN)make k8s shell$(COLOR_RESET) 🐚 Открыть shell в поде" @echo " $(COLOR_YELLOW)Использование: make k8s CMD=apply CONTEXT=<контекст>$(COLOR_RESET)" @if [ -n "$(K8S_CONTEXT)" ]; then \ echo " $(COLOR_CYAN)Текущий контекст: $(COLOR_BOLD)$(K8S_CONTEXT)$(COLOR_RESET)"; \ fi @echo "" @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Env команды:$(COLOR_RESET)" @echo " $(COLOR_GREEN)make env check$(COLOR_RESET) 🔍 Проверить наличие .env файла" @echo " $(COLOR_GREEN)make env create$(COLOR_RESET) 📝 Создать .env файл из env.example" @echo " $(COLOR_GREEN)make env create-force$(COLOR_RESET) 📝 Принудительно создать .env файл" @echo " $(COLOR_YELLOW)Использование: make env CMD=check$(COLOR_RESET)" @echo "" @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Утилиты:$(COLOR_RESET)" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | grep -v "^[[:space:]]*#" | awk 'BEGIN {FS = ":.*?## "}; {if ($$1 ~ /^(version|psql|redis-cli)$$/) printf " $(COLOR_GREEN)%-25s$(COLOR_RESET) %s\n", $$1, $$2}' @echo "" # ============================================================================ # Основные команды # ============================================================================ build: ## 🔨 Собрать Docker образ @echo "$(COLOR_BOLD)$(COLOR_BLUE)Сборка Docker образа...$(COLOR_RESET)" @$(DOCKER_COMPOSE) build --no-cache @echo "$(COLOR_GREEN)✓ Образ собран успешно$(COLOR_RESET)" up: ## 🚀 Запустить приложение @echo "$(COLOR_BOLD)$(COLOR_BLUE)Запуск приложения...$(COLOR_RESET)" @$(DOCKER_COMPOSE) up -d @echo "$(COLOR_GREEN)✓ Приложение запущено$(COLOR_RESET)" @echo "$(COLOR_CYAN)Для просмотра логов: $(COLOR_BOLD)make logs$(COLOR_RESET)" up-build: build up ## 🔨 Собрать и запустить приложение @echo "$(COLOR_GREEN)✓ Приложение собрано и запущено$(COLOR_RESET)" down: ## 🛑 Остановить приложение @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Остановка приложения...$(COLOR_RESET)" @$(DOCKER_COMPOSE) down @echo "$(COLOR_GREEN)✓ Приложение остановлено$(COLOR_RESET)" restart: ## 🔄 Перезапустить приложение @echo "$(COLOR_BOLD)$(COLOR_BLUE)Перезапуск приложения...$(COLOR_RESET)" @$(DOCKER_COMPOSE) restart @echo "$(COLOR_GREEN)✓ Приложение перезапущено$(COLOR_RESET)" logs: ## 📋 Показать логи приложения @echo "$(COLOR_BOLD)$(COLOR_BLUE)Просмотр логов приложения...$(COLOR_RESET)" @clear || true @$(DOCKER_COMPOSE) logs -f --tail=50 $(APP_NAME) shell: ## 🐚 Открыть shell в контейнере @echo "$(COLOR_BOLD)$(COLOR_BLUE)Открытие shell в контейнере...$(COLOR_RESET)" @clear || true @$(DOCKER_COMPOSE) exec $(APP_NAME) /bin/bash stop: ## ⏹️ Остановить приложение (alias для down) @$(MAKE) down status: ## 📊 Показать статус контейнеров @echo "$(COLOR_BOLD)$(COLOR_BLUE)Статус контейнеров:$(COLOR_RESET)" @$(DOCKER_COMPOSE) ps health: ## ❤️ Проверить здоровье приложения @echo "$(COLOR_BOLD)$(COLOR_BLUE)Проверка здоровья приложения...$(COLOR_RESET)" @curl -f http://localhost:8000/api/v1/health || (echo "$(COLOR_RED)✗ Приложение не отвечает$(COLOR_RESET)" && exit 1) @echo "$(COLOR_GREEN)✓ Приложение здорово$(COLOR_RESET)" ready: ## ✅ Проверить готовность приложения @echo "$(COLOR_BOLD)$(COLOR_BLUE)Проверка готовности приложения...$(COLOR_RESET)" @curl -f http://localhost:8000/api/v1/health/ready || (echo "$(COLOR_RED)✗ Приложение не готово$(COLOR_RESET)" && exit 1) @echo "$(COLOR_GREEN)✓ Приложение готово$(COLOR_RESET)" # ============================================================================ # Разработка # ============================================================================ dev: ## 🔧 Запустить в режиме разработки @echo "$(COLOR_BOLD)$(COLOR_BLUE)Запуск в режиме разработки...$(COLOR_RESET)" @$(DOCKER_COMPOSE) up --build test: ## 🧪 Запустить тесты @echo "$(COLOR_BOLD)$(COLOR_BLUE)Запуск тестов...$(COLOR_RESET)" @if [ -f docker-compose.test.yaml ]; then \ $(DOCKER_COMPOSE) -f docker-compose.test.yaml up --abort-on-container-exit; \ else \ echo "$(COLOR_YELLOW)⚠ Файл docker-compose.test.yaml не найден$(COLOR_RESET)"; \ echo "$(COLOR_CYAN)Запуск тестов через pytest...$(COLOR_RESET)"; \ $(DOCKER_COMPOSE) exec $(APP_NAME) pytest -v || true; \ fi lint: ## 🔍 Запустить линтер @echo "$(COLOR_BOLD)$(COLOR_BLUE)Запуск линтера...$(COLOR_RESET)" @$(DOCKER_COMPOSE) exec $(APP_NAME) python -m pylint app/ || echo "$(COLOR_YELLOW)⚠ Линтер не установлен или найдены ошибки$(COLOR_RESET)" format: ## 🎨 Форматировать код @echo "$(COLOR_BOLD)$(COLOR_BLUE)Форматирование кода...$(COLOR_RESET)" @$(DOCKER_COMPOSE) exec $(APP_NAME) python -m black app/ || echo "$(COLOR_YELLOW)⚠ Black не установлен$(COLOR_RESET)" install: ## 📦 Установить зависимости @echo "$(COLOR_BOLD)$(COLOR_BLUE)Установка зависимостей...$(COLOR_RESET)" @pip install -r requirements.txt || $(PYTHON) -m pip install -r requirements.txt @echo "$(COLOR_GREEN)✓ Зависимости установлены$(COLOR_RESET)" clean: ## 🧹 Очистить Docker образы и контейнеры @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Очистка Docker ресурсов...$(COLOR_RESET)" @$(DOCKER_COMPOSE) down -v @$(DOCKER) system prune -f @echo "$(COLOR_GREEN)✓ Очистка завершена$(COLOR_RESET)" clean-all: ## 🗑️ Очистить все Docker ресурсы (включая volumes) @echo "$(COLOR_BOLD)$(COLOR_RED)Очистка всех Docker ресурсов...$(COLOR_RESET)" @$(DOCKER_COMPOSE) down -v --rmi all @$(DOCKER) system prune -af --volumes @echo "$(COLOR_GREEN)✓ Полная очистка завершена$(COLOR_RESET)" # ============================================================================ # Docker команды (подкоманды через make docker CMD=) # ============================================================================ docker: ## 🐳 Docker команды (используйте: make docker CMD=build|tag|push|run|stop|logs|shell) @if [ -z "$(CMD)" ]; then \ echo "$(COLOR_BOLD)$(COLOR_CYAN)Docker команды:$(COLOR_RESET)"; \ echo ""; \ echo " $(COLOR_GREEN)make docker build$(COLOR_RESET) - Собрать Docker образ"; \ echo " $(COLOR_GREEN)make docker tag$(COLOR_RESET) - Тегировать Docker образ"; \ echo " $(COLOR_GREEN)make docker push$(COLOR_RESET) - Отправить образ в registry"; \ echo " $(COLOR_GREEN)make docker run$(COLOR_RESET) - Запустить контейнер"; \ echo " $(COLOR_GREEN)make docker stop$(COLOR_RESET) - Остановить контейнер"; \ echo " $(COLOR_GREEN)make docker logs$(COLOR_RESET) - Показать логи контейнера"; \ echo " $(COLOR_GREEN)make docker shell$(COLOR_RESET) - Открыть shell в контейнере"; \ echo ""; \ echo "$(COLOR_YELLOW)Использование:$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make docker CMD=build$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make docker-build$(COLOR_RESET) (прямой вызов)"; \ else \ $(MAKE) docker-$(CMD); \ fi docker-build: ## 🐳 Собрать Docker образ @echo "$(COLOR_BOLD)$(COLOR_BLUE)Сборка Docker образа...$(COLOR_RESET)" @$(DOCKER) build --no-cache -t $(IMAGE_NAME):$(TAG) . @echo "$(COLOR_GREEN)✓ Образ собран: $(IMAGE_NAME):$(TAG)$(COLOR_RESET)" docker-tag: docker-build ## 🏷️ Тегировать Docker образ для registry @echo "$(COLOR_BOLD)$(COLOR_BLUE)Тегирование образа...$(COLOR_RESET)" @$(DOCKER) tag $(IMAGE_NAME):$(TAG) $(REGISTRY)/$(IMAGE_NAME):$(TAG) || \ (echo "$(COLOR_RED)✗ Ошибка тегирования образа$(COLOR_RESET)" && exit 1) @echo "$(COLOR_GREEN)✓ Образ помечен: $(REGISTRY)/$(IMAGE_NAME):$(TAG)$(COLOR_RESET)" docker-push: docker-tag ## 📤 Собрать, тегировать и отправить образ в registry @echo "$(COLOR_BOLD)$(COLOR_BLUE)Отправка образа в registry...$(COLOR_RESET)" @$(DOCKER) push $(REGISTRY)/$(IMAGE_NAME):$(TAG) || \ (echo "$(COLOR_RED)✗ Ошибка отправки образа в registry$(COLOR_RESET)" && exit 1) @echo "$(COLOR_GREEN)✓ Образ отправлен: $(REGISTRY)/$(IMAGE_NAME):$(TAG)$(COLOR_RESET)" docker-run: docker-build ## 🏃 Запустить контейнер @echo "$(COLOR_BOLD)$(COLOR_BLUE)Запуск контейнера...$(COLOR_RESET)" @if [ ! -f $(ENV_FILE) ]; then \ echo "$(COLOR_RED)✗ Файл .env не найден$(COLOR_RESET)"; \ echo "$(COLOR_YELLOW)Создайте файл .env на основе env.example$(COLOR_RESET)"; \ exit 1; \ fi @$(DOCKER) run -d \ --name $(APP_NAME) \ -p 8000:8000 \ --env-file $(ENV_FILE) \ -v $$(pwd)/app:/app/app \ -v $$(pwd)/config:/app/config \ -v $$(pwd)/templates:/app/templates \ $(IMAGE_NAME):$(TAG) || \ (echo "$(COLOR_RED)✗ Ошибка запуска контейнера$(COLOR_RESET)" && exit 1) @echo "$(COLOR_GREEN)✓ Контейнер запущен$(COLOR_RESET)" docker-stop: ## 🛑 Остановить контейнер @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Остановка контейнера...$(COLOR_RESET)" @$(DOCKER) stop $(APP_NAME) || echo "$(COLOR_YELLOW)⚠ Контейнер не запущен$(COLOR_RESET)" @$(DOCKER) rm $(APP_NAME) || echo "$(COLOR_YELLOW)⚠ Контейнер не существует$(COLOR_RESET)" @echo "$(COLOR_GREEN)✓ Контейнер остановлен$(COLOR_RESET)" docker-logs: ## 📋 Показать логи контейнера @echo "$(COLOR_BOLD)$(COLOR_BLUE)Просмотр логов контейнера...$(COLOR_RESET)" @clear || true @$(DOCKER) logs -f --tail=50 $(APP_NAME) docker-shell: ## 🐚 Открыть shell в контейнере @echo "$(COLOR_BOLD)$(COLOR_BLUE)Открытие shell в контейнере...$(COLOR_RESET)" @clear || true @$(DOCKER) exec -it $(APP_NAME) /bin/bash # ============================================================================ # Git команды (подкоманды через make git CMD=) # ============================================================================ git: ## 📦 Git команды (используйте: make git CMD=status|pull|push|add|commit|branch) @if [ -z "$(CMD)" ]; then \ echo "$(COLOR_BOLD)$(COLOR_CYAN)Git команды:$(COLOR_RESET)"; \ echo ""; \ echo " $(COLOR_GREEN)make git status$(COLOR_RESET) - Показать статус репозитория"; \ echo " $(COLOR_GREEN)make git pull$(COLOR_RESET) - Получить изменения"; \ echo " $(COLOR_GREEN)make git push$(COLOR_RESET) - Отправить изменения"; \ echo " $(COLOR_GREEN)make git add [file]$(COLOR_RESET) - Добавить файлы"; \ echo " $(COLOR_GREEN)make git commit [msg]$(COLOR_RESET) - Создать коммит"; \ echo " $(COLOR_GREEN)make git branch$(COLOR_RESET) - Показать список веток"; \ echo ""; \ echo "$(COLOR_YELLOW)Использование:$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make git CMD=status$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make git CMD=push ARGS=origin main$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make git-status$(COLOR_RESET) (прямой вызов)"; \ else \ $(MAKE) git-$(CMD) ARGS="$(ARGS)"; \ fi git-status: ## 📊 Показать статус репозитория @echo "$(COLOR_BOLD)$(COLOR_BLUE)Статус репозитория:$(COLOR_RESET)" @$(GIT) status git-pull: ## ⬇️ Получить изменения из удаленного репозитория @echo "$(COLOR_BOLD)$(COLOR_BLUE)Получение изменений из удаленного репозитория...$(COLOR_RESET)" @if [ -z "$(ARGS)" ]; then \ $(GIT) pull || (echo "$(COLOR_RED)✗ Ошибка получения изменений$(COLOR_RESET)" && exit 1); \ else \ $(GIT) pull $(ARGS) || (echo "$(COLOR_RED)✗ Ошибка получения изменений$(COLOR_RESET)" && exit 1); \ fi @echo "$(COLOR_GREEN)✓ Изменения получены$(COLOR_RESET)" git-push: ## ⬆️ Отправить изменения в удаленный репозиторий @echo "$(COLOR_BOLD)$(COLOR_BLUE)Отправка изменений в удаленный репозиторий...$(COLOR_RESET)" @if [ -z "$(ARGS)" ]; then \ $(GIT) push || (echo "$(COLOR_RED)✗ Ошибка отправки изменений$(COLOR_RESET)" && exit 1); \ else \ $(GIT) push $(ARGS) || (echo "$(COLOR_RED)✗ Ошибка отправки изменений$(COLOR_RESET)" && exit 1); \ fi @echo "$(COLOR_GREEN)✓ Изменения отправлены$(COLOR_RESET)" git-add: ## ➕ Добавить файлы в индекс @echo "$(COLOR_BOLD)$(COLOR_BLUE)Добавление файлов в индекс...$(COLOR_RESET)" @if [ -z "$(ARGS)" ]; then \ echo "$(COLOR_YELLOW)⚠ Укажите файлы для добавления: make git add ARGS=<файлы>$(COLOR_RESET)"; \ echo "$(COLOR_YELLOW)Или используйте: make git-add ARGS=<файлы>$(COLOR_RESET)"; \ exit 1; \ fi @$(GIT) add $(ARGS) @echo "$(COLOR_GREEN)✓ Файлы добавлены в индекс$(COLOR_RESET)" git-commit: ## 💾 Создать коммит @echo "$(COLOR_BOLD)$(COLOR_BLUE)Создание коммита...$(COLOR_RESET)" @if [ -z "$(ARGS)" ]; then \ echo "$(COLOR_YELLOW)⚠ Укажите сообщение коммита: make git commit ARGS=\"<сообщение>\"$(COLOR_RESET)"; \ echo "$(COLOR_YELLOW)Или используйте: make git-commit ARGS=\"<сообщение>\"$(COLOR_RESET)"; \ exit 1; \ fi @$(GIT) commit -m "$(ARGS)" @echo "$(COLOR_GREEN)✓ Коммит создан$(COLOR_RESET)" git-branch: ## 🌿 Показать список веток @echo "$(COLOR_BOLD)$(COLOR_BLUE)Список веток:$(COLOR_RESET)" @$(GIT) branch -a # ============================================================================ # Kubernetes команды (подкоманды через make k8s CMD=) # ============================================================================ k8s: ## ☸️ Kubernetes команды (используйте: make k8s CMD=apply|delete|status|logs|shell|contexts|set-context) @if [ -z "$(CMD)" ]; then \ echo "$(COLOR_BOLD)$(COLOR_CYAN)Kubernetes команды:$(COLOR_RESET)"; \ echo ""; \ echo " $(COLOR_GREEN)make k8s contexts$(COLOR_RESET) - Показать доступные контексты"; \ echo " $(COLOR_GREEN)make k8s set-context [name]$(COLOR_RESET) - Установить контекст"; \ echo " $(COLOR_GREEN)make k8s apply$(COLOR_RESET) - Применить манифесты"; \ echo " $(COLOR_GREEN)make k8s delete$(COLOR_RESET) - Удалить ресурсы"; \ echo " $(COLOR_GREEN)make k8s status$(COLOR_RESET) - Показать статус подов"; \ echo " $(COLOR_GREEN)make k8s logs$(COLOR_RESET) - Показать логи подов"; \ echo " $(COLOR_GREEN)make k8s shell$(COLOR_RESET) - Открыть shell в поде"; \ echo ""; \ if [ -n "$(K8S_CONTEXT)" ]; then \ echo "$(COLOR_CYAN)Текущий контекст: $(COLOR_BOLD)$(K8S_CONTEXT)$(COLOR_RESET)"; \ else \ echo "$(COLOR_YELLOW)⚠ Контекст не установлен$(COLOR_RESET)"; \ fi; \ echo ""; \ echo "$(COLOR_YELLOW)Использование:$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make k8s CMD=apply$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make k8s CMD=apply CONTEXT=<контекст>$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make k8s-apply$(COLOR_RESET) (прямой вызов)"; \ else \ $(MAKE) k8s-$(CMD) CONTEXT="$(CONTEXT)"; \ fi k8s-contexts: ## 📋 Показать доступные контексты Kubernetes @echo "$(COLOR_BOLD)$(COLOR_BLUE)Доступные контексты Kubernetes:$(COLOR_RESET)" @$(KUBECTL) config get-contexts || echo "$(COLOR_YELLOW)⚠ kubectl не установлен или не настроен$(COLOR_RESET)" @if [ -n "$(K8S_CONTEXT)" ]; then \ echo ""; \ echo "$(COLOR_CYAN)Текущий контекст: $(COLOR_BOLD)$(K8S_CONTEXT)$(COLOR_RESET)"; \ fi k8s-set-context: ## 🔄 Установить контекст Kubernetes @echo "$(COLOR_BOLD)$(COLOR_BLUE)Установка контекста Kubernetes...$(COLOR_RESET)" @if [ -z "$(CONTEXT)" ]; then \ echo "$(COLOR_YELLOW)⚠ Укажите контекст: make k8s set-context CONTEXT=<имя>$(COLOR_RESET)"; \ echo "$(COLOR_YELLOW)Или используйте: make k8s-set-context CONTEXT=<имя>$(COLOR_RESET)"; \ echo ""; \ echo "$(COLOR_CYAN)Доступные контексты:$(COLOR_RESET)"; \ $(KUBECTL) config get-contexts -o name || echo "$(COLOR_YELLOW)⚠ kubectl не установлен$(COLOR_RESET)"; \ exit 1; \ fi @$(KUBECTL) config use-context $(CONTEXT) || \ (echo "$(COLOR_RED)✗ Ошибка установки контекста$(COLOR_RESET)" && exit 1) @echo "$(COLOR_GREEN)✓ Контекст установлен: $(CONTEXT)$(COLOR_RESET)" k8s-apply: ## ✅ Применить манифесты Kubernetes @echo "$(COLOR_BOLD)$(COLOR_BLUE)Применение манифестов Kubernetes...$(COLOR_RESET)" @if [ -n "$(CONTEXT)" ]; then \ echo "$(COLOR_CYAN)Использование контекста: $(CONTEXT)$(COLOR_RESET)"; \ $(KUBECTL) --context=$(CONTEXT) apply -f $(K8S_MANIFEST) || \ (echo "$(COLOR_RED)✗ Ошибка применения манифестов$(COLOR_RESET)" && exit 1); \ else \ if [ -n "$(K8S_CONTEXT)" ]; then \ echo "$(COLOR_CYAN)Использование текущего контекста: $(K8S_CONTEXT)$(COLOR_RESET)"; \ fi; \ $(KUBECTL) apply -f $(K8S_MANIFEST) || \ (echo "$(COLOR_RED)✗ Ошибка применения манифестов$(COLOR_RESET)" && exit 1); \ fi @echo "$(COLOR_GREEN)✓ Манифесты применены$(COLOR_RESET)" k8s-delete: ## 🗑️ Удалить ресурсы Kubernetes @echo "$(COLOR_BOLD)$(COLOR_YELLOW)Удаление ресурсов Kubernetes...$(COLOR_RESET)" @if [ -n "$(CONTEXT)" ]; then \ echo "$(COLOR_CYAN)Использование контекста: $(CONTEXT)$(COLOR_RESET)"; \ $(KUBECTL) --context=$(CONTEXT) delete -f $(K8S_MANIFEST) || \ (echo "$(COLOR_YELLOW)⚠ Ресурсы не найдены или уже удалены$(COLOR_RESET)"); \ else \ if [ -n "$(K8S_CONTEXT)" ]; then \ echo "$(COLOR_CYAN)Использование текущего контекста: $(K8S_CONTEXT)$(COLOR_RESET)"; \ fi; \ $(KUBECTL) delete -f $(K8S_MANIFEST) || \ (echo "$(COLOR_YELLOW)⚠ Ресурсы не найдены или уже удалены$(COLOR_RESET)"); \ fi @echo "$(COLOR_GREEN)✓ Ресурсы удалены$(COLOR_RESET)" k8s-status: ## 📊 Показать статус подов Kubernetes @echo "$(COLOR_BOLD)$(COLOR_BLUE)Статус подов Kubernetes:$(COLOR_RESET)" @if [ -n "$(CONTEXT)" ]; then \ $(KUBECTL) --context=$(CONTEXT) get pods -n $(K8S_NAMESPACE) || \ (echo "$(COLOR_YELLOW)⚠ Поды не найдены$(COLOR_RESET)"); \ else \ $(KUBECTL) get pods -n $(K8S_NAMESPACE) || \ (echo "$(COLOR_YELLOW)⚠ Поды не найдены$(COLOR_RESET)"); \ fi k8s-logs: ## 📋 Показать логи подов Kubernetes @echo "$(COLOR_BOLD)$(COLOR_BLUE)Просмотр логов подов Kubernetes...$(COLOR_RESET)" @if [ -n "$(CONTEXT)" ]; then \ POD=$$($(KUBECTL) --context=$(CONTEXT) get pods -n $(K8S_NAMESPACE) -l app=$(APP_NAME) -o jsonpath='{.items[0].metadata.name}' 2>/dev/null); \ else \ POD=$$($(KUBECTL) get pods -n $(K8S_NAMESPACE) -l app=$(APP_NAME) -o jsonpath='{.items[0].metadata.name}' 2>/dev/null); \ fi; \ if [ -z "$$POD" ]; then \ echo "$(COLOR_YELLOW)⚠ Поды не найдены$(COLOR_RESET)"; \ exit 1; \ fi; \ echo "$(COLOR_CYAN)Просмотр логов пода: $$POD$(COLOR_RESET)"; \ if [ -n "$(CONTEXT)" ]; then \ $(KUBECTL) --context=$(CONTEXT) logs -f -n $(K8S_NAMESPACE) $$POD --tail=50; \ else \ $(KUBECTL) logs -f -n $(K8S_NAMESPACE) $$POD --tail=50; \ fi k8s-shell: ## 🐚 Открыть shell в поде Kubernetes @echo "$(COLOR_BOLD)$(COLOR_BLUE)Открытие shell в поде Kubernetes...$(COLOR_RESET)" @if [ -n "$(CONTEXT)" ]; then \ POD=$$($(KUBECTL) --context=$(CONTEXT) get pods -n $(K8S_NAMESPACE) -l app=$(APP_NAME) -o jsonpath='{.items[0].metadata.name}' 2>/dev/null); \ else \ POD=$$($(KUBECTL) get pods -n $(K8S_NAMESPACE) -l app=$(APP_NAME) -o jsonpath='{.items[0].metadata.name}' 2>/dev/null); \ fi; \ if [ -z "$$POD" ]; then \ echo "$(COLOR_YELLOW)⚠ Поды не найдены$(COLOR_RESET)"; \ exit 1; \ fi; \ echo "$(COLOR_CYAN)Открытие shell в поде: $$POD$(COLOR_RESET)"; \ clear || true; \ if [ -n "$(CONTEXT)" ]; then \ $(KUBECTL) --context=$(CONTEXT) exec -it -n $(K8S_NAMESPACE) $$POD -- /bin/bash || \ $(KUBECTL) --context=$(CONTEXT) exec -it -n $(K8S_NAMESPACE) $$POD -- /bin/sh; \ else \ $(KUBECTL) exec -it -n $(K8S_NAMESPACE) $$POD -- /bin/bash || \ $(KUBECTL) exec -it -n $(K8S_NAMESPACE) $$POD -- /bin/sh; \ fi # ============================================================================ # Env команды (подкоманды через make env CMD=) # ============================================================================ env: ## 🔐 Env команды (используйте: make env CMD=check|create|create-force) @if [ -z "$(CMD)" ]; then \ echo "$(COLOR_BOLD)$(COLOR_CYAN)Env команды:$(COLOR_RESET)"; \ echo ""; \ echo " $(COLOR_GREEN)make env check$(COLOR_RESET) - Проверить наличие .env файла"; \ echo " $(COLOR_GREEN)make env create$(COLOR_RESET) - Создать .env файл из env.example"; \ echo " $(COLOR_GREEN)make env create-force$(COLOR_RESET) - Принудительно создать .env файл"; \ echo ""; \ echo "$(COLOR_YELLOW)Использование:$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make env CMD=check$(COLOR_RESET)"; \ echo " $(COLOR_CYAN)make env-check$(COLOR_RESET) (прямой вызов)"; \ else \ $(MAKE) env-$(CMD); \ fi env-check: ## 🔍 Проверить наличие .env файла @if [ -f $(ENV_FILE) ]; then \ echo "$(COLOR_GREEN)✓ Файл .env найден$(COLOR_RESET)"; \ else \ echo "$(COLOR_RED)✗ Файл .env не найден$(COLOR_RESET)"; \ echo "$(COLOR_YELLOW)Создайте файл .env на основе env.example$(COLOR_RESET)"; \ echo "$(COLOR_CYAN)Используйте: make env create$(COLOR_RESET)"; \ exit 1; \ fi env-create: ## 📝 Создать .env файл из env.example @if [ -f $(ENV_FILE) ]; then \ echo "$(COLOR_YELLOW)⚠ Файл .env уже существует$(COLOR_RESET)"; \ echo "$(COLOR_YELLOW)⚠ Используйте 'make env create-force' для перезаписи$(COLOR_RESET)"; \ exit 1; \ fi @cp env.example $(ENV_FILE) @echo "$(COLOR_GREEN)✓ Файл .env создан из env.example$(COLOR_RESET)" @echo "$(COLOR_YELLOW)⚠ Не забудьте отредактировать .env и указать необходимые значения$(COLOR_RESET)" env-create-force: ## 📝 Принудительно создать .env файл из env.example (перезаписать существующий) @cp env.example $(ENV_FILE) @echo "$(COLOR_GREEN)✓ Файл .env создан из env.example (перезаписан)$(COLOR_RESET)" @echo "$(COLOR_YELLOW)⚠ Не забудьте отредактировать .env и указать необходимые значения$(COLOR_RESET)" # ============================================================================ # Утилиты # ============================================================================ version: ## 📌 Показать версию проекта @echo "$(COLOR_BOLD)$(COLOR_CYAN)Версия проекта: $(COLOR_RESET)$(COLOR_GREEN)$(VERSION)$(COLOR_RESET)" @echo "$(COLOR_BOLD)$(COLOR_CYAN)Тег образа: $(COLOR_RESET)$(COLOR_GREEN)$(TAG)$(COLOR_RESET)" @echo "$(COLOR_BOLD)$(COLOR_CYAN)Регистр: $(COLOR_RESET)$(COLOR_GREEN)$(REGISTRY)$(COLOR_RESET)" psql: ## 🗄️ Подключиться к PostgreSQL (если используется) @echo "$(COLOR_BOLD)$(COLOR_BLUE)Подключение к PostgreSQL...$(COLOR_RESET)" @$(DOCKER_COMPOSE) exec postgres psql -U postgres || echo "$(COLOR_YELLOW)⚠ PostgreSQL не запущен$(COLOR_RESET)" redis-cli: ## 🔴 Подключиться к Redis (если используется) @echo "$(COLOR_BOLD)$(COLOR_BLUE)Подключение к Redis...$(COLOR_RESET)" @$(DOCKER_COMPOSE) exec redis redis-cli || echo "$(COLOR_YELLOW)⚠ Redis не запущен$(COLOR_RESET)" # ============================================================================ # Целевые команды по умолчанию # ============================================================================ .DEFAULT_GOAL := help