BookStack Docker 安装手册
基于 LinuxServer.io 镜像,在 Docker 中快速搭建个人/团队知识库,并启用 TOTP 双因素认证(2FA)。 适用:Docker 20+ / Compose v2,x86-64 与 ARM64(树莓派、飞腾等)均可运行。
目录
- 一、简介与架构
- 二、环境准备
- 三、快速安装(docker compose)
- 四、首次登录与安全加固
- 五、启用双因素认证(2FA / TOTP)
- 六、反向代理 + HTTPS
- 七、SMTP 邮件配置
- 八、数据备份与迁移
- 九、常用维护命令
- 十、故障排查
- 附:完整 docker-compose.yml 一键文件
一、简介与架构
BookStack 是一个自托管的开源 Wiki / 文档平台(MIT 协议,基于 Laravel + PHP),组织方式为:
书架(Shelf) → 书(Book) → 章节(Chapter) → 页面(Page)
支持 Markdown、富文本、附件、全文搜索、角色权限、LDAP/SAML/OIDC 认证。
容器架构(本手册方案):
┌─────────────────────────────────────────┐
│ 宿主机 / 反向代理(Nginx/Caddy,可选) │
└──────────────┬──────────────────────────┘
│ :6875
┌──────────────┴──────────────┐ ┌──────────────────────┐
│ bookstack(应用容器) │───│ mariadb(数据库容器) │
│ lscr.io/linuxserver/ │ │ mariadb:10.11 │
│ bookstack:latest │ └──────────────────────┘
│ /config → 宿主机持久化 │
└─────────────────────────────┘
| 组件 | 说明 |
|---|---|
| 应用镜像 | lscr.io/linuxserver/bookstack(多架构,自动匹配 x86/ARM) |
| 数据库 | MariaDB 10.11(BookStack 官方支持 MySQL/MariaDB) |
| 持久化 | 应用 /config、数据库 /var/lib/mysql 均挂载宿主机目录 |
| 端口 | 容器内 80 → 宿主机 6875(可自定义) |
二、环境准备
# 确认 Docker 与 Compose 已安装
docker --version
docker compose version
# 创建专用目录
mkdir -p ~/bookstack && cd ~/bookstack
💡 时区建议设置为
Asia/Shanghai,见下文环境变量。 查看当前用户 UID/GID(用于 PUID/PGID):id $USER,一般为1000/1000。
三、快速安装(docker compose)
3.1 生成 APP_KEY(必做)
APP_KEY 是 Laravel 的应用加密密钥,首次启动前必须生成并填入,否则容器初始化会中断。它也用于加密 2FA 凭据,迁移/恢复时必须有它。
docker run -it --rm \
--entrypoint /bin/bash \
lscr.io/linuxserver/bookstack:latest \
appkey
输出形如 base64:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx,复制保留(包含 base64: 前缀)。
3.2 编写 docker-compose.yml
在 ~/bookstack/ 下创建 docker-compose.yml:
services:
bookstack:
image: lscr.io/linuxserver/bookstack:latest
container_name: bookstack
restart: unless-stopped
ports:
- "6875:80"
environment:
PUID: "1000"
PGID: "1000"
TZ: "Asia/Shanghai"
APP_URL: "http://localhost:6875" # 有域名/反代后改为 https://your.domain
APP_KEY: "base64:粘贴上面生成的密钥"
DB_HOST: bookstack-db
DB_PORT: "3306"
DB_DATABASE: bookstack
DB_USERNAME: bookstack
DB_PASSWORD: "改成强密码" # 需与 mariadb 中一致
# QUEUE_CONNECTION: database # 如需异步邮件/Webhook 取消注释
volumes:
- ./bookstack_data:/config
depends_on:
- bookstack-db
bookstack-db:
image: mariadb:10.11
container_name: bookstack-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "改成root强密码"
MYSQL_DATABASE: bookstack
MYSQL_USER: bookstack
MYSQL_PASSWORD: "改成强密码" # 与上方 DB_PASSWORD 完全一致
volumes:
- ./db_data:/var/lib/mysql
# 数据库无需对外暴露端口,仅供内网容器访问
# ports:
# - "3306:3306"
⚠️ 三个必须一致:
DB_PASSWORD=MYSQL_PASSWORD;DB_USERNAME=MYSQL_USER;DB_DATABASE=MYSQL_DATABASE。 ⚠️ 密码若含特殊字符,在 YAML 中务必加引号。
3.3 启动与初始化
cd ~/bookstack
docker compose up -d
# 查看日志,等待 "Application ready" 之类提示
docker compose logs -f bookstack
启动后访问 http://服务器IP:6875。
四、首次登录与安全加固
默认管理员账号(首次登录后立即修改):
邮箱:admin@admin.com
密码:password
登录后依次操作:
- 右上角头像 → Settings → Users,编辑 admin 用户,修改邮箱和密码。
- Settings → Features & Security:
- 关闭「允许公开注册」
Allow public registration(个人使用建议关闭)。 - 按需设置「默认角色」。
- 关闭「允许公开注册」
- Settings → General:设置应用名称、语言(中文在 Codeberg 有社区翻译,可在 Languages 中切换)。
🔒 生产环境务必通过反向代理配置 HTTPS,并将
APP_URL改为https://开头后重启。
五、启用双因素认证(2FA / TOTP)
BookStack v21.08 起原生支持双因素认证,无需额外插件 [citation:3]。支持两种机制 [citation:6][citation:9]:
| 方式 | 说明 |
|---|---|
| TOTP("Mobile App") | 使用 Google / Microsoft / Authy 等认证器 App 扫码,基于时间的一次性密码(SHA1,兼容性最佳) |
| Backup Codes(备份码) | 16 个一次性备用码,剩余 < 5 个时会提醒重新生成 |
5.1 为当前账户启用 2FA
- 右上角头像 → My Account → Security(或直接访问
/mfa)。 - 点击 Setup Multi-Factor Authentication。
- 选择 Mobile App(TOTP) → 用认证器 App 扫描二维码 → 输入 App 中生成的 6 位码 → Confirm and Enable。
- (可选)再启用 Backup Codes,将 16 个码安全保存(下载/离线存储),每个仅能用一次。
此后每次登录,输入账号密码后,还需输入动态验证码。
5.2 强制所有用户启用 2FA(按角色)
进入 Settings → Roles,编辑目标角色(如 Admin / Default),勾选:
☑ Requires Multi-Factor Authentication
- 已勾选角色的用户,下次登录时会被强制要求至少配置一种 2FA 方式 [citation:3][citation:6]。
- 适合个人/团队强制安全策略。
5.3 忘记 2FA / 迁移恢复
若丢失认证器,可在宿主机执行命令清除某用户的 MFA(需进入容器):
docker exec -it bookstack \
php /app/www/artisan bookstack:reset-mfa --email=admin@example.com
🔐 务必保管好 APP_KEY:2FA 密钥加密存储在数据库中,迁移/恢复实例时必须使用同一把 APP_KEY,否则无法解密 [citation:3]。
六、反向代理 + HTTPS
推荐用 Nginx Proxy Manager 或 Caddy 做反代 + 自动证书。以 Caddy 为例(Caddyfile):
wiki.yourdomain.com {
reverse_proxy localhost:6875
}
Nginx 关键配置:
location / {
proxy_pass http://localhost:6875;
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;
}
改完 APP_URL 后重启应用:
# 若 URL 已初始化,需同步数据库中的旧值
docker exec -it bookstack \
php /app/www/artisan bookstack:update-url "http://old-url" "https://new-url"
docker compose restart bookstack
七、SMTP 邮件配置
在 bookstack 服务的 environment 中追加(以 Gmail 为例):
MAIL_DRIVER: smtp
MAIL_HOST: smtp.gmail.com
MAIL_PORT: "587"
MAIL_ENCRYPTION: tls
MAIL_USERNAME: "your@gmail.com"
MAIL_PASSWORD: "应用专用密码"
MAIL_FROM: "bookstack@yourdomain.com"
MAIL_FROM_NAME: "BookStack"
修改后 docker compose up -d 重启生效。邮件用于注册验证、密码找回、导出通知等。
八、数据备份与迁移
BookStack 数据由两部分组成:数据库 + 上传文件(/config)。
8.1 应用内导出(简单)
BookStack 自带 Export / API,可在页面级导出为 HTML / PDF / Markdown。
8.2 文件系统级备份(完整)
cd ~/bookstack
# 1. 备份数据库(推荐先停写或锁表,个人使用可直接导)
docker exec bookstack-db \
mariadb-dump -u root -p"root密码" bookstack > bookstack_db_$(date +%F).sql
# 2. 备份上传文件与配置
tar czf bookstack_config_$(date +%F).tar.gz bookstack_data/
# 3. 记录当前 APP_KEY(.env 中的值)
8.3 迁移到新机器
- 新机用同一份
docker-compose.yml(尤其APP_KEY保持一致)启动。 - 恢复数据库:
docker exec -i bookstack-db mariadb -u root -p bookstack < backup.sql。 - 解压
bookstack_data/覆盖/config。 - 重启:
docker compose restart。
九、常用维护命令
# 启动 / 停止 / 重启
docker compose up -d
docker compose down # 停止(保留数据卷)
docker compose down -v # ⚠️ 连同数据卷删除,谨慎
docker compose restart bookstack
# 查看状态与日志
docker compose ps
docker compose logs -f bookstack
# 进入容器
docker compose exec bookstack bash
# 更新到新版本
docker compose pull
docker compose up -d
# 生成新 APP_KEY(仅首次/迁移用)
docker run -it --rm --entrypoint /bin/bash \
lscr.io/linuxserver/bookstack:latest appkey
# 修改 URL(迁移/换域名后)
docker exec -it bookstack \
php /app/www/artisan bookstack:update-url "旧URL" "新URL"
# 清除某用户 2FA
docker exec -it bookstack \
php /app/www/artisan bookstack:reset-mfa --email=user@example.com
十、故障排查
| 问题 | 可能原因 / 解决 |
|---|---|
| 启动后访问空白 / 重定向异常 | APP_URL 与实际访问地址不一致,检查协议+端口 [citation:2] |
提示 APP_KEY 缺失或启动中断 |
未生成密钥,按 3.1 生成并填入 [citation:5] |
| 数据库连接失败 | 密码/用户名不一致、数据库容器未就绪;检查 docker compose logs bookstack-db [citation:10] |
| 权限问题(无法写文件) | PUID/PGID 与宿主机目录属主不一致,执行 sudo chown -R 1000:1000 bookstack_data [citation:2] |
| 迁移后图片链接失效 | 绝对地址含旧域名,用 bookstack:update-url 更新,或批量替换数据库 |
| 忘记 admin 密码 | 进入数据库重置,或配置 SMTP 走「找回密码」 |
| 丢失 2FA 无法登录 | 用宿主机执行 bookstack:reset-mfa 清除(见 5.3) |
| 上传文件大小受限 | 调整 PHP upload_max_filesize / post_max_size(在 /config/www/.env 或反代配置) |
附:完整 docker-compose.yml 一键文件
可直接复制保存为 docker-compose.yml,仅需替换密码和 APP_KEY 即可使用:
services:
bookstack:
image: lscr.io/linuxserver/bookstack:latest
container_name: bookstack
restart: unless-stopped
ports:
- "6875:80"
environment:
PUID: "1000"
PGID: "1000"
TZ: "Asia/Shanghai"
APP_URL: "http://localhost:6875"
APP_KEY: "base64:你的密钥"
DB_HOST: bookstack-db
DB_PORT: "3306"
DB_DATABASE: bookstack
DB_USERNAME: bookstack
DB_PASSWORD: "你的强密码"
volumes:
- ./bookstack_data:/config
depends_on:
- bookstack-db
bookstack-db:
image: mariadb:10.11
container_name: bookstack-db
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: "root强密码"
MYSQL_DATABASE: bookstack
MYSQL_USER: bookstack
MYSQL_PASSWORD: "你的强密码"
volumes:
- ./db_data:/var/lib/mysql
启动:
mkdir -p ~/bookstack && cd ~/bookstack
# 放入上面文件,填好密钥和密码
docker compose up -d
安全清单(Checklist)
- 已修改默认 admin 邮箱和密码
- 已关闭公开注册
- 已启用 TOTP 2FA(关键账户 + 强制角色策略)
- 已保存 Backup Codes 与 APP_KEY
- 已配置 HTTPS 反向代理,
APP_URL为https:// - 已配置定期备份(数据库 +
/config) - 数据库端口未对外暴露
参考资源
- 官方文档:https://www.bookstackapp.com/docs/
- LinuxServer 镜像:https://github.com/linuxserver/docker-bookstack
- 镜像仓库:https://hub.docker.com/r/linuxserver/bookstack
- 安全说明:https://www.bookstackapp.com/docs/admin/security
适用版本:BookStack v26.x · LinuxServer 镜像 latest · MariaDB 10.11 · 更新于 2026-09-11
没有要显示的评论
没有要显示的评论