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

相关推荐
晚风吹长发4 小时前
Docker基础——Docker Network(网络详解)
linux·运维·网络·ubuntu·docker·容器
ji_shuke9 小时前
从零深入:基于 Playwright + Pytest + Allure 的企业级 Web 端到端自动化测试框架实战
前端·自动化测试·docker·jenkins·pytest·allure·playwright
霁月的小屋11 小时前
Docker 工程化实践(六):Docker Compose 管理多容器应用
运维·docker·容器
江湖有缘12 小时前
Docker实战 | 使用Docker部署EasyNode服务器面板工具
服务器·docker·容器
心机之蛙qee12 小时前
Docker Compose 多容器编排
java·docker·容器
AI大佬的小弟12 小时前
私有化 Dify 应用开发(1):Dify 入门|Docker 一键部署全流程
docker·大模型落地·ai 应用开发·dify 教程·私有化 ai 部署·docker 实战·开源 ai 平台
ShiXZ21314 小时前
Docker 安装 Elasticsearch 7.17.6 完整教程
elasticsearch·docker·容器
念何架构之路15 小时前
moby-BuildKit(builder-next)
学习·docker·容器
风曦Kisaki15 小时前
Kubernetes(K8s)笔记Day04:控制器(ReplicaSet 与Deployment),滚动更新及回滚,滚动更新策略,Pod 的 DNS 策略
linux·运维·笔记·docker·容器·kubernetes
爱码少年15 小时前
此docker compose非彼docker-compose
docker