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

相关推荐
Serverless社区2 小时前
阿里云新发的AgentRun 有哪些“大招”,一文详解来了
运维·阿里云·云原生·serverless
倔强的石头1062 小时前
Linux 进程深度解析(二):进程状态、fork 创建与特殊进程(僵尸 与 孤儿)
linux·运维·服务器
Heavydrink2 小时前
华为云EulerOS 2.0安装docker详细教程
docker·容器·华为云
小李小李无与伦比2 小时前
使用Simiki,部署.md文档
linux·运维·服务器
网络小白不怕黑2 小时前
Docker容器网络:从容器互联到跨主机通信
网络·docker·容器
Rysxt_3 小时前
Docker Compose 启动与停止命令完全指南
docker·容器·docker compose
怀旧,3 小时前
【Linux系统编程】12. 基础IO(下)
linux·运维·服务器
网络小白不怕黑3 小时前
Docker Compose与私有仓库
运维·docker·容器
松涛和鸣3 小时前
29、Linux进程核心概念与编程实战:fork/getpid全解析
linux·运维·服务器·网络·数据结构·哈希算法