# CatLink Development and Deployment Makefile # ================================================ # Docker Compose command detection DOCKER_COMPOSE := $(shell which docker-compose 2>/dev/null || echo "docker compose") .PHONY: help install update dev build deploy ssl clean logs test restart shell backup restore # Default target help: ## Показать доступные команды @echo "CatLink - Makefile Commands" @echo "==========================" @echo "" @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-15s\033[0m %s\n", $$1, $$2}' @echo "" # === Development Commands === install: ## Установка и первый запуск @echo "🚀 Установка CatLink..." @./setup.sh @echo "✅ Установка завершена!" @echo "📱 Frontend: http://localhost:3000" @echo "🔧 Backend API: http://localhost:8000" @echo "📊 Admin: http://localhost:8000/admin" dev: ## Запуск в режиме разработки @echo "🔧 Запуск в режиме разработки..." @$(DOCKER_COMPOSE) up dev-bg: ## Запуск в фоне для разработки @echo "🔧 Запуск в фоне..." @$(DOCKER_COMPOSE) up -d @echo "✅ Запущено в фоне" @echo "📱 Frontend: http://localhost:3000" @echo "🔧 Backend: http://localhost:8000" up: ## Запуск с пересборкой (legacy) @$(DOCKER_COMPOSE) up -d --build down: ## Остановка всех сервисов @echo "⏹️ Остановка сервисов..." @$(DOCKER_COMPOSE) down @echo "✅ Сервисы остановлены" stop: ## Остановка всех сервисов (alias) @$(MAKE) down restart: ## Перезапуск сервисов @echo "🔄 Перезапуск сервисов..." @$(DOCKER_COMPOSE) down @$(DOCKER_COMPOSE) up -d @echo "✅ Сервисы перезапущены" # === Build Commands === build: ## Сборка без кэша @echo "🏗️ Сборка контейнеров..." @$(DOCKER_COMPOSE) build --no-cache @echo "✅ Сборка завершена" build-prod: ## Сборка для продакшена @echo "🏗️ Сборка для продакшена..." @$(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.prod.yml build --no-cache @echo "✅ Продакшен сборка готова" update: ## Обновление зависимостей и пересборка @echo "📦 Обновление зависимостей..." @git pull @$(DOCKER_COMPOSE) down @$(DOCKER_COMPOSE) build --no-cache @$(DOCKER_COMPOSE) up -d @echo "✅ Обновление завершено" # === Production Deployment === deploy: ## Развертывание в продакшен @echo "🚀 Развертывание в продакшен..." @$(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.prod.yml down @$(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.prod.yml build --no-cache @$(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.prod.yml up -d @echo "✅ Продакшен развернут" # === SSL and Security === ssl: ## Настройка SSL с Let's Encrypt @echo "🔒 Настройка SSL..." @if [ ! -f docker-compose.ssl.yml ]; then \ echo "⚠️ Файл docker-compose.ssl.yml не найден. Создание..."; \ $(MAKE) ssl-setup; \ fi @$(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.ssl.yml up -d @echo "✅ SSL настроен" ssl-setup: ## Создание конфигурации SSL @echo "🔒 Создание SSL конфигурации..." @./scripts/ssl_setup.sh @echo "✅ SSL конфигурация создана" ssl-cert: ## Получение SSL сертификата @echo "🔐 Получение SSL сертификата..." @read -p "Введите домен (например, catlinks.kr): " DOMAIN; \ read -p "Введите email: " EMAIL; \ docker-compose -f docker-compose.ssl.yml run --rm certbot certonly \ --webroot -w /var/www/certbot \ -d $$DOMAIN \ --email $$EMAIL \ --agree-tos \ --no-eff-email @echo "✅ SSL сертификат получен" # === Database Management === migrate: ## Выполнить миграции базы данных @echo "🗄️ Выполнение миграций..." @$(DOCKER_COMPOSE) exec web python manage.py migrate @echo "✅ Миграции выполнены" makemigrations: ## Создать новые миграции @echo "🗄️ Создание миграций..." @$(DOCKER_COMPOSE) exec web python manage.py makemigrations @echo "✅ Миграции созданы" superuser: ## Создать суперпользователя @echo "👤 Создание суперпользователя..." @$(DOCKER_COMPOSE) exec web python manage.py createsuperuser @echo "✅ Суперпользователь создан" # === Maintenance === logs: ## Просмотр логов @$(DOCKER_COMPOSE) logs -f logs-web: ## Логи backend @$(DOCKER_COMPOSE) logs -f web logs-frontend: ## Логи frontend @$(DOCKER_COMPOSE) logs -f frontend shell: ## Django shell @$(DOCKER_COMPOSE) exec web python manage.py shell shell-db: ## Подключение к базе данных @$(DOCKER_COMPOSE) exec db psql -U links_user -d links_db backup: ## Создать бэкап базы данных @echo "💾 Создание бэкапа..." @mkdir -p backups @$(DOCKER_COMPOSE) exec db pg_dump -U links_user links_db > backups/backup_$(shell date +%Y%m%d_%H%M%S).sql @echo "✅ Бэкап создан в папке backups/" restore: ## Восстановить из бэкапа @echo "📥 Восстановление из бэкапа..." @ls -la backups/ @read -p "Введите имя файла бэкапа: " BACKUP_FILE; \ docker-compose exec -T db psql -U links_user -d links_db < backups/$$BACKUP_FILE @echo "✅ База данных восстановлена" # === Testing and Quality === test: ## Запуск тестов @echo "🧪 Запуск тестов..." @$(DOCKER_COMPOSE) exec web python manage.py test @echo "✅ Тесты завершены" test-legacy: ## Запуск тестов (legacy pytest) @$(DOCKER_COMPOSE) exec web pytest --maxfail=1 --disable-warnings -q lint: ## Проверка кода @echo "🔍 Проверка кода..." @$(DOCKER_COMPOSE) exec web flake8 . || true @$(DOCKER_COMPOSE) exec frontend npm run lint || true @echo "✅ Проверка завершена" format: ## Форматирование кода @echo "🎨 Форматирование кода..." @$(DOCKER_COMPOSE) exec web black . || true @$(DOCKER_COMPOSE) exec frontend npm run format || true @echo "✅ Код отформатирован" # === CI/CD Operations === ci-lint: ## Локальный запуск CI линтинга @echo "🔍 Запуск CI линтинга локально..." @bash ./scripts/ci/lint.sh @echo "✅ CI линтинг завершен" ci-test: ## Локальный запуск CI тестов @echo "🧪 Запуск CI тестов локально..." @bash ./scripts/ci/test.sh @echo "✅ CI тесты завершены" ci-security: ## Локальный запуск проверки безопасности @echo "🔒 Запуск проверки безопасности..." @bash ./scripts/ci/security-scan.sh @echo "✅ Проверка безопасности завершена" ci-build: ## Локальная сборка как в CI @echo "🏗️ Запуск CI сборки локально..." @bash ./scripts/ci/build.sh @echo "✅ CI сборка завершена" ci-build-prod: ## Локальная сборка продакшен образов @echo "🏗️ Сборка продакшен образов..." @bash ./scripts/ci/build-production.sh @echo "✅ Продакшен образы собраны" ci-publish: ## Публикация образов в registry @echo "📤 Публикация образов..." @bash ./scripts/ci/publish.sh @echo "✅ Образы опубликованы" ci-deploy-staging: ## Деплой на staging @echo "🚀 Деплой на staging..." @bash ./scripts/ci/deploy-staging.sh @echo "✅ Staging деплой завершен" ci-deploy-production: ## Деплой на production @echo "🚀 Деплой на production..." @bash ./scripts/ci/deploy-production.sh @echo "✅ Production деплой завершен" ci-pipeline: ## Полный CI/CD пайплайн локально @echo "🚀 Запуск полного CI/CD пайплайна..." @$(MAKE) ci-lint @$(MAKE) ci-test @$(MAKE) ci-security @$(MAKE) ci-build @echo "✅ Полный пайплайн завершен" drone-validate: ## Валидация .drone.yml @echo "✅ Валидация Drone конфигурации..." @if command -v drone >/dev/null 2>&1; then \ drone lint .drone.yml; \ else \ echo "⚠️ Drone CLI не установлен, используем docker..."; \ docker run --rm -v "$(PWD):/repo" -w /repo drone/cli:alpine lint .drone.yml; \ fi @echo "✅ Валидация завершена" drone-sign: ## Подпись .drone.yml (требует настройки) @echo "🔐 Подпись Drone конфигурации..." @if [ -z "$(DRONE_SECRET)" ]; then \ echo "❌ DRONE_SECRET не установлен"; \ exit 1; \ fi @drone sign smartsoltech/links --save @echo "✅ Конфигурация подписана" # === Helper scripts and automation === generate-env: ## Сгенерировать .env (интерактивно) @echo "🧭 Генерация .env файла (использует scripts/generate_env.sh)" @bash ./scripts/generate_env.sh create-superuser-noninteractive: ## Создать/обновить суперпользователя из .env (неинтерактивно) @echo "👤 Создание/обновление суперпользователя из .env" @bash ./scripts/create_superuser.sh rebuild-no-cache: ## Пересобрать и поднять контейнеры без кэша (scripts/rebuild_no_cache.sh) @echo "♻️ Пересборка контейнеров без кэша" @bash ./scripts/rebuild_no_cache.sh migrate-full: ## makemigrations, migrate и collectstatic @echo "⚙️ Полный набор операций миграции и сбора статики" @bash ./scripts/migrate_and_collect.sh ssl-host-setup: ## Локальная установка nginx + certbot и настройка прокси (HOST) @echo "🔐 Настройка nginx/letsencrypt на хосте" @echo "Использование: make ssl-host-setup DOMAIN=example.com EMAIL=you@example.com" @if [ -z "${DOMAIN}" ]; then echo "ERROR: DOMAIN variable required"; exit 1; fi @if [ -z "${EMAIL}" ]; then echo "ERROR: EMAIL variable required"; exit 1; fi @sudo bash ./scripts/ssl_setup.sh ${DOMAIN} ${EMAIL} # === Cleanup === clean: ## Очистка системы @echo "🧹 Очистка..." @$(DOCKER_COMPOSE) down -v @docker system prune -f @docker volume prune -f @echo "✅ Очистка завершена" clean-all: ## Полная очистка (ОСТОРОЖНО!) @echo "⚠️ ВНИМАНИЕ: Это удалит ВСЕ данные!" @read -p "Продолжить? (yes/no): " CONFIRM; \ if [ "$$CONFIRM" = "yes" ]; then \ docker-compose down -v; \ docker system prune -af; \ docker volume prune -f; \ sudo rm -rf storage/; \ echo "✅ Полная очистка завершена"; \ else \ echo "❌ Отменено"; \ fi # === Status and Info === status: ## Статус сервисов @echo "📊 Статус сервисов:" @$(DOCKER_COMPOSE) ps @echo "" @echo "🌐 URL-адреса:" @echo " Frontend: http://localhost:3000" @echo " Backend: http://localhost:8000" @echo " Admin: http://localhost:8000/admin" @echo "" health: ## Проверка здоровья сервисов @echo "🏥 Проверка здоровья..." @curl -s http://localhost:3000 > /dev/null && echo "✅ Frontend: OK" || echo "❌ Frontend: ERROR" @curl -s http://localhost:8000/api/ > /dev/null && echo "✅ Backend: OK" || echo "❌ Backend: ERROR" @$(DOCKER_COMPOSE) exec db pg_isready -U links_user && echo "✅ Database: OK" || echo "❌ Database: ERROR" info: ## Информация о проекте @echo "📋 CatLink - Информация о проекте" @echo "=================================" @echo "🐱 Название: CatLink" @echo "📱 Frontend: Next.js 15" @echo "🔧 Backend: Django 5.2" @echo "🗄️ База данных: PostgreSQL" @echo "🐳 Контейнеризация: Docker" @echo "" @echo "📁 Структура:" @echo " frontend/ - Next.js приложение" @echo " backend/ - Django API" @echo " storage/ - Загруженные файлы" @echo "" @echo "🛠️ Команды разработки:" @echo " make install - Первая установка" @echo " make dev - Режим разработки" @echo " make deploy - Продакшен" @echo "" # === Advanced Operations === scale: ## Масштабирование сервисов @echo "📈 Масштабирование..." @read -p "Количество экземпляров web: " WEB_COUNT; \ read -p "Количество экземпляров frontend: " FRONTEND_COUNT; \ docker-compose up -d --scale web=$$WEB_COUNT --scale frontend=$$FRONTEND_COUNT @echo "✅ Масштабирование применено" monitor: ## Мониторинг ресурсов @echo "📊 Мониторинг ресурсов..." @docker stats reset: ## Сброс к заводским настройкам @echo "⚠️ ВНИМАНИЕ: Сброс к заводским настройкам!" @read -p "Продолжить? (yes/no): " CONFIRM; \ if [ "$$CONFIRM" = "yes" ]; then \ $(MAKE) clean-all; \ $(MAKE) install; \ echo "✅ Сброс завершен"; \ else \ echo "❌ Отменено"; \ fi