发帖

部署/安装——极小资源占用多开 FVTT 工具 【高级用户教程】

此教程解决
想开多个FVTT,但不想让几 GB 的模组/系统(图片、音乐)占用双倍硬盘空间,同时还要避免数据库(LevelDB)被跨服共享导致损坏。
理论上每个FVTT副本只需要占用大约200MB的空间,你甚至能给你的每个团都开一个。

前置教程

❓

为什么需要这个工具?

如果你有两套 FVTT 数据目录(例如:一个是A团,一个是B团),如果你直接复制所有内容,会浪费大量硬盘空间;如果使用普通的软链接把整个模组连过去,FVTT 在同时运行时会因为数据库文件锁(LevelDB 锁定)而崩溃报错。

✨

工具说明

  1. 智能分流:它会自动读取每个模组的 module.json,分辨出哪些文件夹是“数据库(packs)”,哪些是“静态资源”。
  2. 静态资源建链接:对于图片、音乐等占空间的大文件,它在目标目录只建立一个“影子(目录联接)”。不占多余硬盘容量。
  3. 数据库物理复制:对于 LevelDB 数据库,它采用真实的物理复制。这样两个服务器各自拥有独立的数据库,不串车、不报错。
  4. 热更新防爆:如果在 FVTT 正在运行的时候执行此脚本,遇到被系统锁定的数据库文件,它会跳过并提示,而不会导致程序直接崩溃退出。

最为推荐的日常工作流

把你的【主服务器】当成唯一的修改源,【副服务器】对模组和系统应当是“只读”的。
  1. 安装与更新模组

  • 永远只在【主服务器】里打开“附加模组”和“游戏系统”界面进行安装、更新或卸载操作。
  • 不要在副服务器的设置界面里去点“更新模组”。因为副服的文件很多是软链接,直接在副服更新可能导致链接失效或权限错乱。
  1. 执行同步任务

  • 当你在主服更新了几个大模组后。
  • 推荐做法:关闭【主副服务器】的进程,然后双击 一键同步模组.bat
  • 为什么关副服:虽然脚本有防爆保护(跳过锁定的数据库),但为了让副服能玩到最新版的模组,关闭副服后再同步,能确保全部数据库被完美物理复制。
  1. 删除废弃模组

  • 如果你决定不再使用某个模组,在【主服务器】中将其卸载删除。
  • 下次运行同步脚本时,注意:同步脚本默认是覆盖和增量的。如果你想让副服也彻底删掉那个模组,你需要去副服的 modules 文件夹里手动删一下那个残留的文件夹。(或者你可以稍微进阶一点,定期清空副服的 modules 文件夹,然后跑一遍脚本重新生成,这样最干净)。
  1. 战役世界的管理

  • 再次强调,千万不要去同步 worlds 文件夹
  • 世界文件夹包含了各自独立的游戏进程、玩家聊天记录和角色卡。主副服应当各自创建、各自管理自己的 world。

🎓

配置教程

暂时无法在飞书文档外展示此内容
暂时无法在飞书文档外展示此内容

第一步:环境准备

本工具基于 Node.js 运行(因为 FVTT 也是基于 Node.js,所以只要你能开Node版本的 FVTT,通常就已经有这个环境了)。
  • 确认环境:需要 Node.js 16.7.0 或更高版本

第二步:保存脚本

  1. 在你的电脑上新建一个文件夹,比如命名为 FVTT_Sync
  2. 在该文件夹内新建一个文本文件,将你上面的 Node.js 代码 复制进去。
  3. 将该文件重命名为 sync.js(注意后缀是 .js,不是 .txt)。

第三步:修改配置

用记事本或任何代码编辑器(如 VS Code)打开 sync.js,找到开头的 配置区
// ================= 配置区 =================
const SOURCE_DATA = String.raw`C:\wwwroot\fvtt13\fvttdata13\Data`; // 【源数据】路径:这里放拥有最全模组的主力端 Data 目录
const TARGET_DATA = String.raw`C:\wwwroot\fvtt13\fvttdata13-2\Data`; // 【目标数据】路径:这里放需要被同步的测试端/副端 Data 目录
const SYNC_FOLDERS =["modules", "systems"]; // 需要同步的文件夹,一般不需要改
// ==========================================
  • 修改路径:把你自己的实际主服务器 Data 文件夹路径填在 SOURCE_DATA 里,副服务器路径填在 TARGET_DATA 里。
  • 提示:保留 String.raw 和反引号 ` 不变,这样你可以直接复制 Windows 的路径(带有 \),不需要手动转义。

🚀

一键执行脚本

为了方便每次运行,不用敲繁琐的命令,你可以根据你的系统创建下面的执行脚本,和 sync.js 放在同一个文件夹下。

Windows

新建一个记事本,复制以下代码,保存并重命名为 一键同步模组.bat
使用方法:以后每次主服务器更新了模组,直接双击运行这个 一键同步模组.bat 即可(关闭双端的FVTT)
@echo off
:: 设置控制台为UTF-8编码,防止中文乱码
chcp 65001 >nul
title Foundry VTT 数据同步工具

echo ==============================================
echo       检查 Node.js 运行环境...
echo ==============================================
node -v >nul 2>&1
if %errorlevel% neq 0 (
    echo [错误] 你的电脑没有安装 Node.js!
    echo 请前往 https://nodejs.org 下载并安装长期支持版 (LTS)。
    echo.
    pause
    exit
)

echo 环境正常,准备开始同步数据...
echo.

:: 执行同目录下的 sync.js
node sync.js

echo.
echo ==============================================
echo       任务结束,按任意键关闭窗口
echo ==============================================
pause >nul

Linux

新建一个文件名为 run_sync.sh,输入以下代码
使用方法
  1. 给脚本执行权限:chmod +x run_sync.sh
  2. 运行脚本:./run_sync.sh
#!/bin/bash

echo "=============================================="
echo "      Foundry VTT 数据同步工具"
echo "=============================================="

# 检查 node 是否安装
if ! command -v node &> /dev/null
then
    echo "[错误] 未找到 Node.js 命令,请先安装 Node.js"
    exit
fi

# 执行脚本
node sync.js

echo ""
echo "=============================================="
echo "                  任务结束"
echo "=============================================="

常见问题与注意事项

  1. 可以两边服务器都开着的时候运行吗?
    1. 可以,但有条件:工具支持热更新。但是,如果【源服务器】正在运行并且占用了某个数据库,那个数据库本次更新会被跳过。如果想要 100% 完美的数据库全量更新,建议关闭【目标服务器】后再运行脚本。
  2. 为什么只同步了 modules 和 systems,那 worlds 呢?
    1. 世界数据包含了每个战役独立的玩家数据、日志和场景配置。双开通常是为了开两个不同的团,所以 worlds 强烈建议保持完全独立,不要去同步它。
  3. 我在副服务器里修改了模组的图片,主服务器会变吗?
    1. 会! 因为静态资源(图片、音乐)是通过“链接”关联的。两边看的是同一份文件。所以,如果要更新模组资源,请统一在主服务器操作,然后运行本脚本同步。
  4. 控制台出现 [运行中跳过] ... 是什么意思?
    1. 这是工具的保护机制生效了。说明目标目录的这个模组数据库正在被 Foundry VTT 读写。为了防止把文件覆盖坏,脚本跳过了它。关闭目标 FVTT 服务器后再运行一次即可成功覆盖。

上一篇 部署/安装——Node 多开FVTT方法(视频) 下一篇 部署/安装——适用于文件管理与数据迁移的网页资源浏览器filebrowser
评论区
游客
游客

还没有人评论,快来抢沙发吧~