本文档覆盖两种部署方式:
- 传统部署:前端、后端、Celery、MySQL、Redis 分开部署
- Docker 部署:通过
docker compose启动整套服务
frontend:Vue 3 + Vite 前端backend:FastAPI 后端celery-default:轻量后台任务 workercelery-qa:知识问答 workercelery-indexing:索引构建 workercelery-migration:知识迁移 workermysql:业务数据库redis:缓存与任务队列
建议环境:
- Python 3.11
- Node.js 22.22.2+
- MySQL 8.x
- Redis 7.x
- Docker 24+ 与 Docker Compose v2(仅 Docker 部署需要)
数据库初始化:
CREATE DATABASE onlineunigraph CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;导入初始化数据:
mysql -uroot -p onlineunigraph < deploy/mysql/init/01-schema.sql复制环境变量模板:
cp backend/.env.template backend/.env按实际环境修改:
MYSQL_HOSTMYSQL_PORTMYSQL_USERMYSQL_PASSWORDMYSQL_DATABASEREDIS_HOSTREDIS_PORTOPENAI_API_KEYEMBEDDING_MODELTOKEN_SECRET_KEYAUTH_AES_SECRET_KEY(Base64 编码的 32 字节随机值,前端VITE_AUTH_AES_SECRET_KEY必须使用同一值)LLM_API_KEY_ENCRYPTION_KEY(模型 API Key 的数据库加密密钥,请独立备份)OPERA_LOG_ENCRYPT_SECRET_KEYCORS_ALLOWED_ORIGINS(JSON 数组,例如["http://localhost:5173"])
Linux / macOS:
cd backend
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
cd ..
python -m alembic -c backend/alembic.ini upgrade head
python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000Windows PowerShell:
cd backend
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
cd ..
python -m alembic -c backend/alembic.ini upgrade head
python -m uvicorn backend.main:app --host 0.0.0.0 --port 8000接口地址:
- OpenAPI 文档:
http://localhost:8000/knowg/v1/docs - OpenAPI JSON:
http://localhost:8000/knowg/v1/openapi
Linux / macOS:
celery -A backend.app.task.celery:celery_app worker -Q default --concurrency=${CELERY_DEFAULT_CONCURRENCY:-4} --loglevel=info
celery -A backend.app.task.celery:celery_app worker -Q qa --concurrency=${CELERY_QA_CONCURRENCY:-8} --loglevel=info
celery -A backend.app.task.celery:celery_app worker -Q indexing --concurrency=${CELERY_INDEXING_CONCURRENCY:-2} --loglevel=info
celery -A backend.app.task.celery:celery_app worker -Q migration --concurrency=${CELERY_MIGRATION_CONCURRENCY:-2} --loglevel=infoWindows:
celery -A backend.app.task.celery:celery_app worker -Q default --pool=solo --loglevel=info
celery -A backend.app.task.celery:celery_app worker -Q qa --pool=solo --loglevel=info
celery -A backend.app.task.celery:celery_app worker -Q indexing --pool=solo --loglevel=info
celery -A backend.app.task.celery:celery_app worker -Q migration --pool=solo --loglevel=infoWindows 的 solo 池单进程执行,每条队列应使用独立窗口;生产环境建议使用 Linux 的 prefork worker。
开发模式:
cd frontend
npm ci
npm run dev生产构建:
cd frontend
npm ci
npm run build前端运行时配置来自 frontend/public/config.js。
静态部署时可在 config.js 里覆盖:
window.FRONTEND_CONFIG = {
VITE_HOST_URL: '',
VITE_API_BASE_URL: '/knowg',
VITE_SHOW_IMAGE_API: '/knowg/v1/image/',
VITE_USER_INFO_SSO_URL: '/knowg/v1/sys/users/me',
VITE_AUTH_AES_SECRET_KEY: '与后端 AUTH_AES_SECRET_KEY 相同的值',
};- 前端:
8080 - 后端:
8000 - MySQL:
3306 - Redis:
6379
生产配置示例:
deploy/nginx/unigraph.conf.example:传统部署deploy/nginx/default.conf.template:Docker 镜像
构建前端后,将 frontend/dist 同步到 /var/www/unigraph,修改示例中的域名,然后启用站点。配置已经包含:
/提供前端静态资源和 SPA 回退;/knowg/反向代理到后端8000;- 问答流关闭代理缓冲,读写超时为 600 秒;
- 上传请求最大 50 MiB;
- 基础安全响应头。
启用 HTTPS 时建议使用 Certbot、云负载均衡或组织统一证书平台,并把 HTTP 重定向到 HTTPS。
仓库提供五个可修改的服务文件:
deploy/systemd/unigraph-backend.servicedeploy/systemd/unigraph-celery.servicedeploy/systemd/unigraph-celery-qa.servicedeploy/systemd/unigraph-celery-indexing.servicedeploy/systemd/unigraph-celery-migration.service
默认假设代码位于 /opt/unigraph、虚拟环境位于 /opt/unigraph/.venv、运行用户为 unigraph、环境文件位于 /etc/unigraph/unigraph.env。
sudo install -m 0644 deploy/systemd/unigraph-backend.service /etc/systemd/system/
sudo install -m 0644 deploy/systemd/unigraph-celery.service /etc/systemd/system/
sudo install -m 0644 deploy/systemd/unigraph-celery-{qa,indexing,migration}.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now unigraph-backend unigraph-celery unigraph-celery-{qa,indexing,migration}
sudo systemctl status unigraph-backend unigraph-celery unigraph-celery-{qa,indexing,migration}环境文件权限应限制为运行用户和管理员可读:
sudo chown root:unigraph /etc/unigraph/unigraph.env
sudo chmod 0640 /etc/unigraph/unigraph.env复制模板:
cp .env.docker.example .env.docker至少修改这些值:
MYSQL_PASSWORDMYSQL_DATABASETOKEN_SECRET_KEYAUTH_AES_SECRET_KEYLLM_API_KEY_ENCRYPTION_KEYOPERA_LOG_ENCRYPT_SECRET_KEYOPENAI_API_KEYCORS_ALLOWED_ORIGINSFRONTEND_PORTBACKEND_PORT
docker compose --env-file .env.docker up -d --build先把 .env.docker 中的 ENVIRONMENT 改为 pro、COOKIE_SECURE 改为 true,并将 CORS_ALLOWED_ORIGINS 设置为真实 HTTPS Origin。生产模式会拒绝占位密钥、短密钥、通配 CORS 和不安全 Cookie。
docker compose --env-file .env.docker -f compose.yaml -f deploy/compose.prod.yaml up -d --buildfrontend:Nginx 托管前端并代理/knowg/backend:FastAPImigrate:启动前执行 Alembic 数据库升级,成功后退出celery-default:轻量后台任务celery-qa:知识问答celery-indexing:索引构建celery-migration:知识迁移mysql:MySQL 8.4redis:Redis 7
默认访问地址:
- 前端:
http://localhost:8080 - 后端文档:
http://localhost:8000/knowg/v1/docs - 后端健康检查:
http://localhost:8000/knowg/v1/health
后端与前端都配置了容器健康检查;前端会等待后端健康后再启动。后端镜像使用多阶段构建并以 UID/GID 10001 的非 root 用户运行。Linux 主机首次启动前请确保绑定目录可写:
mkdir -p var backend/static
sudo chown -R 10001:10001 var backend/static查看全部日志:
docker compose --env-file .env.docker logs -f查看单个服务日志:
docker compose --env-file .env.docker logs -f backend
docker compose --env-file .env.docker logs -f celery-default celery-qa celery-indexing celery-migration
docker compose --env-file .env.docker logs -f frontend停止服务:
docker compose --env-file .env.docker down连同数据卷一起删除:
docker compose --env-file .env.docker down -v数据库版本由 Alembic 统一管理。后端启动时只做版本一致性检查,不会静默修改结构;版本落后时会拒绝启动并给出升级命令。Docker 的 migrate 服务会在 API 和 worker 之前自动升级。
升级已有数据库前先备份,然后执行:
mysqldump -uroot -p --single-transaction onlineunigraph > unigraph-backup.sql
python -m alembic -c backend/alembic.ini upgrade head
mysql -uroot -p onlineunigraph < backend/migrations/20260724_chat_history.sql
mysql -uroot -p onlineunigraph < backend/migrations/20260728_chat_share.sql
mysql -uroot -p onlineunigraph < backend/migrations/20260730_multi_user_constraints.sql
mysql -uroot -p onlineunigraph < backend/migrations/20260803_llm_provider_sort_order.sql新数据库由 deploy/mysql/init/01-schema.sql 创建最终结构,不要再重复执行上述迁移。
这些目录或卷建议保留:
backend/staticvarmysql_dataredis_data
compose.yamldeploy/compose.prod.yamldeploy/docker/backend.Dockerfiledeploy/docker/frontend.Dockerfiledeploy/mysql/init/01-schema.sqldeploy/nginx/default.conf.templatedeploy/nginx/unigraph.conf.exampledeploy/nginx/40-runtime-config.shdeploy/systemd/unigraph-backend.servicedeploy/systemd/unigraph-celery.servicefrontend/public/config.js.env.docker.example.dockerignore.gitignorebackend/.env.template
当前已经把常见运行产物加入忽略规则,重点包括:
- Python 虚拟环境与缓存
- 前端
node_modules与dist - 本地日志目录
- 后端静态上传目录与临时目录
- Docker 本地环境文件
如果你后续新增了本地运行目录,也建议同步加入 .gitignore 或 .dockerignore。
curl --fail http://127.0.0.1:8000/knowg/v1/health
docker compose --env-file .env.docker ps健康接口返回 {"status":"ok"}。如果后端容器不健康,先检查 MySQL、Redis 和环境变量:
docker compose --env-file .env.docker logs --tail=200 mysql redis backend确认反向代理已设置 proxy_buffering off,没有在上层 CDN 再次缓冲 NDJSON 响应,并检查语言模型和嵌入模型是否分别通过个人中心连接测试。
索引同时依赖语言模型与嵌入模型。社区报告使用语言模型,实体向量使用嵌入模型;任何嵌入失败都会使任务失败。修改配置后重新运行原任务即可,不会在任务中心创建重复记录。
这是安全行为:后端不会把保存的明文密钥返回给浏览器。个人中心显示“已保存”即表示数据库中已有加密密钥;编辑时留空不会覆盖它。