1. 项目概述与核心价值

最近在整理个人知识库,发现零散的笔记和文档越来越难管理,想找一个既能私有化部署、界面又足够优雅、操作还足够简单的文档系统。找了一圈,最终锁定了BookStack。它不像Confluence那么重,也不像Wiki.js那样需要较多配置,开箱即用的体验非常友好。最关键的是,它原生支持Docker部署,这对于我们这些习惯用容器来管理服务的人来说,简直是福音。今天,我就来详细拆解一下如何用Docker一步到位地部署BookStack,并分享一些在部署、配置和使用过程中积累的实战经验,帮你避开我踩过的那些坑。

简单来说,BookStack是一个基于PHP Laravel框架开发的开源、自托管的文档管理和知识库平台。它的核心价值在于,将复杂的知识结构化变得异常简单。你可以把它理解为一个“书架”,书架上有“书架”(Shelf)、“书”(Book)、“章节”(Chapter)和“页面”(Page)四个层级,这种结构非常符合人类组织知识的直觉。无论是团队的项目文档、个人的学习笔记,还是家庭的生活指南,都能很好地容纳进去。通过Docker部署,我们能够将BookStack及其依赖的数据库、缓存等服务打包成一个独立、可移植的运行环境,实现快速部署、版本管理和隔离运行,极大地简化了运维复杂度。

2. 部署环境准备与核心思路

在开始动手之前,我们需要明确整个部署的架构和思路。一个典型的BookStack Docker部署,至少包含两个核心容器:一个是运行BookStack应用本身的容器,另一个是作为其后端数据存储的MySQL数据库容器。虽然BookStack也支持SQLite,但对于正式使用,尤其是可能有团队协作的场景,MySQL是更可靠的选择。我们的目标是通过Docker Compose工具,用一份配置文件( docker-compose.yml )来定义和启动这整个服务栈。

这种做法的好处显而易见。首先,它实现了“基础设施即代码”,你的服务器环境、应用配置都被记录在YAML文件里,可以版本控制,可以一键重建。其次,它彻底解决了“在我机器上能跑”的经典问题,因为运行环境是严格一致的。最后,管理和维护变得极其方便,启动、停止、更新、备份都可以通过几条简单的Docker命令完成。

2.1 服务器环境检查

虽然Docker提供了很好的环境隔离,但宿主机(也就是你的服务器)的基础环境仍然需要满足最低要求。这里我以最常用的Ubuntu 20.04/22.04 LTS系统为例。

首先,我们需要确保服务器有足够的资源。对于个人或小团队使用,建议配置至少1核CPU、2GB内存和20GB的磁盘空间。可以通过以下命令快速查看:

# 查看CPU和内存
free -h
lscpu | grep -E “(Model name|CPU\(s\))”

# 查看磁盘空间
df -h

其次,也是最重要的一步,是检查系统是否支持虚拟化,这是Docker Desktop on Windows/Mac的常见问题,但在Linux服务器上,我们通常直接安装Docker Engine。不过,如果是在个人电脑的虚拟机里操作,或者某些云服务器可能关闭了虚拟化支持,也需要确认。对于Linux,我们主要关注内核版本和是否启用了必要的内核模块。

# 检查内核版本,建议3.10以上
uname -r

# 检查是否支持并已启用OverlayFS存储驱动(Docker常用)
lsmod | grep overlay

如果 lsmod 没有输出,可能需要手动加载 overlay 模块: sudo modprobe overlay 。绝大多数现代Linux发行版都已经默认包含并启用了这些。

2.2 Docker与Docker Compose安装

如果你的服务器还没有安装Docker,那么这是第一步。我强烈建议使用官方提供的安装脚本,它能够自动识别你的系统版本并安装合适的包。

# 1. 卸载旧版本(如果是全新系统可跳过)
sudo apt-get remove docker docker-engine docker.io containerd runc

# 2. 更新apt包索引并安装依赖
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg lsb-release

# 3. 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gosu tee /etc/apt/keyrings/docker.asc > /dev/null

# 4. 设置稳定版仓库
echo \
  “deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable” | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 5. 安装Docker Engine
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

安装完成后,运行 sudo docker run hello-world 来验证安装是否成功。你会看到一段欢迎信息。

注意 :上述命令中的 gosu 是一个用于以特定用户身份运行命令的工具,如果系统没有,可以先安装 sudo apt-get install gosu ,或者直接用 sudo tee 替代。另外,将非root用户加入docker组( sudo usermod -aG docker $USER )可以让你后续不用每次都加 sudo 来运行docker命令,但出于安全考虑,生产环境请谨慎使用。

接下来是Docker Compose。在较新的Docker安装中, docker-compose-plugin 已经包含了Compose V2,我们可以直接使用 docker compose 命令(注意中间没有横线)。如果你习惯用独立的 docker-compose (V1),也可以单独安装,但官方已推荐使用V2。

验证安装: docker compose version ,应该能看到版本号输出。

3. 核心配置解析与Docker Compose文件编写

这是整个部署的核心环节。我们将创建一个 docker-compose.yml 文件,它定义了BookStack应用和MySQL数据库的服务。我建议在服务器上创建一个专属目录,比如 ~/bookstack ,所有相关文件都放在这里。

3.1 编写docker-compose.yml

~/bookstack 目录下,创建 docker-compose.yml 文件,内容如下。我会逐段解释关键配置项。

version: ‘3.8’

services:
  bookstack_db:
    image: mysql:8.0
    container_name: bookstack_mysql
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASS:-aVeryStrongRootPassword!}
      MYSQL_DATABASE: ${DB_DATABASE:-bookstack}
      MYSQL_USER: ${DB_USER:-bookstack}
      MYSQL_PASSWORD: ${DB_PASS:-aVeryStrongPassword!}
    volumes:
      - bookstack_db_data:/var/lib/mysql
      - ./mysql-config:/etc/mysql/conf.d:ro
    command: [‘--default-authentication-plugin=mysql_native_password’, ‘--character-set-server=utf8mb4’, ‘--collation-server=utf8mb4_unicode_ci’]
    networks:
      - bookstack_net

  bookstack_app:
    image: ghcr.io/linuxserver/bookstack:latest
    container_name: bookstack_app
    restart: unless-stopped
    depends_on:
      - bookstack_db
    environment:
      - DB_HOST=bookstack_db
      - DB_PORT=3306
      - DB_DATABASE=${DB_DATABASE:-bookstack}
      - DB_USERNAME=${DB_USER:-bookstack}
      - DB_PASSWORD=${DB_PASS:-aVeryStrongPassword!}
      - APP_URL=${APP_URL:-http://localhost:6875}
    volumes:
      - bookstack_app_data:/config
      - ./uploads:/config/www/public/uploads
      - ./storage-uploads:/config/www/public/storage
    ports:
      - “${HOST_PORT:-6875}:80”
    networks:
      - bookstack_net

volumes:
  bookstack_db_data:
  bookstack_app_data:

networks:
  bookstack_net:
    driver: bridge

逐项解析与避坑指南:

  1. 版本与服务定义 version: ‘3.8’ 指定了Compose文件的语法版本。我们在 services 下定义了两个服务: bookstack_db (数据库)和 bookstack_app (应用)。

  2. 数据库服务 ( bookstack_db )

    • 镜像 :使用官方 mysql:8.0 镜像,稳定且兼容性好。注意,BookStack官方推荐使用MySQL 5.7+或MariaDB 10.2+。
    • 环境变量 :这里我使用了Shell环境变量 ${VAR:-default} 的语法。它的意思是,如果系统环境变量 DB_ROOT_PASS 存在,就用它的值,否则用后面的默认值。 这是安全最佳实践! 千万不要把真实的密码明文写在文件里。我们稍后会创建一个 .env 文件来管理这些敏感信息。 MYSQL_DATABASE MYSQL_USER MYSQL_PASSWORD 是创建初始数据库和用户的。
    • 数据卷 bookstack_db_data 是一个Docker管理的命名卷,用于持久化MySQL的所有数据,即使容器删除,数据也不会丢失。 ./mysql-config:/etc/mysql/conf.d:ro 是将宿主机当前目录下的 mysql-config 文件夹挂载到容器的MySQL配置目录, ro 表示只读。你可以在这里放一个 my.cnf 文件来自定义MySQL配置(比如调整缓冲区大小)。
    • 命令 command 项覆盖了容器的启动命令。这里设置了三个关键参数:
      • --default-authentication-plugin=mysql_native_password 非常重要! 早期一些PHP MySQL驱动可能无法兼容MySQL 8默认的 caching_sha2_password 认证插件,强制使用 mysql_native_password 可以避免连接问题。
      • --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci :将数据库的默认字符集设置为 utf8mb4 ,这是真正的UTF-8编码,支持存储emoji等所有Unicode字符,避免未来出现乱码问题。
  3. 应用服务 ( bookstack_app )

    • 镜像 :这里使用了 linuxserver/bookstack 镜像。LinuxServer.io维护的镜像质量很高,通常整合了最佳实践,并且更新及时。你也可以使用官方镜像 solidnerd/bookstack
    • 依赖 depends_on 确保数据库容器先启动,再启动应用容器。
    • 环境变量 :这里的环境变量是给BookStack应用读取的。 DB_HOST 直接写服务名 bookstack_db ,因为在Docker Compose创建的网络里,容器可以通过服务名互相访问。 APP_URL 需要设置为你最终访问BookStack的完整URL(包括协议和端口),这对生成正确的链接至关重要。
    • 数据卷
      • bookstack_app_data:/config :持久化BookStack的配置、缓存等数据。
      • ./uploads:/config/www/public/uploads :将用户上传的图片、附件等映射到宿主机当前目录的 uploads 文件夹,方便直接管理和备份。
      • ./storage-uploads:/config/www/public/storage :映射Laravel框架生成的文件存储链接。
    • 端口映射 ${HOST_PORT:-6875}:80 将容器内的80端口映射到宿主机的 HOST_PORT 环境变量指定的端口,如果未设置则默认为6875。
  4. 网络与卷 :我们创建了一个名为 bookstack_net 的桥接网络,让两个容器在隔离的网络中通信。数据卷 bookstack_db_data bookstack_app_data volumes 部分声明,由Docker管理。

3.2 创建环境变量配置文件

为了安全和管理方便,我们在 docker-compose.yml 同级目录下创建一个名为 .env 的文件。这个文件不会被提交到版本库(记得加入 .gitignore )。

# BookStack 环境配置
APP_URL=http://your-server-ip-or-domain:6875

# 数据库配置
DB_ROOT_PASS=YourSuperStrongRootPassword123!
DB_DATABASE=bookstack
DB_USER=bookstack
DB_PASS=YourSuperStrongBookstackUserPassword456!

# 宿主机映射端口
HOST_PORT=6875

请务必将 your-server-ip-or-domain 替换成你服务器的实际IP地址或域名。如果只是本地测试,可以用 http://localhost:6875 。密码请务必修改为高强度密码。

4. 启动服务与初始化配置

配置完成后,启动服务就非常简单了。

4.1 启动与查看日志

docker-compose.yml .env 所在的目录下,执行:

# 启动服务(在后台运行)
docker compose up -d

# 查看服务状态
docker compose ps

# 实时查看所有容器的日志
docker compose logs -f

# 仅查看bookstack_app容器的日志
docker compose logs -f bookstack_app

使用 -d 参数让服务在后台运行。第一次启动时,Docker会拉取镜像,这可能需要几分钟时间,取决于你的网络速度。启动完成后,使用 docker compose ps 应该能看到两个容器的状态都是 Up

通过 logs -f 命令观察日志非常重要,特别是首次启动。你应该能看到MySQL初始化完成,以及BookStack应用启动成功的消息。如果出现错误(比如数据库连接失败),日志会明确显示。

4.2 访问与初始化安装

在日志没有报错后,打开浏览器,访问你在 .env 文件中设置的 APP_URL (例如 http://your-server-ip:6875 )。

首次访问,你会看到BookStack的安装引导页面。令人欣喜的是,由于我们在Docker Compose中已经配置好了所有数据库连接信息,这个安装过程被极大地简化了。

  1. 检查环境 :页面会自动检查PHP扩展、文件权限等。使用LinuxServer的镜像,这些通常都已经配置妥当,你应该会看到一连串的绿色对勾。
  2. 数据库配置 :安装程序会自动读取容器内的环境变量,所以数据库主机、端口、名称、用户名、密码这些字段应该已经是填好的(主机名是 bookstack_db )。你只需要点击“检查数据库连接”按钮,确认连接成功即可。
  3. 设置管理员账户 :接下来是设置第一个管理员用户的姓名、邮箱和密码。 这个账户是你在BookStack里登录和管理的超级管理员,务必牢记!
  4. 完成安装 :点击“完成安装”,如果一切顺利,几秒钟后你就会跳转到BookStack的登录页面。用刚才设置的管理员邮箱和密码登录,就可以开始使用了。

实操心得 :有时候点击“检查数据库连接”可能会失败,提示“SQLSTATE[HY000] [2054]”。这通常不是因为密码错误,而是MySQL 8的默认认证插件问题。这正是为什么我们在 docker-compose.yml 的数据库服务中强制指定了 --default-authentication-plugin=mysql_native_password 。如果遇到此问题,请确认数据库容器是否以此参数启动,并重启数据库容器 docker compose restart bookstack_db ,然后再重试。

5. 进阶配置与运维管理

基础部署完成后,为了更贴合生产环境使用,我们还需要进行一些进阶配置。

5.1 配置反向代理与HTTPS(可选但推荐)

直接通过IP和端口访问既不安全也不美观。通常我们会使用Nginx或Caddy作为反向代理,并配置HTTPS。

这里以Nginx为例,假设你有一个域名 docs.yourcompany.com 指向了服务器。

在服务器的Nginx配置目录(如 /etc/nginx/conf.d/ )下创建一个新配置文件,例如 bookstack.conf

server {
    listen 80;
    server_name docs.yourcompany.com;
    # 将HTTP请求重定向到HTTPS
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl http2;
    server_name docs.yourcompany.com;

    # SSL证书路径,可以使用Let‘s Encrypt免费证书
    ssl_certificate /etc/letsencrypt/live/docs.yourcompany.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/docs.yourcompany.com/privkey.pem;

    # 其他SSL优化配置...
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
    ssl_prefer_server_ciphers off;

    # 增大上传文件大小限制,默认1M可能不够
    client_max_body_size 100M;

    location / {
        # 将请求转发给Docker容器内的BookStack
        proxy_pass http://127.0.0.1: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;
        # 设置WebSocket支持(如果BookStack有实时功能可能需要)
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection “upgrade”;
    }

    # 静态文件缓存
    location ~* \.(jpg|jpeg|png|gif|ico|css|js|svg)$ {
        proxy_pass http://127.0.0.1:6875;
        proxy_set_header Host $host;
        expires 30d;
        add_header Cache-Control “public, immutable”;
    }
}

配置完成后,运行 sudo nginx -t 测试配置无误,然后 sudo systemctl reload nginx 重载配置。

同时,别忘了更新 .env 文件中的 APP_URL ,将其改为 https://docs.yourcompany.com ,并重启BookStack应用容器以使新配置生效: docker compose restart bookstack_app

5.2 数据备份与恢复

定期备份是运维的黄金法则。BookStack的数据主要在两处:数据库和上传的文件。

数据库备份: 我们可以使用 docker exec 命令执行 mysqldump

# 在宿主机上创建一个备份脚本,比如 ~/bookstack/backup_db.sh
#!/bin/bash
BACKUP_DIR=“/path/to/your/backup/folder”
DATE=$(date +%Y%m%d_%H%M%S)
docker exec bookstack_mysql mysqldump -u bookstack -pYourSuperStrongBookstackUserPassword456! bookstack > “${BACKUP_DIR}/bookstack_db_${DATE}.sql”
# 压缩备份文件
gzip “${BACKUP_DIR}/bookstack_db_${DATE}.sql”
# 删除7天前的备份
find “${BACKUP_DIR}” -name “bookstack_db_*.sql.gz” -mtime +7 -delete

给脚本执行权限 chmod +x backup_db.sh ,然后通过cron定时任务执行,例如每天凌晨2点备份: 0 2 * * * /path/to/backup_db.sh

上传文件备份: 上传的文件位于我们挂载的 ./uploads ./storage-uploads 目录。直接备份这两个文件夹即可。

# 备份文件脚本片段
tar -czf “${BACKUP_DIR}/bookstack_files_${DATE}.tar.gz” ./uploads ./storage-uploads

恢复数据:

  • 数据库恢复 cat backup.sql | docker exec -i bookstack_mysql mysql -u bookstack -p bookstack
  • 文件恢复 :解压备份的tar.gz文件,覆盖当前的 uploads storage-uploads 目录即可。

重要提示 :恢复前,请务必停止BookStack应用容器,恢复完成后再启动,以避免数据不一致。 docker compose stop bookstack_app

5.3 版本更新与日常维护

BookStack和Docker镜像会持续更新。更新步骤非常简洁:

# 1. 进入项目目录
cd ~/bookstack

# 2. 拉取最新的镜像
docker compose pull

# 3. 重新创建并启动容器(会使用新镜像)
docker compose up -d

# 4. 查看更新日志,确认无异常
docker compose logs -f bookstack_app

Docker Compose的 up -d 命令会检测到镜像已更新,并自动用新镜像重建容器。由于数据都保存在卷(volumes)和宿主机挂载的目录中,所以更新过程数据是安全的。

日常维护中,可以定期查看容器资源使用情况: docker stats 。清理无用的Docker镜像和容器以释放空间: docker system prune -a (谨慎使用,会删除所有未使用的镜像、容器、网络和卷)。

6. 常见问题与故障排查实录

在实际部署和运行中,你可能会遇到一些问题。这里我记录了几个最常见的情况和解决方法。

6.1 容器启动失败:端口冲突

问题描述 :执行 docker compose up -d 后, docker compose ps 显示某个容器状态为 Exit Restarting 。查看日志 docker compose logs bookstack_app 发现类似 bind: address already in use 的错误。

原因分析 :宿主机上映射的端口(默认为6875)已经被其他进程占用。

解决方案

  1. 修改 .env 文件中的 HOST_PORT 变量,换一个未被占用的端口,比如 6876
  2. 或者,找出占用6875端口的进程并停止它: sudo lsof -i :6875 ,然后根据PID使用 kill 命令。
  3. 重启服务: docker compose up -d

6.2 安装页面数据库连接失败

问题描述 :在BookStack安装页面,点击“检查数据库连接”后,提示连接失败,错误信息可能涉及“认证插件”或“拒绝连接”。

排查步骤

  1. 确认数据库容器是否正常运行 docker compose ps ,确保 bookstack_mysql 状态为 Up
  2. 检查数据库容器日志 docker compose logs bookstack_db ,查看MySQL初始化过程中是否有错误。
  3. 进入数据库容器测试连接
    # 进入数据库容器
    docker exec -it bookstack_mysql bash
    # 在容器内登录MySQL
    mysql -u bookstack -p
    # 输入在.env文件中设置的DB_PASS密码
    
    如果能成功登录,说明数据库服务本身和用户密码是正确的。
  4. 检查认证插件(针对MySQL 8) :在MySQL命令行中执行:
    USE mysql;
    SELECT user, host, plugin FROM user WHERE user=‘bookstack’;
    
    如果 plugin 列显示的是 caching_sha2_password ,而BookStack的PHP环境不支持,就会失败。确保 docker-compose.yml 中数据库的启动命令包含了 --default-authentication-plugin=mysql_native_password 。如果已经包含但问题依旧,可能需要重新创建用户:
    ALTER USER ‘bookstack’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘YourSuperStrongBookstackUserPassword456!’;
    FLUSH PRIVILEGES;
    
  5. 检查网络 :确保两个容器在同一个Docker网络 bookstack_net 中。 docker network inspect bookstack_bookstack_net (网络名通常是 项目名_网络名 )。

6.3 上传文件大小限制

问题描述 :上传较大图片或附件时失败。

原因分析 :这通常受到三方面限制:PHP配置、Web服务器(Nginx/Apache)配置和BookStack自身设置。

解决方案

  1. PHP配置(在Docker容器内) :我们需要修改BookStack容器内的PHP配置文件。可以通过挂载自定义配置文件或进入容器修改。
    • 在宿主机 ~/bookstack 目录下创建 php-overrides.ini 文件,内容如下:
      upload_max_filesize = 100M
      post_max_size = 100M
      memory_limit = 256M
      max_execution_time = 300
      
    • 修改 docker-compose.yml bookstack_app 服务的volumes部分,增加一行挂载:
      volumes:
        ...
        - ./php-overrides.ini:/etc/php82/conf.d/99-overrides.ini:ro # 注意镜像内PHP版本路径可能不同,linuxserver/bookstack 基于Alpine,PHP路径可能是/etc/php8/conf.d/
      
    • 重启应用容器: docker compose restart bookstack_app
  2. Web服务器配置 :如果你使用了Nginx反向代理,需要在Nginx配置中增加 client_max_body_size 100M; ,如前面进阶配置所示。
  3. BookStack自身 :BookStack应用层一般没有硬性限制,主要受前述两层制约。

6.4 邮件发送配置

问题描述 :用户注册、密码找回等功能需要发送邮件,但默认未配置。

解决方案 :通过环境变量配置SMTP。在 .env 文件中添加以下变量(以Gmail为例,其他服务商类似):

# 邮件配置
MAIL_DRIVER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your-email@gmail.com
MAIL_PASSWORD=your-app-specific-password # 注意:不要用普通密码,用应用专用密码
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your-email@gmail.com
MAIL_FROM_NAME=“BookStack”

然后,在 docker-compose.yml bookstack_app 服务的 environment 部分,将这些变量传递进去:

environment:
  - DB_HOST=bookstack_db
  # ... 其他DB变量
  - MAIL_DRIVER=${MAIL_DRIVER}
  - MAIL_HOST=${MAIL_HOST}
  - MAIL_PORT=${MAIL_PORT}
  - MAIL_USERNAME=${MAIL_USERNAME}
  - MAIL_PASSWORD=${MAIL_PASSWORD}
  - MAIL_ENCRYPTION=${MAIL_ENCRYPTION}
  - MAIL_FROM_ADDRESS=${MAIL_FROM_ADDRESS}
  - MAIL_FROM_NAME=${MAIL_FROM_NAME}

修改后,运行 docker compose up -d 重启服务。你可以在BookStack的管理员设置->“邮件配置”中测试发送。

6.5 性能优化与调试

问题描述 :随着文档增多,页面加载变慢。

优化建议

  1. 配置OPCache :PHP的OPCache能极大提升性能。同样通过挂载 php-overrides.ini 文件来启用和配置。
    opcache.enable=1
    opcache.memory_consumption=128
    opcache.interned_strings_buffer=8
    opcache.max_accelerated_files=10000
    opcache.revalidate_freq=2
    opcache.fast_shutdown=1
    
  2. 调整MySQL配置 :通过挂载自定义 my.cnf 到数据库容器的 /etc/mysql/conf.d 目录,根据服务器内存调整 innodb_buffer_pool_size 等参数。
  3. 启用缓存 :BookStack支持Redis或Memcached作为缓存驱动。这需要在 docker-compose.yml 中增加一个缓存服务(如Redis),并在BookStack环境变量中配置 CACHE_DRIVER=redis REDIS_HOST 等。
  4. 定期清理日志 :容器日志可能占用大量磁盘空间。可以配置Docker日志轮转,或在 docker-compose.yml 中为服务设置日志选项:
    logging:
      driver: “json-file”
      options:
        max-size: “10m”
        max-file: “3”
    

经过以上步骤,一个高可用、易维护的BookStack知识库系统就已经在Docker上稳稳地跑起来了。从环境准备、配置解析到故障排查,这套流程覆盖了从零到生产级部署的主要环节。最关键的是,所有配置都代码化了,下次换服务器,你只需要拷贝 docker-compose.yml .env 和几个挂载目录,一条 docker compose up -d 命令就能让整个服务满血复活。这种可复现、可迁移的部署方式,正是Docker和容器化技术带来的核心红利。在实际使用中,多利用BookStack的权限系统来管理团队协作,定期执行备份脚本,你的知识库就能成为一个稳定可靠的数字资产。

更多推荐