diff --git a/docs/.vuepress/public/img/nine-user.jpg b/docs/.vuepress/public/img/nine-user.jpg new file mode 100644 index 00000000..34ca9c65 Binary files /dev/null and b/docs/.vuepress/public/img/nine-user.jpg differ diff --git a/docs/.vuepress/public/img/nineadmin.jpg b/docs/.vuepress/public/img/nineadmin.jpg new file mode 100644 index 00000000..678c2871 Binary files /dev/null and b/docs/.vuepress/public/img/nineadmin.jpg differ diff --git a/docs/.vuepress/sidebar.ts b/docs/.vuepress/sidebar.ts index 8f2839dc..945987e6 100644 --- a/docs/.vuepress/sidebar.ts +++ b/docs/.vuepress/sidebar.ts @@ -71,6 +71,7 @@ export default sidebar({ "Static.md", "CloudServices.md", "VPS.md", + "nineai.md", { text: "部署工具", icon: "emmet", diff --git a/docs/deploy/Static.md b/docs/deploy/Static.md index fd5650b3..f52ec096 100644 --- a/docs/deploy/Static.md +++ b/docs/deploy/Static.md @@ -4,167 +4,96 @@ title: 静态部署 icon: generic order: 1 --- +# 项目文档 -## 静态托管 +## 必要环境 -如果在国内静态资源库找不到所需的静态包,建议使用 `npm i` 命令将其下载到本地,然后部署到阿里云/七牛云的国内服务器上,以避免因 UNPKG 和 jsDelivr 等静态节点被屏蔽而导致网页样式显示出错。 +确保您的系统满足以下环境要求: -静态资源库: +- Node.js 版本大于 16 +- pnpm 版本大于 6 +- MySQL 版本大于等于 5.7 +- Redis -- [Staticfile CDN](https://www.staticfile.org/):国内维护最稳定的 CDN。 -- [字节 CDN](https://cdn.bytedance.com/):测速表现不错,缓存过期时间最长设置一年,而自 2022 年 3 月起,静态资源已不再更新。 +## 目录结构 -emoji 等可以使用静态资源库上的项目,比如 twemoji,上面有集成 png 图片。 - -### NPM 包 +``` +project-root +|-- chat # 用户端代码 +|-- admin # 管理端代码 +|-- service # 服务端代码 +``` -- UNPKG:**有墙风险且不稳定**,默认为最新版本,无需 `@latest` 标签。 - - 将静态文件发布为 npm 包,参考[一分钟教你发布 npm 包](https://segmentfault.com/a/1190000023075167)。 - - 加速:在 [npm 官方源](https://www.npmjs.com/)中搜索包位置,然后使用前缀 `https://unpkg.com/`。 -- [NPM MIRROR](https://npmmirror.com/):NPM 项目的国内镜像镜像,不能做静态托管用途。`https://registry.npmmirror.com/项目名/版本号` 可以看见项目的各种信息,但看不了里面的文件。 -- UNPKG 镜像:有资源可以用服务器自建服务,反向代理 unpkg。 - - ~~饿了么 CDN(已关):国内唯一能用的 npm 镜像,2022.07.13 发现外部访问被拒绝。之前饿了么并没说支持对外,可能已经彻底取消了。使用饿了么 CDN 时,注意 `https://npm.elemecdn.com/react@latest/` 需要时间更新,具体频率未知,可固定大版本号来获取更新 `https://npm.elemecdn.com/react@^18/`。~~ -- GitHub:基于 GitHub 公共仓库的资源托管,资源不会失效,但有时需要根据 CDN 服务商而更换域名。 - - ~~[Statically](https://statically.io/):jsDeliver 的替代品,在中国大陆所有地区连接异常。~~ - - ~~jsDelivr(已墙):速度最快,原本是最稳的,但域名暴雷后,经常断开,2022.06.01 彻底打不开。配合 Github action,更新后自动访问 jsdelivr CDN 缓存刷新链接,保持页面常新。刷新命令参考 `curl https://purge.jsdelivr.net/gh/username/project/file`。~~ +## 本地开发 -由于第三方托管过于不稳定,目前我使用自托管 oss.gpt-vip.top。 +在项目根目录执行以下命令进行本地开发: -### 部署平台 +```bash +# 安装依赖 +pnpm install -- Cloudflare:Pages 和 Workers 两类部署方式。 - - [Workers](../deploy/Cloudflare.html#反向代理):复制镜像网站,可直接访问,但反向代理稳定性成疑。 - - Pages:部署简单,外网速度很快,但国内速度不稳,而且 page.dev 域名有时会被墙,可购买便宜的临时域名(一年)来解决该问题。 -- Netlify:国内速度慢点,图片容易卡死,但还算稳定。 -- Vercel:推荐使用 GitHub 账户登录,需绑定手机号(不支持 Voice),支持国内手机号。2022.08.26,「\*.vercel.app」域名被 DNS 污染,需要绑定自定义域名。 -- AWS: 邮箱注册,不过需要信用卡认证。 -- 国内平台:Gitee、WuliHub、CODING,都需要实名认证。 +# 启动项目 +pnpm dev -### IPFS +# 打包项目 +pnpm build +``` -IPFS 无需服务器就可建立静态网站,号称永不失效,但**国内稳定性成疑问,实用性一般**。IPFS 托管在一个网关上,并不会自动复制到所有网关。 +### 启动项目 -[pinata](https://pinata.cloud/) 上传网站构建的目录文件夹,上传后,即可通过 IPFS Hash 访问。网站目录中必须有 index.html,否则网页中将显示网站目录。即使有 index.html,其他人在拥有 CID 后,可以通过 IPFS Desktop 来获取网站的完整目录。为确保私密性,建议只上传单文件。使用单文件 CID 视为单一网站,不可调用原目录中的文件。^[[How to Easily Host a Website on IPFS](https://medium.com/pinata/how-to-easily-host-a-website-on-ipfs-9d842b5d6a01)] +分别安装依赖并启动项目: -上传 ipfs 到 pinata 之后,cloudflare 等其他网关不一定会完全复制文件,php 无法抓取加载,所以不建议使用 cloudflare 网关。 +1. 进入 `service` 目录,创建 `.env` 文件,并修改测试数据库信息和 Redis 配置。完成后执行: -cloudflare 接管 pinata 后,ipfs 域名需通过「pinata 托管」>「cloudflare DNS」>「cloudflare SSL」。如果中途将 DNS 指向 `http://gateway.pinata.cloud` 等非 cloudflare ipfs 网关域名,cloudflare SSL 证书将失效。即便把链接改为非加密的 http,pinata 依然会视之为无效链接而拒绝访问。 +```bash +pnpm i +pnpm dev +``` -对于文件较少且链接有效的域名,可按 [Cloudflare IPFS](https://www.cloudflare.com/zh-cn/distributed-web-gateway/) 页面说明来设置 DNS,提交 IPFS 域名 30 分钟后,即可获取 SSL 证书。 +> 注意:ORM映射会自动创建数据库。 -1. 添加 CNAME 记录,将你的 IPFS 域名 `xxx.example.com` 指向 `cloudflare-ipfs.com`。 -2. `_dnslink.xxx.example.com` 设置为 `dnslink=/ipfs/`。 +2. 进入 `chat` 目录,执行以下命令启动用户端: -## GitHub 同步到 VPS +```bash +pnpm i +pnpm dev +``` -代码、文章推送到 GitHub 后,会自动生成可访问的网页,但国内访问 GitHub Pages 的速度极不稳定,为了确保网站能被正常访问,必须增加国内的访问节点。 +3. 进入 `admin` 目录,执行以下命令启动管理端: -很多人选择 Gitee Pages 作为国内节点,GitHub Actions 将新文档同步到 Gitee,生成位于国内的静态页面 Gitee Pages。但是,Gitee Pages 的限制非常多,免费版无法自定义域名,必须实名验证,更别提近期的下架风波。因此,我没选 Gitee,而是把文档同步到国内服务器(域名需备案)。 +```bash +pnpm i +pnpm dev +``` -::: tip 文件夹名称请勿使用大写字母,否则在同步时容易产生错误。 -::: +### 关于授权 -### 同步到 FTP +授权模块位于 `src/modules/globalConfig/globalConfig.service.ts` 文件下。如果要移除授权,请清空 `nineAiCheckAuth` 函数内容,并移除 `onModuleInit` 中的 `nineAiCheckAuth`。 -如果你有 FTP 服务器,可使用 [FTP-Deploy-Action](https://github.com/SamKirkland/FTP-Deploy-Action) 将 github 代码推送到服务器上。Actions 步骤参考 [GitHub 说明](../deploy/GitHub.html)。 +对应的定时任务也可以移除,位于 `src/modules/task/task.service.ts` 文件中的 `checkauth` 定时任务。 -```shell -on: push -name: 🚀 Deploy website on push -jobs: - web-deploy: - name: 🎉 Deploy - runs-on: ubuntu-latest - steps: - - name: 🚚 Get latest code - uses: actions/checkout@v3 +### 打包路径问题 - - name: 📂 Sync files - uses: SamKirkland/FTP-Deploy-Action@4.3.3 - with: - server: ${{ secrets.ftp_host }} - username: ${{ secrets.ftp_username }} - password: ${{ secrets.ftp_password }} - port: ${{ secrets.ftp_port }} # 建议更改默认的 21 端口 -``` +#### 后端服务 -新建 FTP 时,需在云服务商的安全组和服务器上开放 FTP 端口,并临时暂停宝塔系统加固等安全插件(新建 FTP 容易与安全插件冲突)。 +后端服务只需执行以下命令即可: -如果出现 `FTPError: 530 Login authentication failed`,则说明 FTP 密码错误或账号不存在,需用 FileZilla 测试 FTP 的有效性。确认 FTP 无效后,检查 FTP 密码是否填写正确,是否只有大小写字母和数字。如果密码错误,则在 github secrets 重新 update 密钥。如果密码正确,则进入 `/www/server/pure-ftpd/etc/pureftpd.passwd`,检查是否有该 FTP 账户。没有 FTP 账户的话,**暂停宝塔系统加固**等安全插件后,重新新建 FTP。 +```bash +pnpm build +``` -如果出现 `Error: Timeout (control socket)`,则说明同步服务器超时,可进入 Actions 页面点击右侧按钮「Re-run all jobs」,重新进行部署。如果错误连续出现,可以尝试关闭防火墙,测试是否 GitHub 服务器被拉黑了。 +生成七个文件,其中 `.env` 是环境变量文件,需要在后续部署时自行挂载或创建。项目提供示例文件 `.env.example`。 -### SSH 同步 +#### chat(前端项目) -如果你有服务器的 SSH 权限,可以使用 [web-deploy](https://github.com/SamKirkland/web-deploy) 以 SSH 同步方式发布页面。但与 FTP 相比,不确定安全性、速度、时间是否会区别。我尝试连接一直报错 `Permission denied (publickey,password)`。(有可能是服务器需要非 root 用户,adduser 一直加不上。) +前端项目打包使用配置文件 `.env.production`,与 `admin` 相同。修改文件中的变量即可,如果分开部署,请填写线上后端服务地址。 -```shell -on: push -name: Publish Website -jobs: - web-deploy: - name: 🚀 Deploy Website Every Commit - runs-on: ubuntu-latest - steps: - - name: 🚚 Get Latest Code - uses: actions/checkout@v3 +#### admin(管理端) - - name: 📂 Sync Files - uses: SamKirkland/web-deploy@v1 - with: - source-path: docs/.vuepress/dist/ - target-server: ${{ secrets.host }} - remote-user: ${{ secrets.ssh_username }} - private-ssh-key: ${{ secrets.SSH_KEY }} - destination-path: ${{ secrets.destination_folder }} - ssh-port: ${{ secrets.ssh_port }} # 建议更改默认的 22 端口 -``` +管理端与 chat 部署方式相同,修改 `.env.production` 中的配置即可。分离部署时,只需替换线上地址,其余配置暂时用不到。 -如果出现报错 `error in libcrypto`,说明 SSH 密钥错误,需要登陆服务器终端,运行以下命令。 +### 其他文件 -```shell -ssh-keygen -m PEM -t rsa -b 4096 -cat id_rsa.pub >> authorized_keys -cat id_rsa -``` +#### 刷新404问题 -### 同步到 oss - -如果没有服务器,可以把文件部署在云运营商的云存储上。比如用 [aliyun-oss-website-action](https://github.com/marketplace/actions/aliyun-oss-website-action),将 repo 文件 build 成网站文件,然后同步到阿里云 oss 并运行网站。 - -```shell -name: deploy md to oss -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] -jobs: - build: - runs-on: ubuntu-latest - steps: - # load repo to /github/workspace - - uses: actions/checkout@v3 - - name: Use Node.js - uses: actions/setup-node@v3 - with: - node-version: '14.x' - # 打包文档命令 - # - run: npm install yarn@1.22.4 -g - # - run: yarn install - # - run: yarn docs:build #需要配合 yarn 的 package.json - - name: aliyun-oss-website-action - uses: fangbinwei/aliyun-oss-website-action@v1.3.0 - with: - accessKeyId: ${{ secrets.ACCESS_KEY_ID }} - accessKeySecret: ${{ secrets.ACCESS_KEY_SECRET }} - bucket: learndata-notes - # use your own endpoint - endpoint: oss-cn-shanghai.aliyuncs.com - # 全目录上传 - folder: . - # 不上传的文件 - exclude: | - .github/ - .gitattributes -``` +前端在刷新时可能会出现404问题,需要对 Nginx 进行配置。请参考相关文档进行配置。 diff --git a/docs/deploy/nineai.md b/docs/deploy/nineai.md new file mode 100644 index 00000000..43c879cc --- /dev/null +++ b/docs/deploy/nineai.md @@ -0,0 +1,109 @@ +--- +article: false +title: nine-ai部署教程 +icon: generic +order: 1 +--- +# 项目文档 + +## 必要环境 + +确保您的系统满足以下环境要求: + +- Node.js 版本大于 16 +- pnpm 版本大于 6 +- MySQL 版本大于等于 5.7 +- Redis + +## 目录结构 + +``` +project-root +|-- chat # 用户端代码 +|-- admin # 管理端代码 +|-- service # 服务端代码 +``` + +## 本地开发 + +在项目根目录执行以下命令进行本地开发: + +1. 进入 `service` 目录,创建 `.env` 文件,修改和测试数据库信息连接信息和 Redis 配置。 +2. 数据库名称不能已经存在默认是chatgpt +3. redis、mysql 一定要先本地测试通,再保存.env文件 +3. 上诉工作完成后执行: + +```bash +pnpm i +pnpm dev +``` +> 注意注意!这一步必须做,自动创建数据库,否则后面没有数据库、各种失败! + +```bash +# 安装依赖 +pnpm install + +# 启动项目 +pnpm dev + +# 打包项目 +pnpm build +``` + +### 启动项目 + +分别安装依赖并启动项目: + + +2. 进入 `chat` 目录,执行以下命令启动用户端: + +```bash +pnpm i +pnpm dev +``` + +3. 进入 `admin` 目录,执行以下命令启动管理端: + +```bash +pnpm i +pnpm dev +``` + +### 关于授权 + +授权模块位于 `src/modules/globalConfig/globalConfig.service.ts` 文件下。如果要移除授权,请清空 `nineAiCheckAuth` 函数内容,并移除 `onModuleInit` 中的 `nineAiCheckAuth`。 + +对应的定时任务也可以移除,位于 `src/modules/task/task.service.ts` 文件中的 `checkauth` 定时任务。 + +### 打包路径问题 + +#### 后端服务 + +后端服务只需执行以下命令即可: + +```bash +pnpm build +``` + +生成七个文件,其中 `.env` 是环境变量文件,需要在后续部署时自行挂载或创建。项目提供示例文件 `.env.example`。 + +#### chat(前端项目) + +前端项目打包使用配置文件 `.env.production`,与 `admin` 相同。修改文件中的变量即可,如果分开部署,请填写线上后端服务地址。 + +#### admin(管理端) + +管理端与 chat 部署方式相同,修改 `.env.production` 中的配置即可。分离部署时,只需替换线上地址,其余配置暂时用不到。 + +### 其他文件 + +#### 刷新404问题 + +前端在刷新时可能会出现404问题,需要对 Nginx 进行配置。请参考相关文档进行配置。 + +#### 效果图如下 + +用户界面 +![](/img/nine-user.jpg) +管理界面 +![](/img/nineadmin.jpg)