Установка и развёртывание
aihelpme.ru поддерживает Docker Compose, Kubernetes Helm, одиночный бинарник Lite и настольное приложение. Для серверного развёртывания можно выбрать Compose или Helm; для локального использования — Lite; при участии в разработке используется отдельная оркестрация для разработки. Зависимости, команды запуска и каталоги данных для каждого способа приведены ниже.
Обзор форм развёртывания
| Форма | Точка входа | База данных | Очередь/поток | Сценарий применения |
|---|---|---|---|---|
| Docker Compose (стандартный) | docker-compose.yml | ParadeDB (PostgreSQL) | Redis + Asynq | Production / самохостинг для команды, рекомендуется |
| Docker Compose (разработка) | docker-compose.dev.yml | То же (в контейнеры выносится только инфраструктура) | То же | Локальная разработка: app / frontend работают на хосте |
| Helm | helm/ | ParadeDB (встроен в chart) | Redis (встроен в chart) | Kubernetes >= 1.25 |
| Одиночный бинарник Lite | make build-lite / scripts/package-lite.sh | SQLite (FTS5 + sqlite-vec) | В памяти (без Redis) | Персональное / офлайн- / низкоресурсное окружение |
| Настольное приложение (ещё не выпущено официально) | cmd/desktop (Wails v2) + scripts/package-mac-app.sh | SQLite | В памяти | Автономное использование на настольном ПК, с графическим интерфейсом и локальным каталогом данных |
Требования к оборудованию и зависимостям
- Стандартное развёртывание 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 по умолчанию отключён (нужно включить profileneo4j). - Сборка из исходного кода: 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)
Самый быстрый путь:
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/runningJWT_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в базе данных платформы, а остальные базы данных всё равно нужно проверять отдельно.
# в .env задайте WEKNORA_VERSION как целевую версию (например, 0.8.3) либо оставьте latest
docker compose pull
docker compose up -dВыполнение только
docker compose up -dпереиспользует локально закешированный образ, из-за чего версия, отображаемая в Web UI, может не совпадать со скачанным релизом.
Основные сервисы (запускаются по умолчанию)
| Сервис | Образ | Порт (хост:контейнер) | Зависимости | Описание |
|---|---|---|---|---|
frontend | wechatopenai/weknora-ui:${WEKNORA_VERSION:-latest} | ${FRONTEND_PORT:-80}:80 | app (healthy) | Nginx обслуживает SPA и проксирует на app; APP_HOST/APP_BACKEND_PORT/APP_SCHEME могут указывать на удалённый бэкенд |
app | wechatopenai/weknora-app | ${APP_PORT:-8080}:8080 | postgres (healthy), redis, docreader (healthy) | Бэкенд на Go; монтирует ./config/config.yaml и том data-files; проверка здоровья GET /health |
docreader | wechatopenai/weknora-docreader | только expose: 50051 (не публикуется на хост) | — | gRPC-сервис разбора документов; проверка здоровья grpc_health_probe; делит с app том docreader-tmp для передачи изображений |
postgres | paradedb/paradedb:v0.25.11-pg17 | порт хоста не пробрасывается | — | ParadeDB = PostgreSQL 17 + расширения BM25/векторного поиска, движок поиска по умолчанию |
redis | redis:7.0-alpine | порт хоста не пробрасывается | — | --appendonly yes --requirepass ${REDIS_PASSWORD} |
Опциональные сервисы и profiles
Включаются по необходимости командой docker compose --profile <name> up -d:
| profile | Сервис | Порт | Назначение |
|---|---|---|---|
searxng (входит в full) | searxng-init + searxng | 127.0.0.1:8888 (SEARXNG_BIND/SEARXNG_PORT) | Собственный Web-поиск; по умолчанию привязан только к loopback, перед публикацией обязательно смените SEARXNG_SECRET |
minio (входит в full) | minio | 9000 (S3) / 9001 (консоль) | S3-совместимое объектное хранилище (STORAGE_TYPE=minio), учётная запись по умолчанию minioadmin/minioadmin |
neo4j (входит в full) | neo4j | 7474 / 7687 | Граф знаний (NEO4J_ENABLE=true), по умолчанию neo4j/password |
qdrant (входит в full) | qdrant | 6333 (REST) / 6334 (gRPC) | Векторная база данных (RETRIEVE_DRIVER=qdrant) |
milvus | milvus | 19530 / 9091 | Векторная база данных (standalone, встроенный etcd) |
weaviate | weaviate | 9035 (HTTP) / 50052 (gRPC) | Векторная база данных |
doris | doris-fe + doris-be | 8030 (FE HTTP) / 9030 (FE MySQL) / 8040 (BE) | Поисковый движок Apache Doris 4.1 (требуется >= 3.0, HNSW ANN) |
dex (входит в full) | dex | 5556 | IdP для тестирования OIDC (конфигурация в misc/dex-config.yaml) |
langfuse (входит в full) | langfuse-db-init, langfuse-clickhouse, langfuse-minio, langfuse-worker, langfuse-web | 3000 (UI) / 9100/9101 (выделенный MinIO) | Собственный стек наблюдаемости Langfuse, переиспользует postgres платформы (создаётся БД langfuse) и redis (DB 1) |
odl-hybrid | odl-hybrid | expose 5002 | Гибридный бэкенд разбора PDF на OpenDataLoader/Docling (сборка только локально, используется с DOCREADER_ODL_HYBRID) |
full | sandbox, mcp и перечисленные выше сервисы с меткой full | mcp: ${MCP_PORT:-8082}:8000 | sandbox используется только для 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 работают на хосте с горячей перезагрузкой:
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, profileopensearch-ui) (плагин security отключён); dev.shзагружает.envи.env.local(последний переопределяет первый) и поддерживаетDEV_REMOTE_HOSTдля указания на удалённую инфраструктуру.
III. Сборка образов (каталог docker/)
| Dockerfile | Итоговый образ | Ключевые моменты |
|---|---|---|
docker/Dockerfile.app | wechatopenai/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.docreader | wechatopenai/weknora-docreader | Python 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-hybrid | weknora-odl-hybrid:local | Устанавливает opendataloader-pdf[hybrid] (Docling), слушает 5002, по умолчанию --no-ocr; только локальная сборка, не публикуется |
docker/Dockerfile.sandbox | wechatopenai/weknora-sandbox | Образ песочницы для сессий агента. Базовая среда — Python 3.12-slim + Node 20 + uv/pnpm; по умолчанию выполняется от root, сохранён пользователь user (UID 1000) для явного выбора. Цель сборки по умолчанию sandbox используется для Docker-бэкенда; есть также цели cube (со встроенным Cube envd), desktop / desktop-cube (с графическим рабочим столом) и др., см. Развёртывание песочницы |
frontend/Dockerfile | wechatopenai/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/ на хосте не требуется |
Сборка всех образов из исходного кода:
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:
APT_MIRROR=https://your-apt-mirror.example.com \
PLAYWRIGHT_WEBKIT_DOWNLOAD_HOST=https://your-playwright-mirror.example.com \
./scripts/build_images.sh --docreaderAPT_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:
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-256global.maxFileSizeMB имеет тот же смысл, что MAX_FILE_SIZE_MB в Compose; chart записывает его в три места: frontend (лимит тела запроса Nginx), app (лимит загрузки) и docreader (лимит сообщения gRPC). Опциональный образ MinIO — собранный сообществом pgsty/minio.
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 по пространству; сессии настольного приложения при неуказанной удалённой песочнице используют песочницу локальной операционной системы, см. Настольный клиент.
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/.
make package-mac-appVIII. Компиляция и запуск из исходного кода
# бэкенд (стандартная версия, требуются локальные 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, чтобы выполнить инициализацию и первый вопрос-ответ.
