/
alexefan136
/
flowstack
Обзор
Документация
Войти
/
alexefan136
/
flowstack
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
justfile
641 строка
29 KB
Alexander Efanov
фикс компонентов
19 июл 2026, 15:33
19 июл 2026, 15:33
98835c2
Код
Авторство
О чём код?
# justfile — FlowStack команды для разработки и деплоя # Использование: # just help — показать все команды # just dev — запустить весь стек # just dev-minimal — запустить минимальный стек # just publish — опубликовать образы в GitVerse # ============================================================================ # Конфигурация # ============================================================================ # Цвета (ANSI escape коды) green := "\x1b[0;32m" yellow := "\x1b[0;33m" cyan := "\x1b[0;36m" red := "\x1b[0;31m" blue := "\x1b[0;34m" nc := "\x1b[0m" # GitVerse Registry настройки registry_user := "alexefan136" registry_host := "gitverse.ru" repo_name := "flowstack" version := "1.0.0" # Дефолтная команда default: @just --list # ============================================================================ # HELP # ============================================================================ # 📖 Показать все доступные команды help: @just --list # ============================================================================ # DOCKER COMPOSE — Основные команды # ============================================================================ # 🚀 Запустить весь стек (engine + gateway + rag + ui) dev: env-check @echo "{{green}}🚀 Запуск FlowStack (все сервисы)...{{nc}}" docker compose up --build -d @echo "" @echo "{{green}}🌐 UI: {{cyan}}http://localhost:3000{{nc}}" @echo "{{green}}🦀 Gateway: {{cyan}}http://localhost:8080{{nc}}" @echo "{{green}}🐍 Engine: {{cyan}}http://localhost:8000{{nc}}" @echo "{{green}}📚 RAG: {{cyan}}http://localhost:8002{{nc}}" @echo "{{green}}🔍 Qdrant: {{cyan}}http://localhost:6333/dashboard{{nc}}" # 🚀 Запустить только backend (engine + gateway + rag) dev-backend: env-check @echo "{{green}}🚀 Запуск backend...{{nc}}" docker compose up --build -d engine gateway rag qdrant # 🚀 Запустить минимальный стек (engine + gateway + ui) dev-minimal: env-check @echo "{{green}}🚀 Запуск минимального стека...{{nc}}" docker compose up --build -d engine gateway ui # 🚀 Запустить только RAG + Qdrant dev-rag: env-check @echo "{{green}}🚀 Запуск RAG + Qdrant...{{nc}}" docker compose up --build -d rag qdrant @echo "{{green}}📚 RAG: {{cyan}}http://localhost:8002{{nc}}" @echo "{{green}}🔍 Qdrant: {{cyan}}http://localhost:6333/dashboard{{nc}}" # 🏗️ Запустить только инфраструктуру (postgres + redis + qdrant) dev-infra: @echo "{{green}}🏗️ Запуск инфраструктуры...{{nc}}" docker compose up --build -d postgres redis qdrant # 🔨 Собрать все образы build: @echo "{{cyan}}🔨 Сборка образов...{{nc}}" docker compose build # 🔨 Собрать только RAG образ build-rag: @echo "{{cyan}}🔨 Сборка RAG образа...{{nc}}" docker compose build rag # 🔨 Собрать образы без кэша (полная пересборка) build-no-cache: @echo "{{yellow}}🔨 Полная пересборка без кэша...{{nc}}" docker compose build --no-cache # 🚀 Запустить все сервисы в фоне up: @echo "{{green}}🚀 Запуск сервисов...{{nc}}" docker compose up -d # 🛑 Остановить и удалить все контейнеры down: @echo "{{yellow}}🛑 Остановка сервисов...{{nc}}" docker compose down # ⏸️ Остановить все сервисы (без удаления) stop: @echo "{{yellow}}⏸️ Остановка сервисов...{{nc}}" docker compose stop # 🔄 Перезапустить все сервисы restart: @echo "{{cyan}}🔄 Перезапуск сервисов...{{nc}}" docker compose restart # 📋 Показать статус всех контейнеров ps: docker compose ps # ============================================================================ # LOGS — Просмотр логов # ============================================================================ # 📜 Показать последние логи всех сервисов logs: docker compose logs --tail=100 # 📜 Следить за логами в реальном времени logs-follow: docker compose logs -f # 📜 Логи только Engine logs-engine: docker compose logs -f engine # 📜 Логи только Gateway logs-gateway: docker compose logs -f gateway # 📜 Логи только UI logs-ui: docker compose logs -f ui # 📜 Логи только RAG logs-rag: docker compose logs -f rag # 📜 Логи только Qdrant logs-qdrant: docker compose logs -f qdrant # 📜 Логи только PostgreSQL logs-postgres: docker compose logs -f postgres # 📜 Логи только Redis logs-redis: docker compose logs -f redis # 📜 Логи конкретного сервиса: just logs-service <имя> logs-service service: docker compose logs -f {{service}} # ============================================================================ # ENVIRONMENT — Управление конфигурацией # ============================================================================ # 🔧 Создать все .env файлы из примеров env-setup: env-rag-setup @echo "{{cyan}}🔧 Настройка окружения...{{nc}}" #!/usr/bin/env bash if [ ! -f core/engine/.env ]; then if [ -f core/engine/.env.example ]; then cp core/engine/.env.example core/engine/.env echo "{{green}}✅ Создан core/engine/.env из .env.example{{nc}}" else echo "{{yellow}}⚠️ Файл core/engine/.env.example не найден{{nc}}" fi else echo "{{green}}✅ core/engine/.env уже существует{{nc}}" fi echo "" echo "{{yellow}}⚠️ Отредактируйте .env файлы и добавьте API ключи{{nc}}" # 🔧 Создать .env для RAG сервиса env-rag-setup: @echo "{{cyan}}🔧 Настройка RAG окружения...{{nc}}" #!/usr/bin/env bash if [ ! -f core/rag/.env ]; then if [ -f core/rag/.env.example ]; then cp core/rag/.env.example core/rag/.env echo "{{green}}✅ Создан core/rag/.env из .env.example{{nc}}" else echo "{{yellow}}⚠️ Создаю пустой core/rag/.env{{nc}}" touch core/rag/.env fi else echo "{{green}}✅ core/rag/.env уже существует{{nc}}" fi # ✅ Проверить наличие .env файлов env-check: @echo "{{cyan}}✅ Проверка конфигурации...{{nc}}" @echo "" @echo "{{blue}}[Engine]{{nc}}" #!/usr/bin/env bash if [ ! -f core/engine/.env ]; then echo "{{yellow}} ⚠️ Файл core/engine/.env не найден{{nc}}" echo "{{yellow}} Запустите 'just env-setup' для создания{{nc}}" else echo "{{green}} ✅ core/engine/.env найден{{nc}}" if grep -q '^LLM_API_KEY=$$' core/engine/.env 2>/dev/null; then echo "{{yellow}} ⚠️ LLM_API_KEY не установлен в engine .env{{nc}}" elif grep -q '^LLM_API_KEY=your-api-key-here$$' core/engine/.env 2>/dev/null; then echo "{{yellow}} ⚠️ LLM_API_KEY содержит placeholder{{nc}}" else echo "{{green}} ✅ LLM_API_KEY установлен{{nc}}" fi fi @echo "" @echo "{{blue}}[RAG]{{nc}}" #!/usr/bin/env bash if [ ! -f core/rag/.env ]; then echo "{{yellow}} ⚠️ core/rag/.env не найден{{nc}}" else echo "{{green}} ✅ core/rag/.env найден{{nc}}" fi # ✏️ Открыть engine .env в редакторе env-edit: @echo "{{cyan}}✏️ Открытие .env...{{nc}}" #!/usr/bin/env bash ${EDITOR:-nano} core/engine/.env # ✏️ Открыть RAG .env в редакторе env-edit-rag: @echo "{{cyan}}✏️ Открытие RAG .env...{{nc}}" #!/usr/bin/env bash ${EDITOR:-nano} core/rag/.env # ============================================================================ # LLM — Тестирование LLM интеграции # ============================================================================ # 🤖 Протестировать LLM (обычный запрос) test-llm: @echo "{{cyan}}🤖 Тестирование LLM (обычный запрос)...{{nc}}" curl -s -X POST http://localhost:8000/api/v1/llm/chat \ -H "Content-Type: application/json" \ -d '{"messages":[{"role":"user","content":"Привет! Скажи одно слово."}],"stream":false}' \ | python3 -m json.tool || echo "{{red}}❌ LLM недоступен{{nc}}" # 🤖 Протестировать LLM (стриминг) test-llm-stream: @echo "{{cyan}}🤖 Тестирование LLM (стриминг)...{{nc}}" curl -N -X POST http://localhost:8000/api/v1/llm/chat \ -H "Content-Type: application/json" \ -d '{"messages":[{"role":"user","content":"Расскажи про Rust async"}],"stream":true}' # ⚙️ Показать текущую конфигурацию LLM test-llm-config: @echo "{{cyan}}⚙️ Конфигурация LLM:{{nc}}" curl -s http://localhost:8000/api/v1/llm/models | python3 -m json.tool || echo "{{red}}❌ Engine недоступен{{nc}}" # ============================================================================ # RAG — Тестирование RAG сервиса # ============================================================================ # 🧪 Полный тест RAG (ingest + search) test-rag: rag-ingest rag-search @echo "" @echo "{{green}}✅ RAG тест пройден успешно!{{nc}}" # 📥 Ingest тестового документа в RAG rag-ingest: @echo "{{cyan}}📥 Ingest тестового документа...{{nc}}" curl -s -X POST http://localhost:8002/ingest \ -H "Content-Type: application/json" \ -d '{ \ "content": "Rust is a systems programming language focused on safety, speed, and concurrency.", \ "source": "rust-intro.md", \ "doc_type": "markdown", \ "workspace_id": "engineering", \ "title": "Introduction to Rust" \ }' | python3 -m json.tool || echo "{{red}}❌ RAG недоступен{{nc}}" # 🔍 Поиск в RAG rag-search: @echo "{{cyan}}🔍 Поиск в RAG...{{nc}}" curl -s -X POST http://localhost:8002/search \ -H "Content-Type: application/json" \ -d '{ \ "query": "What is Rust?", \ "workspace_id": "engineering", \ "top_k": 5 \ }' | python3 -m json.tool || echo "{{red}}❌ RAG недоступен{{nc}}" # 📊 Статистика RAG сервиса rag-stats: @echo "{{cyan}}📊 Статистика RAG:{{nc}}" curl -s http://localhost:8002/stats | python3 -m json.tool || echo "{{red}}❌ RAG недоступен{{nc}}" # 📋 Список всех документов в RAG rag-browse: @echo "{{cyan}}📋 Список документов:{{nc}}" curl -s http://localhost:8002/documents | python3 -m json.tool || echo "{{red}}❌ RAG недоступен{{nc}}" # 🔍 Открыть Qdrant Dashboard в браузере qdrant-dashboard: @echo "{{cyan}}🔍 Открываю Qdrant Dashboard...{{nc}}" @echo "{{green}}URL: {{cyan}}http://localhost:6333/dashboard{{nc}}" #!/usr/bin/env bash open http://localhost:6333/dashboard 2>/dev/null || xdg-open http://localhost:6333/dashboard 2>/dev/null || echo "{{yellow}}Откройте URL вручную в браузере{{nc}}" # ============================================================================ # ТЕСТЫ # ============================================================================ # 🧪 Запустить все тесты test: test-engine test-gateway test-rag-unit test-ui # 🧪 Запустить тесты engine (pytest) test-engine: @echo "{{cyan}}🧪 Запуск тестов engine...{{nc}}" cd core/engine && uv run pytest -v # 🧪 Запустить тесты gateway (cargo test) test-gateway: @echo "{{cyan}}🧪 Запуск тестов gateway...{{nc}}" cd core/gateway && cargo test # 🧪 Запустить unit-тесты RAG (локально, без Docker) test-rag-unit: @echo "{{cyan}}🧪 Запуск unit-тестов RAG...{{nc}}" cd core/rag && cargo test --lib # 🧪 Запустить интеграционные тесты RAG (требует Qdrant) test-rag-integration: @echo "{{cyan}}🧪 Запуск интеграционных тестов RAG...{{nc}}" cd core/rag && cargo test --lib -- --ignored # 🧪 Запустить тесты UI (vitest) test-ui: @echo "{{cyan}}🧪 Запуск тестов UI...{{nc}}" cd ui && npm run test --if-present || echo "{{yellow}}⚠️ UI тесты не настроены{{nc}}" # ============================================================================ # LINTING # ============================================================================ # 🔍 Запустить все линтеры lint: lint-engine lint-gateway lint-rag lint-ui # 🔍 Линтинг engine (ruff) lint-engine: @echo "{{cyan}}🔍 Линтинг engine...{{nc}}" cd core/engine && uv run ruff check src cd core/engine && uv run ruff format --check src # 🔍 Линтинг gateway (clippy) lint-gateway: @echo "{{cyan}}🔍 Линтинг gateway...{{nc}}" cd core/gateway && cargo clippy -- -D warnings # 🔍 Линтинг RAG (clippy) lint-rag: @echo "{{cyan}}🔍 Линтинг RAG...{{nc}}" cd core/rag && cargo clippy -- -D warnings cd core/rag && cargo fmt -- --check # 🔧 Автофикс проблем в RAG lint-rag-fix: @echo "{{cyan}}🔧 Автофикс RAG...{{nc}}" cd core/rag && cargo clippy --fix --allow-dirty cd core/rag && cargo fmt # 🔍 Линтинг UI (eslint + tsc) lint-ui: @echo "{{cyan}}🔍 Линтинг UI...{{nc}}" cd ui && npm run lint --if-present || echo "{{yellow}}⚠️ UI линтер не настроен{{nc}}" # ============================================================================ # HEALTH CHECKS # ============================================================================ # 🏥 Проверить здоровье всех сервисов health: health-engine health-gateway health-ui health-rag health-qdrant health-postgres health-redis # 🏥 Проверить здоровье engine health-engine: @echo -n "{{cyan}}🏥 Engine (8000):{{nc}} " @curl -s http://localhost:8000/health | python3 -m json.tool 2>/dev/null || echo "{{red}}❌ недоступен{{nc}}" # 🏥 Проверить здоровье gateway health-gateway: @echo -n "{{cyan}}🏥 Gateway (8080):{{nc}} " @curl -s http://localhost:8080/ready | python3 -m json.tool 2>/dev/null || echo "{{red}}❌ недоступен{{nc}}" # 🏥 Проверить здоровье UI health-ui: @echo -n "{{cyan}}🏥 UI (3000):{{nc}} " @curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/ | grep -q "200" && echo "{{green}}✅ доступен{{nc}}" || echo "{{red}}❌ недоступен{{nc}}" # 🏥 Проверить здоровье RAG health-rag: @echo -n "{{cyan}}🏥 RAG (8002):{{nc}} " @curl -s http://localhost:8002/health | python3 -m json.tool 2>/dev/null || echo "{{red}}❌ недоступен{{nc}}" # 🏥 Проверить здоровье Qdrant health-qdrant: @echo -n "{{cyan}}🏥 Qdrant (6333):{{nc}} " @curl -s http://localhost:6333/healthz | python3 -m json.tool 2>/dev/null || echo "{{red}}❌ недоступен{{nc}}" # 🏥 Проверить здоровье PostgreSQL health-postgres: @echo -n "{{cyan}}🏥 Postgres(5432):{{nc}} " @docker compose exec -T postgres pg_isready -U flowstack >/dev/null 2>&1 && echo "{{green}}✅ доступен{{nc}}" || echo "{{red}}❌ недоступен{{nc}}" # 🏥 Проверить здоровье Redis health-redis: @echo -n "{{cyan}}🏥 Redis (6379):{{nc}} " @docker compose exec -T redis redis-cli ping 2>/dev/null | grep -q "PONG" && echo "{{green}}✅ доступен{{nc}}" || echo "{{red}}❌ недоступен{{nc}}" # 🏥 Краткая проверка здоровья всех сервисов health-short: @echo "" @echo "{{cyan}}=== Health Checks ==={{nc}}" #!/usr/bin/env bash echo -n "{{cyan}} Postgres :{{nc}} " docker compose exec -T postgres pg_isready -U flowstack >/dev/null 2>&1 && echo "{{green}}✅{{nc}}" || echo "{{red}}❌{{nc}}" echo -n "{{cyan}} Redis :{{nc}} " docker compose exec -T redis redis-cli ping 2>/dev/null | grep -q "PONG" && echo "{{green}}✅{{nc}}" || echo "{{red}}❌{{nc}}" echo -n "{{cyan}} Qdrant :{{nc}} " curl -s http://localhost:6333/healthz >/dev/null 2>&1 && echo "{{green}}✅{{nc}}" || echo "{{red}}❌{{nc}}" echo -n "{{cyan}} RAG :{{nc}} " curl -s http://localhost:8002/health >/dev/null 2>&1 && echo "{{green}}✅{{nc}}" || echo "{{red}}❌{{nc}}" echo -n "{{cyan}} Engine :{{nc}} " curl -s http://localhost:8000/health >/dev/null 2>&1 && echo "{{green}}✅{{nc}}" || echo "{{red}}❌{{nc}}" echo -n "{{cyan}} Gateway :{{nc}} " curl -s http://localhost:8080/ready >/dev/null 2>&1 && echo "{{green}}✅{{nc}}" || echo "{{red}}❌{{nc}}" echo -n "{{cyan}} UI :{{nc}} " curl -s -o /dev/null -w "%{http_code}" http://localhost:3000/ 2>/dev/null | grep -q "200" && echo "{{green}}✅{{nc}}" || echo "{{red}}❌{{nc}}" @echo "" # ============================================================================ # DEBUG & INSPECT # ============================================================================ # 🐚 Открыть shell в контейнере engine shell-engine: docker compose exec engine bash # 🐚 Открыть shell в контейнере gateway shell-gateway: docker compose exec gateway sh # 🐚 Открыть shell в контейнере UI shell-ui: docker compose exec ui sh # 🐚 Открыть shell в контейнере RAG shell-rag: docker compose exec rag bash # 🐚 Открыть shell в контейнере Qdrant shell-qdrant: docker compose exec qdrant sh # 🐚 Открыть psql shell shell-postgres: docker compose exec postgres psql -U flowstack # 🐚 Открыть redis-cli shell-redis: docker compose exec redis redis-cli # 🔍 Инспектировать контейнер engine inspect-engine: docker compose exec engine env | grep -E "^(LLM_|FLOWSTACK_|OPENAI_|RAG_)" | sort # 🔍 Инспектировать контейнер RAG inspect-rag: docker compose exec rag env | grep -E "^(LLM_|QDRANT_|SERVER_|CHUNKING_|RUST_)" | sort # ============================================================================ # CLEANUP # ============================================================================ # 🧹 Очистить build артефакты (не трогая образы) clean: @echo "{{yellow}}🧹 Очистка build артефактов...{{nc}}" #!/usr/bin/env bash rm -rf core/engine/.pytest_cache core/engine/.ruff_cache core/engine/.mypy_cache core/engine/__pycache__ 2>/dev/null || true cd core/gateway && cargo clean --profile dev 2>/dev/null || true cd core/rag && cargo clean --profile dev 2>/dev/null || true rm -rf ui/dist ui/.vite 2>/dev/null || true echo "{{green}}✅ Build артефакты очищены{{nc}}" # 🧹 Полная очистка RAG (target + образ) clean-rag: @echo "{{yellow}}🧹 Полная очистка RAG...{{nc}}" #!/usr/bin/env bash cd core/rag && cargo clean 2>/dev/null || true docker rmi flowstack-rag:latest 2>/dev/null || true echo "{{green}}✅ RAG очищен{{nc}}" # 🧹 Очистить LLM кэш clean-cache: @echo "{{yellow}}🧹 Очистка LLM кэша...{{nc}}" docker compose exec engine rm -rf /app/cache/* 2>/dev/null || true echo "{{green}}✅ Кэш очищен{{nc}}" # 🧹 Очистить данные Qdrant (все коллекции!) clean-qdrant: @echo "{{red}}⚠️ ВНИМАНИЕ: Будут удалены ВСЕ данные Qdrant!{{nc}}" #!/usr/bin/env bash read -p "Продолжить? [y/N] " confirm && [ "$confirm" = "y" ] || exit 1 docker compose down qdrant docker volume rm flowstack_qdrant_data 2>/dev/null || true echo "{{green}}✅ Qdrant данные удалены{{nc}}" # 🧹 Очистить данные PostgreSQL clean-postgres: @echo "{{red}}⚠️ ВНИМАНИЕ: Будут удалены ВСЕ данные PostgreSQL!{{nc}}" #!/usr/bin/env bash read -p "Продолжить? [y/N] " confirm && [ "$confirm" = "y" ] || exit 1 docker compose down postgres docker volume rm flowstack_postgres_data 2>/dev/null || true echo "{{green}}✅ PostgreSQL данные удалены{{nc}}" # 🗑️ Полная очистка (включая Docker образы и volumes) clean-all: clean @echo "{{red}}🗑️ Полная очистка Docker ресурсов...{{nc}}" docker compose down -v --rmi local echo "{{green}}✅ Готово{{nc}}" # ============================================================================ # DYNAMIC COMMANDS — Динамические команды с параметрами # ============================================================================ # 🔄 Перезапустить конкретный сервис: just restart <имя> restart service: @echo "{{cyan}}🔄 Перезапуск {{service}}...{{nc}}" docker compose restart {{service}} # 💀 Принудительно остановить сервис: just kill <имя> kill service: @echo "{{red}}💀 Остановка {{service}}...{{nc}}" docker compose kill {{service}} # 🔨 Пересобрать и перезапустить конкретный сервис: just rebuild <имя> rebuild service: @echo "{{cyan}}🔨 Пересборка {{service}}...{{nc}}" docker compose up --build -d --force-recreate {{service}} # ============================================================================ # PUBLISH — Публикация Docker образов в GitVerse # ============================================================================ # 📤 Опубликовать все образы в GitVerse Registry publish: @echo "{{cyan}}╔════════════════════════════════════════════════════════════╗{{nc}}" @echo "{{cyan}}║ FlowStack — Публикация Docker образов в GitVerse ║{{nc}}" @echo "{{cyan}}╚════════════════════════════════════════════════════════════╝{{nc}}" @echo "" @echo "{{yellow}}Registry: {{registry_host}}/{{registry_user}}/{{repo_name}}{{nc}}" @echo "{{yellow}}Version: {{version}}{{nc}}" @echo "" @echo "{{yellow}}🔐 Логин в GitVerse Registry...{{nc}}" docker login -u "{{registry_user}}" "{{registry_host}}" @echo "" #!/usr/bin/env bash set -e echo "{{blue}}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{{nc}}" echo "{{blue}}🔨 Сборка и пуш: engine{{nc}}" echo "{{blue}}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{{nc}}" docker build -t {{registry_host}}/{{registry_user}}/{{repo_name}}:engine-{{version}} \ -t {{registry_host}}/{{registry_user}}/{{repo_name}}:engine-latest \ ./core/engine docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:engine-{{version}} docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:engine-latest echo "{{green}}✅ engine опубликован{{nc}}" echo "" echo "{{blue}}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{{nc}}" echo "{{blue}}🔨 Сборка и пуш: gateway{{nc}}" echo "{{blue}}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{{nc}}" docker build -t {{registry_host}}/{{registry_user}}/{{repo_name}}:gateway-{{version}} \ -t {{registry_host}}/{{registry_user}}/{{repo_name}}:gateway-latest \ ./core/gateway docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:gateway-{{version}} docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:gateway-latest echo "{{green}}✅ gateway опубликован{{nc}}" echo "" echo "{{blue}}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{{nc}}" echo "{{blue}}🔨 Сборка и пуш: rag{{nc}}" echo "{{blue}}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{{nc}}" docker build -t {{registry_host}}/{{registry_user}}/{{repo_name}}:rag-{{version}} \ -t {{registry_host}}/{{registry_user}}/{{repo_name}}:rag-latest \ ./core/rag docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:rag-{{version}} docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:rag-latest echo "{{green}}✅ rag опубликован{{nc}}" echo "" echo "{{blue}}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{{nc}}" echo "{{blue}}🔨 Сборка и пуш: ui{{nc}}" echo "{{blue}}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━{{nc}}" docker build -t {{registry_host}}/{{registry_user}}/{{repo_name}}:ui-{{version}} \ -t {{registry_host}}/{{registry_user}}/{{repo_name}}:ui-latest \ ./ui docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:ui-{{version}} docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:ui-latest echo "{{green}}✅ ui опубликован{{nc}}" echo "" echo "{{green}}╔════════════════════════════════════════════════════════════╗{{nc}}" echo "{{green}}║ ✅ ГОТОВО! ║{{nc}}" echo "{{green}}╚════════════════════════════════════════════════════════════╝{{nc}}" # 📤 Опубликовать только один сервис: just publish-service engine publish-service service: @echo "{{cyan}}📤 Публикация {{service}}...{{nc}}" docker build -t {{registry_host}}/{{registry_user}}/{{repo_name}}:{{service}}-{{version}} \ -t {{registry_host}}/{{registry_user}}/{{repo_name}}:{{service}}-latest \ ./core/{{service}} || docker build -t {{registry_host}}/{{registry_user}}/{{repo_name}}:{{service}}-{{version}} \ -t {{registry_host}}/{{registry_user}}/{{repo_name}}:{{service}}-latest \ ./{{service}} docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:{{service}}-{{version}} docker push {{registry_host}}/{{registry_user}}/{{repo_name}}:{{service}}-latest @echo "{{green}}✅ {{service}} опубликован{{nc}}" # ============================================================================ # UI — Управление фронтендом # ============================================================================ # 🔨 Собрать UI образ ui-build: @echo "{{cyan}}🔨 Пересборка UI...{{nc}}" docker compose build ui # 🎨 Установить зависимости UI (локально) ui-local: @echo "{{cyan}}📦 Установка зависимостей UI...{{nc}}" cd ui && npm install # 🚀 Запустить UI в dev-режиме (локально) ui-dev: @echo "{{cyan}}🚀 Запуск UI в dev-режиме...{{nc}}" cd ui && npm run dev