补充说明
本教程介绍 fan-image-tr 的部署、升级、卸载、备份、恢复与日常运维,适用于 NAS / 个人工作站上的私有图片批量处理台。
项目:fan-image-tr|基于 FFmpeg 的图片批量处理 Web 工具 仓库:https://github.com/meimolihan/fan-image-tr 运行依赖:FFmpeg 8+(
ffmpeg与ffprobe);编译依赖:Go 1.25+
fan-image-tr 没有账号密码体系,浏览器打开即用。 对外暴露时请自行在前面加反向代理与鉴权。
安装与卸载
方式一:Docker Compose 部署(推荐)
# 一键脚本(拉源码 + 本地构建 + 启动)
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/dc_inst_fan-image-tr.sh) 8791 /vol1/1000/compose/fan-image-tr
方式二:使用仓库自带的 compose 文件
git clone --depth 1 https://github.com/meimolihan/fan-image-tr.git
cd fan-image-tr
# 启动前把 ./photos 换成你的图片库目录
docker compose up -d --build
# 指定端口与并发
FIT_PORT=8791 FIT_APP_WORKER=2 docker compose up -d --build
方式三:Release 二进制 + systemd 部署
# 1. 安装 FFmpeg(项目运行强依赖,内含 ffprobe)
apt update && apt install -y ffmpeg # dnf / yum / apk 同理
# 2. 创建服务账号与目录
sudo useradd -r -s /sbin/nologin -d /var/lib/fan-image-tr fit
sudo mkdir -p /var/lib/fan-image-tr /srv/photos
# 3. 下载二进制(按架构二选一,release 里还有 darwin / windows 产物)
ARCH=$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')
sudo curl -fsSL -o /usr/local/bin/fan-image-tr \
"https://github.com/meimolihan/fan-image-tr/releases/latest/download/fan-image-tr-linux-${ARCH}"
sudo chmod +x /usr/local/bin/fan-image-tr
fan-image-tr version
# 4. 写入 systemd 单元
sudo cp scripts/fan-image-tr.service /etc/systemd/system/
# 按需修改 unit 里的 FIT_APP_PORT / FIT_APP_MEDIA_DIR / User / ReadWritePaths
sudo systemctl daemon-reload
sudo systemctl enable --now fan-image-tr
- 静默安装 / 升级(等同于重跑上面的二进制替换 +
systemctl restart)
sudo systemctl stop fan-image-tr
sudo curl -fsSL -o /usr/local/bin/fan-image-tr "https://github.com/meimolihan/fan-image-tr/releases/latest/download/fan-image-tr-linux-$(uname -m | sed 's/x86_64/amd64/;s/aarch64/arm64/')"
sudo chmod +x /usr/local/bin/fan-image-tr
sudo systemctl start fan-image-tr
卸载命令
# systemd 方式
sudo systemctl disable --now fan-image-tr
sudo rm -f /etc/systemd/system/fan-image-tr.service /usr/local/bin/fan-image-tr
sudo systemctl daemon-reload && sudo systemctl reset-failed fan-image-tr
sudo rm -rf /var/lib/fan-image-tr # 可选:删数据目录
- Docker 方式
cd /vol1/1000/compose/fan-image-tr && docker-compose down --rmi all && rm -rf /vol1/1000/compose/fan-image-tr
- 菜单内一键安装 / 卸载
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/fan-image-tr_menu.sh)
# 菜单内选 66 安装/升级、99 卸载
备份与恢复
数据目录(默认 /var/lib/fan-image-tr)内含 tasks.json 任务快照、profiles.json 自定义预设、uploads/ 上传文件与 output/ 转换产物,打包备份即可。
备份数据
sudo tar -czf "/vol2/1000/file/backup/fan-image-tr-$(date +%Y%m%d-%H%M%S).tar.gz" \
-C "$(dirname /var/lib/fan-image-tr)" "$(basename /var/lib/fan-image-tr)"
- 将备份脚本添加到系统定时任务
# 1.(推荐)直接用菜单内选项 77 备份;也可以按下面的方式落地为独立脚本
cat > /usr/local/bin/fan-image-tr_backup << 'EOF'
#!/bin/bash
set -uo pipefail
DATA_DIR="/var/lib/fan-image-tr"
BACKUP_DIR="${1:-/vol2/1000/file/backup/fan-image-tr-backup}"
KEEP="${2:-6}"
[ -d "$DATA_DIR" ] || { echo "数据目录不存在: $DATA_DIR"; exit 1; }
mkdir -p "$BACKUP_DIR"
ts=$(date +%Y%m%d-%H%M%S)
tar -czf "$BACKUP_DIR/fan-image-tr-${ts}.tar.gz" -C "$(dirname "$DATA_DIR")" "$(basename "$DATA_DIR")" || exit 1
ls -1t "$BACKUP_DIR"/fan-image-tr-*.tar.gz 2>/dev/null | tail -n +$((KEEP + 1)) | xargs -r rm -f
echo "备份完成: $BACKUP_DIR/fan-image-tr-${ts}.tar.gz"
EOF
# 2.增加执行权限
chmod +x /usr/local/bin/fan-image-tr_backup
# 3.测试运行一次(目录/保留份数:/vol2/1000/file/backup/fan-image-tr-backup 保留6份)
fan-image-tr_backup /vol2/1000/file/backup/fan-image-tr-backup 6
# 4.追加 crontab(root):每日凌晨2点30分执行,防重复追加
(crontab -l 2>/dev/null | grep -Fq '/usr/local/bin/fan-image-tr_backup /vol2/1000/file/backup/fan-image-tr-backup 6') || (crontab -l 2>/dev/null; echo '30 2 * * * /usr/local/bin/fan-image-tr_backup /vol2/1000/file/backup/fan-image-tr-backup 6 >> /var/log/fan-image-tr_backup.log 2>&1') | crontab -
# 5.验证定时任务是否写入成功
crontab -l
恢复数据
- 恢复
/vol2/1000/file/backup/fan-image-tr-backup目录最新的备份
sudo systemctl stop fan-image-tr
sudo mv /var/lib/fan-image-tr "/var/lib/fan-image-tr.bak.$(date +%Y%m%d-%H%M%S)"
sudo tar -xzf "$(ls -1t /vol2/1000/file/backup/fan-image-tr-backup/fan-image-tr-*.tar.gz | head -1)" -C /var/lib
sudo chown -R fit:fit /var/lib/fan-image-tr
sudo systemctl start fan-image-tr
- 或使用菜单内选项
88恢复(交互确认,失败自动回滚)
脚本命令
| 命令 | 说明 |
|---|---|
fan-image-tr [serve] |
启动 Web 服务(无命令时默认启动) |
fan-image-tr -port 8791 -data ./data -media /srv/photos -worker 2 |
带参数启动 |
fan-image-tr check |
检查 FFmpeg 环境,输出格式字典 + 硬件加速逐格式实测结果 |
fan-image-tr status |
查看本机运行状态、监听端口、数据目录与产物/上传占用 |
fan-image-tr version / -v / --version |
打印版本信息 |
fan-image-tr help / -h |
显示帮助 |
make build / make build-all |
编译到 bin/ / 交叉编译到 dist/ |
make test / make race / make check |
静态检查与测试 / 竞态检测 / FFmpeg 能力自检 |
日常管理命令
| 操作 | 命令 |
|---|---|
| 启动 | systemctl start fan-image-tr |
| 关闭 | systemctl stop fan-image-tr |
| 重启 | systemctl restart fan-image-tr |
| 状态 | systemctl status fan-image-tr |
| 查看实时日志 | journalctl -u fan-image-tr -f |
| 查看最近 30 行日志 | journalctl -u fan-image-tr -n 30 --no-pager |
| 关闭开机自启 | systemctl disable fan-image-tr |
| 能力自检 | fan-image-tr check(或 docker exec fan-image-tr fan-image-tr check) |
| 健康检查 | curl -fsS http://127.0.0.1:8791/api/health |
| 容器日志 | docker logs -f fan-image-tr |
| 端口放行 | firewall-cmd --permanent --add-port=8791/tcp && firewall-cmd --reload(firewalld) |
配置参数
优先级:命令行参数 > 环境变量(FIT_ 前缀) > 配置文件 > 默认值
| 命令行 | 环境变量 | 默认值 | 说明 |
|---|---|---|---|
-port |
FIT_APP_PORT |
8791 |
监听端口 |
-data |
FIT_APP_DATA_DIR |
./data |
数据目录(任务快照、预设、上传、产物) |
-media |
FIT_APP_MEDIA_DIR |
当前工作目录 | 图片浏览根目录 |
-output |
FIT_APP_OUTPUT_DIR |
<data>/output |
转换产物目录 |
-upload |
FIT_APP_UPLOAD_DIR |
<data>/uploads |
上传文件目录 |
-worker |
FIT_APP_WORKER |
2 |
转换并发数 |
-log-level |
—(无环境变量) | info |
debug / info / warn / error |
-debug |
FIT_APP_DEBUG |
false |
调试日志 |
| — | FIT_FFMPEG_PATH |
ffmpeg |
ffmpeg 可执行文件 |
| — | FIT_FFMPEG_FFPROBE_PATH |
ffprobe |
ffprobe 可执行文件 |
| — | FIT_FFMPEG_ACCEL |
auto |
auto / qsv / nvenc / vaapi / none |
| — | FIT_VERSION |
编译期注入 | 版本号(可覆盖 /api/version 与启动横幅) |
-web |
— | 内嵌资源 | 覆盖前端静态目录(调试用) |
配置文件 config.yaml 按 ./ → ./data → /etc/fan-image-tr 顺序查找。
浏览根目录、数据目录、上传目录、输出目录都允许被 API 访问;其余路径一律拒绝(ErrPathNotAllowed / HTTP 403)。
HTTP API 速查
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health |
健康检查 |
| GET | /api/version |
版本、构建信息 |
| GET | /api/capabilities |
格式字典 + 硬件加速自检结果 |
| GET | /api/options |
缩放 / 滤镜 / 颜色模式 / 水印等选项字典 |
| GET | /api/media/dir?path= |
目录浏览 |
| GET | /api/media/info?path= |
单图探测信息 |
| POST | /api/media/probe |
批量探测({paths:[...]}) |
| GET | /api/media/thumb?path=&size= |
缩略图 |
| GET | /api/media/raw?path= / /api/media/download?path= |
原图 / 下载(仅图片类型) |
| POST | /api/media/rename / /api/media/delete / /api/media/mkdir / /api/media/upload |
重命名 / 删除 / 新建目录 / 上传 |
| POST | /api/estimate |
体积预估 |
| POST | /api/preview |
返回将要执行的 FFmpeg 命令 |
| GET/POST/DELETE | /api/tasks[/:id] |
任务列表 / 创建 / 清理 |
| GET | /api/tasks/stats |
任务计数 |
| POST | /api/tasks/:id/cancel /retry |
取消 / 重试 |
| GET/POST/DELETE | /api/presets[/:name] |
预设列表 / 保存 / 删除 |
提交任务示例(variants 一次生成缩略图 / 列表图 / 大图):
curl -X POST http://127.0.0.1:8791/api/tasks \
-H 'Content-Type: application/json' \
-d '{
"inputs": ["IMG_0001.jpg", "IMG_0002.png"],
"output_dir": "output",
"options": {"format": "webp", "quality": 82, "resize": "long_edge", "size": 1920, "adapt": "fit", "strip_metadata": true},
"variants": [
{"name": "thumb", "resize": "long_edge", "size": 320},
{"name": "list", "resize": "long_edge", "size": 640, "quality": 75}
]
}'
状态码约定:400 参数非法 / 403 路径越界 / 404 任务或文件不存在 / 409 任务状态不允许该操作 / 503 FFmpeg 探测失败或能力不可用。
数据目录说明
- 默认数据目录:
/var/lib/fan-image-tr(systemd)/./data(二进制直跑) - 目录内容:
tasks.json任务快照(重启后未完成任务回到队列)、profiles.json自定义预设(内置预设不可改)、uploads/上传文件、output/转换产物 - 版本号注入:
internal/version.Version(编译期 ldflags),也可用FIT_VERSION覆盖 - 浏览根目录、数据目录、上传目录、输出目录允许被 API 访问,其余路径一律 403
- 硬件加速:
/api/capabilities里的hw_formats是逐个格式实际编码一张测试图得出的结果;QSV 的 JPEG 在yuvj*像素格式下会自动补-color_range pc,避免白底发灰