Docwise — корпоративная платформа для работы с документами и знаниями:
- хранение и управление документами;
- чат-интерфейс с поиском по корпоративной базе знаний (RAG);
- контроль доступа на основе ролей и разрешений;
- мульти-тенантность (изоляция данных по организациям).
- Проект (архитектура, модули, мульти-тенантность):
docs/README_PROJECT.md - RAG (архитектура и принципы):
docs/README_RAG.md
Минимальный набор для разработки:
- Git
- Docker + Docker Compose v2 (команда
docker compose) - make (GNU Make)
- доступ к интернету для скачивания Docker‑образов и ML‑моделей (RAG, Docling, Hugging Face и др.)
Для RAG по умолчанию используется режим GPU:
- в файле
.envпеременнаяRAG_RUNTIME=gpu(берётся из.env.example) - для запуска GPU‑режима нужен Docker Runtime с поддержкой GPU (например,
nvidia-container-toolkit)
Если GPU недоступен, можно перевести RAG в CPU‑режим (см. раздел 6).
Проект разворачивается целиком в Docker через docker compose и Makefile из корня репозитория.
Основные сервисы:
- nginx — единая точка входа (HTTP)
- frontend — Vue-приложение (Vite dev server в dev, собранный бандл в prod)
- backend — Laravel-приложение (админка, бизнес-логика, интеграции)
- rag — RAG‑подсистема (FastAPI + воркеры конвейера)
- llm-proxy — OpenAI‑совместимый прокси LLM (используется для маршрутизации моделей и может быть вызван как внешнее API)
- db — PostgreSQL
- qdrant — векторная БД
- redis — очереди/стримы
- speech — сервис синтеза/распознавания речи (Yandex SpeechKit)
- telegram-bot — Telegram‑бот, работающий с backend и speech
Файлы окружения .env используются как в dev, так и в prod. На dev они обычно создаются автоматически через make init, на prod — через make env или ручное копирование файлов из .env.example.
Шаблоны:
- корень:
.env.example→.env
- backend (Laravel):
backend/.env.example→backend/.env
- frontend (Vue):
frontend/.env.example→frontend/.env
- RAG:
rag/.env.example→rag/.env
- Telegram‑бот:
integrations/telegram/.env.example→integrations/telegram/.env
- Yandex SpeechKit:
integrations/speech/yandex/.env.example→integrations/speech/yandex/.env
- LLM Proxy:
integrations/llm-proxy/config.example.yaml→integrations/llm-proxy/config.yaml
Файл: .env (создаётся из .env.example). Ключевые переменные:
DOCKER_PROJECT_NAME=docwise— имя проекта в Docker (идёт в имена контейнеров)RAG_RUNTIME=gpu|cpu— режим работы RAG (GPU по умолчанию)HOST_FRONTEND_PORT=8001— внешний порт HTTP (nginx)HOST_BACKEND_PORT=8000— внутренний порт backend (используется прокси)HOST_ADMINER_PORT=8002— порт AdminerHOST_QDRANT_PORT=8003— порт QdrantHOST_UID,HOST_GID— UID/GID текущего пользователя (подставляются автоматически черезmake init)
Файл: backend/.env (создаётся из backend/.env.example). Основное:
- настройки Laravel (APP* , LOG* , CACHE** , SESSION** и др.)
- PostgreSQL (
DB_*) — хостdb, порт5432(контейнер базы изdocker-compose.yml) - Redis (
REDIS_*) — хостredis - URL RAG:
RAG_URL=http://rag:8000— внутренний адрес сервиса RAG
- LLM Proxy:
LLM_PROXY_BASE_URL=http://llm-proxy:8317/v1— base_url OpenAI‑совместимого API (используется RAG)LLM_PROXY_API_KEY— ключ доступа (Bearer)
- интеграция с Yandex LLM:
YANDEX_API_URL,YANDEX_API_KEY,YANDEX_FOLDER_ID
- интеграция со SpeechKit:
SPEECHKIT_URL=http://speech:8000,SPEECHKIT_TIMEOUT
Файл: frontend/.env (создаётся из frontend/.env.example). Основное:
VITE_ENABLE_PWA,VITE_ENABLE_PWA_DEV— активация PWA для prod/devCHOKIDAR_USEPOLLING,CHOKIDAR_INTERVAL— настройки file‑watcher для Docker/WSL2
Адрес backend и RAG для фронтенда проксируются через nginx, поэтому дополнительно прописывать URL в этом файле обычно не требуется.
Файл: rag/.env (создаётся из rag/.env.example). Содержит:
- настройки Redis‑стримов (
RAG_REDIS_*), директорий данных (RAG_DATA_DIR,RAG_UPLOADS_DIR) - лимиты загрузок и список поддерживаемых типов файлов (
RAG_UPLOAD_*) - параметры реранкера (ONNX‑модель, кэш)
- настройки Hugging Face, spaCy, Docling, RapidOCR
- размерность эмбеддингов и модель (
VECTOR_DENSE_DIMENSIONS,EMBED_MODEL_ID) - URL собственного API эмбеддингов для воркеров (
EMBED_API_URL) YANDEX_API_KEY,YANDEX_FOLDER_ID— для LLM‑провайдера
-
Telegram‑бот (
integrations/telegram/.env):TELEGRAM_BOT_TOKEN— токен ботаBACKEND_API_URL— URL API backend, по умолчаниюhttp://localhost:8001/apiSPEECHKIT_API_URL— URL API сервиса речи, по умолчаниюhttp://localhost:8002/api/v1
-
Yandex SpeechKit (
integrations/speech/yandex/.env):YANDEX_API_KEY,YANDEX_FOLDER_ID— ключ и каталог в Yandex CloudAUDIO_DIR=/app/audio— путь до каталога с аудио в контейнере
-
LLM Proxy (
integrations/llm-proxy/config.yaml):api-keys— список ключей доступа к OpenAI‑совместимому APIremote-management.secret-key— ключ управления (если нужен доступ к панели)
Все команды выполняются из корня репозитория.
git clone https://github.com/void-environment/docwise.git
cd docwiseПри необходимости до запуска можно отредактировать:
.env.example— изменитьRAG_RUNTIME(например, наcpu) и портыHOST_*backend/.env.example— указать свои значенияAPP_URL, почтовых настроек и др.rag/.env.example— режим работы с Hugging Face (RAG_HF_MODE=offline|online), лимиты и др.integrations/*/.env.example— если планируются интеграции (Yandex, Telegram)
Изменения из .env.example будут перенесены в .env при выполнении make init (через цель make env).
make initЧто делает make init:
- Создаёт
.envфайлы из.env.example(корень, backend, frontend, rag, telegram, speech/yandex) - Прописывает в корневой
.envзначенияHOST_UIDиHOST_GIDтекущего пользователя - Собирает Docker‑образы для всех сервисов (
docker compose build) - Проверяет и при необходимости устанавливает зависимости:
- PHP‑зависимости backend (composer install)
- npm‑зависимости frontend (
npm installвнутри контейнера)
- Поднимает контейнеры (
docker compose up -d) - Генерирует
APP_KEYLaravel (php artisan key:generate) - Ожидает готовности БД (PostgreSQL)
- Прогоняет миграции и сиды базы (
php artisan migrate --force,db:seed) - Очищает кеши и пересобирает автодискавери (
php artisan optimize:clear,package:discover) - Перезапускает стек (down → up -d)
После успешного выполнения команда завершится без ошибок, а все основные сервисы будут запущены.
По умолчанию (из .env.example):
- основное веб‑приложение (nginx + frontend + backend):
http://localhost:8001
- Adminer (управление PostgreSQL):
http://localhost:8002
- Qdrant (векторная БД, HTTP API):
http://localhost:8003
Порт 8001 можно изменить в .env через HOST_FRONTEND_PORT до запуска контейнеров.
Сиды создают:
- супер-админа (
admin@example.com, парольpassword) - несколько организаций (tenants) и пользователей, привязанных к ним (см.
TenantSeeder)
После того как make init уже был выполнен хотя бы один раз, для обычной разработки достаточно следующих команд.
make upmake downmake restart-
открыть консоль в контейнере backend:
make backend-console
-
логи backend:
make backend-logs
-
миграции БД:
make backend-migrate
-
сиды БД:
make backend-seed
-
полное обновление схемы + сиды:
make backend-refresh
-
очистка кешей Laravel:
make backend-clear
-
установка npm‑зависимостей (если нужно вручную):
make frontend-install
-
логи frontend:
make frontend-logs
Через Docker напрямую, например:
docker compose logs -f rag
docker compose logs -f db
docker compose logs -f qdrantПо умолчанию используется GPU‑режим (RAG_RUNTIME=gpu). Для работы на CPU:
-
Остановить стек, если запущен:
make down
-
В файле
.envизменить:RAG_RUNTIME=cpu
-
Пересобрать образ RAG (целевой CPU‑вариант):
make build-rag-cpu
-
Поднять стек заново:
make up
При необходимости вернуться к GPU‑режиму можно через RAG_RUNTIME=gpu и make build-rag-gpu.
Файл docker-compose.prod.yml описывает продакшен‑окружение. Основные отличия от dev:
- отдельные prod‑образы (
docwise-*-:prod) - отдельные тома для данных (
backend_storage,backend_public,documents_data,audio_dataи др.) - health‑checks на всех ключевых сервисах
- логгирование с увеличенными лимитами
На целевом сервере (prod):
git clone https://gitlab.analyticumplus.ru/analyticum/python/docwise.git
cd docwiseДалее нужно создать .env файлы для prod-окружения.
-
Через Make (рекомендуется):
make env
Эта команда создаст
.env,backend/.env,frontend/.env,rag/.env,integrations/telegram/.env,integrations/speech/yandex/.envиз соответствующих.env.exampleбез сборки и запуска контейнеров. -
Ручное копирование (если
makeнедоступен):cp .env.example .env cp backend/.env.example backend/.env cp frontend/.env.example frontend/.env cp rag/.env.example rag/.env cp integrations/telegram/.env.example integrations/telegram/.env cp integrations/speech/yandex/.env.example integrations/speech/yandex/.env
После создания файлов обязательно проверьте и измените значения под prod.
После подготовки .env (см. 7.1) один из самых простых способов запустить prod-окружение «с нуля» — использовать обёртку:
make init-prodЭта команда последовательно выполняет:
make build-prod— сборка prod-образовmake up-prod— запуск prod-стекаmake backend-migrate-prod— прогон миграций в prodmake backend-seed-prod— прогон сидов в prod
make build-prodmake up-prodДля остановки:
make down-prodПерезапуск:
make restart-prodЕсли вы не используете make init-prod или хотите выполнять шаги вручную, миграции и сиды в prod нужно запускать отдельными командами. В отличие от dev-цели make init, в prod-стеке они не выполняются автоматически.
После того как стек поднят (make up-prod), выполните:
make backend-migrate-prod
make backend-seed-prodДля работы с моделями Yandex необходимо указать в двух файлах (минимум):
-
backend/.env:YANDEX_API_KEYYANDEX_FOLDER_ID
-
rag/.env:YANDEX_API_KEYYANDEX_FOLDER_ID
Для сервиса речи:
integrations/speech/yandex/.env:YANDEX_API_KEYYANDEX_FOLDER_IDAUDIO_DIR=/app/audio(обычно оставляется по умолчанию)
После изменения значений перезапустите стек:
make restartВ файле integrations/telegram/.env задаются:
TELEGRAM_BOT_TOKEN— токен бота из BotFatherBACKEND_API_URL— адрес backend API (по умолчаниюhttp://localhost:8001/api)SPEECHKIT_API_URL— адрес API сервиса речи (http://localhost:8002/api/v1)
llm-proxy поднимается как отдельный сервис и используется RAG‑подсистемой для вызова выбранных моделей.
Дополнительно его можно использовать как внешний OpenAI‑совместимый API.
В dev/prod nginx проксирует llm-proxy по префиксу:
http://localhost:${HOST_FRONTEND_PORT}/api/llm/→http://llm-proxy:8317/
Примеры эндпоинтов:
GET /api/llm/v1/modelsPOST /api/llm/v1/chat/completions
Аутентификация: Authorization: Bearer <LLM_PROXY_API_KEY>.
Внутри docker‑сети сервис доступен как:
http://llm-proxy:8317/v1
Этот адрес используется RAG по переменной LLM_PROXY_BASE_URL.
Для просмотра доступных команд в корне репозитория:
make helpКоманда выведет список целей Makefile с кратким описанием, включая команды для управления dev/prod‑стеком и полезные утилитарные цели.