NovaBot
GitHub

第 3 章 安装

三种装法挑一种:大多数人是第一种(Linux 一键安装);用 macOS、Windows 或不想让脚本碰系统的用第二种;用 Docker 的看第三种。 只有装法一按版本分目录存放程序(升级时旧版本留着);装法二与装法三的目录不分版本。

源码从哪来

源码用 git clone 取得,仓库是 https://github.com/FrostNovaOrg/NovaBot。 从网页下载的源码压缩包不是 git 仓库,构建脚本会在第一步停下,提示「这里不是 git 仓库,无法记录构建来源」——所以别下载 zip。

装法一:Linux 一键安装

git clone https://github.com/FrostNovaOrg/NovaBot
cd NovaBot
./install.sh

脚本一口气做完:检查 Java 17 与中文字体、构建、把程序装进 /opt/starbot/releases/<版本>/(配置与数据留在 /opt/starbot)、生成初始配置、 创建 systemd 服务。缺了 Java 17 或中文字体,默认经包管理器装上。坐等跑完就行。

Maven 要先装好(3.9 或更高版本),脚本不替你装;没有就在构建前停下,印 「错误: 未找到 Maven,请先安装 Maven 3.9 或更高版本」。

机器上装着 python3 时,构建会把手册随程序一起打进包,控制台的「使用说明」打开的 就是包里这一份;没装 python3 也能装,只是包里不带手册,控制台的「使用说明」会转到 线上那份手册(GitHub 上的)。

机器上已经装有更高版本 JDK 时,一键安装不停:它会另找一份 JDK 17,专供 这一次构建(找不到就经包管理器装一份,带 --no-packages 时才停下),机器 默认的 Java 不动。JDK 17 装在别处时,用 NOVABOT_JVM_ROOTS=<它的上层目录> 指给脚本。

可选参数(写在 ./install.sh 后面):

参数作用
--dir /srv/novabot指定安装目录(默认 /opt/starbot)。目录名不能带空格或制表符,另有几个特殊字符也会被拒;被拒时提示写明是哪个字符、为什么
--user starbot指定运行服务的系统用户
--port 7827指定服务端口
--no-service跳过 systemd 服务创建
--no-switch只装、不换(有别的实例在跑时不自动换到本版)
--no-packages不经包管理器装任何东西(缺 Java 17 就停下,缺字体只提醒)
--keep-syslog系统日志 /var/log/syslog 里照旧多记一份 NovaBot 的输出(默认不记,见第 11 章);先前装时写的那条规则会删掉

目录名里有空格时停下,印「错误: --dir 不能包含空格(生成的服务单元会按空白把路径拆开,服务起不来)」。 有制表符时停下,印「错误: --dir 不能包含制表符(生成的服务单元会按空白把路径拆开,服务起不来)」。

--no-packages 缺 Java 17 就停下,提示里都写着「这一次什么都没改。」。从源码构建、Java 低于 17 时, 印「错误: 缺 Java 17。从源码构建请先装好 JDK 17 后再运行。这一次什么都没改。」只跑现成产物、 Java 低于 17 时,印「错误: 缺 Java 17。请先装好 Java 17 后再运行。这一次什么都没改。」下面两种停下只在从源码构建时发生。Java 高于 17、 又找不到 JDK 17 时,印「错误: 缺 Java 17。从源码构建需要 JDK 17,请先装好 JDK 17 后再运行。这一次什么都没改。」 有 Java 17 但没有 javac 时,印「错误: 缺 Java 17。从源码构建需要 javac,请先装好 JDK 17 后再运行。这一次什么都没改。」 缺中文字体不停下,照常往下装。认得出包管理器时提醒「警告: 未检测到系统中文字体。程序自带中文字体,中文照常显示;系统字体只补内置没有的字(如韩文)。需要时请手动安装,本发行版的候选包名:」 后面接包名;认不出时,这一句的末尾是「需要时请手动安装 Noto Sans CJK 或文泉驿字体。」

新装完启动并看日志(实例名就是版本号)。这一步是新装的做法;机器上已有版本 在跑时,升级就是重跑一遍安装脚本,装完怎么走见第 13 章:

sudo systemctl start novabot@<版本> && sudo journalctl -u novabot@<版本> -f

装法二:手动安装

适合 macOS、Windows,或者不想让脚本建 systemd 服务的机器:

./build.sh

build.sh 同样要 Maven 3.9 或更高版本,没有就停下,印「未找到 mvn,请先安装 Maven 3.9 或更高版本」。机器上装着的 Java 高于 17 时,构建也会停下,要把 JDK 17 排在 PATH 最前再跑。只改 JAVA_HOME、不改 PATH 不算数——构建脚本 查的是 PATH 上的 java。

不带参数会跑全部测试,这需要 Node 22 和 python3(有几个测试要用它,没装就过不去)。 只出包、不跑测试:./build.sh --skip-tests,这时以及一键安装都可以没有 python3: 装着时手册会随构建打进包,控制台的「使用说明」开的是包里这一份;没装时包里不带手册, 「使用说明」转到线上那份。

产物在 dist/build/ 目录,把它整个拷到目标机器,在里面运行(这种装法的目录不分版本, 程序、配置与数据都在同一个目录里):

./start.sh
说明构建必须走 build.sh,不要直接调 maven:插件预处理、打可运行包、
起动自检都串在这一个入口里,单独跑其中一段会漏掉前置步骤。

装法三:容器部署

./build.sh
docker build -f dist/templates/Dockerfile -t novabot dist/build
docker run -d --name novabot --restart unless-stopped \
  --log-opt max-size=20m --log-opt max-file=5 \
  -v novabot-data:/app -p 127.0.0.1:7827:7827 novabot

四件事必须知道:

  • 卷必须挂在 /app。 配置、登录凭据、推送目标全写在程序的工作目录下;挂到 /app/data 之类的子目录等于什么都没持久化,容器一重建就得重新扫码登录。
  • 容器里的监听地址固定为所有网卡。 对外开不开,完全由 docker run 的 -p 决定:例子里的 -p 127.0.0.1:7827:7827 只把端口开在宿主机回环上。不要图省事改成直接发布到公网。设置页里改监听地址对容器不起作用。
  • 同一个数据卷同时只能有一个容器在跑。 再起一个会说明一句后退出,不会改动这个卷上的文件。
  • 容器打到标准输出的内容,Docker 自己另存一份,默认没有大小上限。 程序自己的日志文件照旧写在卷上的 logs/ 里;docker logs 看的是 Docker 另存的那份,示例里的--log-opt max-size=20m --log-opt max-file=5 把它限在 100MB 以内。

容器里的目录也不分版本。换镜像会换掉卷上的程序;plugins-lib/ 里镜像自带的依赖 每次启动按构件名换新,自己放的留下——细节看第 13 章 升级与备份。

装完之后

无论哪种装法,程序启动后都会在日志里打出控制台地址,这就是下一章的起点:

  • 没设口令登录时,每次启动都打带访问令牌的地址;令牌没在配置里写死的话,每次启动都换一个。设了口令登录,只打不带令牌的地址。
  • 还没登录过 B 站、又没开免登录时,另打一张登录二维码。
  • 登录过(保存的凭据还有效)或开了免登录,就不打二维码——日志里找不到它不是装坏了。

没设口令登录时,启动日志里会有这样两行(<令牌> 处是一长串字母、数字,中间也会夹着 - 和 _):

配置界面已启动: http://127.0.0.1:7827/config?token=<令牌>
该地址包含访问令牌, 请勿分享。令牌未在配置文件中显式设置时, 每次启动都会重新生成