一个非常棒的Wiki程序:BookStack

BookStack是一个简单且免费的开源Wiki平台,你可以非常轻松的使用它来构建自己的知识库,由于功能非常丰富,用它来搭建自己的个人博客也是没问题的。

本文使用Docker安装并配置Nginx反向代理。本来还是想用Traefik的,后来想了想很多人都是机器外面装一个Nginx然后还跑着其他的服务,这要一用Traefik那端口又冲突了。。

安装docker和docker-compose

apt -y update
apt -y install curl
curl -sSL https://get.docker.com/ | sh
systemctl start docker
systemctl enable docker
curl -L https://github.com/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

安装nginx和certbot:

apt -y install nginx python-certbot-nginx

新建一个目录:

mkdir -p /opt/bookstack && cd /opt/bookstack

新建一个docker-compose:

nano docker-compose.yml

写入如下配置:

version: '3.5'

services: 
    bookstack:
        image: linuxserver/bookstack
        container_name: bookstack
        depends_on: 
            - bookstack-db
        environment: 
            - PUID=1000
            - PGID=1000
            - DB_HOST=bookstack-db
            - DB_USER=imlala
            - DB_PASS=password
            - DB_DATABASE=bookstack
            - APP_URL=https://wiki.imlala.best # 配置反向代理这里要指定你的域名,如果使用ssl记得加上https
        ports: 
            - 54321:80
        volumes: 
            - ./data:/config
        restart: unless-stopped

    bookstack-db:
        image: mariadb
        container_name: bookstack-db
        environment: 
            - MYSQL_ROOT_PASSWORD=password
            - MYSQL_DATABASE=bookstack
            - MYSQL_USER=imlala
            - MYSQL_PASSWORD=password
        volumes: 
            - ./db:/var/lib/mysql
        restart: unless-stopped

启动:

docker-compose up -d

新建一个nginx配置文件:

nano /etc/nginx/conf.d/bookstack.conf

写入如下内容:

server {
    listen       80;
    server_name  wiki.imlala.best; # 换成你的域名
    client_max_body_size 0;

    error_log /var/log/nginx/bookstack.error.log;
    access_log /var/log/nginx/bookstack.access.log;

    location / {
        proxy_pass              http://127.0.0.1:54321;
        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;
    }
}

签一个ssl证书:

certbot --nginx --agree-tos --no-eff-email --email xxxxx@qq.com

访问你的域名能看到登录界面说明一切正常:

注:默认的管理员账号:admin@admin.com 密码:password 首次登录进去,你应该立即修改密码。

这个容器默认的php配置不是很适合生产环境,写Wiki一般会上传很多大文件或者图片,稍微优化一下:

echo "memory_limit = -1" >> /opt/bookstack/data/php/php-local.ini
echo "post_max_size = 100M" >> /opt/bookstack/data/php/php-local.ini
echo "upload_max_filesize = 100M" >> /opt/bookstack/data/php/php-local.ini
echo "max_execution_time = 300" >> /opt/bookstack/data/php/php-local.ini

修改这些php设置后需要重启容器使其生效:

docker-compose restart bookstack

这里就不介绍BookStack的使用方法了,使用起来的话上手很快,BookStack的结构就和一本普通的图书一样,就好像你要出一本书的步骤是:

  1. 给书起一个名字
  2. 新建章节
  3. 新建页面
  4. 发布

就这么简单,而且BookStack还有一个书架的功能,如果你的图书很多,那么可以用书架进行分类。

额外补充一点后续维护的问题。

如果你之前没有配置反代直接用IP+PORT这种方式使用的话,现在想使用反向代理的话需要把数据库内的域名给替换过来。

比如我之前没有配置反代直接用209.151.156.157:54321访问,在里面新建了图书并且上传了附件和图片,这些附件和图片的URL不会自动更换,执行下面的命令更换成新的域名:

docker exec -it bookstack /bin/sh
cd /var/www/html/
php artisan bookstack:update-url http://IPHost:54321 https://wiki.imlala.best
exit

同样的如果后续你的站点需要更换域名也可以使用这个方法。

再补充一点使用过程中遇到的小问题:导出PDF中文乱码。

这个容器内已经装好了wkhtmltopdf,只是没有中文字体,装一个中文字体就可以解决问题了。注意不要exec到容器内装,切到容器内装的话容器更新或者删除了你又得重装。

具体步骤,先把旧容器删除(如果你使用本文的docker-compose配置,你的数据目录都挂载在宿主机上,这不会删除你的数据)

docker-compose down

然后配置BookStack使用wkhtmltopdf:

echo "WKHTMLTOPDF=/usr/bin/wkhtmltopdf" >> /opt/bookstack/data/www/.env

然后新建一个custom-cont-init.d目录(目录名字必须指定为这个)

mkdir -p /opt/bookstack/data/custom-cont-init.d

接着新建一个脚本文件:

nano /opt/bookstack/data/custom-cont-init.d/install-fonts.sh

在里面写入如下配置:

#!/bin/bash

apk add \
  --no-cache \
  --repository \
  http://dl-cdn.alpinelinux.org/alpine/edge/testing \
  wqy-zenhei

最后再起一个新容器即可:

docker-compose up -d

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注