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

上述命令创建了一个名为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对文件进行加密。

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

相关推荐
hellice12 小时前
闪传 FlashDrop 实战:我用 300 行 Node 代码做了个「4 位取件码」临时文件中转站
前端·产品
茶底世界之下15 小时前
阴天窗边的柿子:用 Awaking 让暖色成为主角
ios·app·产品
wz975417 小时前
Docker 从 systemd 托管容器、overlay2 存储驱动到 Compose 多容器实战
spring cloud·docker·eureka
新*18 小时前
ES 7.17 三节点 Docker 集群接入 IK 自定义词典:一次从丢插件到热更新的完整排障
运维·elasticsearch·docker·中文分词·ik分词
小白的码BUG之路19 小时前
Jenkins -- gitee+docker+harbor+k8s 部署项目
docker·gitee·jenkins
AlfredZhao19 小时前
Docker Compose 平滑切换环境变量文件,容器配置不残留
docker
duansamve1 天前
Python3+Flask+PostgreSQL18+Vue3项目生产环境用docker如何部署?
python·docker·flask
SL_staff2 天前
为什么企业级自动化不能只靠AI编排?——逻辑引擎在确定性业务场景中的不可替代性
java·开源·产品
茶底世界之下2 天前
仙人掌与沙丘的傍晚:用 Awaking 让侧光有了层次
ios·app·产品
那明眸似水2 天前
云原生项目三:Docker秒级启动NextCloud个人网盘存储办公系统
linux·运维·docker·云原生·容器