这就是编译和部署中最经典的困境:
编译时:我们需要一个新环境(Debian 12),因为它有程序源码需要的、新的开发工具和库(比如
libglib-2.0 >= 2.70
)。运行时:我们需要产物能在一个旧环境(Debian 11)上运行,因为它只有旧版的系统基础库(
glibc
)。
幸运的是,Rust 语言的工具链非常强大,它提供了一个完美的解决方案来解决这个悖论。
最终解决方案:静态编译 (Static Compilation using MUSL)
我们的最终目标是生成一个不依赖任何系统库的、完全独立的“绿色”程序。这样它就不再关心你的 VPS 是 Debian 11、12 还是其他什么系统了。
这个技术叫做“静态编译”,我们将使用一个名为 MUSL
的C语言基础库来替代主流的 GLIBC
。
GLIBC (动态链接):程序运行时,需要去“借用”操作系统的基础库。操作系统版本不对,就借不到,程序报错。
MUSL (静态链接):在编译的最后一步,把所有需要的基础库功能,像“干粮”一样,全部打包进最终的程序文件里。程序运行时自给自足,完全不依赖外部系统。
这完美地契合了你最初“单文件,占用资源较少,不需要安装依赖”的设想。
终极操作指南:编译一个真正的静态程序
我们将继续使用 Debian 12 作为我们的编译环境(因为它有我们需要的新版开发工具),但我们会告诉编译器,我们的最终目标是生成一个基于 MUSL 的静态程序。
第一步:彻底清理旧环境
和上次一样,我们先删除旧的 stump-builder
容器,确保从一个干净的状态开始。
如果你还在容器里,请
exit
。在你本地电脑的终端运行:
Bash
docker stop stump-builder docker rm stump-builder
第二步:启动 Debian 12 编译容器
这一步和上次完全一样,我们仍然需要 Debian 12 的新环境来满足编译时的依赖。
Bash
docker run -it \
--name stump-builder \
-v "$(pwd)":/build \
--env "HTTP_PROXY=http://172.17.0.1:7890" \
--env "HTTPS_PROXY=http://172.17.0.1:7890" \
debian:12-slim \
/bin/bash
第三步:在 Debian 12 容器内执行全新的编译步骤
进入容器后,请一步步执行以下命令。注意,依赖包和编译命令都发生了变化。
设置代理和软件源(同上)
Bash
export HTTP_PROXY="http://172.17.0.1:7890" export HTTPS_PROXY="http://172.17.0.1:7890" sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list sed -i 's|security.debian.org/debian-security|mirrors.ustc.edu.cn/debian-security|g' /etc/apt/sources.list
安装依赖(新增了
musl-tools
)Bash
apt-get update && apt-get install -y curl git build-essential pkg-config libssl-dev libglib2.0-dev musl-tools
安装 Rust 并添加 MUSL 编译目标
Bash
# 安装 Rust curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y # 配置环境变量 export PATH="$HOME/.cargo/bin:$PATH" # 告诉 Rust 编译器:“请学习如何为 MUSL 环境构建程序” rustup target add x86_64-unknown-linux-musl
克隆源代码(同上)
Bash
cd / git clone https://github.com/stumpapp/stump.git
执行静态编译(最关键的一步!)
Bash
cd /stump # 我们增加了 --target 参数,指定编译目标为 musl cargo build --release --locked --target=x86_64-unknown-linux-musl
这个编译过程可能会比之前更长一些,因为它需要将所有东西都打包进去。
第四步:取出最终的静态文件
编译成功后,可执行文件的路径也变了。
在容器内,从新的路径移动文件:
Bash
# 注意路径的变化 mv /stump/target/x86_64-unknown-linux-musl/release/stump /build/stump-static
退出容器:
Bash
exit
现在,你本地 stump-build
文件夹里的 stump-static
文件,就是一个完全静态的二进制文件。你可以把它复制到你的 Debian 11 VPS,甚至一个更老的 CentOS 系统上,它都不需要任何外部依赖,可以直接运行!
客户端配置:使用更精确的OPDS完整路径(最推荐的尝试)
Full OPDS + OPDS Page Streaming support
这句话暗示了Stump支持的是现代的、分页的OPDS规范(版本1.2)。
虽然 /opds
是根入口,但很多现代客户端(尤其是iOS上的App)更希望能直接访问到OPDS的根目录(Root Catalog)。这个地址通常是:
/opds/v1.2/catalog
请尝试在KyBook中输入下面这个更完整的URL:
https://books.yourdomain.com/opds/v1.2/catalog
这个地址直接指向了书库的“第一页”,绕过了可能存在的重定向,成功率会高很多。