使用docker搭建memos
本文将介绍使用docker
搭建memos
。
本文所依赖的
memos
版本为:Version: v0.24.0
本文所依赖的
mysql
版本为:8.0.41 MySQL Community Server - GPL
什么是memos
memos
是一个开源 的自托管 轻量级笔记解决方案 ,github
地址和官网地址如下:
github
地址:github.com/usememos/me...
优点:
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
对文件进行加密。