-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
5 changed files
with
169 additions
and
130 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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/<your_ipfs_hash_here>`。 | ||
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/[email protected] | ||
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 [email protected] -g | ||
# - run: yarn install | ||
# - run: yarn docs:build #需要配合 yarn 的 package.json | ||
- name: aliyun-oss-website-action | ||
uses: fangbinwei/[email protected] | ||
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 进行配置。请参考相关文档进行配置。 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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) |