1 需求

  • 搭建一个共享的私有Wiki

2 现状

  • Ubuntu22实体服务器
  • Mysql5.7

3 解决方案

采用开源的Wiki系统进行搭建,比较出名的是Wikijs,它支持多种数据库PostgreSQL / MySQL / MariaDB / MS SQL Server / SQLite,经过考虑用Mysql。
优点:维护的活跃程度高,功能强大
缺点:需要Mysql8+

4 实施方案

Mysql8x和Mysql5的共存安装没经验,可能会出现配置冲突问题。解决方案是通过Docker安装Mysql8,实现共存。

4.1 Ubuntu22的中安装Mysql Docker

(1)查看ubuntu 版本信息更新系统

更新系统

sudo apt update
sudo apt list --upgradeable
sudo apt upgrade -y

查看最新系统信息

cat /etc/os-release
lsb_release -a
(2)安装Docker
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun

查看Docker运行状态

sudo systemctl status docker

看到如下状态则证明安装成功

(3)配置Docker

Docker 镜像加速
国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如:

科大镜像:https://docker.mirrors.ustc.edu.cn/
网易:https://hub-mirror.c.163.com/
阿里云:https://<你的ID>.mirror.aliyuncs.com
七牛云加速器:https://reg-mirror.qiniu.com
Docker中国区官方镜像:https://registry.docker-cn.com
网易:http://hub-mirror.c.163.com
USTC 中国科技大学:https://docker.mirrors.ustc.edu.cn

sudo vim /etc/docker/daemon.json

加入如下信息

{
  "registry-mirrors": [
    "https://registry.docker-cn.com",
    "http://hub-mirror.c.163.com",
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

查看是否生效

docker info

看到如下消息则生效

(4)安装Mysql8x
docker pull mysql

查看镜像文件的相关信息

docker inspect mysql
(5)启动Mysql实例

Mysql实例重启后数据和配置文件都会丢失,所以需要通过虚拟目录的方式进行保存,在启动的时候进行参数配置。首先启动一个简单的实例,看看配置文件具体在哪,每个系统的配置文件位置可能不一样。

docker run -itd -P -e MYSQL_ROOT_PASSWORD=root mysql

查看实例启动情况

docker ps

如果出错则先查看错误日志

docker logs 1b78ca228ac3

进入Mysql8实例查看

docker exec -it 1b78ca228ac3 /bin/bash
cd /etc
ls

同理也能找到数据文件所在的地方

cd /var/lib/mysql

本文有一个需求,就是Wiki上传的数据文件比较大,超过了Mysql8默认的大小,需求进行配置,我们在系统中先构造出my.cnf,将max_allowed_packet上限设置为1Gb。我们创建数据文件和配置文件目录

mkdir /home/dev/wiki-data/docker-mysql
mkdir /home/dev/wiki-data/docker-mysqld-cnf
cd /home/dev/wiki-data/docker-mysqld-cnf
vim my.cnf

输入Docker实例中/etc/my.cnf内容,并在[mysqld]下新增字段max_allowed_packet

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
max_allowed_packet=1024M

# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql

pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock

!includedir /etc/mysql/conf.d/

关闭上次启动的实例

docker stop 1b78ca228ac3

再次创建新实例

docker run -itd -p 26666:3306 -P -v /home/dev/wiki-data/docker-mysql:/var/lib/mysql -v /home/dev/wiki-data/docker-mysqld-cnf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=root mysql

访问Mysql实例

mysql -h172.17.0.1 -uroot -p -P26666

看到如下内容则成功进入实例

创建数据库、账户和授权

create database wiki character SET utf8 COLLATE utf8_bin; //创建Wiki对应数据库并授权
SET GLOBAL transaction_isolation='READ-COMMITTED';  //设置mysql隔离级别 
create user 'wikijs'@'%' identified by 'wikijsrocks';
GRANT ALL PRIVILEGES ON wiki.* TO 'wikijs'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;

重启Mysql8实例,检查数据是和否持久化

(6)实例自动重启

为应对系统重启和其他灾害导致的实例挂了的情况,可以做一个简单的脚本做重启任务

#!/bin/bash
sm=`ps -fe |grep "-host-port 26666" |grep -v "grep" |wc -l`
if [ $sm -eq 0 ]; then
   echo "start to run mysql8."
   docker run -itd -p 26666:3306 -P -v /home/dev/wiki-data/docker-mysql:/var/lib/mysql -v /home/dev/wiki-data/docker-mysqld-cnf/my.cnf:/etc/my.cnf -e MYSQL_ROOT_PASSWORD=root mysql
else
   echo "mysql8 is already running!"
fi
(7)数据备份

为防止数据丢失,可以做一个简单的数据备份,定时备份

login_user="root"    #数据库登录账户
login_passwd="root"        #数据库登录密码
vDate=`date +%Y%m%d`    #当前日期,用作目录名
backup_dir="/home/dev/wiki-data/"$vDate"/" #配置备份文件保存的目录
echo $backup_dir
if [ ! -d $backup_dir ];then
	mkdir -p $backup_dir
fi
# 将需要备份的数据放入
mysqldump -h172.17.0.1 -P26666 -u$login_user -p$login_passwd wiki > $backup_dir$vDate.sql
# 删除7天前备份的文件
find backup_dir -atime +7 -name "*.sql" -exec rm -rf {} \
echo "备份结束"
# 如果遇到unexpected end of file,使用vim打开文件后,输入“:set ff”,如果看到结果为dos,则文件编码不正确
# 需要输入“:set ff=unix”进行修复

至此,数据库创建完成。

4.2 安装Wikijs

(1)下载Wikijs

Wikijs为开源项目,在定制化要求不高的情况下,可以考虑直接用它的release版本:
下载release包

wget https://github.com/requarks/wiki/releases/download/v2.5.291/wiki-js.tar.gz
tar -zxvf wiki-js.tar.gz

这里要进行数据库和存储文件配置,这里只需要修改根目录下的config.yml就行了
配置Mysql参数

  type: mysql
  host: localhost     #Mysql所在服务器地址
  port: 3306          #Mysql所在服务器地址
  user: wikijs        #在Mysql中创建的wiki的登陆用户名
  pass: wikijsrocks   #在Mysql中创建的wiki的登陆用户名密码
  db: wiki            #在Mysql中创建的wiki的数据库名称

配置文件保存地址,默认放到安装包的根目录data文件夹内

dataPath: ./data
(2)配置Nginx

Nginx的配置这里不具体展开,具体安装过程参考基于CentOS 8搭建Nginx服务器(https://blog.csdn.net/huiskai/article/details/111302936),这里需要重点注意的是,对于有大文件上传下载需求的,需要修改nginx的最大数据包限制。

在http下面加上如下参数,从而将最大数据包限制提高到1Gb

client_max_body_size 1024m;

为了防止超时,需要加一下超时参数,这里配置server的超时参数

 proxy_send_timeout 300;
 proxy_read_timeout 300;
 proxy_connect_timeout 300;

如下

(3)安装Nodejs

Wikijs为node作为后端,需要安装nodejs,这里不展开详细介绍怎么安装nodejs,具体可以参考这篇文章Ubuntu20安装最新nodejs(https://blog.csdn.net/huiskai/article/details/116109255)

(4)启动服务

根据项目说明文档提示,进入根目录后直接运行命令

npm run start

打开http://localhost:3000

进入配置页面,Enjoy!

Wikijs文档齐全,功能强大,涉及到用户管理、权限管理、文档管理等,各位大佬可以根据需要进行配置。

参考资料

  1. ubuntu 安装docker mysql 8.0.28
  2. 虚拟机中docker安装mysql远程无法访问解决方法
  3. 怎么在Docker中部署MySQL并实现数据持久化
  4. 在UBUNTU上自动备份MYSQL
  5. 在Ubuntu/Linux中自动备份MySQL数据库
  6. Nginx 配置之解决 413 错误(Request Entity Too Large)
  7. NGINX 报错 413 Request Entity Too Large 解决方案
  8. Nginx 出现504 Gateway Time-out的解决方法
  9. Ubuntu 22.04安装、配置和删除MySQL 8
  10. Got a packet bigger than ‘max_allowed_packet’ bytes?问题解决
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐