
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