这就是编译和部署中最经典的困境:

  • 编译时:我们需要一个新环境(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 容器,确保从一个干净的状态开始。

  1. 如果你还在容器里,请 exit

  2. 在你本地电脑的终端运行:

    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 容器内执行全新的编译步骤

进入容器后,请一步步执行以下命令。注意,依赖包和编译命令都发生了变化。

  1. 设置代理和软件源(同上)

    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
    
  2. 安装依赖(新增了 musl-tools

    Bash

    apt-get update && apt-get install -y curl git build-essential pkg-config libssl-dev libglib2.0-dev musl-tools
    
  3. 安装 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
    
  4. 克隆源代码(同上)

    Bash

    cd /
    git clone https://github.com/stumpapp/stump.git
    
  5. 执行静态编译(最关键的一步!)

    Bash

    cd /stump
    # 我们增加了 --target 参数,指定编译目标为 musl
    cargo build --release --locked --target=x86_64-unknown-linux-musl
    

    这个编译过程可能会比之前更长一些,因为它需要将所有东西都打包进去。

第四步:取出最终的静态文件

编译成功后,可执行文件的路径也变了。

  1. 在容器内,从新的路径移动文件:

    Bash

    # 注意路径的变化
    mv /stump/target/x86_64-unknown-linux-musl/release/stump /build/stump-static
    
  2. 退出容器:

    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

这个地址直接指向了书库的“第一页”,绕过了可能存在的重定向,成功率会高很多。