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

相关推荐
闲云自留地5 小时前
K8s 的记忆大脑!ETCD 集群部署、etcdctl 命令与备份恢复全通关
容器·kubernetes·etcd
讯捷蓝达5 小时前
戴尔R720xd服务器卡死在 “Configuring Memory...Done“,换了内存还是卡?问题根本不在内存
运维·服务器
爱和冰阔落7 小时前
【Linux网络】TCP 服务器如何并发处理多个客户端?从 fork、僵尸进程到双重 fork
linux·运维·服务器·网络
lisanmengmeng8 小时前
alertmanger 标签 rules 打上分组标签
linux·运维·服务器
Android系统攻城狮9 小时前
Linux FFmpeg深度解析之av_write_frame调用流程与实战(三十三)
linux·运维·服务器·ffmpeg·音视频进阶·ffmpeg音视频
上火的金鱼妹9 小时前
k8s生产实际问题排查(网关,数据库读写等)
运维·服务器
孙克旭_9 小时前
k8s基础组件与创建资源
运维·docker·容器·kubernetes
孙克旭_9 小时前
云原生基础之Containerd容器运行时
运维·云原生
分布式存储与RustFS9 小时前
RustFS 自建对象存储实战目录:110 篇按场景分类(持续更新)
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
无忧_wy9 小时前
MoneyPrinterTurbo 自动化视频生成实战指南
运维·人工智能·自动化·音视频