feat(infra): переход прод/test на общую инфраструктуру вместо self-hosted
Postgres/Redis/RabbitMQ/MinIO/Ollama теперь общие серверы сети (адреса в .env), локально в докере остаётся только Elasticsearch + app-сервисы. Старый docker-compose.yml (полностью автономный стек) сохранён как docker-compose.selfhosted.yml.example на случай отдельного GPU-сервера в будущем. Добавлен docker-compose.prod.yml (app + свой nginx с TLS, собирающий фронтенд в статику). Makefile переписан под три режима (dev/test-up/prod). Мелкая чистка неиспользуемых импортов во фронтенде.
This commit is contained in:
95
Makefile
95
Makefile
@@ -1,11 +1,18 @@
|
||||
.PHONY: dev build migrate logs shell-api shell-gpu lint test down ps restart clean
|
||||
.PHONY: dev build migrate logs shell-api shell-gpu lint test down ps restart clean test-up test-down test-logs test-ps
|
||||
|
||||
# ─── Переменные ────────────────────────────────────────────────────────────────
|
||||
COMPOSE = docker compose
|
||||
COMPOSE_DEV = docker compose -f docker-compose.yml -f docker-compose.dev.yml
|
||||
# Прод: docker-compose.prod.yml — app-сервисы + локальный ES, остальная инфра
|
||||
# (postgres/redis/rabbitmq/minio/ollama) уже существует и берётся из .env.
|
||||
# Dev (полностью локальный sandbox, свои postgres/redis/rabbitmq/minio/ollama +
|
||||
# hot reload) — поверх self-hosted примера, используется редко.
|
||||
# Test (то, что реально гоняется на машине разработчика день в день) — hot
|
||||
# reload против той же общей инфры, что и прод.
|
||||
COMPOSE_PROD = docker compose -f docker-compose.prod.yml
|
||||
COMPOSE_DEV = docker compose -f docker-compose.selfhosted.yml.example -f docker-compose.dev.yml
|
||||
COMPOSE_TEST = docker compose -f docker-compose.test.yml
|
||||
PROJECT = anti-plagiarism
|
||||
|
||||
# ─── Разработка ────────────────────────────────────────────────────────────────
|
||||
# ─── Разработка (полностью локальный sandbox, редко используется) ─────────────
|
||||
dev:
|
||||
@cp -n .env.example .env 2>/dev/null || true
|
||||
$(COMPOSE_DEV) up --build
|
||||
@@ -14,99 +21,112 @@ dev-d:
|
||||
@cp -n .env.example .env 2>/dev/null || true
|
||||
$(COMPOSE_DEV) up --build -d
|
||||
|
||||
# ─── Test (hot reload против общей инфры — повседневная разработка) ──────────
|
||||
test-up:
|
||||
$(COMPOSE_TEST) up --build -d
|
||||
|
||||
test-down:
|
||||
$(COMPOSE_TEST) down
|
||||
|
||||
test-logs:
|
||||
$(COMPOSE_TEST) logs -f
|
||||
|
||||
test-ps:
|
||||
$(COMPOSE_TEST) ps
|
||||
|
||||
# ─── Продакшн ─────────────────────────────────────────────────────────────────
|
||||
build:
|
||||
$(COMPOSE) build
|
||||
$(COMPOSE_PROD) build
|
||||
|
||||
up:
|
||||
$(COMPOSE) up -d
|
||||
$(COMPOSE_PROD) up -d
|
||||
|
||||
down:
|
||||
$(COMPOSE) down
|
||||
$(COMPOSE_PROD) down
|
||||
|
||||
restart:
|
||||
$(COMPOSE) restart
|
||||
$(COMPOSE_PROD) restart
|
||||
|
||||
ps:
|
||||
$(COMPOSE) ps
|
||||
$(COMPOSE_PROD) ps
|
||||
|
||||
# ─── Миграции ─────────────────────────────────────────────────────────────────
|
||||
migrate:
|
||||
$(COMPOSE) exec api alembic upgrade head
|
||||
$(COMPOSE_PROD) exec api alembic upgrade head
|
||||
|
||||
migrate-dev:
|
||||
$(COMPOSE_DEV) exec api alembic upgrade head
|
||||
|
||||
makemigration:
|
||||
@read -p "Migration name: " name; \
|
||||
$(COMPOSE) exec api alembic revision --autogenerate -m "$$name"
|
||||
$(COMPOSE_PROD) exec api alembic revision --autogenerate -m "$$name"
|
||||
|
||||
downgrade:
|
||||
$(COMPOSE) exec api alembic downgrade -1
|
||||
$(COMPOSE_PROD) exec api alembic downgrade -1
|
||||
|
||||
# ─── Логи ─────────────────────────────────────────────────────────────────────
|
||||
logs:
|
||||
$(COMPOSE) logs -f
|
||||
$(COMPOSE_PROD) logs -f
|
||||
|
||||
logs-api:
|
||||
$(COMPOSE) logs -f api
|
||||
$(COMPOSE_PROD) logs -f api
|
||||
|
||||
logs-gpu:
|
||||
$(COMPOSE) logs -f worker-gpu
|
||||
$(COMPOSE_PROD) logs -f worker-gpu
|
||||
|
||||
logs-indexer:
|
||||
$(COMPOSE) logs -f worker-indexer
|
||||
$(COMPOSE_PROD) logs -f worker-indexer
|
||||
|
||||
logs-notifier:
|
||||
$(COMPOSE) logs -f worker-notifier
|
||||
$(COMPOSE_PROD) logs -f worker-notifier
|
||||
|
||||
logs-gost:
|
||||
$(COMPOSE) logs -f worker-gost
|
||||
$(COMPOSE_PROD) logs -f worker-gost
|
||||
|
||||
# ─── Шеллы ────────────────────────────────────────────────────────────────────
|
||||
shell-api:
|
||||
$(COMPOSE) exec api bash
|
||||
$(COMPOSE_PROD) exec api bash
|
||||
|
||||
shell-gpu:
|
||||
$(COMPOSE) exec worker-gpu bash
|
||||
$(COMPOSE_PROD) exec worker-gpu bash
|
||||
|
||||
shell-indexer:
|
||||
$(COMPOSE) exec worker-indexer bash
|
||||
$(COMPOSE_PROD) exec worker-indexer bash
|
||||
|
||||
shell-db:
|
||||
$(COMPOSE) exec postgres psql -U antiplagiator antiplagiator
|
||||
@echo "Postgres общий (192.168.1.11) — подключайся напрямую: psql -h 192.168.1.11 -U antiplagiator antiplagiator"
|
||||
|
||||
shell-redis:
|
||||
$(COMPOSE) exec redis redis-cli
|
||||
@echo "Redis общий (192.168.1.19) — подключайся напрямую: redis-cli -h 192.168.1.19 -n 3"
|
||||
|
||||
# ─── Линтинг и тесты ──────────────────────────────────────────────────────────
|
||||
lint:
|
||||
$(COMPOSE) exec api ruff check . --fix
|
||||
$(COMPOSE) exec api mypy app/
|
||||
$(COMPOSE_PROD) exec api ruff check . --fix
|
||||
$(COMPOSE_PROD) exec api mypy app/
|
||||
|
||||
lint-frontend:
|
||||
cd services/frontend && npm run lint
|
||||
|
||||
test:
|
||||
$(COMPOSE) exec api pytest tests/ -v
|
||||
$(COMPOSE_PROD) exec api pytest tests/ -v
|
||||
|
||||
test-cov:
|
||||
$(COMPOSE) exec api pytest tests/ -v --cov=app --cov-report=html
|
||||
$(COMPOSE_PROD) exec api pytest tests/ -v --cov=app --cov-report=html
|
||||
|
||||
# ─── Утилиты ──────────────────────────────────────────────────────────────────
|
||||
# ВНИМАНИЕ: -v удаляет только ЛОКАЛЬНЫЕ volume (es_prod_data, faiss_index_prod) —
|
||||
# общие postgres/redis/rabbitmq/minio не в Compose, их не затронет.
|
||||
clean:
|
||||
$(COMPOSE) down -v --remove-orphans
|
||||
$(COMPOSE_PROD) down -v --remove-orphans
|
||||
docker system prune -f
|
||||
|
||||
# Запустить парсер (пример: make parse PARSER=openalex ARGS="--limit 1000")
|
||||
parse:
|
||||
$(COMPOSE) exec api python /scripts/run_parser.py $(PARSER) $(ARGS)
|
||||
$(COMPOSE_PROD) exec api python /scripts/run_parser.py $(PARSER) $(ARGS)
|
||||
|
||||
# Создать MinIO бакеты
|
||||
# Создать MinIO бакеты (запускать один раз на общем MinIO 192.168.1.21, не локально)
|
||||
minio-init:
|
||||
$(COMPOSE) exec minio mc alias set local http://localhost:9000 minioadmin changeme
|
||||
$(COMPOSE) exec minio mc mb local/documents || true
|
||||
$(COMPOSE) exec minio mc mb local/backups || true
|
||||
@echo "MinIO общий (192.168.1.21) — бакеты documents/backups создаются на нём, см. .env MINIO_*"
|
||||
|
||||
# Создать ES индекс
|
||||
es-init:
|
||||
@@ -115,13 +135,14 @@ es-init:
|
||||
# Статистика Celery
|
||||
flower:
|
||||
@echo "Flower доступен по адресу http://localhost:5555"
|
||||
@$(COMPOSE) ps flower
|
||||
@$(COMPOSE_PROD) ps flower
|
||||
|
||||
help:
|
||||
@echo "Академический помощник — команды make:"
|
||||
@echo ""
|
||||
@echo " make dev — запустить в режиме разработки (hot reload)"
|
||||
@echo " make build — собрать Docker образы"
|
||||
@echo " make test-up — запустить тестовый стек (hot reload, общая инфра)"
|
||||
@echo " make dev — запустить полностью локальный sandbox (редко нужно)"
|
||||
@echo " make build — собрать прод-образы"
|
||||
@echo " make up — запустить в продакшн режиме"
|
||||
@echo " make down — остановить все сервисы"
|
||||
@echo " make migrate — применить миграции Alembic"
|
||||
@@ -129,4 +150,4 @@ help:
|
||||
@echo " make shell-api — открыть shell в контейнере api"
|
||||
@echo " make lint — запустить линтер"
|
||||
@echo " make test — запустить тесты"
|
||||
@echo " make clean — удалить все контейнеры и volumes"
|
||||
@echo " make clean — удалить прод-контейнеры и ЛОКАЛЬНЫЕ volume"
|
||||
|
||||
Reference in New Issue
Block a user