Docker部署Bookstack

BookStack是一个基于PHP和MariaDB的知识管理系统。它以"书架"模式组织知识,结构清晰,支持WYSIWYG和Markdown编辑,并具备全文搜索、权限管理等功能。文章详细指导了如何使用Docker Compose部署BookStack,包括数据库配置和Nginx反向代理。部署过程简单,资源消耗低,应用和MariaDB总内存占用约100MB,适合个人或企业内部知识管理。

1. 介绍

Bookstack如其名所示,书架。就像我们去图书馆,有社科类的书柜,有科技类的书柜,每个书柜摆满各种各样的书。Bookstack以"像书架一样组织知识"为核心理念,将内容结构设计为Shelves → Books → Chapters → Pages 的层次体系,因此能够依据逻辑顺序逐层构建知识结构,降低文档散乱的问题。它简洁易用,界面风格统一,学习曲线相对平缓,即使是非技术人员可以很容易就上手。

2. 技术栈和特点

BookStack 基于 PHP(Laravel 框架)构建,数据库使用MySQL/MariaDB,即标准的LAMP/LNMP架构。部署起来和Wordpress感觉很像。它具有支持角色与权限管理,多语言界面,全文搜索等特点。文档编辑器支持WYSIWYG和Markdown两种形式。除了常规的用户名密码验证外,还支持设置MFA。对于企业环境的部署,还支持OIDC,SAML2.0,LDAP等方式集成统一认证,从而更好地与现有基础设施融合。

不过,Bookstack的生态插件比较少,但对于个人或企业内部使用是足够了。而我是把它作为琐碎知识的集中管理的地方,内容涵括服务器,网络,编程,语言学习以及其他的技能。而最早我是使用Wordpress管理这一切的,但是现在我的博客只用于系统地记录技术上的内容。

3. 部署

最简单的方法还是使用容器进行部署,由于我的服务器上已经有一个单独的Nginx给所有的应用做反向代理,所以我直接将Bookstack部署在Nginx后面就好了。

3.1 准备工作

我使用了linuxserver的镜像,下载bookstack和mariadb。通过bookstack自带的功能来生成App Key。

bash 复制代码
docker pull lscr.io/linuxserver/bookstack:`latest`
docker pull lscr.io/linuxserver/mariadb:latest

docker run -it --rm --entrypoint /bin/bash lscr.io/linuxserver/bookstack:latest appkey
base64:xpAY8sV6hmZ/loCvfPZ1wRPLkd2f5lODPAL7aKtawPw=

新建了bookstack的Docker网络,nginx的Docker网络是原来就有的。

3.2 Docker Compose文件

  • 使用2个服务,分别为bookstack和mariadb
  • 设置时区使用APP_TIMEZONE
  • 数据卷都是映射到内部的/config文件夹
  • 只用expose来记录一下应用使用的端口
  • 敏感数据使用了环境变量
yaml 复制代码
services:
  bookstack:
    image: lscr.io/linuxserver/bookstack:latest
    container_name: bookstack
    environment:
      - PUID=1000
      - PGID=1000
      - APP_TIMEZONE=Asia/Shanghai
      - APP_URL=https://bookstack.example.com
      - APP_KEY=${APP_KEY}
      - DB_HOST=bookstack_db
      - DB_PORT=3306
      - DB_DATABASE=bookstack
      - DB_USERNAME=bookstack
      - DB_PASSWORD=${DB_PASSWORD}
    volumes:
      - ./bookstack_app_data:/config
    networks:
      - nginx
      - bookstack
    expose:
      - 80
    restart: unless-stopped

  mariadb:
    image: lscr.io/linuxserver/mariadb:latest
    container_name: bookstack_db
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Asia/Shanghai
      - MYSQL_ROOT_PASSWORD=${DB_ROOT_PASSWORD}
      - MYSQL_DATABASE=bookstack
      - MYSQL_USER=bookstack
      - MYSQL_PASSWORD=${DB_PASSWORD}
    volumes:
      - ./bookstack_db_data:/config
    networks:
      - bookstack
    expose:
      - 3306
    restart: unless-stopped

networks:
  nginx:
    external: true
  bookstack:
    external: true

3.3 环境变量

可以在Docker Compose文件所在的目录下新建一个env文件。如果是使用Portainer来部署stack,则可以直接设置环境变量。文件内容如下:

plain 复制代码
APP_KEY=base64:xpAY8sV6hmZ/loCvfPZ1wRPLkd2f5lODPAL7aKtawPw=
DB_PASSWORD=BOOKSTACK_DB_PASSWORD
DB_ROOT_PASSWORD=MYSQL_ROOT_PASSWORD

3.4 Nginx配置文件

其实就可以将服务都跑起来了,只不过是没有反向代理,无法访问服务而已。这时再配置Nginx的配置文件,确认没问题了,再重启Nginx的服务,然后就可以访问bookstack了。

bash 复制代码
server {
    listen 443 ssl;
    server_name bookstack.example.com;

    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;

    # SSL/TLS Security Settings
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers HIGH:!aNULL:!MD5;

    # Enable HSTS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    location / {
        proxy_pass http://bookstack:80;
        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;

	client_max_body_size 50M; 
    }
}

4. 使用教程

4.1 设置管理员账号

其实在Docker Compose文件里并没有指定bookstack的admin用户和密码。它默认账号是admin@admin.com,默认密码是password

登录进来之后,赶紧改密码。点击自己的账号,选择My Account。

左侧选择Profile Details,可以更改自己的显示名,邮箱地址和头像。

选择Access & Security可以更改密码,并设置MFA。我是使用了谷歌的Authenticator设置了MFA。

4.2 应用设置

在应用设置里,可以设置是否是公开的站点,默认是否,还有应用的名称以及图标等。此外还可以进行用户和角色方面的设置。

4.3 文档相关

可以创建书架和书,在每本书里可以再创建章节和页面。应用还有一个全文搜索的搜索栏。

5. 资源利用率

新建的bookstack,整体消耗了大概100M的内存,其中应用消耗了70M左右的内存,Mariadb消耗了30M左右的内存。两者的CPU使用率都非常低。

📚 延伸阅读

更多内容持续更新于我的博客:https://www.zenseek.site

相关推荐
蝎子莱莱爱打怪1 天前
GitLab CI/CD + Docker Registry + K8s 部署完整实战指南
后端·docker·kubernetes
碳基沙盒1 天前
OpenClaw 多 Agent 配置实战指南
运维
小p2 天前
docker学习7:docker 容器的通信方式
docker
小p2 天前
docker学习5:提升Dockerfile水平的5个技巧
docker
小p2 天前
docker学习3:docker是怎么实现的?
docker
小p4 天前
docker学习: 2. 构建镜像Dockerfile
docker
小p4 天前
docker学习: 1. docker基本使用
docker
蝎子莱莱爱打怪4 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀4 天前
Docker部署Nacos
docker·容器
缓解AI焦虑4 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器