This commit is contained in:
2026-04-25 16:36:34 +08:00
commit db90e7579b
1876 changed files with 189777 additions and 0 deletions

View File

@@ -0,0 +1,4 @@
{
"label": "应用部署",
"position": 10
}

View File

@@ -0,0 +1,41 @@
---
sidebar_position: 9
title: 部署管理后台(可选)
---
:::info
管理后台的功能还在不断迭代中,目前正处于前期体验版
后续会不断丰富内部的内容
:::
`github`获取最新的管理后台配置:
```bash
wget https://raw.githubusercontent.com/msgbyte/tailchat/master/docker/admin.yml
```
在环境变量 `docker-compose.env` 中设置管理后台的账号和密码:
```ini
ADMIN_USER=tailchat
ADMIN_PASS=<这里写入独立的后台密码, 不要告知其他人>
```
然后使用[多文件方式](https://docs.docker.com/compose/extends/#understanding-multiple-compose-files)启动应用:
```bash
docker compose -f docker-compose.yml -f admin.yml up -d
```
*注意先后顺序,因为`admin.yml`依赖`docker-compose.yml`所以要放在后面*
此时访问后台地址后面追加`/admin/`即可访问:
```
https://tailchat.example.com/admin/
```
*注意不要忘记在最后有一个`/`*
<details>
<summary>关于弃用的旧版admin</summary>
旧版本 <strong>admin-old</strong> 将于v1.8.6版本被移除,如果你依旧期望使用旧版本,可以切换到之前的版本获取
</details>

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View File

@@ -0,0 +1,34 @@
---
sidebar_position: 11
title: 前端分离部署(CDN部署前端)(可选)
---
有可能会出现前后端分开部署的情况比如想要把前端代码单独放在对象存储中管理增加CDN支持。则需要单独编译前端代码。
后端代码依旧建议使用 `docker` 来部署
为了单独编译前端代码,你需要下载源码来手动编译
```bash
git clone https://github.com/msgbyte/tailchat.git
cd tailchat
# 你可以通过 git checkout v1.8.8 来切换不同的发行版本
pnpm install # 你需要使用 `pnpm` 来安装依赖,使用其他的包管理工具可能会出现问题. 另外你最好使用 pnpm@8 来进行安装因为pnpm@9有一些不兼容的改动
```
耐心等待依赖安装完毕
进入前端代码中,进行编译
```bash
cd client/web
SERVICE_URL=<your-api-url> pnpm build
```
确保 `SERVICE_URL` 的值是后端的地址,形如: `http://127.0.0.1:11000`
编译完毕后你可以在 `tailchat/client/web/dist` 目录下获得所有的前端文件。
> 另外如果出现刷新页面后报404. 需要配置类似 [静态网站托管时,把根目录下的 index.html 文件设置为默认首页] 这样的配置

View File

@@ -0,0 +1,86 @@
---
sidebar_position: 99
title: 开发环境
---
对于开发环境的搭建Tailchat 提供了非常简单快捷的方式:
## 使用Docker快速搭建依赖环境
**mongodb**
```bash
docker run -d --name mongo -p 27017:27017 mongo:4
```
**redis**
```bash
docker run -d --name redis -p 6379:6379 redis
```
**minio**
```bash
docker run -d \
-p 19000:9000 \
-p 19001:9001 \
--name minio \
-e "MINIO_ROOT_USER=tailchat" \
-e "MINIO_ROOT_PASSWORD=com.msgbyte.tailchat" \
minio/minio server /data --console-address ":9001"
```
### 示例
这是一个 ".env" 的最小示例,可让您在开发环境中运行 `tailchat`
```ini
PORT=11000
MONGO_URL=mongodb://127.0.0.1:27017/tailchat
REDIS_URL=redis://localhost:6379/
MINIO_URL=127.0.0.1:19000
MINIO_USER=tailchat
MINIO_PASS=com.msgbyte.tailchat
```
## Node Version
Tailchat 是使用 `nodejs` 进行开发的请自行安装nodejs, 这里是nodejs的官方网站: [https://nodejs.org/](https://nodejs.org/)
建议使用 `nodejs18.x` 因为目前还不支持 `nodejs20.x`(nodejs 20 有一些break change)
## 启动开发服务器
```bash
pnpm install
pnpm dev
```
可以编辑`server/.env`的配置为自己相关的上下文
该文件可以从 `server/.env.example` 开始
现在你可以在 `http://localhost:11011` 访问你的 Tailchat 服务了
## 项目目录说明
- `apps`: 非核心应用
- `cli`: Tailchat 的命令行程序
- `github-app`: Tailchat 的github集成机器人
- `oauth-demo`: Tailchat 开放平台第三方登录演示程序
- `widget`: 网页嵌入小部件
- `client`: 客户端
- `desktop`: 桌面端
- `mobile`: 移动端
- `packages`: 依赖包
- `shared`: 平台无关的通用代码
- `web`: 网页端
- `plugins`: 纯前端插件
- `src`: 源码
- `packages`
- `types`: 前后端通用类型
- `server`: 服务端
- `admin`: 后台管理
- `models`: 数据库模型
- `plugins`: 服务端插件
- `services`: 微服务
- `website`: 官网

View File

@@ -0,0 +1,90 @@
---
sidebar_position: 104
title: Docker Compose 部署服务端(Deprecated)
---
:::caution 弃用警告
该文档已弃用。建议访问最新版的部署文档以获得最新的支持, [点击此处跳转](./docker-compose.mdx)
我们保留本篇文档是为了希望安装 `1.x` 版本之前的用户准备的
:::
## 安装环境
### Docker / Docker Compose
首先需要确保有 `Docker / Docker Compose` 环境
安装方式如下:
- [Docker](https://docs.docker.com/engine/install/)
- [Docker Compose](https://docs.docker.com/compose/install/)
### node 环境
- 从[官网下载](https://nodejs.org/en/download/)
- 或者使用[nvm](https://github.com/nvm-sh/nvm)
#### 安装pnpm
`pnpm` 是一个`nodejs`的包管理工具, 是`npm`的替代品, 为了确保能有与开发者一样依赖环境强烈建议你使用pnpm作为后续的包管理工具
```bash
npm install -g pnpm
```
## Clone 项目
将项目从远程下载到本地:
```bash
mkdir msgbyte && cd msgbyte
git clone https://github.com/msgbyte/tailchat.git # clone 客户端
git clone https://github.com/msgbyte/tailchat-server.git # clone 服务端
```
## 编译项目
#### 前端项目
```bash
cd tailchat/web
pnpm install # 安装依赖
export SERVICE_URL=http://127.0.0.1:11000 # 配置服务端地址这里的127.0.0.1 可以替换为任何网页可以访问到的服务端地址
pnpm build # 构建项目
```
构建完毕后会生成一个`tailchat/web/dist`目录,将该目录托管到任意网页托管服务器即可(如使用`http-server`进行静态代理或者直接上传到`oss`)
> NOTICE: 因为webpack编译需要比较大的内存资源占用在服务器资源不足的场合建议使用本地编译完毕以后上传到服务端
#### 使用docker-compose构建服务端
> 在启动前需要检查代码环境变量
修改 `docker-compose.env` 文件的配置,以下内容推荐修改:
- `API_URL` 对外可访问的url地址用于文件服务访问
- `SECRET` 服务端加密秘钥用于生成Token. 默认为 `tailchat`
```bash
cd tailchat-server
docker-compose build
docker-compose up -d
```
*在`docker-compose.env`文件中提供了部分环境变量可供配置。*
`tailchat``docker-compose.yml`配置默认提供了如下配置:
- `mongodb`: 持久化数据库
- `redis`: KV数据库与消息中转服务
- `minio`: 分布式文件服务
其中持久化文件(数据库, 文件存储)通过 `docker volume` 统一管理:
```
docker volume ls | grep "tailchat-server"
```

View File

@@ -0,0 +1,184 @@
---
sidebar_position: 4
title: Docker Compose 部署
---
## 建议配置
建议最低配置 **1核2G**
> 如果只有 **1核1G**? 请参阅我的博客: [Linux 小资源服务器使用经验总结](http://moonrailgun.com/posts/6769ba51/) 通过交换内存来拓展内存空间
>
> 可供参考的内存用量:
> ![](/img/misc/memory-usage.png)
## 前置环境
### Docker / Docker Compose
首先需要确保有 `Docker / Docker Compose` 环境
安装方式可参考: [安装 Docker 环境](./install-docker.md)
## 拉取镜像
你可以通过从**公共镜像拉取已经编译好的镜像**或者**通过源码手动编译**
> 使用已经编译好的镜像可以无需花费足够的计算机资源进行编译,对小资源配置的服务器会十分友好。另外相对于源码编译,公共镜像的代码更加稳定。
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
<Tabs groupId="build">
<TabItem value="cli" label="使用cli一键安装" default>
> 使用 `cli` 请确保在你的服务器上已经拥有了node环境(建议node版本 16+)
> 如果对node不了解可以使用`从公共镜像中手动安装`方式
使用 命令行工具 tailchat-cli 一键拉取/更新镜像:
```bash
npx tailchat-cli docker update
```
</TabItem>
<TabItem value="public-image" label="从公共镜像中手动安装" default>
使用Docker原生命令手动安装:
```bash
docker pull moonrailgun/tailchat # 从公共镜像库拉取 tailchat镜像
docker tag moonrailgun/tailchat tailchat # 将下载的镜像改名为tailchat(和源码编译保持一致,如果不改的话会走源码编译流程)
```
:::info
可以从 [Docker Hub](https://hub.docker.com/r/moonrailgun/tailchat/tags) 查看历史支持的镜像版本
:::
</TabItem>
<TabItem value="source-code" label="从源码中编译">
*本节内容适用于高级玩家用于获取最新的tailchat实现请确保你有足够的 docker, nodejs, git 的使用常识*
#### 编译环境 node 环境
- 从 [官网下载](https://nodejs.org/en/download/)
- 或者使用 [nvm](https://github.com/nvm-sh/nvm)
#### 安装pnpm
`pnpm` 是一个`nodejs`的包管理工具, 是`npm`的替代品, 为了确保能有与开发者一样依赖环境强烈建议你使用pnpm作为后续的包管理工具
```bash
npm install -g pnpm
```
#### Clone 项目
将项目从远程下载到本地:
```bash
mkdir msgbyte && cd msgbyte
git clone https://github.com/msgbyte/tailchat.git # 克隆项目到本地
```
#### 编译项目
```bash
cd tailchat && docker compose build
```
*编译对服务器配置有一定要求2核4G编译约10分钟供参考*
编译完毕后可以通过 `docker images` 查看编译完毕的镜像。
</TabItem>
</Tabs>
## 启动项目
<Tabs groupId="build">
<TabItem value="cli" label="使用cli一键安装" default>
```bash
npx tailchat-cli docker init
```
执行该命令会以交互式的方式向你询问一些配置相关的问题(如下图),填写完毕后即可自动生成配置文件
![](./assets/docker-init.png)
</TabItem>
<TabItem value="public-image" label="从公共镜像中手动安装">
> 启动之前需要下载配置文件以告知 `docker-compose` 要如何启动镜像
> 从仓库下载配置文件与配置环境变量:
> - [docker-compose.yml](https://raw.githubusercontent.com/msgbyte/tailchat/master/docker-compose.yml)
> - [docker-compose.env](https://raw.githubusercontent.com/msgbyte/tailchat/master/docker-compose.env)
```bash
mkdir tailchat && cd tailchat
wget https://raw.githubusercontent.com/msgbyte/tailchat/master/docker-compose.yml
wget https://raw.githubusercontent.com/msgbyte/tailchat/master/docker-compose.env
```
在启动之前需要修改一下配置
修改 `docker-compose.env` 文件的配置,以下字段推荐修改:
- `API_URL` 对外可访问的url地址用于文件服务访问, 可以是域名也可以是ip **如果出现发送图片不能正常显示就是这个变量没有设置**
- `SECRET` 服务端加密秘钥用于生成Token. 默认为 `tailchat`
</TabItem>
<TabItem value="source-code" label="从源码中编译">
在启动之前需要修改一下配置
修改 `docker-compose.env` 文件的配置,以下字段推荐修改:
- `API_URL` 对外可访问的url地址用于文件服务访问, 可以是域名也可以是ip
- `SECRET` 服务端加密秘钥用于生成Token. 默认为 `tailchat`
</TabItem>
</Tabs>
完成配置后使用`docker-compose` 一键启动 `Tailchat` 应用:
```bash
# 确保配置文件(docker-compose.yml和docker-compose.env)在当前目录下
# 执行以下命令一键启动
docker compose up -d
```
访问: `http://<server ip>:11000` 即可打开tailchat
注意部分云服务可能需要手动开放防火墙端口。
*在`docker-compose.env`文件中提供了部分环境变量可供配置。*
`tailchat` 的`docker-compose.yml`配置默认提供了如下配置:
- `mongodb`: 持久化数据库
- `redis`: KV数据库与消息中转服务
- `minio`: 分布式文件服务
其中持久化文件(数据库, 文件存储)通过 `docker volume` 统一管理:
```
docker volume ls | grep "tailchat-server"
```
:::info
完整的环境变量可以查询 [环境变量](./environment.md)
:::
## 更多部署相关文档
- [搭建 https 网关(可选)](./https-gateway.md)
- [部署管理后台(可选)](./admin.md)

View File

@@ -0,0 +1,79 @@
---
sidebar_position: 7
title: 环境变量
---
## 环境变量
| 变量名 | 默认值 | 描述 |
| ----- | ------ | --- |
| PORT | 11000 | 网关服务端口号 |
| SECRET | tailchat | 加密秘钥, 用于JWT |
| STATIC_HOST | "{BACKEND}" | 对外可访问的静态服务主机,用于文件服务访问, 默认为动态根据前端请求推断出的服务端地址如果期望存储在第三方OSS中需要进行修改 |
| STATIC_URL | "{BACKEND}/static/" | 对外可访问的静态服务完整地址前缀,用于文件服务访问, 默认为动态根据前端请求推断出的服务端地址如果期望存储在第三方OSS中需要进行修改, 如果设置了本变量则上面的 `STATIC_HOST` 值无效 |
| API_URL | http://127.0.0.1:11000 | 对外可访问的url地址用于开放平台的issuer签发或者作为文件服务的fallback |
| MONGO_URL | - | 数据库服务地址 |
| REDIS_URL | - | Redis服务地址 |
| MINIO_URL | - | 文件服务地址(minio) |
| MINIO_USER | - | 文件服务用户名 |
| MINIO_PASS | - | 文件服务密码 |
| MINIO_BUCKET_NAME | tailchat | 文件服务存储桶名 |
| MINIO_PATH_STYLE | "Path" | 是否使用路径形式的s3通信格式, `Path``Path Style`, `VirtualHosted``Virtual hosted style` |
| MINIO_SSL | false | 是否使用加密连接文件存储服务, 如果为 "1" 或者 "true" 则使用SSL协议 |
| SMTP_SENDER | - | 邮件服务发件人(示例: `"Tailchat" example@163.com`) |
| SMTP_URI | - | 邮件服务连接地址(示例: `smtp://username:password@smtp.example.com/?pool=true`) |
| FILE_LIMIT | 1048576 | 文件/图片上传的大小限制默认为1m请输入数字单位: 字节) |
| EMAIL_VERIFY | - | 是否开启邮箱校验, 如果为 "1" 或者 "true" 则在注册时增加邮箱校验控制 |
| REQUEST_TIMEOUT | 10000 | 请求超时毫秒数,请求超过该时间没有完成会抛出 `RequestTimeout` 错误。 如果需要禁用请求超时限制传0 |
| TIANJI_SCRIPT_URL | - | Tianji 脚本 URL如需监控 Tailchat 用户使用情况,可在天际网站代码模式中获取 (例如:`https://tianji.example.com/tracker.js`) |
| TIANJI_WEBSITE_ID | - | Tianji 网站 id |
| DISABLE_MESSAGEPACK | - | 是否禁用 openapi 的 sockio 使用 messagepack 作为 [解析器](https://socket.io/zh-CN/docs/v4/custom-parser/), 如果为 "1" 或者 "true" 则禁用该功能 |
| DISABLE_LOGGER | - | 是否禁用日志输出, 如果为 "1" 或者 "true" 则在运行中关闭日志 |
| DISABLE_TRACING | - | 是否禁用Tracing功能(开启可以节约大量日志), 如果为 "1" 或者 "true" 则在运行中关闭日志 |
| DISABLE_USER_REGISTER | - | 是否关闭用户注册功能, 如果为 "1" 或者 "true" 则关闭该功能 |
| DISABLE_GUEST_LOGIN | - | 是否关闭用户游客登录功能, 如果为 "1" 或者 "true" 则关闭该功能 |
| DISABLE_CREATE_GROUP | - | 是否关闭用户创建群组功能, 如果为 "1" 或者 "true" 则关闭该功能 |
| DISABLE_PLUGIN_STORE | - | 是否隐藏用户插件中心功能, 如果为 "1" 或者 "true" 则关闭该功能 |
| DISABLE_ADD_FRIEND | - | 是否隐藏用户添加好友功能, 如果为 "1" 或者 "true" 则关闭该功能 |
| DISABLE_TELEMETRY | - | 是否关闭遥测报告功能, 遥测是完全匿名的,如果为 "1" 或者 "true" 则关闭该功能 |
> 部分环境变量示例可见: https://github.com/msgbyte/tailchat/blob/master/server/.env.example
### 使用文件进行配置环境变量
- 如果是本地方式启动,请复制 `.env.example``.env` 然后进行编辑
```bash
mv .env.example .env
vi .env
```
- 如果是 `docker-compose` 启动,可以直接编辑 `docker-compose.env`, 改动后直接使用 `docker compose up -d` 即可生效
### 关于带空格的环境变量的使用
如果你的环境变量值包含空格,为了让系统能够识别这是一个完整的字符串而不是把空格视为分隔符。你需要在外部包一层双引号。
如下:
```bash
SMTP_SENDER="\"Tailchat\" example@163.com" # 如果有重复的双引号需要使用转义符对其进行转义
```
-----------
:::caution
部分环境变量修改可能需要清理缓存后才能生效
:::
### 如何清理缓存
一些环境变量的改动可能涉及到缓存的更新,如 `FILE_LIMIT`, 因为配置信息是需要发送到客户端的。
因此可能会出现修改环境变量后在客户端上的表现还是和以前一样的情况。这时候你需要清空旧的缓存来让更新生效。
以下有几种方案可以清理缓存:
- `docker compose down` 后执行 `docker compose up -d`. 这是因为 `redis` 服务的数据并没有被持久化,把服务关了再重启相当于一个全新的环境
- 手动进入 `redis` 服务清理名称包含 `config.client` 的缓存项,这里面包含了返回给客户端的配置项
- 进入 `admin` 管理后台的缓存管理页面。点击`清理配置缓存`按钮

View File

@@ -0,0 +1,45 @@
---
sidebar_position: 8
title: 搭建 https 网关(可选)
---
`Tailchat` 中,有一些服务是强依赖 `https` 的,比如音视频通话、嵌入外部的 `https` 媒体资源与网页等。
同时为了用户的安全性,我们非常建议将 `Tailchat` 对外以 `https` 服务的形式提供。
![](/img/architecture/https-gateway.excalidraw.svg)
如果你没有相关的经验,且在同一台机器上只部署了 `Tailchat` 服务(没有占用 **80**/**443** 端口),那么我们推荐从 `Tailchat` 自带的 `swag` 配置开始。
:::info
你可以在 [Github](https://github.com/msgbyte/tailchat/tree/master/docker) 看到原始的配置内容
:::
通过以下命令直接拉取所需要的配置文件
```bash
wget https://raw.githubusercontent.com/msgbyte/tailchat/master/docker/swag.yml
wget https://raw.githubusercontent.com/msgbyte/tailchat/master/docker/swag.env.example -O swag.env
mkdir config
wget https://raw.githubusercontent.com/msgbyte/tailchat/master/docker/config/nginx.conf -O ./config/nginx.conf
```
完成后应该会在在当前目录看到以下三个文件:
- `swag.yml`
- `swag.env`
- `config/nginx.conf`
修改`swag.env`的内容,将 `URL` 的值改为域名, 如: `URL=tailchat.example.com`
:::info
`https`协议是依赖域名做证书校验的,因此需要提前分配一个域名指向目标服务器
:::
域名的地址需要在购买域名的管理后台创建一条A指向记录。
在分配好域名后我们就可以启动服务了。
```bash
docker compose -f ./swag.yml up -d
```
如果一切顺利的话,此时`swag`服务已经自动为你申请了一个证书并启动了反向代理服务,此时在浏览器访问 `https://tailchat.example.com` 的话可以看到熟悉的界面已经出现了。

View File

@@ -0,0 +1,79 @@
---
sidebar_position: 2
title: 安装docker环境
---
> 因为 `Tailchat` 的环境对于初学者来说有一些些复杂,因此提供了 `docker` 为主的一键环境搭建配置。但是对于`docker`不熟的同学来说可能`docker`本身也是一种复杂度。
> 因此为了方便大家可以快速搭建 `Tailchat`,提供了本文作为引导。对于 `docker` 有一定了解的同学可以跳过本篇
> 本文以 `linux centos` 为例,目标是方便大家直接在服务器上部署。对于想要在其他系统(`windows`, `mac`) 使用的同学可以参考官方文档进行`docker`的安装
## 一键安装 docker
官方维护的一键安装 `Docker` 脚本, 适合不喜欢研究细节的同学
在服务器终端按照以下操作依次执行即可
```bash
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
```
如果安装成功的话就可以跳过后续内容了。
## 手动安装docker与docker compose
官方文档: [https://docs.docker.com/engine/install/](https://docs.docker.com/engine/install/)
```bash
# 如果之前有安装过docker可以执行以下命令删除旧的
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
```
```bash
sudo yum install -y yum-utils # yum-utils 提供了 yum-config-manager 命令
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
```
<!-- 安装docker 与 docker-compose 插件 -->
```bash
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
```
*PS: `docker-compose-plugin`提供了`docker compose`命令,用法同`docker-compose`*
> 如果`docker ps`显示守护进程没有启动(Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?)的话可以执行以下命令启动: `sudo systemctl start docker`
## 单独安装 docker-compose
如果购买的服务器已经预装了docker, 想要单独安装docker-compose的话可以看本节内容:
官方文档: [https://docs.docker.com/compose/install/](https://docs.docker.com/compose/install/)
```bash
curl -SL https://github.com/docker/compose/releases/download/v2.4.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose # 下载二进制文件
sudo chmod +x /usr/local/bin/docker-compose # 给予执行权限
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose # 软链接到path, 可以直接调用
docker-compose --version # 该行命令返回版本号则成功安装
```
## NOTICE
因为历史原因,`docker compose` 拥有`docker`插件版本与 `docker compose` 独立版本。一般意义上可以认为 `docker compose xxx``docker-compose xxx` 是等价的
## 参考文档
- [Docker](https://docs.docker.com/engine/install/)
- [Docker Compose](https://docs.docker.com/compose/install/)

View File

@@ -0,0 +1,155 @@
---
sidebar_position: 12
title: 移动端自编译(可选)
---
`Tailchat` 移动端的源码位于 `client/mobile`. 技术栈为 `react-native`
你可以直接在官网中下载已经编译好的通用版本: [https://tailchat.msgbyte.com/downloads](https://tailchat.msgbyte.com/downloads),或者自行通过源码编译
本节内容主要就是讲解如何对 `Tailchat` 的移动端进行编译。
## 准备开发环境
你可以在 [https://reactnative.dev/docs/environment-setup](https://reactnative.dev/docs/environment-setup) 看到完整的开发环境准备操作,这里就不再赘述。
### 安装依赖
```bash
cd client/mobile
yarn
```
### 环境检查
```bash
yarn doctor
```
## 准备环境变量
```bash
cp .env.example .env
```
`.env` 文件中我们来配置所需的环境变量用于编译
```ini
TAILCHAT_UPLOAD_STORE_FILE=
TAILCHAT_UPLOAD_STORE_PASSWORD=
TAILCHAT_UPLOAD_KEY_ALIAS=
TAILCHAT_UPLOAD_KEY_PASSWORD=
GETUI_APPID=
GETUI_APPKEY=
GETUI_APPSECRET=
GETUI_HUAWEI_APP_ID=
```
## 证书签名
如果仅用于测试则可以跳过本节内容Tailchat 会为你使用公开测试证书进行签名
### Android
如果需要使用你自己的证书进行签名,你需要填入以下内容:
```ini
TAILCHAT_UPLOAD_STORE_FILE=
TAILCHAT_UPLOAD_STORE_PASSWORD=
TAILCHAT_UPLOAD_KEY_ALIAS=
TAILCHAT_UPLOAD_KEY_PASSWORD=
```
需要依次填入: 证书文件名、密码、别名、别名密码
证书文件需要放在`client/mobile/android/app`目录下,一般是 `*.keystore` 文件
> 至于具体如何生成,你可以使用 `Android Studio` 或者 `keytool` 工具来生成,这个有很多公开资料就不在此赘述了
### iOS
TODO
## 推送
`Tailchat` 通过集成个推作为中转来实现安卓多厂商的消息推送
你可以在 `getui` 的应用配置中获得所有所需要的配置
其中 `GETUI_APPID`, `GETUI_APPKEY`, `GETUI_APPSECRET` 依次填入
在服务端需要对应配置 `GETUI_APPID`, `GETUI_APPKEY`, `GETUI_MASTERSECRET` 来使自部署的推送服务能正确发送推送
![](/img/misc/getui.png)
### 厂商推送
厂商推送可以按需打开或者关闭
需要修改源码如下:
- `client/mobile/android/app/build.gradle``manifestPlaceholders` 部分 和 `dependencies` 部分
- `.env` 环境变量配置
## 编译
### 安卓
```bash
cd android
./gradlew assembleRelease
```
### iOS
iOS 编译需要通过 `xcode` 进行操作
> 因为缺少设备无法截图,请按照网络上公开资料进行操作即可
### 常见问题
如果出现以下类型的报错:
```
error Failed to install the app. Make sure you have the Android development environment set up: https://reactnative.dev/docs/environment-setup.
Error: Command failed: gradlew.bat app:installDebug -PreactNativeDevServerPort=8081
FAILURE: Build failed with an exception.
* What went wrong:
Could not determine the dependencies of task ':app:compileDebugJavaWithJavac'.
> Could not resolve all dependencies for configuration ':app:debugRuntimeClasspath'.
> Could not create task ':app:generateDebugLintModel'.
> java.lang.NullPointerException (no error message)
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 27s
```
可能是因为你的环境变量有缺失, 你可以保留值为空,但该条目必须存在
如:
```ini
GETUI_APPID=xxxxxxxxxxxx
GETUI_APPKEY=yyyyyyyyy
GETUI_APPSECRET=zzzzzzzzzz
GETUI_HUAWEI_APP_ID=
```
而不是
```ini
GETUI_APPID=xxxxxxxxxxxx
GETUI_APPKEY=yyyyyyyyy
GETUI_APPSECRET=zzzzzzzzzz
```
#### 我能自己编译后发布到应用商店么
可以,但是请修改应用的名称、包名、图标等信息防止与官方应用冲突

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

View File

@@ -0,0 +1,40 @@
---
sidebar_position: 3
title: 使用宝塔安装
---
:::info
Tailchat 已上架宝塔应用商店你可以在应用商店中一键安装Tailchat
宝塔服务器面板,一键全能部署及管理: [https://www.bt.cn](https://www.bt.cn/u/P0shD8)
:::
## 安装宝塔
如果您已经有宝塔服务器,直接登录宝塔面板,跳过本节内容即可。
[![](./assets/bt-logo.jpg)](https://www.bt.cn/u/P0shD8)
点击以上链接跳转到宝塔官网,查看如何在你的服务器安装宝塔
## 在应用商店安装
登录到宝塔面板,在侧边栏点击 `docker` 菜单
![](./assets/bt1.png)
在应用商店中搜索 Tailchat点击安装按钮
![](./assets/bt2.png)
如果使用的是ip请勾选`允许外部访问`。端口默认为11000
![](./assets/bt3.png)
点击确定,需要等待一段时间,等待时间主要取决于服务器网络
![](./assets/bt4.png)
等待一段时间后,显示完成后在浏览器打开 `http://<your-ip>:11000`
![](./assets/bt5.png)

View File

@@ -0,0 +1,4 @@
{
"label": "Kubernetes",
"position": 2
}

View File

@@ -0,0 +1,176 @@
---
sidebar_position: 2
title: 在 Sealos 上部署Tailchat
---
`Sealos` 是一款开源的 Kubernetes 部署系统。通过 `Sealos` 我们可以快捷的创建一个按需付费的应用集群。
## 首先进入 Sealos 并打开「应用管理」
![](/img/kubernetes/sealos/1.png)
## 新建应用
![](/img/kubernetes/sealos/2.png)
### 创建依赖
`tailchat` 作为企业级的应用,最小依赖: `mongodb`, `redis`, `minio`.
接下来让我们来一一创建。
#### mongodb
为了方便起见我们固定一个实例,并且为数据库绑定本地存储。
使用的镜像是 `mongo:4`
需要注意的是因为我没有给数据库设置密码,因此不要对外网提供网络服务。容器暴露端口填数据库默认服务端口 `27017` 即可
内容如下:
![](/img/kubernetes/sealos/3.png)
点击部署应用提交部署
耐心等待一会,就可以看到应用已经启动起来了
![](/img/kubernetes/sealos/4.png)
> 需要注意的是初始分配的64m对于mongodb来说实在太小了所以通过变更应用改为了128m。可以随时分配资源大小这也是sealos/k8s很方便的一点
#### minio
接下来我们创建minio, minio是一个开源的对象存储服务。我们同样可以通过`sealos`的点点点来快速创建
使用的镜像是: `minio/minio`
需要注意的是我们要进行一些调整:
- 暴露端口: 9000
- 运行命令改为: `minio`
- 命令参数改为: `server /data`
- 设置环境变量:
- MINIO_ROOT_USER: tailchat
- MINIO_ROOT_PASSWORD: com.msgbyte.tailchat
- 本地存储: `/data`
最终结果如下:
![](/img/kubernetes/sealos/5.png)
点击部署按钮同样看到服务已经正常启动起来了。
#### redis
最后我们需要部署redis作为内容缓存与信息转发。
使用镜像: `redis:alpine`
暴露端口: `6379`
最终结果如下:
![](/img/kubernetes/sealos/6.png)
### 创建 Tailchat 本体
此时Tailchat所需要的依赖均已部署完毕如下:
![](/img/kubernetes/sealos/7.png)
现在我们来部署 `Tailchat` 本体。
`Tailchat` 的本体会相对复杂一点,不过因为`sealos`纯UI操作也不会太过复杂。
- 使用镜像: `moonrailgun/tailchat`
- 暴露端口: `11000`(记得要打开外网访问)
- 配置环境变量如下:
```
SERVICEDIR=services,plugins
TRANSPORTER=redis://redis:6379
REDIS_URL=redis://redis:6379
MONGO_URL=mongodb://mongo/tailchat
MINIO_URL=minio:9000
MINIO_USER=tailchat
MINIO_PASS=com.msgbyte.tailchat
```
最终效果如下:
![](/img/kubernetes/sealos/8.png)
耐心等待一段时间后可以看到`Tailchat` 服务已经启动起来了
![](/img/kubernetes/sealos/9.png)
## 预览服务
首先我们可以先检查一下`Tailchat`服务的可用性,可以通过外网地址提供的服务后面加上 `/health` 来检查服务可用性, 如: `https://<xxxxxxxxxx>.cloud.sealos.io/health`
当启动完毕后Tailchat服务会返回如下内容:
![](/img/kubernetes/sealos/10.png)
这段json字符串中包含了使用的镜像版本节点名称系统占用微服务加载情况。
这里我们可以看到我的常见的服务, 如`user`/`chat.message`以及一些带有插件前缀的服务如`plugin.registry`都已经正常启动起来了,说明我们的服务端是正常运行的。
现在我们可以直接访问我们的外网地址,可以看到经过短暂的加载后,页面正常打开自动跳转到了登录界面。
![](/img/kubernetes/sealos/11.png)
随便注册一个账号可以看到我们可以正常进入Tailchat的主界面, 如下图:
![](/img/kubernetes/sealos/12.png)
至此我们的服务已经成功在 sealos 中落地了。
## 扩容服务
当然,作为一个分布式架构的系统,`Tailchat` 天然是支持水平扩容的。而在 `sealos` 想要实现扩容也非常简单, 只需要通过变更操作修改实例数即可:
![](/img/kubernetes/sealos/13.png)
![](/img/kubernetes/sealos/14.png)
![](/img/kubernetes/sealos/15.png)
此时当我们访问 `https://<xxxxxxxxxx>.cloud.sealos.io/health` 可以看到我们可以访问到不同的节点
![](/img/kubernetes/sealos/16.png)
## 添加 Tailchat 入口到桌面
打开 Terminal, 输入`vim app.yml`创建并编辑一个配置文件
输入以下内容注意url要换成自己部署的网址
```yml
apiVersion: app.sealos.io/v1
kind: App
metadata:
name: tailchat-app-entry
spec:
name: Tailchat
icon:
type: iframe
data:
url: <Your url>
desc:
icon: https://tailchat.msgbyte.com/img/logo.svg
menuData:
nameColor: text-black
helpDropDown:
helpDocs:
displayType: normal
```
按`esc`退出编辑模式, 按`:wq`保存并退出vim
输入`kubectl apply -f app.yml`启动配置。
完毕后刷新页面,此时我们可以看到我们的入口就出现在`sealos`的桌面上了
![](/img/kubernetes/sealos/17.png)

View File

@@ -0,0 +1,116 @@
---
sidebar_position: 1
title: 简单部署
---
## 简介
Kubernetes 是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。它提供了一种容器编排的方法,可以自动化容器的部署、调度、负载均衡和故障恢复等任务,使得容器化应用程序可以在分布式系统中高效地运行。
Kubernetes 的优点包括:
- 自动化Kubernetes 可以自动化容器的部署、调度、负载均衡和故障恢复等任务,减少了人工干预的工作量。
- 可扩展性Kubernetes 可以在大规模集群中管理数千个容器化应用程序,具有良好的水平扩展性和垂直扩展性。
- 灵活性Kubernetes 支持多种容器运行时和多种云平台,可以在不同的环境中部署和管理应用程序。
- 可靠性Kubernetes 提供了强大的故障恢复机制和自我修复能力,可以确保应用程序的高可用性和可靠性。
- 社区支持Kubernetes 是一个活跃的开源项目,有庞大的社区支持和生态系统,可以快速获取更新和支持。
## 快速入门
如果您想要在 Kubernetes 上部署 Tailchat 项目,那么您可以在项目目录中的 `docker/simple/k8s` 子目录中找到已经准备好的简单 Tailchat 部署配置。这些配置文件包括了用于运行 Tailchat 的 Kubernetes 资源定义,例如 StatefulSet、Service 和 依赖的数据库、持久化存储 等等。这些资源定义可以让您快速地在 Kubernetes 上部署一个简单的 Tailchat 项目,而无需手动创建和配置这些资源。
:::info
需要注意的是,本教程部署的 Tailchat 不包含完整的 Tailchat 生态如**开放平台**与**Admin后台管理平台**
:::
### 环境依赖
为了开始本章的内容,我们假设你已经准备好了一个可用的 kubernetes 环境,关于如何搭建 k8s 环境本节不进行赘述。
### 开始
首先我们需要clone项目仓库:
```bash
git clone git@github.com:msgbyte/tailchat.git
```
将工作目录切到配置文件目录
```bash
cd docker/simple/k8s
```
此时我们可以看到有许多已经准备好了的配置文件,我们可以通过一条命令直接启动:
```bash
kubectl apply -f namespace.yml -f pv.yml -f mongo.yml -f minio.yml -f redis.yml -f tailchat.yml
```
这条命令会依次执行创建`namespace`、创建`pv``pvc`、创建`mongodb``minio``redis`等必须的第三方中间件,最后启动一个多实例的 `tailchat` 服务。
你可以通过以下命令检测各个服务的状态:
```bash
kubectl get svc -n tailchat
```
### 路由与负载均衡。
当所有的服务都就绪后我们的Tailchat服务目前已经在集群中运行起来了但是此时我们还无法访问因为还没有暴露在外部。
对于本地测试,我们可以用`port forward`功能将一个pod的端口映射到本地。而在生产环境我们则需要构建路由转发。
`traefik` 为例:
> Traefik 是一款开源的反向代理和负载均衡器专门用于处理容器化应用程序和微服务架构中的流量路由和负载均衡。Traefik 支持多种后端服务,包括 Docker、Kubernetes、Mesos、Swarm、Consul、Etcd 等等。它可以自动地发现和配置后端服务,并根据规则将流量路由到相应的服务实例。
#### 安装helm, 并增加仓库地址
`helm` 的安装不做赘述。我们执行以下命令将`traefik`添加到仓库列表
```bash
helm repo add traefik https://helm.traefik.io/traefik
```
#### 在 tailchat 命名空间中安装traefik
```bash
helm install traefik traefik/traefik -n tailchat
```
#### 启动 ingress 资源声明
```bash
kubectl apply -f ingress.yml
```
如果一切正常,则通过以下命令可以看到如下输出
```bash
kubectl get services -n tailchat
```
![](/img/kubernetes/traefik-svc.png)
#### 设置DNS服务
你可以在上述的`ingress.yml`中修改域名地址配置,默认是 `http://tailchat.internal.com/`
如果不期望修改或者没有域名则可以通过修改`hosts`文件来实现:
```bash
sudo vim /etc/hosts
```
然后增加如下路径:
```
127.0.0.1 tailchat.internal.com
```
现在你可以打开浏览器并打开`http://tailchat.internal.com`来访问部署在k8s中的tailchat服务
当然,你也可以访问如下地址检测服务可用性:
```
http://tailchat.internal.com/health
```

View File

@@ -0,0 +1,87 @@
---
sidebar_position: 1
title: 手动部署
---
:::caution
本章内容需要你对 nodejs, git, linux 有一定程度的了解。当出现如依赖问题、环境问题、系统问题等问题时需要具备自行解决和排查问题的能力。
如果你对此并不了解,不建议你使用本章内容进行部署。建议使用统一镜像进行部署。
:::
## 依赖
- git
- nodejs v16.18.0 或以上
- pnpm v8.3.1 或以上
- mongodb
- redis
- minio
## 下载源码
```bash
mkdir msgbyte && cd msgbyte
git clone https://github.com/msgbyte/tailchat.git
```
### 切换到稳定代码
因为克隆下来的代码是最新代码可能存在短时间内不稳定的情况因此如果想要切换到各个版本的稳定代码的话可以使用git的tag功能
如切换到`v1.7.6`则可以使用命令:
```bash
git checkout v1.7.6
```
## 编译项目
Tailchat 是一个前后端分离的项目。因此我们要分别处理前端代码和后端代码
### 安装依赖
我们假设你已经安装了 `nodejs v16.18.0+` 或者以上的版本。以及安装了 `pnpm v8.3.1` 或以上版本
```bash
cd tailchat
pnpm install
```
该命令会花费一些时间将Tailchat所有的依赖都安装一遍。当安装完毕后内部的插件会自动执行编译命令。
### 构建项目
```bash
NODE_ENV=production pnpm build
```
该命令会并行执行编译前端后端管理端的命令。并将前端产物移动到服务端的 `server/dist/public` 目录
当项目构建完毕后我们的产物就可以正常运行了
:::caution
请尽可能在 `macos` / `linux` 环境进行构建window 对 shell 命令支持并不一定完全
:::
## 运行项目
为了确保项目能够水平扩容,`Tailchat` 的核心代码虽然写在同一个项目中,但是实际启动起来的时候可以被划分为多个细分的微服务。通过传入不同的环境变量的组合来实现有选择的启用不同的服务。
在server目录下以`.env.example`目录为例创建一个环境变量文件
```bash
cp server/.env.example server/dist/.env
vim .env
```
将必要的环境变量修改为自己的,如 `MONGO_URL`, `REDIS_URL`, `MINIO_URL`
然后启动服务
```bash
SERVICEDIR=services,plugins pnpm start:service
```
> `SERVICEDIR` 表示加载微服务的目录

View File

@@ -0,0 +1,26 @@
---
sidebar_position: 1
title: 快速开始
---
## 演示环境
演示环境会持续部署最新前端代码和不定期更新后端代码
[https://nightly.paw.msgbyte.com/](https://nightly.paw.msgbyte.com/)
## 部署方式
### Docker/Docker Compose
强烈推荐使用 `docker-compose` 部署 `tailchat`
教程请翻阅: [Docker Compose 部署](./docker-compose.mdx)
### Kubernetes
教程请翻阅: [kubernetes 简易部署](./other-way/kubernetes/simple.md)
## 系统架构
见 [系统架构](../architecture.md)

View File

@@ -0,0 +1,45 @@
---
sidebar_position: 10
title: SMTP 服务(可选)
---
`Tailchat` 包含邮件服务, 使用的场景如 **密码找回**、**邮件认证**
因为仅需要单向的发送邮件而无需接受邮件,因此在 `Tailchat` 中仅使用简单邮件服务(SMTP).
为了启用该服务,我们需要在环境变量中设置如下内容:
- `SMTP_SENDER`: 发送人信息, 一般的格式是 `xxx@example.com``"YourName" xxx@example.com`
- `SMTP_URI`: SMTP 邮件服务地址, 遵循国际通用 URI 格式: `<protocol>://<username>:<password>@<host>:<port>/<other-info>`
## 使用 cli 进行辅助测试
如果你对 SMTP 服务不熟,为了提高检测效率你可以选择使用 `tailchat-cli` 来快速帮你验证 smtp 服务可靠性
> 关于 tailchat-cli 的使用见 [tailchat-cli](../cli/tailchat-cli.md)
```
tailchat smtp
SMTP Service
Commands:
tailchat smtp verify Verify smtp sender service
tailchat smtp test Send test email with smtp service
Options:
--version Show version number [boolean]
-h, --help Show help [boolean]
```
你可以使用 `tailchat smtp verify` 验证 URI 可用性,在这个操作中是不会实际发送邮件的。类似于账号登录
如果验证通过后依旧有问题,你可以使用`tailchat smtp test`来实际发送测试邮件来帮助你排查问题,因为实际生产环境中可能性非常多,比如各个服务商的审核问题导致的退信,比如验证程度不一样如有的服务商允许自定义发信人名称有的对其有严格的要求
## SMTP_URI 示例
因为不同的服务商提供的服务各有差异, 这里只能举出部分内容用于演示。如果你有其他的可以作为示例的 URI 欢迎提交 PR 来帮助我们一起完善文档:
- `smtps://<username>:<password>@smtp.exmail.qq.com/?pool=true`
- `smtps://<username>:<password>@smtp.163.com/?pool=true`
- `smtps://<qqNumber>:<password>@smtp.qq.com/?pool=true`

View File

@@ -0,0 +1,103 @@
---
sidebar_position: 50
title: 常见问题
---
## 部署相关
### 如何更新版本?
和部署时获取镜像一样
```bash
docker pull moonrailgun/tailchat
docker tag moonrailgun/tailchat tailchat
```
然后重启应用即可, 如 `docker compose up -d`
### 如何使用指定版本?
```bash
docker pull moonrailgun/tailchat:1.8.4
docker tag moonrailgun/tailchat:1.8.4 tailchat
```
在拉取镜像的时候指定版本号即可
## 服务端相关
### Websocket 连接访问不正确,表现形式是可以注册但是无法打开主界面
如果使用了 nginx 进行反向代理。请确保nginx的配置支持websocket一个参考的配置如下:
```
server {
server_name demo.example.com;
listen 443 ssl;
access_log /var/log/nginx/host.access.log main;
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
proxy_pass http://127.0.0.1:11000/;
}
}
```
### 内网可以访问外网无法访问?
可以启动一个简单的http服务看下是不是docker-proxy层的问题。*该问题可能会出现在腾讯轻量云的docker-ce镜像机器上, 可以选择使用centos7镜像重装*
```bash
docker run --rm --name nginx-test -p 8080:80 nginx
```
### 启动时会出现随机hash的volume
见: [https://github.com/msgbyte/tailchat/issues/79](https://github.com/msgbyte/tailchat/issues/79)
### 发送邮件时出现 `502 Invalid paramenters`
如果提示类似: `Error: Mail command failed: 502 Invalid paramenters`
```
code:'EENVELOPE',
response: '502 Invalid paramenters',
responseCode: 502,
command: 'MAIL FROM'
```
请检查你的`SMTP_SENDER`内容是否正确,一般的格式是 `xxx@example.com``"YourName" xxx@example.com`
### Openapi 服务一直在重启
如果抛出了错误 `Issuer Identifier must be a valid web uri`
你应该确保在环境变量`API_URL`中填入了一个url(`http://xxxx``https://xxxx`)
## 开放平台相关
如果开放平台部署在代理之后,如果出现访问 `/open/.well-known/openid-configuration` 结果的json中endpoint不正确的情况请尝试修改代理的配置。
如nginx:
```
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:11000;
proxy_redirect off;
}
```