Skip to content

Commit

Permalink
📝 docs: improve server deployment docs (lobehub#3534)
Browse files Browse the repository at this point in the history
* 📝 docs: 更新 docker 部署文档

* 📝 docs: 更新 docker 部署文档

* 📝 docs: 更新 docker 部署文档

* 📝 docs: 更新 docker 部署文档

* 📝 docs: 更新 docker 部署文档

* 📝 docs: 更新 docker 部署文档

* 📝 docs: 更新 docker 部署文档
  • Loading branch information
arvinxx authored Aug 21, 2024
1 parent 6b35a64 commit 53a3089
Show file tree
Hide file tree
Showing 8 changed files with 113 additions and 96 deletions.
3 changes: 1 addition & 2 deletions docs/self-hosting/advanced/auth.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@ Before using NextAuth, please set the following variables in LobeChat's environm
| Environment Variable | Type | Description |
| --- | --- | --- |
| `NEXT_AUTH_SECRET` | Required | The key used to encrypt Auth.js session tokens. You can use the following command: `openssl rand -base64 32`, or visit `https://generate-secret.vercel.app/32` to generate the key. |
| `ACCESS_CODE` | Required | Add a password to access this service. You can set a sufficiently long random password to "disable" access code authorization. |
| `NEXTAUTH_URL` | Optional | This URL specifies the callback address for Auth.js when performing OAuth verification. Set this only if the default generated redirect address is incorrect. `https://example.com/api/auth` |
| `NEXTAUTH_URL` | Required | This URL specifies the callback address for Auth.js when performing OAuth verification. Set this only if the default generated redirect address is incorrect. `https://example.com/api/auth` |
| `NEXT_AUTH_SSO_PROVIDERS` | Optional | This environment variable is used to enable multiple identity verification sources simultaneously, separated by commas, for example, `auth0,azure-ad,authentik`. |

Currently supported identity verification services include:
Expand Down
3 changes: 1 addition & 2 deletions docs/self-hosting/advanced/auth.zh-CN.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,7 @@ LobeChat 与 Clerk 做了深度集成,能够为用户提供一个更加安全
| 环境变量 | 类型 | 描述 |
| --- | --- | --- |
| `NEXT_AUTH_SECRET` | 必选 | 用于加密 Auth.js 会话令牌的密钥。您可以使用以下命令: `openssl rand -base64 32`,或者访问 `https://generate-secret.vercel.app/32` 生成秘钥。 |
| `ACCESS_CODE` | 必选 | 添加访问此服务的密码,你可以设置一个足够长的随机密码以 “禁用” 访问码授权 |
| `NEXTAUTH_URL` | 可选 | 该 URL 用于指定 Auth.js 在执行 OAuth 验证时的回调地址,当默认生成的重定向地址发生不正确时才需要设置。`https://example.com/api/auth` |
| `NEXTAUTH_URL` | 必选 | 该 URL 用于指定 Auth.js 在执行 OAuth 验证时的回调地址,当默认生成的重定向地址发生不正确时才需要设置。`https://example.com/api/auth` |
| `NEXT_AUTH_SSO_PROVIDERS` | 可选 | 该环境变量用于同时启用多个身份验证源,以逗号 `,` 分割,例如 `auth0,azure-ad,authentik`|

目前支持的身份验证服务有:
Expand Down
18 changes: 0 additions & 18 deletions docs/self-hosting/advanced/knowledge-base.zh-CN.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -44,22 +44,4 @@ Unstructured.io 是一个强大的文档处理工具。
- **应用场景**:处理 PDF、Word 等非纯文本格式的文档
- **注意事项**:评估处理需求,根据文档复杂度决定是否部署

## 部署注意事项

1. **数据安全**:确保所有组件都有适当的安全措施,特别是涉及敏感数据时。

2. **性能优化**

- 为 PostgreSQL 和 PGVector 配置足够的计算资源
- 优化 S3 存储的访问策略和缓存机制

3. **可扩展性**:设计架构时考虑未来可能的数据增长和用户增加。

4. **监控与维护**

- 实施日志记录和监控系统
- 定期备份数据库和对象存储

5. **合规性**:确保部署符合相关的数据保护法规和隐私政策。

通过正确配置和集成这些核心组件,您可以为 LobeChat 构建一个强大、高效的知识库系统。每个组件都在整体架构中扮演着关键角色,共同支持高级的文档管理和智能检索功能。
49 changes: 45 additions & 4 deletions docs/self-hosting/advanced/s3.zh-CN.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,62 @@ tags:
- 图片上传
- 文件存储
---

# 配置 S3 存储服务

LobeChat 在 [很早以前](https://x.com/lobehub/status/1724289575672291782) 就支持了多模态的 AI 会话,其中涉及到图片上传给 AI 的功能。在客户端数据库方案中,图片文件直接以二进制数据存储在浏览器 IndexedDB 数据库,但在服务端数据库中这个方案并不可行,在 Postgres 中直接存储文件类数据会大大浪费数据库存储空间,并拖慢计算性能。
LobeChat 在 [很早以前](https://x.com/lobehub/status/1724289575672291782) 就支持了多模态的 AI 会话,其中涉及到图片上传给大模型的功能。在客户端数据库方案中,图片文件直接以二进制数据存储在浏览器 IndexedDB 数据库,但在服务端数据库中这个方案并不可行。因为在 Postgres 中直接存储文件类二进制数据会大大浪费宝贵的数据库存储空间,并拖慢计算性能。

这块最佳实践是使用文件存储服务(S3)来存储图片文件,同时 S3 也是文件上传/知识库功能所依赖的存储方案
这块最佳实践是使用文件存储服务(S3)来存储图片文件,同时 S3 也是文件上传/知识库功能所依赖的大容量静态文件存储方案

<Callout type={'info'}>
在本文档库中,S3 所指代的是指兼容 S3 存储方案,即支持 Amazon S3 API 的对象存储系统,常见例如
Cloudflare R2 、阿里云 OSS,可以自部署的 minio 等均支持 S3 兼容 API。
</Callout>

目前文档中包含的 S3 配置教程有:
## 核心环境变量

<Steps>
### `S3_ACCESS_KEY_ID``S3_SECRET_ACCESS_KEY`

所有 S3 兼容存储服务都需要的两个密钥,用于访问 S3 存储服务,不详细展开。

### `S3_ENDPOINT`

存储桶的请求端点, 注意此处链接不应该包含存储桶的名称。

<Callout type={'warning'}>`S3_ENDPOINT`必须删除后缀路径,否则会无法访问所上传文件</Callout>

例如 Cloudflare 为:

```shell
S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
```

### `S3_BUCKET``S3_REGION`

存储桶的名称和区域,`S3_BUCKET` 是必须的,用于指定存储桶的名称。 `S3_REGION` 是可选的,用于指定存储桶的区域,一般来说不需要添加,但某些服务商则需要配置。

### `S3_SET_ACL`

是否在上传文件时设置 ACL 为 `public-read`。该选项默认启用。如果服务商不支持为文件设置单独的 ACL(即所有文件继承存储桶的 ACL),启用此选项可能会导致请求错误,将 `S3_SET_ACL` 设置为 `0` 即可关闭。

### `NEXT_PUBLIC_S3_DOMAIN`

存储桶对外的访问域名,用于访问存储桶中的文件,这个地址需要**允许互联网可读**。 原因是 OpenAI 的 gpt-4o 等视觉模型识别图片时,OpenAI 会尝试在他们的服务器中下载这个图片链接,因此这个链接必须是公开可访问的,如果是私有的链接,OpenAI 将无法访问到这个图片,进而无法正常识别到图片内容。

<Callout type={'warning'}>
此外,由于该访问域名往往是一个独立的网址,因此需要配置允许站点的跨域访问,否则会在浏览器中出现跨域问题。

</Callout>

</Steps>

## S3 配置指南

目前文档中包含的 S3 配置指南如下:

<Cards>
<Card href={'/zh/docs/self-hosting/advanced/s3/cloudflare-r2'} title={'Cloudflare R2'} />
</Cards>

点击即可查看对应平台的教程,如果上述教程中不包含你所使用的 S3 服务商,欢迎提交 Pull Request ,将共同完善 S3 对象存储的指南。
点击即可查看对应 S3 服务的部署指南,如果上述指南中不包含你所使用的 S3 服务商,欢迎提交 PR ,将共同完善 S3 对象存储的指南。
56 changes: 16 additions & 40 deletions docs/self-hosting/server-database.zh-CN.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,21 @@ tags:

# 使用服务端数据库部署

LobeChat 默认使用客户端数据库(IndexedDB),同时也支持使用服务端数据库。LobeChat 采用了 Postgres 作为后端存储数据库。
LobeChat 默认使用客户端数据库(IndexedDB),同时也支持使用服务端数据库(下简称 DB 版)。LobeChat 采用了 Postgres 作为后端存储数据库。

<Callout>
PostgreSQL是一种强大的开源关系型数据库管理系统,具备高度扩展性和标准SQL支持。它提供了丰富的数据类型、并发处理、数据完整性、安全性及可编程性,适用于复杂应用和大规模数据管理。
</Callout>

本文将从框架角度介绍在任何一个平台中部署服务端数据库版 LobeChat 的流程和原理,让你知其然也知其所以然,最后可以根据自己的实际情况进行部署。
本文将从框架角度介绍在任何一个平台中部署 DB 版 LobeChat 的流程和原理,让你知其然也知其所以然,最后可以根据自己的实际情况进行部署。

如你已经熟悉完整原理,可以查看各个平台的部署指南快速开始:

<PlatformCards urlPrefix={'server-database'} />

---

对于 LobeChat 的服务端数据库版,正常的部署流程都需要包含三个模块的配置:
对于 LobeChat 的 DB 版,正常的部署流程都需要包含三个模块的配置:

1. 数据库配置;
2. 身份验证服务配置;
Expand All @@ -39,9 +39,12 @@ LobeChat 默认使用客户端数据库(IndexedDB),同时也支持使用
- `A.` 使用 Vercel / Neon 等 Serverless Postgres 实例;
- `B.` 使用 Docker / Railway / Zeabur 等自部署 Postgres 实例,下统称 Node Postgres 实例;

两者的配置方式在环境变量的取值上会略有一点区别。
<Callout>两者的配置方式在环境变量的取值上会略有一点区别,其他方面是一样的。</Callout>

同时,由于我们支持了文件对话/知识库对话的能力,因此我们需要为 Postgres 安装 `pgvector` 插件,该插件提供了向量搜索的能力,是 LobeChat 实现 RAG 的重要构件之一。

<Steps>

### `NEXT_PUBLIC_SERVICE_MODE`

LobeChat 同时支持了客户端数据库和服务端数据库,因此我们提供了一个环境变量用于切换模式,这个变量为 `NEXT_PUBLIC_SERVICE_MODE`,该值默认为 `client`
Expand All @@ -53,6 +56,13 @@ LobeChat 同时支持了客户端数据库和服务端数据库,因此我们
Docker 镜像部署,则无需再配置该环境变量。
</Callout>

<Callout type={'tip'}>
由于 `NEXT_PUBLIC` 开头的环境变量是在前端代码中生效的,而因此无法通过容器运行时注入进行修改。 (`next.js`的参考文档 [Configuring: Environment Variables | Next.js (nextjs.org)](https://nextjs.org/docs/pages/building-your-application/configuring/environment-variables) ) 这也是为什么我们选择再打一个 DB 版镜像的原因。

如果你需要在 Docker 部署中修改 `NEXT_PUBLIC` 前缀的变量,你必须自行构建镜像,在 build 时就把自己的 `NEXT_PUBLIC` 开头的环境变量打进去。

</Callout>

### `DATABASE_URL`

配置数据库,核心是添加 `DATABASE_URL` 环境变量,将你准备好的 Postgres 数据库连接 URL 填入其中。数据库连接 URL 的通常格式为 `postgres://username:password@host:port/database`
Expand Down Expand Up @@ -120,49 +130,15 @@ NextAuth 是一个开源的身份验证库,支持多种身份验证提供商

## 配置 S3 存储服务

LobeChat 在 [很早以前](https://x.com/lobehub/status/1724289575672291782) 就支持了多模态的 AI 会话,其中涉及到图片上传给大模型的功能。在客户端数据库方案中,图片文件直接以二进制数据存储在浏览器 IndexedDB 数据库,但在服务端数据库中这个方案并不可行。因为在 Postgres 中直接存储文件类数据会大大浪费宝贵的数据库存储空间,并拖慢计算性能。
LobeChat 在 [很早以前](https://x.com/lobehub/status/1724289575672291782) 就支持了多模态的 AI 会话,其中涉及到图片上传给大模型的功能。在客户端数据库方案中,图片文件直接以二进制数据存储在浏览器 IndexedDB 数据库,但在服务端数据库中这个方案并不可行。因为在 Postgres 中直接存储文件类二进制数据会大大浪费宝贵的数据库存储空间,并拖慢计算性能。

这块最佳实践是使用文件存储服务(S3)来存储图片文件,同时 S3 也是后续文件上传/知识库功能所依赖的存储方案
这块最佳实践是使用文件存储服务(S3)来存储图片文件,同时 S3 也是文件上传/知识库功能所依赖的大容量静态文件存储方案

<Callout type={'info'}>
在本文档库中,S3 所指代的是指兼容 S3 存储方案,即支持 Amazon S3 API 的对象存储系统,常见例如
Cloudflare R2 、阿里云 OSS,可以自部署的 minio 等均支持 S3 兼容 API。
</Callout>

<Steps>
### `S3_ACCESS_KEY_ID``S3_SECRET_ACCESS_KEY`

所有 S3 兼容存储服务都需要的两个密钥,用于访问 S3 存储服务,不详细展开。

### `S3_ENDPOINT`

存储桶的请求端点, 注意此处链接不应该包含存储桶的名称。

<Callout type={'warning'}>`S3_ENDPOINT`必须删除后缀路径,否则会无法访问所上传文件</Callout>

例如 Cloudflare 为:

```shell
S3_ENDPOINT=https://0b33a03b5c993fd2f453379dc36558e5.r2.cloudflarestorage.com
```

### `S3_BUCKET``S3_REGION`

存储桶的名称和区域,`S3_BUCKET` 是必须的,用于指定存储桶的名称。 `S3_REGION` 是可选的,用于指定存储桶的区域,一般来说不需要添加,但某些服务商则需要配置。

### `S3_SET_ACL`
是否在上传文件时设置 ACL 为 `public-read`。该选项默认启用。如果服务商不支持为文件设置单独的 ACL(即所有文件继承存储桶的 ACL),启用此选项可能会导致请求错误,将 `S3_SET_ACL` 设置为 `0` 即可关闭。

### `NEXT_PUBLIC_S3_DOMAIN`

存储桶对外的访问域名,用于访问存储桶中的文件,这个地址需要**允许互联网可读**。 原因是 OpenAI 的 gpt-4o 等视觉模型识别图片时,OpenAI 会尝试在他们的服务器中下载这个图片链接,因此这个链接必须是公开可访问的,如果是私有的链接,OpenAI 将无法访问到这个图片,进而无法正常识别到图片内容。

<Callout type={'warning'}>
此外,由于该访问域名往往是一个独立的网址,因此需要配置允许站点的跨域访问,否则会在浏览器中出现跨域问题。
</Callout>

</Steps>

关于 S3 的详细配置指南,请参阅 [S3 对象存储](/zh/docs/self-hosting/advanced/s3) 了解详情。

## 开始部署
Expand Down
70 changes: 44 additions & 26 deletions docs/self-hosting/server-database/docker.zh-CN.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ tags:
- 数据库部署
- Postgres
---

# 使用 Docker 部署服务端数据库版

<div style={{display:"flex", gap: 4}}>
Expand All @@ -19,37 +20,49 @@ tags:
</div>

<Callout type="info">
本文已经假定你了解了 LobeChat 服务端数据库版本的部署基本原理和流程,因此只包含核心环境变量配置的内容。如果你还不了解 LobeChat 服务端数据库版本的部署原理,请先查阅 [使用服务端数据库部署](/zh/docs/self-hosting/server-database)
本文已经假定你了解了 LobeChat 服务端数据库版本(下简称 DB
版)的部署基本原理和流程,因此只包含核心环境变量配置的内容。如果你还不了解 LobeChat DB
版的部署原理,请先查阅 [使用服务端数据库部署](/zh/docs/self-hosting/server-database)
</Callout>

## 在 Linux 服务器上部署

以下是在 Linux 服务器上部署 LobeChat 服务端数据库版本的流程
以下是在 Linux 服务器上部署 LobeChat DB 版的流程

<Steps>

### 创建 Postgres 数据库实例

请按照你自己的诉求创建一个 Postgres 数据库实例,例如:
请按照你自己的诉求创建一个带有 PGVector 插件的 Postgres 数据库实例,例如:

```sh
docker run --name my-postgres --network pg -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d postgres
docker network create pg

docker run --name my-postgres --network pg -e POSTGRES_PASSWORD=mysecretpassword -p 5432:5432 -d pgvector/pgvector:pg16
```

<Callout type="warning">
以上命令仅用于测试/演示,因为这个 pg 实例并没有包含持久化部分。
上述指令会创建一个名为 `my-postgres`,并且网络为 `pg` 的 PG 实例,其中 `pgvector/pgvector:pg16` 是一个 Postgres 16 的镜像,且默认安装了 pgvector 插件。

<Callout type="info">
pgvector 插件为 Postgres 提供了向量搜索的能力,是 LobeChat 实现 RAG 的重要构件之一。
</Callout>

上述指令会创建一个名为 `my-postgres`,并且网络为 `pg` 的 PG 实例。
<Callout type="warning">
以上指令得到的 pg
实例并没有指定持久化存储位置,因此仅用于测试/演示,生产环境请自行配置持久化存储。
</Callout>

### 创建名为 `lobe-chat.env` 文件用于存放环境变量:

```shell
# DB 必须
#网站域名
APP_URL=https://your-prod-domain.com

# DB 必须的环境变量
KEY_VAULTS_SECRET=jgwsK28dspyVQoIf8/M3IIHl1h6LYYceSYNXeLpy6uk=
DATABASE_URL=postgres://postgres:mysecretpassword@my-postgres:5432/postgres

# NEXT_AUTH 相关
# NEXT_AUTH 相关,可以使用 auth0、Azure AD、GitHub、Authentik、zitadel 等,如有其他接入诉求欢迎提 PR
NEXT_AUTH_SECRET=3904039cd41ea1bdf6c93db0db96e250
NEXT_AUTH_SSO_PROVIDERS=auth0
NEXTAUTH_URL=https://your-prod-domain.com/api/auth
Expand Down Expand Up @@ -88,37 +101,42 @@ docker run -it -d -p 3210:3210 --network pg --env-file lobe-chat.env --name lobe
</Steps>

<Callout type="tip">
在我们官方的 Docker 镜像中,会在启动镜像前自动执行数据库 schema 的 migration ,我们会确保从一个空数据库到所有表正式可用的稳定性。因此我们建议你的数据库实例使用一个空表实例,进而省去手动维护表结构 migration 的成本。
在我们官方的 Docker 镜像中,会在启动镜像前自动执行数据库 schema 的 migration
,我们的官方镜像承诺「空数据库 ->
完整表」这一段自动建表的稳定性。因此我们建议你的数据库实例使用一个空表实例,进而省去手动维护表结构或者
migration 的麻烦。
</Callout>

## 在本地(Mac / Windows) 上使用

LobeChat 的数据版本也支持直接在本地的 Mac/Windows 本地使用。
LobeChat 的 DB 版也支持直接在本地的 Mac/Windows 本地使用。

在此我们已假设你的本地有一个 5432 端口可用,账号为 `postgres` ,密码是 `mysecretpassword` 的 pg 实例,它在 `localhost:5432` 可用。

那么你需要执行的脚本指令为:

```shell
$ docker run -it -d --name lobe-chat-database -p 3210:3210 \
-e DATABASE_URL=postgres://postgres:mysecretpassword@host.docker.internal:5432/postgres \
-e KEY_VAULTS_SECRET=jgwsK28dspyVQoIf8/M3IIHl1h6LYYceSYNXeLpy6uk= \
-e NEXT_AUTH_SECRET=3904039cd41ea1bdf6c93db0db96e250 \
-e NEXT_AUTH_SSO_PROVIDERS=auth0 \
-e AUTH0_CLIENT_ID=xxxxxx \
-e AUTH0_CLIENT_SECRET=cSX_xxxxx \
-e AUTH0_ISSUER=https://lobe-chat-demo.us.auth0.com \
-e NEXTAUTH_URL=http://localhost:3210/api/auth \
-e S3_ACCESS_KEY_ID=xxxxxxxxxx \
-e S3_SECRET_ACCESS_KEY=xxxxxxxxxx \
-e S3_ENDPOINT=https://xxxxxxxxxx.r2.cloudflarestorage.com \
-e S3_BUCKET=lobechat \
-e NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com \
lobehub/lobe-chat-database
-e DATABASE_URL=postgres://postgres:mysecretpassword@host.docker.internal:5432/postgres \
-e KEY_VAULTS_SECRET=jgwsK28dspyVQoIf8/M3IIHl1h6LYYceSYNXeLpy6uk= \
-e NEXT_AUTH_SECRET=3904039cd41ea1bdf6c93db0db96e250 \
-e NEXT_AUTH_SSO_PROVIDERS=auth0 \
-e AUTH0_CLIENT_ID=xxxxxx \
-e AUTH0_CLIENT_SECRET=cSX_xxxxx \
-e AUTH0_ISSUER=https://lobe-chat-demo.us.auth0.com \
-e APP_URL=http://localhost:3210 \
-e NEXTAUTH_URL=http://localhost:3210/api/auth \
-e S3_ACCESS_KEY_ID=xxxxxxxxxx \
-e S3_SECRET_ACCESS_KEY=xxxxxxxxxx \
-e S3_ENDPOINT=https://xxxxxxxxxx.r2.cloudflarestorage.com \
-e S3_BUCKET=lobechat \
-e NEXT_PUBLIC_S3_DOMAIN=https://s3-for-lobechat.your-domain.com \
lobehub/lobe-chat-database
```

<Callout type="tip">
`Docker``Windows``macOS` 上走的是虚拟机方案,如果使用 `localhost` / `127.0.0.1` ,将会走到自身容器的 `localhost`,此时请尝试用 `host.docker.internal` 替代 `localhost`
`Docker``Windows``macOS` 上走的是虚拟机方案,如果使用 `localhost` / `127.0.0.1`
,将会走到自身容器的 `localhost`,此时请尝试用 `host.docker.internal` 替代 `localhost`
</Callout>

[docker-pulls-link]: https://hub.docker.com/r/lobehub/lobe-chat-database
Expand Down
Loading

0 comments on commit 53a3089

Please sign in to comment.