使用docker搭建memos
本文将介绍使用docker搭建memos。
本文所依赖的memos版本为:Version: v0.24.0
本文所依赖的mysql版本为:8.0.41 MySQL Community Server - GPL
什么是memos
memos是一个开源的自托管轻量级笔记解决方案,github地址和官网地址如下:
github地址:https://github.com/usememos/memos
官网:https://www.usememos.com
优点:
memos是一个开源产品。
- 可以自托管完全控制自己的数据和隐私。
- 支持
markdown 语法。
使用mysql作为后端存储
memos默认使用sqlite作为存储,虽然sqlite非常轻量,但是性能容易遇到瓶颈,特别是高频写入下会导致性能下降,不适合高并发写操作。所以推荐使用mysql作为后端存储。
使用docker安装mysql 8.0。
使用docker启动mysql 8.0容器即可,命令如下:
| Bash |
|---|
| docker run -d --name mysql8 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=密码 mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
|
上述命令创建了一个名为mysql8的mysql:8.0容器,且映射端口为宿主机3306端口映射进容器的3306端口,-e表示环境变量,MYSQL_ROOT_PASSWORD表示设置mysql root密码,需要将其设置为自己想要的密码即可,--character-set-server 和 --collation-server 表示设置字符编码。
创建完毕后,使用docker inspect mysql8可以查看其容器的ip 地址,配合jq也可以进行查询,例如:
| Bash |
|---|
| docker inspect mysql8 | jq .[0].NetworkSettings.IPAddress
|
也可以通过宿主机的3306端口进行访问mysql服务器。
在启动memos之前,需要创建相应的数据库,例如:
| SQL |
|---|
| mysql> create database memos_prod;
Query OK, 1 row affected (0.02 sec)
mysql> show create database memos_prod;
+------------+--------------------------------------------------------------------------------------------------------------------------------------+
| Database | Create Database |
+------------+--------------------------------------------------------------------------------------------------------------------------------------+
| memos_prod | CREATE DATABASE `memos_prod` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ |
+------------+--------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> exit
|
启动以mysql为后端存储的memos
上述搭建了mysql且创建了相应库之后,便可以进行启动memos容器了,命令如下:
| Bash |
|---|
| docker run -d --name memos-mysql -p 5230:5230 neosmemo/memos:latest --driver mysql --dsn 'root:密码@tcp(主机名)/memos_prod'
|
其中需要指定--driver为mysql,并且指定--dsn为刚刚创建的memos_prod数据库地址,这样启动容器后,便可以访问5230端口进行访问memos了。
不过需要注意的是,默认memos存放附件,因为数据库字段类型为MEDIUMBLOB,导致最多只能存储16M的数据,可以将其修改为LONGBLOB,理论上可以存放4G数据。修改方法如下:
| SQL |
|---|
| mysql> use memos_prod
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> ALTER TABLE resource MODIFY `blob` LONGBLOB;
|
不仅如此,还需要修改mysql系统变量max_allowed_packet的值,它将用于控制客户端和服务器之间通信允许最大数据包大小,比如将其修改为512M。
| SQL |
|---|
| mysql> SET GLOBAL max_allowed_packet = 536870912;
Query OK, 0 rows affected (0.00 sec)
mysql>
|
数据库备份
若使用数据库作为memos对象存储的话,那么所有的数据都会存放在数据库中,包括图片、视频等,所以对mysql的备份显得非常重要,可以使用mysqldump进行备份,比如,我编写的脚本如下:
| Bash |
|---|
| #!/bin/bash
# 备份memos
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
# 当前时间
readonly nowDate=$(date +"%F_%H_%M_%S")
# 备份目录
readonly backupDirs=$(date +"%Y/%m/%d/")
# 如果目录不存在,则创建目录
if [ ! -d $(date +"%Y-%m") ];then
mkdir -p ${backupDirs}
fi
# 使用mysqldump进行dump数据
mysqldump memos_prod > ${backupDirs}/memos_prod_${nowDate}.sql
if [ 0 -eq $? ];then
echo "dump ok"
fi
|
这样的话,只需要将该脚本放入cron中且定时执行,就可以实现按时备份数据了。
| Bash |
|---|
| 00 03 * * * cd /data/memos && bash dump.sh 2>> /dev/null >> /dev/null
|
总结
总的而言,使用docker安装memos非常简单,只不过需要注意的是mysql需要修改一下resource表的blob类型和max_allowed_packet的环境变量。
定期异地备份是一个非常好的习惯,在备份的时候进行加密数据更好,推荐使用gpg对文件进行加密。