Files
links/Makefile
Andrey K. Choi fb74a4a25d
Some checks failed
continuous-integration/drone/push Build is failing
some fixes
2025-11-08 18:45:20 +09:00

488 lines
20 KiB
Makefile
Raw Permalink 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.

# 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