@@ -7,16 +7,16 @@ import { Callout } from "fumadocs-ui/components/callout";
77
88# Docker Compose 部署
99
10- OpenDeepWiki 在项目根目录提供 ` compose.yaml ` ,定义了两个服务:后端 API 和前端 web 应用。
10+ OpenDeepWiki 在项目根目录提供 ` compose.yaml ` ,定义了两个服务:后端 API 和前端 web 应用。PostgreSQL 用户可直接使用 ` compose.pgsql.yaml ` 。
1111
1212## 服务架构
1313
14- | 服务 | 端口 | 描述 |
15- | ---| ---| ---|
16- | ` opendeepwiki ` | ` 8080 ` | 带有 AI 处理的 ASP.NET Core 后端 API |
17- | ` web ` | ` 3000 ` | Next.js 前端应用 |
14+ | 服务 | 容器端口 | 默认宿主机映射 | 描述 |
15+ | ---| ---| ---| --- |
16+ | ` opendeepwiki ` | ` 8080 ` | ` 8081:8080 ` | 带有 AI 处理的 ASP.NET Core 后端 API |
17+ | ` web ` | ` 3000 ` | ` 8090:3000 ` | Next.js 前端应用 |
1818
19- 前端依赖于后端,并在其健康检查通过后才启动 。
19+ > 端口映射以仓库中 ` compose.yaml ` 的实际内容为准,可按需修改。前端通过内部网络使用 ` API_PROXY_URL=http://opendeepwiki:8080 ` 访问后端 。
2020
2121## 快速部署
2222
@@ -27,13 +27,15 @@ cd OpenDeepWiki
2727
2828# 编辑 compose.yaml 中的环境变量(见下文)
2929# 然后启动所有服务
30- docker- compose up -d
30+ docker compose up -d
3131```
3232
33- 在 ` http://localhost:3000 ` 访问应用。
33+ 在 ` http://localhost:8090 ` 访问应用。
3434
3535## 完整 compose.yaml 参考
3636
37+ 以下是当前 ` compose.yaml ` 的关键结构(完整内容以文件为准):
38+
3739``` yaml
3840services :
3941 opendeepwiki :
@@ -42,56 +44,57 @@ services:
4244 context : .
4345 dockerfile : src/OpenDeepWiki/Dockerfile
4446 ports :
45- - " 8080 :8080"
47+ - " 8081 :8080"
4648 restart : unless-stopped
47- healthcheck :
48- test : ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]
49- interval : 30s
50- timeout : 10s
51- retries : 3
52- start_period : 15s
5349 environment :
5450 - ASPNETCORE_ENVIRONMENT=Production
5551 - URLS=http://+:8080
5652
5753 # 数据库
58- - DB_TYPE= sqlite
59- - CONNECTION_STRING= Data Source=/data/opendeepwiki.db
54+ - Database__Type=${DB_TYPE:- sqlite}
55+ - ConnectionStrings__Default=${CONNECTION_STRING:- Data Source=/data/opendeepwiki.db}
6056
6157 # JWT
62- - JWT_SECRET_KEY=your-secret-key-change-in-production
58+ - JWT_SECRET_KEY=${JWT_SECRET_KEY:-OpenDeepWiki-Default-Secret-Key-Please-Change-In-Production-Environment-2024}
6359
64- # 仓库存储
60+ # 仓库存储与本地目录导入白名单
6561 - REPOSITORIES_DIRECTORY=/data
62+ - RepositoryAnalyzer__AllowedLocalPathRoots__0=${LOCAL_IMPORT_ROOT:-/host/home/youruser}
6663
6764 # AI 服务(聊天)
68- - CHAT_API_KEY=your-api-key
69- - ENDPOINT=https://api.openai.com/v1
70- - CHAT_REQUEST_TYPE=OpenAI
65+ - CHAT_API_KEY=${CHAT_API_KEY:- your-chat- api-key}
66+ - ENDPOINT=${ENDPOINT:- https://api.openai.com/v1}
67+ - CHAT_REQUEST_TYPE=${CHAT_REQUEST_TYPE:- OpenAI}
7168
7269 # Wiki 目录生成
73- - WIKI_CATALOG_MODEL=gpt-4o
74- - WIKI_CATALOG_ENDPOINT=https://api.openai.com/v1
75- - WIKI_CATALOG_API_KEY=your-api-key
76- - WIKI_CATALOG_REQUEST_TYPE=OpenAI
70+ - WIKI_CATALOG_MODEL=${WIKI_CATALOG_MODEL:- gpt-4o}
71+ - WIKI_CATALOG_ENDPOINT=${WIKI_CATALOG_ENDPOINT:- https://api.openai.com/v1}
72+ - WIKI_CATALOG_API_KEY=${WIKI_CATALOG_API_KEY:- your-catalog- api-key}
73+ - WIKI_CATALOG_REQUEST_TYPE=${WIKI_CATALOG_REQUEST_TYPE:- OpenAI}
7774
7875 # Wiki 内容生成
79- - WIKI_CONTENT_MODEL=gpt-4o
80- - WIKI_CONTENT_ENDPOINT=https://api.openai.com/v1
81- - WIKI_CONTENT_API_KEY=your-api-key
82- - WIKI_CONTENT_REQUEST_TYPE=OpenAI
76+ - WIKI_CONTENT_MODEL=${WIKI_CONTENT_MODEL:- gpt-4o}
77+ - WIKI_CONTENT_ENDPOINT=${WIKI_CONTENT_ENDPOINT:- https://api.openai.com/v1}
78+ - WIKI_CONTENT_API_KEY=${WIKI_CONTENT_API_KEY:- your-content- api-key}
79+ - WIKI_CONTENT_REQUEST_TYPE=${WIKI_CONTENT_REQUEST_TYPE:- OpenAI}
8380
8481 # Wiki 翻译(可选,回退到内容配置)
8582 # - WIKI_TRANSLATION_MODEL=gpt-4o
8683 # - WIKI_TRANSLATION_ENDPOINT=https://api.openai.com/v1
8784 # - WIKI_TRANSLATION_API_KEY=your-api-key
8885 # - WIKI_TRANSLATION_REQUEST_TYPE=OpenAI
8986
90- # 并行生成数量
91- - WIKI_PARALLEL_COUNT=5
92-
93- # 多语言支持(逗号分隔)
94- - WIKI_LANGUAGES=en,zh,zh-tw,ja,ko,es,fr,de,pt-br,pl,ru,ar
87+ # 并行生成数量 / 多语言支持
88+ - WIKI_PARALLEL_COUNT=${WIKI_PARALLEL_COUNT:-5}
89+ - WIKI_MAX_CONCURRENT_GENERATIONS=${WIKI_MAX_CONCURRENT_GENERATIONS:-1}
90+ - WIKI_LANGUAGES=${WIKI_LANGUAGES:-en,zh,zh-tw,ja,ko,es,fr,de,pt-br,pl,ru,ar}
91+
92+ # Graphify 图谱产物(可选)
93+ - GRAPHIFY_BACKEND=${GRAPHIFY_BACKEND:-}
94+ - GRAPHIFY_MODEL=${GRAPHIFY_MODEL:-}
95+ - GRAPHIFY_OUTPUT_ROOT=/data/graphify-artifacts
96+ - GRAPHIFY_OPENAI_BASE_URL=${GRAPHIFY_OPENAI_BASE_URL:-}
97+ - GRAPHIFY_OPENAI_API_KEY=${GRAPHIFY_OPENAI_API_KEY:-}
9598 volumes :
9699 - ./data:/data
97100
@@ -101,23 +104,25 @@ services:
101104 context : ./web
102105 dockerfile : Dockerfile
103106 ports :
104- - " 3000 :3000"
107+ - " 8090 :3000"
105108 restart : unless-stopped
106- depends_on :
107- opendeepwiki :
108- condition : service_healthy
109109 environment :
110110 - NODE_ENV=production
111- - SITE_URL=${SITE_URL:-http://localhost:3000 }
111+ - SITE_URL=${SITE_URL:-http://localhost:8090 }
112112 - API_PROXY_URL=http://opendeepwiki:8080
113113` ` `
114114
115+ <Callout type="info">
116+ 根目录提供 ` .env.example`,可复制为 `.env` 后通过 `${VAR:-default}` 插值注入配置,无需直接修改 `compose.yaml`。
117+ </Callout>
118+
115119# # 环境变量
116120
117121# ## 必需变量
118122
119123| 变量 | 描述 | 示例 |
120124|---|---|---|
125+ | `JWT_SECRET_KEY` | JWT 签名密钥(生产环境必须更改) | 长随机字符串 |
121126| `CHAT_API_KEY` | 聊天 AI 服务的 API 密钥 | `sk-...` |
122127| `ENDPOINT` | 聊天 AI 服务端点 | `https://api.openai.com/v1` |
123128| `WIKI_CATALOG_API_KEY` | 目录生成的 API 密钥 | `sk-...` |
@@ -131,13 +136,17 @@ services:
131136|---|---|---|
132137| `DB_TYPE` | `sqlite` | 数据库类型:`sqlite` 或 `postgresql` |
133138| `CONNECTION_STRING` | `Data Source=/data/opendeepwiki.db` | 数据库连接字符串 |
134- | `JWT_SECRET_KEY` | 内置默认值 | JWT 签名密钥(生产环境需更改) |
135139| `WIKI_CATALOG_MODEL` | `gpt-4o` | 目录生成模型 |
136140| `WIKI_CONTENT_MODEL` | `gpt-4o` | 内容生成模型 |
137- | `CHAT_REQUEST_TYPE` | `OpenAI` | AI 提供商类型 |
141+ | `CHAT_REQUEST_TYPE` | `OpenAI` | AI 提供商类型:`OpenAI`、`AzureOpenAI`、`OpenAIResponses`、`Anthropic`、`DeepSeekOpenAI` |
138142| `WIKI_PARALLEL_COUNT` | `5` | 并行 wiki 生成任务数 |
143+ | `WIKI_MAX_CONCURRENT_GENERATIONS` | `1` | 集群同时生成的仓库 Wiki 数量,多实例共享 |
139144| `WIKI_LANGUAGES` | `en,zh,zh-tw,ja,ko,es,fr,de,pt-br,pl,ru,ar` | 支持的语言(逗号分隔) |
140- | `SITE_URL` | `http://localhost:3000` | 公开站点 URL,用于 sitemap、robots.txt、canonical URL 和社交分享元数据 |
145+ | `SITE_URL` | `http://localhost:8090` | 公开站点 URL,用于 sitemap、robots.txt、canonical URL 和社交分享元数据 |
146+ | `SITEMAP_REVALIDATE_SECONDS` | `3600` | sitemap 缓存 TTL(秒) |
147+ | `LOCAL_IMPORT_ROOT` | — | 允许导入的本地目录根路径(本地目录导入白名单) |
148+ | `MCP_ENABLED` | `true` | 是否启用 MCP 端点 |
149+ | `GRAPHIFY_*` 系列 | — | Graphify 图谱产物配置(Backend、Model、OpenAI 凭证等) |
141150
142151<Callout type="warn">
143152 在生产环境中始终更改 `JWT_SECRET_KEY`。默认密钥仅用于开发。
@@ -163,7 +172,7 @@ volumes:
163172
164173# # 健康检查
165174
166- 后端包含内置的健康检查端点 :
175+ 后端内置健康检查端点 `/health`。`compose.pgsql.yaml` 中配置了健康检查与依赖顺序 :
167176
168177` ` ` yaml
169178healthcheck:
@@ -174,48 +183,40 @@ healthcheck:
174183 start_period: 15s
175184` ` `
176185
177- 前端在此健康检查通过后才启动,确保 API 已准备好接受请求 。
186+ PostgreSQL 编排中,后端在数据库 `service_healthy` 后才启动。SQLite 默认编排未启用 `depends_on` 条件,前端启动失败时检查后端是否就绪即可 。
178187
179188# # 构建镜像
180189
181190` ` ` bash
182191# 构建所有镜像
183- docker- compose build
192+ docker compose build
184193
185- # 为特定架构构建
186- docker-compose build --build-arg ARCH=arm64 # Apple Silicon、AWS Graviton
187- docker-compose build --build-arg ARCH=amd64 # Intel/AMD x86_64
194+ # 为特定架构构建(通过 Makefile)
195+ make build-arm # ARM64: Apple Silicon、AWS Graviton
196+ make build-amd # AMD64: Intel/AMD x86_64
188197
189198# 构建单个服务
190- docker-compose build opendeepwiki # 仅后端
191- docker-compose build web # 仅前端
192- ` ` `
193-
194- 如果已安装 `make`:
195-
196- ` ` ` bash
197- make build # 构建全部
198- make build-arm # ARM 架构
199- make build-amd # AMD 架构
199+ docker compose build opendeepwiki # 仅后端
200+ docker compose build web # 仅前端
200201` ` `
201202
202203# # 常见操作
203204
204205` ` ` bash
205206# 后台启动
206- docker- compose up -d
207+ docker compose up -d
207208
208209# 查看日志
209- docker- compose logs -f
210+ docker compose logs -f
210211
211212# 查看特定服务的日志
212- docker- compose logs -f opendeepwiki
213+ docker compose logs -f opendeepwiki
213214
214215# 重启服务
215- docker- compose restart
216+ docker compose restart
216217
217218# 停止服务
218- docker- compose down
219+ docker compose down
219220` ` `
220221
221222# # 一键部署
@@ -232,14 +233,14 @@ docker-compose down
232233
233234- 验证 AI API 密钥有效且端点可达
234235- 检查 `CONNECTION_STRING` 与你的数据库类型匹配
235- - 查看日志:`docker- compose logs opendeepwiki`
236+ - 查看日志:`docker compose logs opendeepwiki`
236237
237238# ## 前端显示连接错误
238239
239- - 确保后端健康检查通过 :`docker- compose ps`
240+ - 确保后端已启动 :`docker compose ps`
240241- ` API_PROXY_URL` 必须指向后端容器:`http://opendeepwiki:8080`
241242
242243# ## 磁盘空间不足
243244
244245- 克隆的仓库存储在 `./data` 中。通过 web UI 或 API 清理旧仓库
245- - 对于大型部署,考虑从 SQLite 切换到 [PostgreSQL](/docs/deployment/database)
246+ - 对于大型部署,考虑从 SQLite 切换到 [PostgreSQL](/docs/deployment/database)(可直接使用 `compose.pgsql.yaml`)
0 commit comments