Files
links/Makefile
Andrey K. Choi 0963ac97b2
Some checks failed
continuous-integration/drone/push Build is failing
🚀 Добавлен docker-compose.prod.yml и команда up-prod в Makefile
- Создан docker-compose.prod.yml для продакшен конфигурации
- Добавлена команда up-prod в Makefile для запуска в продакшен режиме
- Обновлен .env файл с правильными настройками для продакшена
- Исправлены проблемы с паролем PostgreSQL
- Система полностью развернута и работает
2025-11-02 08:56:28 +09:00

377 lines
15 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.

# 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 "✅ Продакшен сборка готова"
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: ## Развертывание в продакшен
@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 (автоматически из .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 ""
# === 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