Atlantis
GitHub Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

3.1 bookstack

1. 前言

bookstack 是一个开源的文档管理系统,旨在帮助团队和个人轻松创建、组织和共享文档。它提供了一个直观的用户界面和丰富的功能,使用户可以方便地编写、编辑、组织和分享文档内容。

笔者主要将 bookstack 作为 confluence 的代替品,当作私人 wiki 使用。

官方链接:https://www.bookstackapp.com

2. 部署

bookstack 依赖 MySQL 数据库,默认使用本地存储保存图片、附件等文件。

首先在 MySQL 数据库中,创建一个 bookstack 账户,密码设置为 bookstack,使用的 SQL 语句如下:

create user 'bookstack'@'%' identified by 'bookstack';
create database bookstack;
GRANT ALL PRIVILEGES ON `bookstack`.* TO bookstack;
flush  privileges;

然后创建一个 statefulset 与 service,配置如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: bookstack
  namespace: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstack
  template:
    metadata:
      labels:
        app: bookstack
    spec:
      containers:
        - name: bookstack
          image: docker.io/linuxserver/bookstack:23.10.4
          env:
            - name: APP_URL
              value: "https://bookstack.app.wbuntu.com"
            - name: TZ
              value: "Asia/Shanghai"
            - name: DB_HOST
              value: "mysql.storage"
            - name: DB_PORT
              value: "3306"
            - name: DB_USER
              value: "bookstack"
            - name: DB_PASS
              value: "bookstack"
            - name: DB_DATABASE
              value: "bookstack"
            - name: STORAGE_TYPE
              value: "local"
          ports:
            - containerPort: 80
          volumeMounts:
            - name: data
              mountPath: /config
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 5Gi
---
apiVersion: v1
kind: Service
metadata:
  name: bookstack
  namespace: app
spec:
  type: ClusterIP
  selector:
    app: bookstack
  ports:
    - name: http
      port: 80
      targetPort: 80

上面的 yaml 中针对 bookstack 做了一些针对性设置:

  1. 使用 linuxserver 提供的镜像:docker.io/linuxserver/bookstack:23.10.4
  2. 配置了环境变量:
    1. APP_URL:博客链接
    2. TZ:时区
    3. DB_HOST:MySQL 数据库地址
    4. DB_PORT:MySQL 数据库端口
    5. DB_USER、DB_PASS、DB_DATABASE:连接 MySQL 时使用的用户名、密码、数据库名
    6. STORAGE_TYPE:存储类型,local 表示使用本地存储,博客中的图片、附件等将保存到本地持久化存储
  3. 挂载 statefulset 关联的存储卷 data 到容器内的 /config 路径

最后在公共 ingressroute 的 routes 中添加一个 rule 暴露 service:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRoute
metadata:
  name: ingressroute
  namespace: kube-system
spec:
  entryPoints:
  - websecure
  routes:
  ...
  - kind: Rule
    match: Host(`bookstack.app.wbuntu.com`)
    services:
    - name: bookstack
      namespace: app
      port: 80
  ...
  tls:
    secretName: tls-cert

然后配置DNS解析(或者修改本地 hosts)访问域名,可以看到 bookstack 的登录页面:

3. 使用

bookstack 的内容组织是按照图书馆的方式进行的,我们需要创建一个书架,然后在书架上存放图书,最后在图书中创建章节或者页面。

创建页面时可选使用 markdown 编辑器:

或者所见即所得编辑器(WYSIWYG):

笔者更偏向使用 WYSIWYG,它更方便进行图文混排,图片可以直接复制粘贴到当前的上下文中。