使用docker搭建memos

使用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...

官网: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

上述命令创建了一个名为mysql8mysql: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'

其中需要指定--drivermysql,并且指定--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对文件进行加密。

转载:wangli2025.github.io/2025/04/11/...

相关推荐
NorthCastle22 分钟前
Docker 镜像 的常用命令介绍
运维·docker·容器·docker 镜像
被子你放开我42 分钟前
Docker 安装CRMEB陀螺匠教程
运维·docker·容器
卜及中1 小时前
【Docker基础】深入解析 Docker 存储卷:管理、绑定与实战应用
运维·docker·容器
张青贤2 小时前
Docker 常用使用命令
运维·docker·容器
东风微鸣2 小时前
管理大规模监控技术栈的最佳实践
docker·云原生·kubernetes·可观察性
~卷心菜~3 小时前
【Docker基础-镜像】--查阅笔记2
docker·容器
it界的哈士奇3 小时前
docker部署scylladb
运维·docker·容器·scylladb
小蓝波3 小时前
Docker部署jenkins
java·docker·jenkins
oceanweave6 小时前
【kind管理脚本-1】便捷使用 kind 创建、删除、管理集群脚本
docker·kubernetes·kind
小费的部落8 小时前
记 etcd 无法在docker-compose.yml启动后无法映射数据库目录的问题
数据库·docker·etcd