Stump 0.1.12 Docker Compose 部署指南

用一份 Docker Compose 文件部署 Stump 0.1.12 官方镜像,完成健康检查、属主认领、建库扫描、重启持久化的端到端实测闭环,含环境变量覆盖与配置回写行为实录。

StumpStumpDockerDocker Compose自托管2026/11/02

Stump 0.1.12 Docker Compose 部署指南

目标:在一台 Linux 服务器上用一份 Docker Compose 文件部署 Stump 0.1.12 官方镜像,并完成「健康检查 → 创建属主 → 登录 → 建库扫描 → 重启持久化」的端到端实测闭环。全部命令与回显均为 2026-11-02 在 stump-0.1.12-stack 栈上实测照抄,示例账号 admin / q1w2e3r4。组件定位与选型见 《Stump 0.1.12 介绍与选型指南》;参数逐项详解见本专栏 《Stump 0.1.12 配置参数详解》;CLI 用法见 《Stump 0.1.12 常用 CLI 命令与工具详解》。

一、环境信息

项目值
操作系统Linux(x86_64,内核 7.0.0-38-generic)
容器运行时Docker 29.9.2(build a82e528),Docker Compose v2
应用版本Stump 0.1.12(官方镜像 aaronleopold/stump:latest,构建 rev 0769a29,编译时间 2026-11-01T17:07:58Z)
对外端口8141(映射到服务默认端口 10801)
专用网络stump-0.1.12-net,子网 10.89.56.0/24(compose 显式声明,避免与其他栈冲突)
配置/数据目录/srv/stump/config:/config(Stump.toml 与 stump.db)、/srv/stump/data:/data(书库媒体)
演示账号admin / q1w2e3r4(首次认领创建的服务器属主)

二、镜像选型说明

Stump 官方 Docker 安装路径使用 Docker Hub 上的 aaronleopold/stump 镜像(作者维护,来源:官方文档 Installation/Docker 页,查询日期 2026-11-01)。本部署取 :latest 标签,实际内容为当前最新稳定版 v0.1.12——启动后可用版本接口复核(见 4.7 实测回显,semver 为 0.1.12)。

💡 技术拓展:容器化部署 Stump 的标签策略选择——

策略写法取舍
latestaaronleopold/stump:latest始终最新,但重建时版本可能漂移
固定版本aaronleopold/stump:0.1.12(以 Releases 为准)可复现,升级需显式改标签

本文用 :latest 与官方文档示例一致,并在环境信息中固化实测版本号,生产环境建议改用固定标签。

三、前置条件

  1. 服务器已安装 Docker 与 Compose v2 插件(docker --version 确认 29.9.2);
  2. 端口 8141 未被占用(ss -ltn | grep 8141 无输出);
  3. 已准备书库媒体目录(本文用 /srv/stump/data,放入 EPUB/CBZ/CBR/PDF 文件即可);
  4. 官方镜像拉取可用(docker pull aaronleopold/stump:latest,国内网络慢时按下载降级链先试国内加速器、再走代理)。

四、部署步骤

4.1 准备目录

# 配置目录(Stump.toml + stump.db 落盘处)与书库数据目录
mkdir -p /srv/stump/config /srv/stump/data

4.2 编写 compose 文件

/srv/stump/docker-compose.yml(实测使用的完整内容):

name: stump-0.1.12-stack

services:
  stump:
    image: aaronleopold/stump:latest
    container_name: stump-0.1.12-server
    volumes:
      - /srv/stump/config:/config
      - /srv/stump/data:/data
    ports:
      - "8141:10801"
    environment:
      - PUID=0
      - PGID=0
      - STUMP_CONFIG_DIR=/config
      - STUMP_ENABLE_UPLOAD=true
    restart: unless-stopped
    networks:
      - stumpnet

networks:
  stumpnet:
    name: stump-0.1.12-net
    driver: bridge
    ipam:
      config:
        - subnet: 10.89.56.0/24

逐项说明:

  • name: 显式声明 compose 项目名,多栈并存时 down 不会误伤其他项目;
  • PUID/PGID 按官方文档应设为配置与数据目录属主(echo -e "PUID=$(id -u)\nPGID=$(id -g)" 可打印当前值);本文以 root 属主目录演示故取 0;
  • STUMP_CONFIG_DIR=/config 与挂载点对齐,保证 Stump.toml 与数据库落在持久化卷;
  • STUMP_ENABLE_UPLOAD=true 开启网页上传(官方默认关闭);
  • 子网 10.89.56.0/24 显式固定,避免 Docker 自动分配撞上其他栈网段。

4.3 启动服务

$ cd /srv/stump && docker compose up -d
 Network stump-0.1.12-net Creating
 Network stump-0.1.12-net Created
 Container stump-0.1.12-server Creating
 Container stump-0.1.12-server Created
 Container stump-0.1.12-server Starting
 Container stump-0.1.12-server Started

状态确认:

$ docker compose ps
NAME                  IMAGE                       COMMAND            SERVICE   CREATED         STATUS         PORTS
stump-0.1.12-server   aaronleopold/stump:latest   "/entrypoint.sh"   stump     4 seconds ago   Up 4 seconds   0.0.0.0:8141->10801/tcp, [::]:8141->10801/tcp

4.4 启动日志与 Web 入口验证

$ docker compose logs --tail 8
stump-0.1.12-server  | If you face any issues, or encounter any bugs: https://github.com/stumpapp/stump/issues/new/choose
stump-0.1.12-server  | If you would like to join the Stump Community Discord Server: https://discord.gg/63Ybb7J3as
stump-0.1.12-server  | Enjoy!
stump-0.1.12-server  |   2026-11-02T06:46:00.409210Z  INFO stump_server::http_server: ⚡️ Stump HTTP server starting on http://0.0.0.0:10801
stump-0.1.12-server  |     at apps/server/src/http_server.rs:136

日志出现 ASCII 横幅与 Stump HTTP server starting on http://0.0.0.0:10801 即服务就绪。Web 入口验证:

$ curl -sI http://localhost:8141/
HTTP/1.1 200 OK
content-type: text/html
accept-ranges: bytes
last-modified: Sun, 01 Nov 2026 17:07:45 GMT
content-length: 8496
cache-control: no-cache, no-store, must-revalidate

4.5 健康检查

$ curl -s http://localhost:8141/api/v2/ping
pong
$ curl -s http://localhost:8141/api/v2/health
{"dependencies":{"database":{"status":"ok"},"spa":{"status":"ok"}},"status":"ok"}
$ curl -s http://localhost:8141/api/v2/auth/claim
{"isClaimed":false}

database 与 spa 双 ok、isClaimed:false 表示全新实例等待认领属主。

4.6 创建属主账号并登录

浏览器打开 http://<服务器>:8141 会进入首次引导页;等价 REST 实测(属主注册即首次 register,无用户时自动成为服务器属主):

$ curl -s -o /dev/null -w "%{http_code}\n" -X POST http://localhost:8141/api/v2/auth/register -H "Content-Type: application/json" -d '{"username":"admin","password":"q1w2e3r4"}'
200
$ curl -s http://localhost:8141/api/v2/auth/claim
{"isClaimed":true}
$ curl -s -c /tmp/stump_ck.txt -o /dev/null -w "%{http_code}\n" -X POST http://localhost:8141/api/v2/auth/login -H "Content-Type: application/json" -d '{"username":"admin","password":"q1w2e3r4"}'
200

登录成功响应头下发服务端会话 Cookie(set-cookie 中 stump_session 值,属性 HttpOnly; SameSite=Lax; Max-Age=259200,有效期即默认 session_ttl 3 天),后续 GraphQL 请求以 -b /tmp/stump_ck.txt 携带。

4.7 版本复核

$ curl -s -b /tmp/stump_ck.txt -X POST http://localhost:8141/api/v2/version
{"semver":"0.1.12","buildChannel":"stable","rev":"0769a29","compileTime":"2026-11-01T17:07:58.582423267+00:00"}
$ curl -s -b /tmp/stump_ck.txt http://localhost:8141/api/v2/check-for-update
{"currentSemver":"0.1.12","latestSemver":"0.1.12","hasUpdateAvailable":false}

确认镜像内容即最新稳定版 0.1.12,且无更新可用。

4.8 功能闭环:建库、扫描、读回

Stump 核心 API 是 GraphQL(端点 /api/graphql)。创建指向 /data 的书库(实测回显,节选):

$ curl -s -b /tmp/stump_ck.txt -X POST http://localhost:8141/api/graphql -H "Content-Type: application/json" -d '{"query":"mutation { createLibrary(input: { name: \"quzuo-test\", path: \"/data\", description: \"S9 实测书库\" }) { id name path createdAt } }"}'
{"data":{"createLibrary":{"id":"b106a108-8b78-4182-ab7e-9399cd0a58c7","name":"quzuo-test","path":"/data","createdAt":"2026-11-02T05:07:24.178986125+00:00"}}}

扫描作业与媒体读回(实测回显):

$ curl -s -b /tmp/stump_ck.txt -X POST http://localhost:8141/api/graphql -H "Content-Type: application/json" -d '{"query":"{ jobs { nodes { name status msElapsed } } }"}'
{"data":{"jobs":{"nodes":[{"name":"library_scan","status":"COMPLETED","msElapsed":6},{"name":"library_scan","status":"COMPLETED","msElapsed":7}]}}}
$ curl -s -b /tmp/stump_ck.txt -X POST http://localhost:8141/api/graphql -H "Content-Type: application/json" -d '{"query":"{ media { nodes { name extension pages status } } }"}'
{"data":{"media":{"nodes":[{"name":"test-book","extension":"epub","pages":3,"status":"READY"},{"name":"test-manga","extension":"cbz","pages":3,"status":"READY"},{"name":"upload-demo","extension":"cbz","pages":3,"status":"READY"}]}}}

library_scan 作业 COMPLETED(毫秒级完成)、媒体状态 READY,即部署端到端可用。

💡 技术拓展:Stump 建库的三种触达方式——

方式入口适用
Web UI管理页「新建书库」表单日常操作
GraphQL APIcreateLibrary 变更(本文实测)脚本化/自动化
CLI同二进制 stump 的 account/system 子命令(不含建库,见 《Stump 0.1.12 常用 CLI 命令与工具详解》)无 Web 登录态时运维

本文验证用 GraphQL,因其为 Stump 核心 API;Web UI 路径行为一致。

4.9 重启与持久化验证

$ docker compose down
 Container stump-0.1.12-server Stopping
 Container stump-0.1.12-server Stopped
 Container stump-0.1.12-server Removing
 Container stump-0.1.12-server Removed
 Network stump-0.1.12-net Removing
 Network stump-0.1.12-net Removed
$ docker compose up -d
 Network stump-0.1.12-net Creating
 Network stump-0.1.12-net Created
 Container stump-0.1.12-server Creating
 Container stump-0.1.12-server Created
 Container stump-0.1.12-server Starting
 Container stump-0.1.12-server Started
$ curl -s -o /dev/null -w "%{http_code}\n" -X POST http://localhost:8141/api/v2/auth/login -H "Content-Type: application/json" -d '{"username":"admin","password":"q1w2e3r4"}'
200

down 后重建网络、up 后属主账号登录仍 200、书库与媒体数据完整(4.8 读回即重建后所查),持久化成立。

五、数据持久化说明

两个卷即全部持久化面:

宿主目录容器内内容丢失后果
/srv/stump/config/configStump.toml、stump.db(用户/会话/书库元数据/缩略图记录)、JWT 签名密钥需重新认领属主、重扫全部书库
/srv/stump/data/data你的书籍文件本体媒体丢失

数据库为 SQLite 单文件(/config/stump.db),备份只需停服务后拷贝该目录;书库元数据可经 GraphQL 重建,但阅读进度、API Keys 均在库内,务必纳入备份。

六、环境变量表

compose 的 environment: 即配置覆盖通道(完整参数语义见本专栏 《Stump 0.1.12 配置参数详解》),常用如下:

环境变量对应 TOML 键默认值说明
PUID / PGID—(entrypoint)—容器内运行身份,设为配置/数据目录属主
STUMP_IPip0.0.0.0监听地址
STUMP_PORTport10801服务端口(容器内)
STUMP_CONFIG_DIRconfig_dir~/.stump配置目录,Docker 部署务必指向挂载点
STUMP_VERBOSITYverbosity1日志级别 0–3(见 7.2 实测)
STUMP_ENABLE_UPLOADenable_uploadfalse网页上传开关
STUMP_DB_PATHdb_path配置目录父级SQLite 库文件目录
STUMP_ALLOWED_ORIGINSallowed_originsTauri 相关跨域白名单(API 从别的域名访问时配置)
STUMP_TRUST_PROXY_HEADERStrust_proxy_headersfalse反代后置真时启用
STUMP_SESSION_TTLsession_ttl259200会话有效期(秒)
STUMP_OIDC_ENABLED 等[oidc].*falseOIDC 登录接入(详见 《Stump 0.1.12 配置参数详解》)

七、配置参数说明

7.1 双通道配置模型

Stump 所有参数可在 Stump.toml 与环境变量两处设置,环境变量以 STUMP_ 前缀覆盖同名 TOML 键;未设置的键使用内置默认值(来源:官方文档 Server Config,查询日期 2026-11-01)。

7.2 环境变量覆盖实测

在 compose 中加入 STUMP_VERBOSITY=2 后重建:

$ docker compose up -d
 Container stump-0.1.12-server Recreate
 Container stump-0.1.12-server Recreated
 Container stump-0.1.12-server Starting
 Container stump-0.1.12-server Started
$ docker compose logs --since 30s | grep "Tracing initialized"
stump-0.1.12-server  |   2026-11-02T06:45:06.464403Z  INFO stump_core::config::logging: Tracing initialized, verbosity: LevelFilter::DEBUG, verbosity_num: 2

日志级别由默认 LevelFilter::INFO(1)切换为 LevelFilter::DEBUG(2),覆盖生效。

7.3 覆盖值会写回 Stump.toml(重要行为)

上述覆盖后检查配置文件:verbosity = 2 已被持久化写入 /config/Stump.toml;随后移除环境变量并重建,服务仍按 TOML 中的 2 启动(实测日志仍为 LevelFilter::DEBUG, verbosity_num: 2)。即环境变量只在「设置时」生效一次并落盘,回退需直接编辑 Stump.toml 改回默认再重启(见 FAQ 11.3)。

八、配置文件挂载

首次启动时服务在 /config 自动生成全量 Stump.toml(实测生成 30 个键,节选首段):

ip = "0.0.0.0"
port = 10801
verbosity = 1
pretty_logs = true
colorful_logs = false
db_timeout_secs = 30
client_dir = "/app/client"
config_dir = "/config"
allowed_origins = []
enable_playground = false
enable_koreader_sync = false
enable_kobo_sync = false

(输出节选,实测首段;其中 client_dir/config_dir 为镜像内路径,其余键的完整语义与默认值对照见 《Stump 0.1.12 配置参数详解》。)该文件位于持久化卷内,可直接编辑后 docker compose restart 生效,适合与 compose 环境变量混合使用:常驻参数进 TOML,环境差异化参数用 STUMP_* 注入。

九、等价 docker run

不用 Compose 时官方给出的等价命令(形态来源:官方文档 Installation/Docker「Docker CLI」,查询日期 2026-11-01;端口/目录按本栈调整):

docker create \
  --name=stump-0.1.12-server \
  -e "PUID=0" \
  -e "PGID=0" \
  -e "STUMP_CONFIG_DIR=/config" \
  -e "STUMP_ENABLE_UPLOAD=true" \
  -p 8141:10801 \
  --volume "/srv/stump/config:/config" \
  --volume "/srv/stump/data:/data" \
  --restart unless-stopped \
  aaronleopold/stump:latest
docker start stump-0.1.12-server

官方文档同时说明可用 --mount 形式替换 --volume 行。两种形态数据目录一致,可随时互换。

十、常用运维命令

# 查看状态
docker compose ps
# 跟踪日志
docker compose logs -f stump
# 重启(改 Stump.toml 后生效)
docker compose restart
# 停止并移除(数据卷在宿主目录,不受影响)
docker compose down

升级(官方文档 Update the container 流程):

docker compose pull stump
docker compose up -d

升级前后用版本接口对照(实测 4.7):POST /api/v2/version 看当前运行版,GET /api/v2/check-for-update 看 latestSemver 与 hasUpdateAvailable。0.1.x 系列升级注意官方 Breaking changes 页。

账号应急运维(CLI 与服务同镜像,详见 《Stump 0.1.12 常用 CLI 命令与工具详解》):

$ docker exec stump-0.1.12-server /app/stump account list
+---------+----------+
| Account | Status   |
+---------+----------+
| admin   | unlocked |
+---------+----------+

十一、常见问题

11.1 启动 panic:index idx_media_annotations_user_media already exists

复用旧实验残留的配置目录时,迁移与残留库冲突,启动即崩溃(实测报错原文):

thread 'main' panicked at core/src/context.rs:53:6:
Failed to connect to database: DBError(Exec(SqlxError(Database(SqliteError { code: 1, message: "index idx_media_annotations_user_media already exists" }))))

定位:报错指向 SQLite 索引重复创建,说明 /config/stump.db 是旧版本/旧栈遗留库。解决:停服后清掉配置目录内的数据库文件(mv /srv/stump/config/stump.db /srv/stump/config/stump.db.bak)再启动,服务重新建库并正常打出启动横幅(实测清库重启后 Stump HTTP server starting on http://0.0.0.0:10801 成功)。数据目录 /data 的书籍文件不受影响,重新建库扫描即可。

11.2 启动日志出现 addgroup: gid '0' in use

PUID=0/PGID=0 时镜像 entrypoint 尝试创建 stump 用户/组会与 root 的 uid/gid 冲突,每次启动打印:

Adding group stump with gid 0
addgroup: gid '0' in use
Adding user stump with uid 0
adduser: unknown group stump

该告警无害,服务照常启动(实测两轮启动均出现且随后 HTTP 正常监听)。规范做法是把 PUID/PGID 设为数据目录属主的真实 uid/gid(id -u/id -g),告警即消失。

11.3 移除环境变量后配置没回退

见 7.3:STUMP_* 覆盖会持久化写进 Stump.toml,删除环境变量不等于回退。回退方法:直接编辑 Stump.toml 将键改回默认值(或删键)后 docker compose restart(实测改回 verbosity = 1 重启后日志恢复 LevelFilter::INFO, verbosity_num: 1)。

11.4 端口 10801 冲突

宿主机映射端口冲突改 ports: 左侧即可(如 8141:10801);若要改容器内监听端口,需同时设 STUMP_PORT 并同步映射右侧。

十二、参考链接