Skip to content

Установка и развёртывание ​

aihelpme.ru поддерживает Docker Compose, Kubernetes Helm, одиночный бинарник Lite и настольное приложение. Для серверного развёртывания можно выбрать Compose или Helm; для локального использования — Lite; при участии в разработке используется отдельная оркестрация для разработки. Зависимости, команды запуска и каталоги данных для каждого способа приведены ниже.

Обзор форм развёртывания ​

ФормаТочка входаБаза данныхОчередь/потокСценарий применения
Docker Compose (стандартный)docker-compose.ymlParadeDB (PostgreSQL)Redis + AsynqProduction / самохостинг для команды, рекомендуется
Docker Compose (разработка)docker-compose.dev.ymlТо же (в контейнеры выносится только инфраструктура)То жеЛокальная разработка: app / frontend работают на хосте
Helmhelm/ParadeDB (встроен в chart)Redis (встроен в chart)Kubernetes >= 1.25
Одиночный бинарник Litemake build-lite / scripts/package-lite.shSQLite (FTS5 + sqlite-vec)В памяти (без Redis)Персональное / офлайн- / низкоресурсное окружение
Настольное приложение (ещё не выпущено официально)cmd/desktop (Wails v2) + scripts/package-mac-app.shSQLiteВ памятиАвтономное использование на настольном ПК, с графическим интерфейсом и локальным каталогом данных

Требования к оборудованию и зависимостям ​

  • Стандартное развёртывание Docker: Docker 20.10+ и Docker Compose v2 (v1 docker-compose тоже совместим, scripts/start_all.sh определит автоматически); рекомендуемый минимум — 4-ядерный CPU / 8 ГБ памяти (docreader включает LibreOffice и Playwright, довольно требователен к памяти), диск резервируется по масштабу базы знаний (том Postgres + файловый том /data/files). При включении таких опциональных компонентов, как Milvus / OpenSearch / Langfuse, память нужно соответственно увеличить.
  • Сервис моделей: для локального инференса требуется Ollama (адрес по умолчанию http://host.docker.internal:11434; при OLLAMA_OPTIONAL=true недоступность лишь вызывает предупреждение и не блокирует работу); либо любой OpenAI-совместимый API (DeepSeek, Tongyi, Zhipu, SiliconFlow и др.). Указанный минимум 8 ГБ не включает веса моделей Ollama; Neo4j по умолчанию отключён (нужно включить profile neo4j).
  • Сборка из исходного кода: Go 1.26 (см. стадию builder golang:1.26-bookworm в docker/Dockerfile.app), CGO (зависит от libsqlite3-dev), Node.js + npm (фронтенд), Python 3.10 + uv (docreader).
  • Kubernetes: >= 1.25.0 (helm/Chart.yaml).

Базовый уровень x86 CPU для ParadeDB v0.22.6-pg17 по умолчанию в Compose — x86-64-v2 (включая SSE4.2, POPCNT), AVX2 больше не является обязательным; базовый уровень для более новых версий образа см. в официальных заметках к релизу ParadeDB. Это не означает, что все ARM CPU или другие опциональные сервисы совместимы.

I. Стандартное развёртывание Docker Compose (docker-compose.yml) ​

Самый быстрый путь:

bash
git clone https://aihelpme.ru && cd aihelpme.ru
cp .env.example .env              # заполните обязательные поля: DB_USER/DB_PASSWORD/DB_NAME, REDIS_PASSWORD, JWT_SECRET, SYSTEM_AES_KEY
make start-all                # эквивалент ./scripts/start_all.sh (по умолчанию подтягивает последний образ)
# или напрямую:
docker compose pull           # подтянуть образ, соответствующий WEKNORA_VERSION
docker compose up -d
docker compose ps                 # дождитесь, пока все сервисы станут healthy/running

JWT_SECRET и SYSTEM_AES_KEY в .env.example по умолчанию оставлены пустыми; их нужно один раз сгенерировать при первом развёртывании и надёжно сохранить: JWT_SECRET можно сгенерировать командой openssl rand -hex 32, а SYSTEM_AES_KEY должен быть размером 32 байта — используйте openssl rand -hex 16. При обновлении существующего развёртывания сохраняйте прежний SYSTEM_AES_KEY, иначе уже зашифрованные учётные данные нельзя будет расшифровать. Назначение каждого ключа описано в разделе Подробная конфигурация.

Для остановки используйте docker compose down (флаг -v удалит вместе с данными тома, применяйте осторожно). В репозитории make start-all — это обёртка над той же командой (scripts/start_all.sh, дополнительно проверяет Ollama, подстраховывает .env и заранее подтягивает образ песочницы); достаточно выбрать один из двух вариантов.

После запуска откройте в браузере http://localhost — это фронтенд (порт определяется FRONTEND_PORT, по умолчанию 80); при первом обращении откроется страница регистрации. Nginx фронтенда проксирует /api/ на бэкенд, поэтому вызовы API также идут через http://localhost/api/v1; порт бэкенда 8080 тоже напрямую проброшен на хост, и curl http://localhost:8080/health можно использовать для проверки готовности бэкенда.

Примечание: сервис app в docker-compose.yml использует env_file: [.env]; отсутствие .env приведёт к ошибке разбора compose. make docker-run / start_all.sh автоматически подстрахуют, выполнив cp .env.example .env или touch .env.

Обновление версии ​

Если у вас уже есть развёртывание и вы скачали более новый релиз:

Если база данных всё ещё ParadeDB v0.22.2-pg17, сначала, следуя инструкции по обновлению ParadeDB, остановите запись, сделайте резервную копию, замените образ с сохранением тому данных и завершите обновление расширения pg_search, после чего снова запустите приложение. Простая замена образа не обновит SQL расширения в существующей базе данных; миграция 000099 обработает подходящие версии 0.22.2–0.22.5 в базе данных платформы, а остальные базы данных всё равно нужно проверять отдельно.

bash
# в .env задайте WEKNORA_VERSION как целевую версию (например, 0.8.3) либо оставьте latest
docker compose pull
docker compose up -d

Выполнение только docker compose up -d переиспользует локально закешированный образ, из-за чего версия, отображаемая в Web UI, может не совпадать со скачанным релизом.

Основные сервисы (запускаются по умолчанию) ​

СервисОбразПорт (хост:контейнер)ЗависимостиОписание
frontendwechatopenai/weknora-ui:${WEKNORA_VERSION:-latest}${FRONTEND_PORT:-80}:80app (healthy)Nginx обслуживает SPA и проксирует на app; APP_HOST/APP_BACKEND_PORT/APP_SCHEME могут указывать на удалённый бэкенд
appwechatopenai/weknora-app${APP_PORT:-8080}:8080postgres (healthy), redis, docreader (healthy)Бэкенд на Go; монтирует ./config/config.yaml и том data-files; проверка здоровья GET /health
docreaderwechatopenai/weknora-docreaderтолько expose: 50051 (не публикуется на хост)—gRPC-сервис разбора документов; проверка здоровья grpc_health_probe; делит с app том docreader-tmp для передачи изображений
postgresparadedb/paradedb:v0.25.11-pg17порт хоста не пробрасывается—ParadeDB = PostgreSQL 17 + расширения BM25/векторного поиска, движок поиска по умолчанию
redisredis:7.0-alpineпорт хоста не пробрасывается—--appendonly yes --requirepass ${REDIS_PASSWORD}

Опциональные сервисы и profiles ​

Включаются по необходимости командой docker compose --profile <name> up -d:

profileСервисПортНазначение
searxng (входит в full)searxng-init + searxng127.0.0.1:8888 (SEARXNG_BIND/SEARXNG_PORT)Собственный Web-поиск; по умолчанию привязан только к loopback, перед публикацией обязательно смените SEARXNG_SECRET
minio (входит в full)minio9000 (S3) / 9001 (консоль)S3-совместимое объектное хранилище (STORAGE_TYPE=minio), учётная запись по умолчанию minioadmin/minioadmin
neo4j (входит в full)neo4j7474 / 7687Граф знаний (NEO4J_ENABLE=true), по умолчанию neo4j/password
qdrant (входит в full)qdrant6333 (REST) / 6334 (gRPC)Векторная база данных (RETRIEVE_DRIVER=qdrant)
milvusmilvus19530 / 9091Векторная база данных (standalone, встроенный etcd)
weaviateweaviate9035 (HTTP) / 50052 (gRPC)Векторная база данных
dorisdoris-fe + doris-be8030 (FE HTTP) / 9030 (FE MySQL) / 8040 (BE)Поисковый движок Apache Doris 4.1 (требуется >= 3.0, HNSW ANN)
dex (входит в full)dex5556IdP для тестирования OIDC (конфигурация в misc/dex-config.yaml)
langfuse (входит в full)langfuse-db-init, langfuse-clickhouse, langfuse-minio, langfuse-worker, langfuse-web3000 (UI) / 9100/9101 (выделенный MinIO)Собственный стек наблюдаемости Langfuse, переиспользует postgres платформы (создаётся БД langfuse) и redis (DB 1)
odl-hybridodl-hybridexpose 5002Гибридный бэкенд разбора PDF на OpenDataLoader/Docling (сборка только локально, используется с DOCREADER_ODL_HYBRID)
fullsandbox, mcp и перечисленные выше сервисы с меткой fullmcp: ${MCP_PORT:-8082}:8000sandbox используется только для build/pull образа (command: ["true"], не постоянно запущен). Docker-песочница по умолчанию отключена; нужно задать WEKNORA_SANDBOX_DOCKER_ENABLED=true и смонтировать docker.sock (что эквивалентно root на хосте); Cube/E2B не зависят от локального daemon. mcp — это MCP Server

Секция environment контейнера app — это полный перечень переменных окружения (базы данных, векторные базы, объектное хранилище, тонкая настройка Docreader, стратегии тенантов, OIDC и т. д.), подробности см. в 04-configuration.md.

II. Режим разработки (docker-compose.dev.yml + scripts/dev.sh) ​

Оркестрация для разработки помещает в контейнеры только инфраструктуру (порты postgres, redis и docreader полностью пробрасываются на хост), а app и frontend работают на хосте с горячей перезагрузкой:

bash
make dev-start          # ./scripts/dev.sh start; можно добавить DEV_ARGS=--odl-hybrid / --minio / --qdrant / --neo4j / --dex / --full
make dev-app            # запуск Go-бэкенда на хосте (автоматически направляет DB_HOST/REDIS_ADDR на localhost)
make dev-frontend       # запуск dev-сервера фронтенда Vue на хосте
make dev-logs / dev-status / dev-stop / dev-restart

Отличия от продакшн-оркестрации:

  • postgres (5432), redis (6379), docreader (50051) публикуются на порты хоста для прямого подключения локальных процессов;
  • дополнительно предоставляется одноузловое окружение разработки opensearch (9200) и opensearch-dashboards (5601, profile opensearch-ui) (плагин security отключён);
  • dev.sh загружает .env и .env.local (последний переопределяет первый) и поддерживает DEV_REMOTE_HOST для указания на удалённую инфраструктуру.

III. Сборка образов (каталог docker/) ​

DockerfileИтоговый образКлючевые моменты
docker/Dockerfile.appwechatopenai/weknora-appТри стадии: сначала собираются bsk из BrowserSkill и сопутствующее расширение Chrome (устанавливается в /opt/weknora/browserskill/, см. Локальный браузер); затем компиляция через golang:1.26-bookworm (make build-prod; по умолчанию WITH_ANYDOC=1 линкует встроенный движок разбора office, внедряет информацию о версии, заранее скачивает расширение DuckDB cmd/download/duckdb) → рабочий слой debian:12.12-slim (включает утилиту миграций migrate, python3/node/uvx (для stdio MCP), ffmpeg (ASR), gosu для сброса привилегий, а также тексты сторонних лицензий). Точка входа scripts/docker-entrypoint.sh: исправляет владельца смонтированных каталогов; если смонтирован docker.sock, добавляет appuser в соответствующую группу по GID сокета (group_add в compose не действует после gosu), после чего запускает ./WeKnora от имени appuser. EXPOSE 8080
docker/Dockerfile.docreaderwechatopenai/weknora-docreaderPython 3.10 + фиксация зависимостей через uv; генерация protobuf; рабочий слой устанавливает LibreOffice, OpenJDK 17, antiword, Playwright (webkit) и grpc_health_probe. Облегчённая версия не содержит PaddleOCR. EXPOSE 50051. Поддерживает параметры сборки APT_MIRROR, PLAYWRIGHT_DOWNLOAD_HOST и PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST
docker/Dockerfile.odl-hybridweknora-odl-hybrid:localУстанавливает opendataloader-pdf[hybrid] (Docling), слушает 5002, по умолчанию --no-ocr; только локальная сборка, не публикуется
docker/Dockerfile.sandboxwechatopenai/weknora-sandboxОбраз песочницы для сессий агента. Базовая среда — Python 3.12-slim + Node 20 + uv/pnpm; по умолчанию выполняется от root, сохранён пользователь user (UID 1000) для явного выбора. Цель сборки по умолчанию sandbox используется для Docker-бэкенда; есть также цели cube (со встроенным Cube envd), desktop / desktop-cube (с графическим рабочим столом) и др., см. Развёртывание песочницы
frontend/Dockerfilewechatopenai/weknora-uiДве стадии: внутри зафиксированного по digest node:24-bookworm-slim ($BUILDPLATFORM, чтобы многоархитектурный CI не запускал Vite через QEMU) выполняются npm ci + npm run build (VITE_IS_DOCKER / VITE_FRONTEND_COMMIT), опционально NPM_REGISTRY / NODE_MAX_OLD_SPACE_SIZE; рабочий слой — зафиксированный по digest nginx:1.30.3-alpine (совместим со старым ядром CentOS 7). Предварительная сборка dist/ на хосте не требуется

Сборка всех образов из исходного кода:

bash
make build-images        # ./scripts/build_images.sh, параметры --app/--docreader/--frontend/--sandbox/--clean
# или по отдельности:
make docker-build-app
make docker-build-docreader
make docker-build-frontend

При сборке docreader в Китае или корпоративной сети можно одновременно сменить зеркала APT и артефактов Playwright:

bash
APT_MIRROR=https://your-apt-mirror.example.com \
PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST=https://your-playwright-mirror.example.com \
./scripts/build_images.sh --docreader

APT_MIRROR должен указывать на корневой адрес зеркала, сохраняющего структуру путей /debian и /debian-security; зеркало артефактов Playwright должно сохранять структуру путей официальных артефактов. При настройке только WebKit предпочитайте PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST — он имеет приоритет над универсальным PLAYWRIGHT_DOWNLOAD_HOST.

IV. Краткий справочник целей Makefile, связанных с развёртыванием ​

ЦельНазначение
make start-all / stop-allВызывает scripts/start_all.sh для запуска/остановки всего набора сервисов (включая проверку Ollama, подстраховку.env, предварительную загрузку образа песочницы)
make start-ollama / start-dockerЗапускает только Ollama / только сервисы Docker
make docker-run / docker-stop / docker-restartТрадиционные docker-compose up/down/restart (автоматически подстраховывают .env)
make build-images* / clean-images / pull-imagesСборка из исходников / очистка / загрузка образов
make check-env / list-containers / show-platformПроверка окружения (scripts/check-env.sh проверяет обязательные переменные.env и инструментарий) / список контейнеров / платформа сборки (автоопределение amd64/arm64)
make migrate-up / migrate-down / migrate-version / migrate-create name=x / migrate-force version=n / migrate-goto version=nМиграции базы данных (scripts/migrate.sh; в контейнере по умолчанию AUTO_MIGRATE=true, миграции выполняются автоматически при запуске)
make dev-*Режим разработки (см. выше)
make build / run / build-prodЛокальная компиляция и запуск cmd/server (build-prod требует CGO, внедряет номер версии и Edition=standard)
make build-lite / run-lite / package-liteСборка / запуск режима Lite (читает .env.lite) / упаковка дистрибутива
make package-mac-appУпаковка настольного приложения macOS
make docs / install-swaggerГенерация документации Swagger (http://localhost:8080/swagger/index.html, отключено в режиме release)
make clean-dbУдаляет тома данных postgres/minio/redis (опасная операция)

V. Скрипты запуска в scripts/ ​

СкриптНазначение
scripts/start_all.shЗапуск в одно действие: параметры -o (только Ollama), -d (только Docker), -a (всё, по умолчанию), -s (остановка), -c (проверка окружения), -l (список контейнеров), -p (загрузка образов); автоматически определяет compose v1/v2, задаёт PLATFORM по uname -m, в фоне заранее загружает образ sandbox
scripts/dev.shОркестрация среды разработки (см. выше), подкоманды start/stop/restart/logs/status/app/frontend
scripts/check-env.shПроверяет обязательные переменные .env (DB_*, STORAGE_TYPE, REDIS_ADDR, OLLAMA_BASE_URL и др.) и инструментарий Go/npm/Docker/Air
scripts/build_images.shСобирает образы и внедряет версию (git tag / commit / build time), поддерживает кросс-архитектуру
scripts/build_frontend_dist.shСборка статики фронтенда frontend/dist на хосте (сценарии без Docker, например упаковка Lite / настольного приложения; образ UI теперь собирается многостадийным Dockerfile)
scripts/migrate.shОбёртка над golang-migrate
scripts/docker-entrypoint.shТочка входа контейнера app (исправление владельца + добавление группы по GID docker.sock + сброс привилегий через gosu)
scripts/package-lite.sh / package-mac-app.shУпаковка tarball Lite /.app macOS

VI. Развёртывание Helm (helm/) ​

helm/Chart.yaml: apiVersion v2, имя chart weknora, appVersion следует за версией (например, v0.8.3), требуется Kubernetes >= 1.25.0.

Chart содержит пять компонентов: app (wechatopenai/weknora-app), frontend (wechatopenai/weknora-ui), docreader, postgresql (образ ParadeDB, в chart по умолчанию paradedb/paradedb:v0.18.9-pg17, что отличается от версии в Compose), redis (redis:7-alpine); дополнительно можно включить minio и neo4j.

Ключевые настройки helm/values.yaml:

yaml
app:
  replicaCount: 1
  env:
    GIN_MODE: release
    RETRIEVE_DRIVER: postgres      # postgres / elasticsearch_v7 / elasticsearch_v8 / qdrant ...
    STORAGE_TYPE: local            # local / minio / cos / tos / s3
    STREAM_MANAGER_TYPE: redis
postgresql:
  enabled: true
  persistence: { enabled: true, size: 10Gi }
redis:
  enabled: true
  persistence: { enabled: true, size: 1Gi }
dataFiles:
  persistence: { enabled: true, size: 10Gi }
global:
  maxFileSizeMB: 50                 # ограничение размера загрузки, действует для frontend / app / docreader
secrets:                            # обязательные поля либо используйте existingSecret для ссылки на существующий Secret
  dbPassword: ""
  redisPassword: ""
  jwtSecret: ""
  systemAesKey: ""                  # 32-байтовый мастер-ключ AES-256

global.maxFileSizeMB имеет тот же смысл, что MAX_FILE_SIZE_MB в Compose; chart записывает его в три места: frontend (лимит тела запроса Nginx), app (лимит загрузки) и docreader (лимит сообщения gRPC). Опциональный образ MinIO — собранный сообществом pgsty/minio.

bash
helm install weknora ./helm -n weknora --create-namespace \
  --set secrets.dbPassword=xxx --set secrets.redisPassword=xxx \
  --set secrets.jwtSecret=xxx --set secrets.systemAesKey=$(openssl rand -hex 16)

VII. Настольная версия (режим Lite / настольное приложение) ​

Настольная версия ориентирована на локальный компьютер и среды с малыми ресурсами; в основе обеих лежит один и тот же рантайм Lite (один процесс + SQLite + очередь в памяти), различаются лишь способ распространения и запуска: одиночный бинарник (запуск из командной строки, также может работать как фоновая служба) и настольное приложение (графический интерфейс, запуск двойным щелчком). Возможности базы знаний и вопросов-ответов одинаковы; вход без регистрации, локальная песочница и привязка к локальному каталогу проекта предоставляются только в настольном приложении.

Рантайм Lite (без внешних зависимостей) ​

Режим Lite реализует принцип «один процесс — весь набор» через задаваемый на этапе компиляции EDITION=lite и окружение .env.lite на этапе выполнения:

  • База данных: DB_DRIVER=sqlite + DB_PATH=./data/weknora.db, при компиляции добавляется -tags "sqlite_fts5";
  • Поиск: RETRIEVE_DRIVER=sqlite, используется полнотекстовый поиск SQLite FTS5 + векторный поиск sqlite-vec, векторная база данных не требуется;
  • Очередь/поток: STREAM_MANAGER_TYPE=memory (internal/stream/factory.go), Redis не нужен; распределённая очередь Asynq в режиме Lite работает в памяти как no-op;
  • Фронтенд: make build-lite копирует frontend/dist в web/ в корне репозитория, и бинарник напрямую раздаёт встроенную статику (WEKNORA_WEB_DIR позволяет указать каталог, раздачу обеспечивает serveFrontendStatic роутера);
  • Разбор документов: по-прежнему можно опционально подключить локальный docreader (DOCREADER_ADDR=127.0.0.1:50051);
  • Песочница: при запуске одиночного бинарника бэкенд не предустановлен; в настройках можно сконфигурировать Docker, CubeSandbox или E2B по пространству; сессии настольного приложения при неуказанной удалённой песочнице используют песочницу локальной операционной системы, см. Настольный клиент.
bash
cp .env.lite.example .env.lite      # укажите SYSTEM_AES_KEY (openssl rand -hex 16) и JWT_SECRET
make run-lite                       # соберите и запустите ./WeKnora-lite с окружением .env.lite
make package-lite                   # упакуйте релизный tarball (scripts/package-lite.sh)

При доступе к одиночному бинарнику через браузер, как и в стандартной версии, требуется регистрация и вход. Настольное приложение при запуске через нативный мост получает случайные для каждого процесса учётные данные и вызывает POST /auth/auto-setup, чтобы автоматически создать локальную учётную запись и войти; этот эндпоинт не принимает анонимные HTTP-запросы.

Настольное приложение (cmd/desktop, Wails v2) ​

Настольное приложение предоставляет способ локального использования с графическим интерфейсом: запуск двойным щелчком, внутри процесса встроены бэкенд и SQLite, данные размещаются в системном каталоге данных приложения; кроме того, есть особые для настольной версии возможности, такие как настройка порта, привязка к локальной сети и проверка обновлений. Возможности рантайма совпадают с Рантайм Lite (без внешних зависимостей).

Ещё не выпущено официально

В настоящее время настольное приложение не поставляется с установочным пакетом в Release — его нужно собрать самостоятельно по шагам ниже. В release-lite.yml уже есть задачи сборки для разных платформ (macOS universal/amd64/arm64, Linux amd64, Windows amd64), но триггер по tag в этом workflow закомментирован и запуск возможен только вручную, а к текущему последнему Release не приложено никаких артефактов.

  • Точка входа cmd/desktop/main.go + cmd/desktop/wails.json; cmd/desktop/app.go предоставляет фронтенду такие связанные методы, как GetAPIBaseURL (возвращает http://127.0.0.1:PORT/api/v1), настройки HTTP-порта и «привязки к локальной сети», CheckForUpdates для автоматической проверки обновлений.
  • scripts/package-mac-app.sh: сначала собирает фронтенд в web/, затем выполняет wails build -tags "sqlite_fts5", и наконец собирает пакет .app — Contents/MacOS/WeKnora Lite является главной программой, Contents/Resources содержит встроенные .env, config, migrations/sqlite, web-фронтенд; данные с относительными путями автоматически перенаправляются в ~/Library/Application Support/WeKnora Lite/data/, логи пишутся в ~/Library/Logs/WeKnora Lite/.
bash
make package-mac-app

VIII. Компиляция и запуск из исходного кода ​

bash
# бэкенд (стандартная версия, требуются локальные postgres/redis/docreader, см. режим разработки)
go mod download
make build && ./WeKnora                       # или make build-prod

# фронтенд
cd frontend && npm ci && npm run dev          # разработка; npm run build создаёт dist/

# docreader
cd docreader && uv sync --locked && bash scripts/generate_proto.sh && uv run -m docreader.main  # совпадает с CMD образа

Порядок поиска конфигурационного файла (LoadConfig в internal/config/config.go): текущий каталог → ./config → $HOME/.appname → /etc/appname/, имя файла config.yaml.

Типовые топологии развёртывания ​

Дальнейшие шаги ​

После завершения развёртывания прочитайте 03-quickstart.md, чтобы выполнить инициализацию и первый вопрос-ответ.

Версия v0.8.3 · MIT License