补充说明
本教程介绍 fan-md(Markdown + OpenAPI 云文档服务器)从部署、备份恢复到日常运维的完整流程。fan-md 基于 Docker 部署(镜像 mobufan/fan-md:latest,默认端口 9900,数据目录挂载 ./data:/fan-md/data)。
项目:fan-md|云文档(Markdown + OpenAPI 文档服务器) 仓库:https://github.com/meimolihan/fan-md 镜像:https://hub.docker.com/r/mobufan/fan-md
部署
Compose 一键部署(推荐)
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/dc_inst_fan-md.sh)
- 交互式输入部署目录(默认 /vol1/1000/compose/fan-md)与映射端口(默认 9900)
- 脚本自动检查并安装 Docker / Docker Compose、开放防火墙端口、清理旧容器、生成 docker-compose.yml 并启动容器
传参部署(先目录后端口,顺序可互换)
bash <(curl -sL gitee.com/meimolihan/cmdbox/raw/master/sh/dc_inst_fan-md.sh) /vol1/1000/compose/fan-md 9900
Docker 手动运行
docker run -d --name fan-md --restart always \
-p 9900:9900 \
-v /etc/localtime:/etc/localtime:ro \
-v /home/docker/fan-md:/fan-md/data \
-e reg=true \
mobufan/fan-md:latest
卸载命令
docker rm -f fan-md && docker rmi -f mobufan/fan-md:latest && rm -rf /vol1/1000/compose/fan-md
首次使用
- 启动服务后访问
http://<IP>:9900 - 登录页点击注册,创建第一个用户账号(该功能由环境变量
reg=true控制) - 注册完成后,修改
docker-compose.yml将reg改为false关闭注册(不影响已注册用户登录)
无用户时即使
reg=false也允许注册第一个账号。
忘记密码
停止服务后用 SQLite 工具打开 ./data/md.db 重置:
SELECT id, name FROM t_user;
UPDATE t_user SET password = hex(sha256(id || '新密码')) WHERE name = '用户名';
改完重启容器即可。
备份与恢复
数据目录 ./data(含 SQLite 数据库 md.db 与 resource/ 图片/缩略图)可通过脚本快速备份与还原。脚本自动探测运行方式(systemd 服务 > docker 容器 > 离线),也可用 --mode docker 强制指定。
备份数据脚本
# 默认:备份到 <数据目录>/backup/,自动清理过期备份,保留最近 6 份
bash <(curl -sL https://raw.githubusercontent.com/meimolihan/fan-md/main/scripts/fan-md_backup.sh)
# 指定备份目录 + 保留份数
bash <(curl -sL https://raw.githubusercontent.com/meimolihan/fan-md/main/scripts/fan-md_backup.sh) "/vol1/1000/backup/fan-md" 10
# 指定数据目录(Docker 挂载的宿主路径)
bash <(curl -sL https://raw.githubusercontent.com/meimolihan/fan-md/main/scripts/fan-md_backup.sh) --data /vol1/1000/compose/fan-md/data
- 备份文件命名:
FanMD-YYYY-MM-DD_HH-MM-SS.tar.gz
将备份脚本添加到系统定时任务
# 1.下载脚本到 /usr/local/bin/fan-md_backup
curl -fsSL https://raw.githubusercontent.com/meimolihan/fan-md/main/scripts/fan-md_backup.sh -o /usr/local/bin/fan-md_backup
# 2.增加执行权限
chmod +x /usr/local/bin/fan-md_backup
# 3.测试运行一次
fan-md_backup
# 4.追加 crontab(root):每日凌晨2点30分执行,防重复追加
(crontab -l 2>/dev/null | grep -Fq '/usr/local/bin/fan-md_backup') || (crontab -l 2>/dev/null; echo '30 2 * * * /usr/local/bin/fan-md_backup >> /var/log/fan-md_backup.log 2>&1') | crontab -
# 5.验证定时任务是否写入成功
crontab -l
恢复数据脚本
# 默认:取备份目录下最新一份恢复
bash <(curl -sL https://raw.githubusercontent.com/meimolihan/fan-md/main/scripts/fan-md_recover.sh)
# 指定备份目录,或指定具体文件
bash <(curl -sL https://raw.githubusercontent.com/meimolihan/fan-md/main/scripts/fan-md_recover.sh) /vol1/1000/backup/fan-md
bash <(curl -sL https://raw.githubusercontent.com/meimolihan/fan-md/main/scripts/fan-md_recover.sh) --file FanMD-2026-09-15_10-00-00.tar.gz
还原会停止容器后将备份解压至数据目录(覆盖同名文件);离线模式(未检测到容器)会要求手动确认。 提示:还原后容器内仍缓存旧页面,建议重启容器
docker restart fan-md。
脚本命令
| 命令 | 说明 |
|---|---|
bash scripts/fan-md_backup.sh [目录] [保留份数] [--mode ...] [--data ...] [--container ...] |
备份数据目录为 tar.gz |
bash scripts/fan-md_recover.sh [目录] [--mode ...] [--data ...] [--file ...] |
从备份恢复(默认最新一份) |
./scripts/build-and-push.sh vX.Y.Z --yes -m "说明" |
一键发布(更新版本号+打tag+推送,CI 自动构建) |
./build.sh |
本地编译(npm 构建前端 + go build) |
日常管理命令
| 操作 | 命令 |
|---|---|
| 启动 | docker start fan-md |
| 关闭 | docker stop fan-md |
| 重启 | docker restart fan-md |
| 状态 | docker ps -a --filter name=^/fan-md$ |
| 查看实时日志 | docker logs -f fan-md |
| 查看最近 100 行日志 | docker logs -n 100 fan-md |
| 端口映射 | docker port fan-md |
| 容器开机自启 | docker update --restart always fan-md |
| 端口放行 | iptables -I INPUT -p tcp --dport 9900 -j ACCEPT |
数据目录说明
- 默认数据目录:
./data(Compose 部署为 /vol1/1000/compose/fan-md/data)md.db:SQLite 数据库(用户/文档数据)resource/:图片文件与缩略图
- 容器内路径:
/fan-md/data - 命令行参数覆盖:
-p 9900 -log /fan-md/logs -data /fan-md/data;Docker 环境变量同命令行参数去掉-前缀(如reg、pg_host) - 可选 PostgreSQL:填写
pg_host/pg_port/pg_user/pg_password/pg_db全部 5 个参数时使用 PostgreSQL,否则使用 SQLite - 首次登录:登录页点击注册创建账号(
reg=true允许注册),生产环境建议注册后关闭注册
相关命令
- fan-md 👈 当前所在位置
- fan-md_menu
- fan-md-build
- dc_inst_fan-md