488 lines
20 KiB
Makefile
488 lines
20 KiB
Makefile
# CatLink Development and Deployment Makefile
|
||
# ================================================
|
||
|
||
# Docker Compose command detection (v1 or v2)
|
||
DOCKER_COMPOSE := $(shell command -v docker-compose >/dev/null 2>&1 && echo "docker-compose" || echo "docker compose")
|
||
|
||
# Check if Docker Compose is available
|
||
ifndef DOCKER_COMPOSE
|
||
$(error Docker Compose not found. Please install Docker Compose v1 or v2)
|
||
endif
|
||
|
||
.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: ## Сборка для продакшена с настройкой nginx
|
||
@echo "🏗️ Сборка для продакшена..."
|
||
@$(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.prod.yml build --no-cache
|
||
@echo "🔧 Проверка и настройка nginx + certbot..."
|
||
@bash -c 'if ! command -v nginx &> /dev/null; then \
|
||
echo "📥 Установка nginx..."; \
|
||
sudo apt update && sudo apt install -y nginx; \
|
||
else \
|
||
echo "✅ nginx уже установлен"; \
|
||
fi'
|
||
@bash -c 'if ! command -v certbot &> /dev/null; then \
|
||
echo "📥 Установка certbot..."; \
|
||
sudo apt update && sudo apt install -y certbot python3-certbot-nginx; \
|
||
else \
|
||
echo "✅ certbot уже установлен"; \
|
||
fi'
|
||
@./scripts/setup-nginx.sh
|
||
@echo "✅ Продакшен сборка и nginx настройка завершены"
|
||
@echo "📝 Для получения SSL сертификата выполните:"
|
||
@echo " make ssl-cert"
|
||
|
||
ssl-cert: ## Получить SSL сертификат от Let's Encrypt
|
||
@echo "🔒 Получение SSL сертификата..."
|
||
@sudo certbot --nginx -d links.shareon.kr --non-interactive --agree-tos --email shadow85@list.ru
|
||
@echo "✅ SSL сертификат получен и настроен"
|
||
|
||
up-prod: ## Запуск в продакшен режиме
|
||
@echo "🚀 Запуск в продакшен режиме..."
|
||
@$(DOCKER_COMPOSE) -f docker-compose.yml -f docker-compose.prod.yml up -d
|
||
@echo "✅ Продакшен запущен"
|
||
@echo "📱 Frontend: http://localhost:3000"
|
||
@echo "🔧 Backend: http://localhost:8000"
|
||
|
||
update: ## Обновление зависимостей и пересборка
|
||
@echo "📦 Обновление зависимостей..."
|
||
@git pull
|
||
@$(DOCKER_COMPOSE) down
|
||
@$(DOCKER_COMPOSE) build --no-cache
|
||
@$(DOCKER_COMPOSE) up -d
|
||
@echo "✅ Обновление завершено"
|
||
|
||
# === Production Deployment ===
|
||
|
||
deploy-full: ## Полное развертывание в продакшен с SSL
|
||
@echo "🚀 Полное развертывание в продакшен..."
|
||
@make build-prod
|
||
@make up-prod
|
||
@sleep 10
|
||
@make migrate
|
||
@make ssl-cert
|
||
@echo "✅ Полное развертывание завершено!"
|
||
@echo "🌐 Сайт доступен по адресу: https://links.shareon.kr"
|
||
|
||
deploy-simple: ## Простое развертывание в продакшен (без мастер-настройки)
|
||
@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 "✅ Продакшен развернут"
|
||
|
||
fix-production: ## Исправление настроек продакшена
|
||
@echo "🔧 Исправление настроек продакшена..."
|
||
@./scripts/fix-production-env.sh
|
||
|
||
deploy: ## Мастер-развертывание проекта с полной настройкой
|
||
@echo "🚀 Запуск мастер-развертывания CatLink..."
|
||
@echo "⚠️ Это полное развертывание с настройкой SSL, БД и безопасности"
|
||
@read -p "Продолжить? (yes/no): " CONFIRM; \
|
||
if [ "$$CONFIRM" = "yes" ]; then \
|
||
./scripts/master-deploy.sh; \
|
||
else \
|
||
echo "❌ Развертывание отменено"; \
|
||
fi
|
||
|
||
deploy-force: ## Принудительное развертывание без проверок
|
||
@echo "🚀 Принудительное развертывание CatLink..."
|
||
@echo "⚠️ Пропуск проверки готовности системы"
|
||
@./scripts/master-deploy.sh --skip-checks
|
||
|
||
quick-deploy: ## Быстрое развертывание без полной настройки
|
||
@echo "⚡ Быстрое развертывание CatLink..."
|
||
@./scripts/quick-deploy.sh
|
||
|
||
pre-deploy-check: ## Проверка готовности системы к развертыванию
|
||
@echo "🔍 Проверка готовности системы..."
|
||
@./scripts/pre-deploy-check.sh
|
||
|
||
pre-deploy-check-force: ## Проверка готовности (игнорировать предупреждения)
|
||
@echo "🔍 Проверка готовности системы (игнорировать предупреждения)..."
|
||
@./scripts/pre-deploy-check.sh || echo "⚠️ Есть предупреждения, но продолжаем..."
|
||
|
||
# === SSL and Security ===
|
||
|
||
ssl-setup: ## Настройка SSL сертификатов
|
||
@echo "🔒 Настройка SSL сертификатов..."
|
||
@./scripts/ssl-manager.sh
|
||
|
||
ssl-renew: ## Обновление SSL сертификатов
|
||
@echo "🔄 Обновление SSL сертификатов..."
|
||
@sudo certbot renew --quiet
|
||
@sudo systemctl reload nginx
|
||
@echo "✅ SSL сертификаты обновлены"
|
||
|
||
ssl: ## Быстрая настройка SSL (legacy)
|
||
@echo "🔒 Быстрая настройка SSL..."
|
||
@$(MAKE) ssl-setup
|
||
|
||
# === 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-bash: ## Bash в контейнере backend
|
||
@$(DOCKER_COMPOSE) exec web bash
|
||
|
||
shell-exec: ## Выполнить команду в контейнере (использование: make shell-exec CMD="python manage.py migrate")
|
||
@$(DOCKER_COMPOSE) exec web $(CMD)
|
||
|
||
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 ===
|
||
|
||
check-nginx: ## Быстрая проверка nginx
|
||
@./scripts/nginx-quick-check.sh
|
||
|
||
check-nginx-full: ## Полная диагностика nginx
|
||
@./scripts/check-nginx.sh
|
||
|
||
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 (автоматически из .env.example)
|
||
@echo "🧭 Генерация .env файла из .env.example"
|
||
@bash ./scripts/generate_env.sh --yes
|
||
|
||
generate-env-interactive: ## Сгенерировать .env (интерактивно)
|
||
@echo "🧭 Генерация .env файла (интерактивно)"
|
||
@bash ./scripts/generate_env.sh
|
||
|
||
generate-env-prod: ## Сгенерировать .env для продакшена
|
||
@echo "🚀 Генерация .env для продакшена"
|
||
@bash ./scripts/generate_env.sh --yes
|
||
@echo "⚠️ ВНИМАНИЕ: Измените значения в .env для продакшена!"
|
||
@echo " - DJANGO_SECRET_KEY (сгенерируйте новый)"
|
||
@echo " - DJANGO_DEBUG=False"
|
||
@echo " - DATABASE_PASSWORD (установите надежный пароль)"
|
||
@echo " - DJANGO_ALLOWED_HOSTS (добавьте ваш домен)"
|
||
|
||
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 " make pre-deploy-check - Проверка готовности"
|
||
@echo " make deploy-simple - Простое развертывание"
|
||
@echo ""
|
||
@echo "🔒 Безопасность:"
|
||
@echo " make security-audit - Аудит безопасности БД"
|
||
@echo " make security-setup - Настройка безопасности БД"
|
||
@echo " make ssl-setup - Настройка SSL"
|
||
@echo " make ssl-renew - Обновление SSL"
|
||
@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
|
||
|
||
# === Security Commands ===
|
||
|
||
diagnose: ## Диагностика проблем на сервере
|
||
@echo "🔍 Запуск диагностики сервера..."
|
||
@./scripts/diagnose-server.sh
|
||
|
||
check-db: ## Проверка подключения к базе данных
|
||
@echo "🔗 Проверка подключения к БД..."
|
||
@./scripts/check-db-connection.sh
|
||
|
||
check-api: ## Проверка всех API эндпоинтов
|
||
@echo "🌐 Проверка API эндпоинтов..."
|
||
@./scripts/check-api-endpoints.sh
|
||
|
||
check-users: ## Показать данные пользователей
|
||
@echo "👥 Данные пользователей:"
|
||
@$(DOCKER_COMPOSE) exec db psql -U links_user -d links_db -c "SELECT id, username, email, first_name, last_name, is_active, is_staff, is_superuser, date_joined FROM users_user ORDER BY date_joined DESC;"
|
||
|
||
fix-admin: ## Исправить маршрут /admin в nginx
|
||
@echo "🔧 Исправление маршрута /admin..."
|
||
@./scripts/fix-nginx-admin.sh
|
||
|
||
security-audit: ## Аудит безопасности PostgreSQL
|
||
@echo "🔍 Запуск аудита безопасности PostgreSQL..."
|
||
@./scripts/audit-db-security.sh
|
||
|
||
security-setup: ## Настройка безопасности PostgreSQL
|
||
@echo "🔒 Настройка безопасности PostgreSQL..."
|
||
@./scripts/setup-db-security.sh
|
||
|
||
fix-db-security: security-setup security-audit ## Полная настройка безопасности БД
|
||
|
||
update-production-security: ## Безопасное обновление в продакшене
|
||
@echo "🔒 Обновление безопасности в продакшене..."
|
||
@./scripts/update-production-security.sh
|