Docker 进阶部署指南
本文档面向需要在生产环境部署 biliup 的用户,覆盖 docker-compose 完整配置、数据持久化、反向代理、HTTPS 等进阶场景。
基础回顾
如果你还未完成基础部署,请先查看Docker 安装指引。
最简启动命令:
docker run -d \
--name biliup \
-p 19159:19159 \
-v $(pwd)/data:/opt \
ghcr.io/biliup/caution:latest \
serverdocker-compose 完整配置
使用 docker-compose.yml 管理容器是推荐方式,便于维护、升级和备份。
最小可用配置
# docker-compose.yml
version: "3.8"
services:
biliup:
image: ghcr.io/biliup/caution:latest
container_name: biliup
restart: unless-stopped
ports:
- "19159:19159"
volumes:
- ./data:/opt
command: >
server
--bind 0.0.0.0
--auth
--port 19159启动:docker compose up -d
生产环境推荐配置
# docker-compose.yml
version: "3.8"
services:
biliup:
image: ghcr.io/biliup/caution:latest
container_name: biliup
restart: unless-stopped
# 资源限制(防止 OOM)
deploy:
resources:
limits:
memory: 2G
reservations:
memory: 512M
ports:
- "127.0.0.1:19159:19159" # 仅绑定本地,由反向代理转发
volumes:
# 数据持久化(数据库、配置、录制文件)
- ./data:/opt
# 如需自定义 WebUI,挂载自定义前端目录
# - ./custom-ui:/opt/custom-ui
environment:
# 时区设置(录制文件名时间戳用)
- TZ=Asia/Shanghai
command: >
server
--bind 0.0.0.0
--auth
--port 19159
logging:
driver: "json-file"
options:
max-size: "10m"
max-file: "3"
networks:
- biliup-net
# 可选:Nginx 反向代理(见下方反向代理章节)
# nginx:
# image: nginx:alpine
# ...
networks:
biliup-net:
driver: bridge数据持久化详解
目录结构
./data 目录挂载到容器内的 /opt,包含:
data/
├── data.sqlite3 # WebUI 配置数据库(账号、模板、主播配置)
├── log/ # 运行日志
├── recordings/ # 录制文件存放目录(默认)
└── cookies/ # 存放 B站等平台的 Cookie 文件重要提醒
⚠️ 必须挂载
/opt卷,否则容器重启后所有配置(账号登录状态、主播列表、投稿模板)会全部丢失。
自定义录制文件存放路径
默认录制文件保存在容器内的 /opt/recordings,映射到宿主机:
volumes:
# 将录制文件存放到宿主机的指定路径
- /mnt/large-disk/biliup-data:/opt或在「空间配置 → 全局设置」中修改录制文件保存路径(需挂载对应路径)。
环境变量参考
| 环境变量 | 说明 | 默认值 |
|---|---|---|
TZ | 时区(影响文件名时间戳) | UTC |
BILIUP_PORT | 服务端口 | 19159 |
BILIUP_CONFIG | 自定义配置文件路径 | - |
WARNING
截至本文撰写版本,源码中未确认 BILIUP_PORT / BILIUP_CONFIG 这两个环境变量被服务端实际读取。请优先使用命令行参数(--port)与 WebUI「空间配置」来设置端口与配置,不要依赖环境变量生效;如后续版本支持,以该版本的发布说明为准。
💡 认证通过
--auth参数开启,首次访问 WebUI 时管理员用户名固定为biliup并设置密码,无需额外环境变量。
反向代理 + HTTPS
生产环境建议通过反向代理(Nginx / Caddy)访问 WebUI,而非直接暴露端口。
Nginx 配置示例
# /etc/nginx/sites-available/biliup
server {
listen 80;
server_name biliup.yourdomain.com;
# 先配置 HTTP 以便 Certbot 验证,之后再开启 HTTPS
location / {
proxy_pass http://127.0.0.1:19159;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# WebSocket 支持(日志查看器需要)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}开启 HTTPS(Certbot)
# 安装 certbot
sudo apt install certbot python3-certbot-nginx
# 自动配置 HTTPS
sudo certbot --nginx -d biliup.yourdomain.com
# 设置自动续期
sudo systemctl enable certbot.timerCaddy 配置示例(推荐,自动 HTTPS)
# Caddyfile
biliup.yourdomain.com {
reverse_proxy 127.0.0.1:19159
}Caddy 会自动申请和续期 Let's Encrypt 证书,无需额外配置。
安全加固
1. 开启登录认证并设置密码
docker-compose.yml 的 command 中已包含 --auth 参数(见上方基础配置)。--auth 仅控制是否开启登录认证,不接收密码;服务启动后首次访问 WebUI 时,管理员用户名固定为 biliup,请设置密码,之后使用同一用户名(biliup)与密码登录。
⚠️ WebUI 管理员账号(固定用户名
biliup)与用于投稿的 B站账号(扫码 / Cookie 添加)是两套不同身份,请勿混淆。
可用以下命令生成高强度密码备用:
openssl rand -base64 16注册完成后,之后每次访问 WebUI 都需先登录。
2. 不要将端口直接暴露到公网
在 docker-compose.yml 中将端口绑定改为 127.0.0.1:19159:19159,仅允许本地访问,再通过反向代理转发。
3. 定期备份数据
# 备份脚本示例(可加入 crontab)
#!/bin/bash
BACKUP_DIR=/opt/backups/biliup
mkdir -p $BACKUP_DIR
# 备份数据库、配置与 Cookie(不含录制文件本身,录制文件通常很大,请按需单独归档)
tar -czf $BACKUP_DIR/biliup-data-$(date +%Y%m%d).tar.gz /opt/data /opt/cookies
# 仅清理过期的「备份压缩包」,不影响任何录制文件
find $BACKUP_DIR -name "biliup-data-*.tar.gz" -mtime +7 -delete4. 限制容器资源
见上方「生产环境推荐配置」中的 deploy.resources 配置,防止录制任务占用过多资源影响宿主机。
升级 biliup 容器
方法一:使用 docker-compose(推荐)
# 拉取最新镜像
docker compose pull
# 重新创建容器(配置和数据卷不变)
docker compose up -d --force-recreate方法二:手动操作
# 拉取最新镜像
docker pull ghcr.io/biliup/caution:latest
# 停止并删除旧容器(数据卷不受影响)
docker stop biliup
docker rm biliup
# 使用相同参数重新创建容器
docker run -d \
--name biliup \
-p 19159:19159 \
-v $(pwd)/data:/opt \
ghcr.io/biliup/caution:latest \
server --bind 0.0.0.0 --auth --port 19159⚠️ 升级前建议备份
./data目录,尤其是跨大版本升级时(如 0.4.x → 1.x)。
常见问题
Docker 容器数据丢失
确认 docker-compose.yml 中已正确配置 volumes 挂载。检查:
# 查看容器挂载情况
docker inspect biliup | grep -A 10 "Mounts"录制文件占用过多磁盘空间
biliup 不会自动清理已上传的视频文件。
DANGER
请勿使用按文件年龄批量删除的脚本。 例如下面的命令只会按修改时间删除目录内所有超过 7 天的 .flv,完全不检查该文件是否已经上传 / 投稿完成,可能导致尚未上传的录像被误删:
# ❌ 危险:会删除所有超过 7 天的 FLV,包括尚未上传的录像
find /path/to/recordings -name "*.flv" -mtime +7 -delete推荐做法:
- 优先在「空间配置 → 全局设置」中,对已确认上传完成的主播配置安全的保留 / 删除策略(如保留 N 份或仅删除已投稿文件)。
- 若必须脚本清理,请基于 biliup 的任务 / 上传状态生成「待清理清单」,并先 dry-run 人工确认,再执行删除;删除前务必已完成一次有效备份。
# ✅ 安全示例:仅列出 7 天前的 FLV,先人工核对,绝不自动 -delete
find /path/to/recordings -name "*.flv" -mtime +7 -print端口冲突
如果 19159 端口已被占用,修改 docker-compose.yml 中的端口映射:
ports:
- "19160:19159" # 宿主机 19160 → 容器 19159同时记得在 --port 参数中保持一致(容器内部端口),或只改宿主机映射端口。
宿主机时区不正确导致文件名时间异常
在 docker-compose.yml 中添加时区环境变量:
environment:
- TZ=Asia/Shanghai下一步
- 了解WebUI 完整使用指南
- 了解全局配置参数
- 遇到问题时查看常见问题 Q&A