用最少的变量先跑通一套可用环境,再根据真实使用规模切换数据库、缓存、存储和文件处理服务。第一次部署建议从轻量安装开始。
面向长期多人使用时,建议使用 PostgreSQL + Redis。
开始之前#
DEEIX Chat 的部署需要先明确三件事:服务运行在哪里、浏览器访问哪个公开地址、数据和文件保存在哪里。不要同时在多个地方维护同一个配置值。
如果使用环境变量覆盖 config.yaml,应当把覆盖来源记录清楚,方便后续排查。
| 项目 | 要求 | 说明 |
|---|---|---|
| 运行环境 | Docker 与 Docker Compose | 推荐用于首次部署、轻量安装、标准部署和全量部署 |
| 配置文件 | 仓库根目录 config.yaml | Docker 部署时挂载到容器内 /app/config.yaml |
| 公开地址 | API、Web、CORS 保持一致 | 分离部署时尤其需要同步前端构建变量和后端公开 URL |
| 安全密钥 | 生产环境必须替换 | jwt_secret 和 data_encryption_key 不应使用示例值 |
| 数据持久化 | 数据库、缓存、文件卷 | SQLite 和 local storage 也必须挂载持久化目录 |
terminal
选择部署路径#
五条路径覆盖从试用到生产、从一体化运行到前后端分离的常见场景。先选择路径,再复制对应模板,不建议把不同模板的字段混合使用。
| 路径 | 适合场景 | 配置模板 | 启动方式 | 依赖模型 |
|---|---|---|---|---|
| 轻量安装 | 试用、演示、个人部署、小型单节点 | config.sqlite.example.yaml | docker-compose.sqlite.yml | App + SQLite + sqlite-vec + memory cache |
| 标准部署 | 已有 PostgreSQL 与 Redis | config.example.yaml | docker-compose.yml | 只启动 App,数据库和缓存外置 |
| 全量部署 | 单机运行应用、数据库和缓存 | config.full.example.yaml | docker-compose.full.yml | App + PostgreSQL + Redis |
| 分离部署 | 前端和 API 使用不同公网域名 | 目标环境配置 | 自定义构建与静态托管 | 前端静态资源和后端 API 分开托管 |
| 本地开发 | 修改源码、调试前后端 | config.example.yaml + frontend/.env.local | 后端 make run,前端 pnpm dev | 本机 PostgreSQL、Redis 和开发服务 |
1. 轻量安装#
轻量安装只启动 app 容器,数据写入 SQLite,向量索引使用 sqlite-vec,缓存使用进程内 memory cache。它是最快的体验路径,适合验证功能、演示和小型单节点使用。
如果后续需要多人长期使用,建议迁移到 PostgreSQL + Redis。
准备配置#
terminal
首次公开部署前,至少替换 security.jwt_secret、security.data_encryption_key、server.public_api_base_url、server.public_web_base_url 和 server.cors_allow_origin。安全密钥可以在 配置指南 中生成。
启动应用#
terminal
默认镜像是 ghcr.io/deeix-ai/deeix-chat:latest。如果要使用本地镜像或测试当前源码构建,可以覆盖镜像名。
terminal
打开服务#
| 服务 | 地址 | 用途 |
|---|---|---|
| Web 应用 | http://localhost:8080 | 用户对话和后台管理入口 |
| 健康检查 | http://localhost:8080/healthz | 验证服务是否启动 |
| Swagger | http://localhost:8080/swagger/index.html | 查看后端 API |
2. 标准部署#
标准部署只启动应用容器,适合已经具备 PostgreSQL、Redis、对象存储或平台级基础设施的环境。容器内访问外部服务时,数据库和 Redis 地址必须是容器可解析、可连接的地址。
如果服务运行在 Docker 宿主机上,通常使用 host.docker.internal。
准备配置#
terminal
检查连接参数#
| 配置 | 说明 |
|---|---|
database.postgres.dsn | PostgreSQL 连接字符串,注意容器网络可达性 |
cache.redis.addr | Redis 地址,推荐生产环境使用 Redis 而不是 memory cache |
cache.redis.password | Redis 密码。如果为空,应确认 Redis 网络边界足够可信 |
server.public_api_base_url | 浏览器、回调和外部系统访问 API 的公开地址 |
server.public_web_base_url | 分享、跳转和通知使用的 Web 地址 |
server.cors_allow_origin | 分离部署或跨域访问时允许的前端来源 |
启动应用#
terminal
默认 docker-compose.yml 不会启动 PostgreSQL 或 Redis。除非明确需要覆盖 config.yaml,不要在 Compose 环境变量里重复维护同名配置,避免实际生效来源变得不清晰。
3. 全量部署#
全量部署会在同一台机器上启动 App、PostgreSQL 和 Redis。它比轻量安装更接近生产依赖结构,适合单机长期运行,也更方便后续迁移到独立数据库、独立 Redis 或云托管服务。
准备配置#
terminal
公开部署前仍然要替换安全密钥、公开访问地址、CORS、可信代理、PostgreSQL 密码、Redis 密码和存储配置。
启动完整栈#
terminal
docker-compose.full.yml 会通过环境变量注入 POSTGRES_DSN、REDIS_ADDR 和 REDIS_PASSWORD。环境变量优先级高于 config.yaml,因此这些值会覆盖配置文件里的数据库和 Redis 连接项。
这是为了保证 app 容器连接 Compose 内部服务。
检查依赖状态#
terminal
如果 app 启动失败,优先确认 PostgreSQL 是否完成初始化、Redis 密码是否一致、config.yaml 是否成功挂载,以及 Compose 环境变量是否覆盖了预期字段。
4. 分离部署#
当前端和后端分别暴露在不同公网地址时使用分离部署。例如 Web 是 https://chat.example.com,API 是 https://api.example.com。这种路径对构建变量、CORS、公开 URL 和 CDN 路由回退都有要求,建议先阅读 配置指南。
对齐公开地址#
| 配置 | 示例 | 说明 |
|---|---|---|
NEXT_PUBLIC_API_BASE_URL | https://api.example.com | 前端构建时写入,浏览器用它请求后端 |
server.public_api_base_url | https://api.example.com | 后端对外 API 地址,用于回调、链接和外部系统 |
server.public_web_base_url | https://chat.example.com | 后端生成 Web 链接时使用 |
server.cors_allow_origin | https://chat.example.com | 允许跨域请求 API 的前端来源 |
构建前端#
terminal
发布 frontend/out 时,CDN 或静态服务器需要支持路由回退,例如 /chat 回退到 /chat/index.html。API、健康检查和 Swagger 路径应绕过 CDN 缓存,并完整转发请求头、请求体和响应状态码。
部署后检查#
terminal
如果页面能打开但接口失败,通常是 NEXT_PUBLIC_API_BASE_URL、cors_allow_origin 或反向代理路径没有对齐。前端构建变量已经写入静态产物,修改后需要重新构建前端。
5. 本地开发#
本地开发适合修改源码、调试前后端和验证界面交互,不是最短试用路径。默认配置连接本机 PostgreSQL 和 Redis,请先确认依赖已启动。
后端#
terminal
后端默认监听 http://localhost:8080,Swagger 地址是 http://localhost:8080/swagger/index.html。
前端#
terminal
本地前端通常把 API 指向后端开发服务。
.env.local
启动后检查#
应用启动后先检查健康状态、容器状态、配置挂载和启动日志。下面以轻量安装为例。
标准部署去掉 -f docker-compose.sqlite.yml,全量部署替换为 -f docker-compose.full.yml。
terminal
| 检查项 | 期望结果 | 异常时优先看什么 |
|---|---|---|
| 健康检查 | 返回服务健康状态 | 配置解析、数据库连接、端口占用 |
| 容器状态 | app 处于 running | 镜像拉取、启动命令、依赖服务状态 |
| 配置挂载 | /app/config.yaml 存在 | 启动目录、挂载路径、文件权限 |
| 启动日志 | 无迁移和初始化错误 | 数据库版本、密钥长度、环境变量覆盖 |
首次登录#
数据库中没有超级管理员时,后端会在首次启动时自动创建初始管理员,并且只在创建当次输出一次初始密码。不要把初始密码写入配置文件,也不要长期使用初始凭据。
| 项目 | 说明 |
|---|---|
| 初始用户名 | admin |
| 初始密码 | 查看启动日志,搜索 bootstrap superadmin created,读取 password 字段 |
| 首次登录 | 系统会要求修改用户名和密码 |
| 后续变更 | 通过账户流程或后台管理完成,不通过 config.yaml 修改 |
可选文件处理服务#
基础部署不强制启动文档解析和 OCR 服务。只有在后台或配置中启用对应能力时,才需要启动这些可选服务。它们通常和文件提取、OCR、RAG 构建链路有关,建议先完成基础应用部署,再逐项接入。
terminal
这些服务会接入 deeix-chat-network。请先启动任一根目录部署,或手动创建网络。
terminal
| 服务 | 默认地址 | 用途 |
|---|---|---|
| Tika | http://127.0.0.1:9998 | 文档文本提取 |
| Tesseract OCR | http://127.0.0.1:8004/ocr | OCR 服务 |
| Docling | http://127.0.0.1:8005/ocr | 文档和 OCR 提取 |
下一步#
登录后先完成运行时业务配置,再开放给真实用户使用。模型、上游、路由、价格、文件策略、RAG 和 MCP 工具属于后台管理,不建议写死在部署配置里。
| 配置项 | 建议操作 |
|---|---|
| 上游与模型 | 添加上游渠道,配置平台模型和路由绑定 |
| 文件与 RAG | 确认存储、提取、OCR、Embedding 和检索策略 |
| 认证与安全 | 替换密钥,检查 CORS、可信代理、注册策略和 2FA |
| 计费与用量 | 配置模型价格、订阅、充值、支付和 Webhook |
| 运维与审计 | 检查日志、审计事件、备份、GeoIP 和 OpenTelemetry |