0x00 原理图

构建原理

0x01 服务器初始化

【本步骤大约需要3分钟】

你需要初始化一台云服务器,基本配置要求如下(云服务器建议选择阿里、腾讯、华为等。本次使用华为云作为示范):

  • CPU:不小于1U
  • 内存:不小于1G
  • 带宽:不小于3M(或使用按量付费模式)
  • 系统:CentOS 7.3

然后需要进入云服务器控制面板设置以下内容:

  • 配置Root帐号密码。
  • 开放下列端口的安全组:22(SSH)、80(Http)、443(Https)、8888(宝塔面板)
    最后启动服务器,等待服务器正常开机。

0x02 安装面板(以宝塔面板为例)

【本步骤大约需要3分钟】
使用Putty或者云服务器提供的远程Shell登录云服务器,登入后若为非Root用户(阿里云、腾讯云居多),则需要执行以下步骤:

sudo su root
cd $home

然后执行安装面板的操作,可以访问宝塔官网获取面板安装脚本,https://www.bt.cn/download/linux.html
在这里我们执行:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

安装宝塔面板

安装过程中,我们需要输入一次 “Y” 以确认安装位置

确认安装位置到www

安装完毕后会弹出如下提示,记录下Shell中显示的面板网址、登入帐号、密码。以后我们会用到。然后我们就可以关闭这个shell窗口了。

记录下登陆地址和初始账号

可选步骤:跳过账号绑定,请执行以下内容:

sed -i "s|if (bind_user == 'True') {|if (bind_user == 'REMOVED') {|g" /www/server/panel/BTPanel/static/js/index.js

0x03 初始化面板

【本步骤大约需要10分钟】
访问从第二步获取的面板网址,并输入帐号密码进入宝塔面板。进入面板后需要绑定宝塔帐号(若在上方执行了跳过帐号绑定,则可以直接进入系统)。进入系统后,弹出初始化面板对话框,在这里我们左侧的LNMP模式,但是仅勾选最上方的安装Nginx,并点击确定系统会将nginx加入安装队列。

选择安装nginx

在等待nginx安装的过程中,我们还需要安装一下PM2管理器。打开【软件商店】-【运行环境】并找到【PM2管理器】。点击后方的安装,系统也会将PM2管理器加入安装队列。

选择安装pm2管理器

接下来我们点击左上角的黄色方框,查看安装进度并等待安装完毕。 (此处需要耐心等待5-8分钟)

查看安装进度并等待

请注意,本步骤完全安装完成后方可进行下一步骤


0x04 安装Fvtt系统程式

【本步骤大约需要1分钟】
打开宝塔面板首页中的【宝塔SSH终端1.0】,然后输入步骤1的Root帐号密码。并等待系统连接。然后再窗口中执行安装脚本:

wget https://sh.peatsuki.com/fvtt/BTPanelInstallFVTT.sh && sh BTPanelInstallFVTT.sh

安装FVTT指令

等待安装完毕后FVTT会自动加入PM2管理器并启动。

等待运行


0x05 配置反向代理

【本步骤大约需要2分钟】
首先我们回到 【软件商店】-【运行环境】 ,将【PM2管理器】添加到面板管理

将PM2管理加入面板

然后我们点击【PM2管理器】选择项目列表,然后点击后方的【映射】。再新打开的窗口中输入你希望使用的域名,若不想使用域名,则直接输入服务器IP。

映射反向代理

若此步使用了域名,需要进入域名控制面板中将DNS,配置该域名的解析地址为服务器IP。 我们找到【文件】并定位到如下目录【/root/foundrydata/Config/ options.json】然后右键编辑并修改下列两项内容:

"hostname": "your.domain.com",
"proxyPort": 80,

配置FVTT域名

之后,我们就可以通过域名,或者IP直接访问FVTT。(不需要添加端口号)


0x06 配置动静分离和静态CDN

【本步骤大约需要8分钟】

因为FVTT本身的原因,无法支持简单的动静分离配置,websocket也无法简单的通过重定向来使用。故采取传统的静态内容301到第二个域名的方式进行动静分离。好在由于FVTT本身对于静态没有过于严格的校验,所以可以很简单的通过复制站点创造两份内容。
请使用05步骤创建一个静态专用域名映射,域名需要和主站点不相同。然后再网站栏,主站点找到配置文件,将其替换成如下内容(其中 your.domain.com 请修改为你的域名):

主站点分离代码

server { 
    server_name your.domain.com; 
    listen 80; 
    client_max_body_size 300M; 
    location ~ .*.(jpg|png|gif|webm|webp|woff2|svg|wav|mp3|hdr|db|js|css)$ { 
        rewrite ^(.*)http://your.domain.com$1 permanent; 
} 
location / { 
    proxy_set_header Host $host; 
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    proxy_set_header X-Forwarded-Proto $scheme; 
    proxy_set_header Upgrade $http_upgrade; 
    proxy_set_header Connection "Upgrade"; 
    proxy_pass http://localhost:30000; 
    } 
}

然后再修改副站点的配置文件,将其替换成如下内容:

副站点分离代码

server {
    server_name your.domain.com;
    listen 80;
    client_max_body_size 300M;
    location / {
        proxy_set_header Host $host;
        fastcgi_hide_header Cache-Control;
        add_header Cache-Control "public, max-age=0, s-maxage=3153600";
        add_header Access-Control-Allow-Origin "*";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_pass http://localhost:30000;
    }
}

然后我们打开CDN控制面板,将静态专用站点添加到CDN中,并配置对应的缓存规则。
然后我们前往域名管理中,将CDN提供的Cname配置到对应的静态站域名里。然后我们就可以静等CDN生效,通过主域名访问FVTT了。


0x07 【可选】配置对象存储

创建一个对象存储,将存储桶按照 FoundryVTT 用户目录下的Data目录搭建。
比如 /worlds/tomb-of-annihilation/
然后修改主域名的配置文件,新增以下字段(其中os.domain.com请修改为你的对象存储桶域名)

location ^~ /worlds/tomb-of-annihilation/ {
    rewrite ^(.*)http://os.domain.com1 permanent;
}

然后进入对象存储或者对象存储关联的CDN中,找到【Response Header配置】,新增一项 Access-Control-Allow-Origin ,值为:*。这样FoundryVTT在跨域的情况下在可以正常加载图片。


0x08 【可选】配置SSL

【本步骤大约需要5分钟】
若在上方的第5步选择了域名,则可以进行SSL配置。你需要申请一个对应域名的免费证书,然后将证书放置于/wwwroot/your.domain.com/下。 若在上方第六步中配置了动静分离,则需要两份对应的证书。然后在两个站点的配置文件修改如下字段:

listen 443 ssl;

并在上方字段下方添加如下两行:

ssl_certificate /wwwroot/your.domain.com/fullchain.pem;
ssl_certificate_key /wwwroot/your.domain.com/privkey.pem;

然后修改主站点配置文件中下方内容:

rewrite ^(.*)https://your.domain.com$1 permanent;

最后在两个站点配置文件最底部添加如下内容,用于跳转HTTPS:

# Optional, but recommend. Redirects all HTTP requests to HTTPS for you 
server { 
    if ($host = your.domain.com) { 
        return 301 https://hostrequest_uri; 
    } 
    
    listen 80; 
    listen [::]:80; 
    
    server_name your.domain.com; 
    return 404; 
}

然后前往CDN,将静态证书配置到CDN上,然后设置回源类型为HTTPS即可。


0x09 双网卡并行方案

若需要使用双网卡方案,购买的服务器必须是【云服务器】而非【轻量应用服务器】,且你的计费类型必须为【带宽上移计费】。
首先、在你的服务器中添加第二块网卡,找到云服务器-【弹性网卡】,单机【绑定弹性网卡】增加第二块网卡。

创建弹性网卡

其次、进入弹性公网IP页面,申请按量付费IP,并将带宽上限拉满。

调整弹性网卡至上限

然后在弹性IP页面新申请的IP信息后方点点击绑定,并选择上方刚才新建的弹性网卡即可。
【可选部分】:将按量IP和按宽带IP分别绑定两个域名,其中按量IP直接配置为服务器IP,按宽带IP配置为CDN加速。当访问按量付费IP连接FVTT时,从nginx上,将/worlds目录重定向到按宽带IP并使用CDN加速静态资源加载。


0x10 【提示】故障排错

1、目前已知DAE系统与动静分离存在BUG,若需要使用DAE系统,则需要将 /modules/dae/ 目录排除动静分离列表。具体需要新增主站配置文件如下:

location ^~ /modules/dae/ {
    proxy_pass http://localhost:30000;
}

2、目前已知Midi-qol系统与动静分离存在BUG,若需要使用,则需要将 /modules/midi-qol/ 目录排除动静分离列表。具体需要新增主站配置文件如下:

location ^~ /modules/midi-qol/ {
    proxy_pass http://localhost:30000;
}