部署文档
相关内容

拓展内容

⚠️

此部分内容将说明一些额外的操作流程,根据自己需要进行配置。

反向代理

在这里提供双域名(前端和后端各用一个域名)与单域名(前后端共用一个域名)的配置步骤。

当然不管使用哪种方法,都建议用控制面板(如宝塔、1Panel 等)的使用面板提供的反代功能单独粘贴对应的反代配置部分完成配置(需要删掉开头和结尾的 server 块),手写反代配置的大佬随意。

另外,不管是前端还是后端的域名,都需要配置好 HTTPS 证书以保证网站能正常访问。

双域名

这里假定前端域名为 www.example.com,后端为 server.example.com

以下是后端 server.example.com 反代配置部分

server {
    ## 反向代理开始
    ## WebSocket
    location /socket.io {
      proxy_pass http://127.0.0.1:2333/socket.io; 
      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 REMOTE-HOST $remote_addr; 
      proxy_set_header Upgrade $http_upgrade; 
      proxy_set_header Connection "upgrade"; 
      proxy_buffering off;
      proxy_http_version 1.1; 
      add_header Cache-Control no-cache; 
    }
    ## Others
    location / {
      proxy_pass http://127.0.0.1:2333; 
      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 REMOTE-HOST $remote_addr; 
      add_header X-Cache $upstream_cache_status; 
    }
    ## 反向代理结束
}

前端 www.example.com 反代部分

server{
    location ~* \.(gif|png|jpg|css|js|woff|woff2)$ {
      proxy_pass http://127.0.0.1:2323;
      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 REMOTE-HOST $remote_addr;
      expires 30d;
    }
    location ~* \/(feed|sitemap|atom.xml) {
      proxy_pass http://127.0.0.1:2333/$1;
      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 REMOTE-HOST $remote_addr;
      add_header X-Cache $upstream_cache_status;
      add_header Cache-Control max-age=60;
    }
    location / {
      proxy_pass http://127.0.0.1:2323;
      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 REMOTE-HOST $remote_addr;
      add_header X-Cache $upstream_cache_status;
      add_header Cache-Control no-cache;
      proxy_intercept_errors on;
    }
}

如果您使用此部分示例配置 Nginx 反向代理,您的:

  • API 地址为 https://server.example.com/api/v2
  • 前端(Kami/Shiro)地址为 https://www.example.com
  • GateWay 为 https://server.example.com
  • 本地后台为 https://server.example.com/proxy/qaqdmin

单域名

以下配置文件以 Nginx 为例,请自行修改 SSL 证书路径以及自己的网站域名。

若使用 Caddy 进行配置可参考 Caddyfile 文件示例 (opens in a new tab)进行相应修改。

server {
    ## 反向代理开始 
    ## WebSocket 地址
    location /socket.io {
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection "Upgrade"; 
        proxy_buffering off; 
        proxy_set_header Host $host; 
        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:2333/socket.io; 
    }
    ## API 地址
    location /api/v2 {
        proxy_pass http://127.0.0.1:2333/api/v2; 
    }
    ## 简读 render 地址
    location /render {
        proxy_pass http://127.0.0.1:2333/render; 
    }
    ## Kami 地址
    location / {
        proxy_pass http://127.0.0.1:2323; 
    }
    ## 后台地址
    location /qaqdmin {
        proxy_pass http://127.0.0.1:2333/proxy/qaqdmin;
    }
    ## RSS 地址
    location ~* \/(feed|sitemap|atom.xml) {
        proxy_pass http://127.0.0.1:2333/$1; 
    }
    ## 反向代理结束
}

完整示例如下

server {
    listen 80;
    listen 443 ssl http2 ; 
    ## 绑定域名 
    server_name www.example.com; 
    index index.html; 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Host $server_name; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "upgrade"; 
    error_log /www/sites/www.example.com/log/error.log;
    access_log /www/sites/www.example.com/log/access.log; 
    location /socket.io {
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection "Upgrade"; 
        proxy_set_header Host $host; 
        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:2333/socket.io; 
    }
    location /api/v2 {
        proxy_pass http://127.0.0.1:2333/api/v2; 
    }
    location /render {
        proxy_pass http://127.0.0.1:2333/render; 
    }
    location / {
        proxy_pass http://127.0.0.1:2323; 
    }
    location /qaqdmin {
        proxy_pass http://127.0.0.1:2333/proxy/qaqdmin;
    }
    location /proxy {
        proxy_pass http://127.0.0.1:2333/proxy;
    }
 
    location ~* \/(feed|sitemap|atom.xml) {
        proxy_pass http://127.0.0.1:2333/$1; 
    }
    ssl_certificate /www/sites/www.example.com/ssl/fullchain.pem; 
    ssl_certificate_key /www/sites/www.example.com/ssl/privkey.pem; 
    ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; 
    ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!3DES:!MD5:!PSK'; 
    ssl_prefer_server_ciphers on; 
    ssl_session_cache shared:SSL:10m; 
    ssl_session_timeout 10m; 
    error_page 497 https://$host$request_uri; 
    limit_conn perserver 300; 
    limit_conn perip 25; 
    limit_rate 512k; 
}

如果您使用此部分示例配置 Nginx 反向代理,您的:

  • API 地址为 https://www.example.com/api/v2
  • 前端(Kami/Shiro)地址为 https://www.example.com
  • GateWay 为 https://www.example.com
  • 本地后台为 https://www.example.com/proxy/qaqdmin

配置其他 Redis 服务

如果你需要使用来自 (远端 / 非容器) 的 Redis 服务,你可以通过使用 argv 来动态传入对应的配置项。

支持传入如下值:

  • redis_host Redis 服务地址,域名、IP 都可以
  • redis_port Redis 服务端口
  • redis_password Redis 服务密码

在默认情况下,我们认为这样已经足够了。

对于进阶部署

针对这种部署方式,我们可以修改 ecosystem.config.js 在 12 行,也就是 script 这一项,添加你需要传入的值,如下所示:

const { cpus } = require('os')
const { execSync } = require('child_process')
const nodePath = execSync(`npm root --quiet -g`, { encoding: 'utf-8' }).split(
  '\n',
)[0]
 
const cpuLen = cpus().length
module.exports = {
  apps: [
    {
      name: 'mx-server',
-     script: 'out/index.js,
+     script: 'out/index.js --redis_host=远端地址 --redis_password=redis?passwd',
      autorestart: true,
      exec_mode: 'cluster',

当你修改完成,你需要重新构建,并重启服务:

pnpm bundle
pnpm prod:pm2

配置其他 MongoDB 服务

如果你需要使用来自 (远端 / 非容器) 的 MongoDB 服务,你可以通过使用 argv 来动态传入对应的配置项。

支持传入如下值:

  • collection_name 数据库集合名字
  • db_host MongoDB 服务地址,域名、IP 都可以
  • db_port MongoDB 服务端口
  • db_user MongoDB 服务用户名
  • db_password MongoDB 服务密码
⚠️

如果你需要使用密码登录,你不仅仅需要传入 password,还需要传入 user,建议你对数据库集合划分好用户权限

对于进阶部署

和 Redis 一样,我们可以修改 ecosystem.config.js 在 12 行,也就是 script 这一项,添加你需要传入的值,如下所示:

const { cpus } = require('os')
const { execSync } = require('child_process')
const nodePath = execSync(`npm root --quiet -g`, { encoding: 'utf-8' }).split(
  '\n',
)[0]
 
const cpuLen = cpus().length
module.exports = {
  apps: [
    {
      name: 'mx-server',
+     script: 'out/index.js --db_host=远端地址 --db_user=mongodb-test --db_password=db?passwd',
      autorestart: true,
      exec_mode: 'cluster',

当你修改完成,你需要重新构建,并重启服务:

pnpm bundle
pnpm prod:pm2