Docker Compose 部署 Memos:从安装到备份恢复

记录常用命令、排查过程和临时想法,并不总是需要一篇完整文档。能随手写下、添加标签,再通过关键词找回来,就可以满足不少日常需求。

Memos 是一个支持自部署的开源笔记工具,提供 Markdown、标签、搜索和附件等功能。本文使用 Docker Compose 部署一个个人实例,再完成首次登录、数据持久化检查和备份恢复验证。

示例采用 SQLite,先通过 SSH 隧道访问,适合在放入正式数据前把整个流程走通。

1.准备运行环境

准备一台已经安装 Docker Engine 和 Compose V2 的 Linux 主机。可以使用已有设备,也可以选择莱卡云 Linux 云服务器作为部署环境,具体配置结合附件规模和同机业务评估。

以下服务器命令使用 root 执行。普通用户需要相应的 sudo 和 Docker 操作权限。

先检查:

复制代码
docker --version
docker compose version
docker info

如果命令不存在,或 Docker 服务无法连接,先完成 Docker 安装和服务检查。

本文沿用原教程的 neosmemo/memos:0.31.0,固定版本便于复现,不代表它始终是最新版本。使用其他版本前,应先阅读对应的更新说明。

2.创建 Compose 配置

本文使用 /opt/memos 保存配置和数据,适用于新部署。如果该目录已经有现有实例,先查看原配置,不要直接覆盖。

创建目录:

复制代码
mkdir -p /opt/memos/data
cd /opt/memos

新建 compose.yaml,写入:

复制代码
services:
  memos:
    image: neosmemo/memos:0.31.0
    restart: unless-stopped
    ports:
      - "127.0.0.1:5230:5230"
    environment:
      MEMOS_PORT: "5230"
      MEMOS_DRIVER: sqlite
    volumes:
      - ./data:/var/opt/memos
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

其中:

  • 127.0.0.1:5230:5230:将应用端口绑定到服务器本机回环地址。

  • ./data:/var/opt/memos:把应用数据保存在宿主机 /opt/memos/data。

  • MEMOS_DRIVER: sqlite:使用 SQLite,无须另外部署数据库容器。

  • logging:限制该容器的 Docker 日志文件大小。

先检查配置,再启动:

复制代码
docker compose config -q
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 memos

逐条执行,出现错误时先处理,再继续下一条。

3.通过 SSH 隧道创建管理员

本例没有把 5230 端口绑定到公网地址,首次访问通过 SSH 隧道完成。

在自己的电脑上打开终端或 Windows PowerShell,执行:

复制代码
ssh -N -L 15230:127.0.0.1:5230 root@203.0.113.10

把 203.0.113.10 替换为服务器实际 IP,root 替换为实际 SSH 用户。

如果 SSH 使用其他端口,例如 2222:

复制代码
ssh -p 2222 -N -L 15230:127.0.0.1:5230 root@203.0.113.10

连接成功后,终端保持占用是正常现象。保持窗口打开,在这台电脑的浏览器访问:

复制代码
http://127.0.0.1:15230

完成首次账号创建。新实例的第一个用户会成为管理员,应使用独立的高强度密码。

随后检查注册入口、实例访问策略和笔记默认可见性。个人使用时,关闭不需要的注册功能,并确认普通笔记页面的访问范围符合预期。

主动创建的分享链接需要单独管理。实例设置为私有访问,不代表已经创建的分享链接自动失效。

4.检查文字、附件和持久化

先创建一条测试笔记,加入容易搜索的词,例如:

复制代码
Memos部署验证记录

已完成:
- 创建管理员
- 写入测试内容

待验证:
- 上传附件
- 重建容器后检查数据

#memos测试

再上传一张不含敏感信息的测试图片,确认可以打开。

回到服务器,检查挂载:

复制代码
cd /opt/memos

docker inspect "$(docker compose ps -q memos)" \
  --format '{{range .Mounts}}{{println .Source "->" .Destination}}{{end}}'

结果中应包含宿主机数据目录到 /var/opt/memos 的映射。

接着重建应用容器:

复制代码
docker compose up -d --force-recreate memos

等待服务恢复后,重新登录,检查测试笔记和图片是否仍然正常。

这一步用于验证容器重建后的数据保留情况。它不能替代备份验证,因为文件仍然保存在同一台服务器上。

5.需要域名访问时,配置 HTTPS 反向代理

只通过 SSH 隧道使用,可以暂时跳过这一部分。

需要让手机和电脑直接通过域名访问时,可以在同一台宿主机上的 Nginx、Caddy 或面板反向代理中配置:

配置项 示例
访问域名 memos.example.com
上游地址 http://127.0.0.1:5230
对外协议 HTTPS
应用端口 保持仅监听回环地址
转发信息 原始 Host、访问协议和客户端地址

域名需要解析到服务器,并配置有效证书及相应的网络访问规则。

如果反向代理本身运行在容器中,容器内的 127.0.0.1 指向它自己,不能直接套用上面的上游地址。应通过共享 Docker 网络连接 Memos,或按实际部署方式配置访问宿主机的地址。

域名配置完成后,在 Memos 的 environment 下补充实际地址:

复制代码
      MEMOS_INSTANCE_URL: "https://memos.example.com"

然后执行:

复制代码
cd /opt/memos
docker compose config -q
docker compose up -d

这个变量用于设置实例的规范访问地址,注册权限和公开访问策略仍需在应用设置中单独检查。

最后通过 HTTPS 地址验证登录、上传和附件访问,再使用无痕窗口检查未登录状态下的访问结果。

6.制作一次停机备份

下面的方法适用于本文的 SQLite 配置,且附件保存在数据库内或挂载的数据目录内。

如果后续使用了对象存储、其他本地附件目录或外部数据库,需要另外备份对应的数据。

备份期间会短暂停止 Memos。以下命令使用 Bash 执行:

复制代码
(
  set -euo pipefail
  umask 077

  cd /opt/memos
  mkdir -p /opt/memos-backups

  memos_backup_file="/opt/memos-backups/memos-$(date +%Y%m%d-%H%M%S).tar.gz"

  docker compose stop memos
  trap 'docker compose start memos' EXIT

  tar -czf "${memos_backup_file}.partial" -C /opt memos
  gzip -t "${memos_backup_file}.partial"
  mv "${memos_backup_file}.partial" "$memos_backup_file"

  printf '备份文件:%s\n' "$memos_backup_file"
)

这段命令会打包 /opt/memos,包括本文的 Compose 配置和数据目录。备份失败时,不会把未完成文件命名为正式备份;退出子 Shell 时会尝试重新启动服务。

执行后确认:

复制代码
cd /opt/memos
docker compose ps
docker compose logs --tail=50 memos

还需要将备份复制到另一台设备或独立存储位置。同一块磁盘上的备份文件,无法应对整块磁盘损坏。

如果 HTTPS 代理配置保存在其他目录,也应另行保存。

7.恢复到独立目录,检查备份能否使用

不要直接拿正式数据目录练习恢复。

先查看备份文件:

复制代码
ls -lh /opt/memos-backups/

下面命令中的备份文件名需要替换为实际文件名。先确认备份存在,再创建一个新的恢复目录:

复制代码
memos_backup_file="/opt/memos-backups/memos-实际时间.tar.gz"

test -f "$memos_backup_file"

确认上一条命令成功后,继续在同一个终端执行:

复制代码
memos_restore_dir="$(mktemp -d /opt/memos-restore.XXXXXX)"
tar -xzf "$memos_backup_file" -C "$memos_restore_dir"
cd "$memos_restore_dir/memos"

新建 compose.restore.yaml:

复制代码
services:
  memos:
    image: neosmemo/memos:0.31.0
    restart: "no"
    ports:
      - "127.0.0.1:5231:5230"
    environment:
      MEMOS_PORT: "5230"
      MEMOS_DRIVER: sqlite
    volumes:
      - ./data:/var/opt/memos

这里使用独立的数据副本,并将测试实例绑定到本机 5231 端口。镜像版本应与备份时一致。

确认没有同名的旧恢复测试项目后,启动:

复制代码
docker compose \
  -p memos-restore-test \
  -f compose.restore.yaml \
  up -d

在自己的电脑上另外建立 SSH 隧道:

复制代码
ssh -N -L 15231:127.0.0.1:5231 root@203.0.113.10

按实际情况替换 IP、用户名和 SSH 端口,然后在浏览器打开:

复制代码
http://127.0.0.1:15231

使用原账号登录,确认:

  • 可以找到备份前创建的测试笔记。

  • 图片和附件可以打开。

  • 搜索和编辑功能正常。

  • 在测试副本中修改内容,不影响正式实例。

如果备份前配置了单点登录、外部存储等功能,需要同时检查这些外部依赖。本例主要验证普通账号、SQLite 和本地数据的恢复。

验证完成后,在恢复目录中停止测试实例:

复制代码
docker compose \
  -p memos-restore-test \
  -f compose.restore.yaml \
  down

该命令停止并移除测试容器和项目网络,恢复出来的数据目录仍然保留。

8.遇到问题时,先定位到具体环节

浏览器打不开页面

先在服务器上检查:

复制代码
cd /opt/memos
docker compose ps
docker compose logs --tail=100 memos
curl -I http://127.0.0.1:5230

如果服务器本机能收到 HTTP 响应,但电脑打不开隧道地址,重点检查 SSH 连接是否保持、本地端口是否冲突,以及浏览器使用的端口是否正确。

提示数据目录不可写

先检查目录权限及容器运行身份:

复制代码
ls -ld /opt/memos /opt/memos/data
docker compose exec memos id

根据实际 UID/GID 修正权限,不要直接把整个数据目录改成所有人可写。

反向代理出现 502

检查应用是否正常运行,以及代理所在位置能否访问上游。容器内的回环地址与宿主机回环地址不是同一个位置。

重建后笔记不见了

先检查数据挂载路径。可能是切换了 Compose 所在目录,导致 ./data 指向另一个目录。

此时先保留现有文件,确认原数据位置,不要反复初始化或删除目录。

准备升级

先阅读目标版本的更新说明,完成备份,再修改镜像版本并启动。涉及数据库迁移时,仅把镜像标签改回旧版本,可能无法恢复旧环境,需要配合升级前的数据备份。

完成部署后,可以保留一条"实例维护记录",写清镜像版本、配置目录、数据位置、访问方式和最近一次恢复验证结果。下次维护时,先查看这条记录,就能更快确认从哪里开始。

原始搭建教程:使用 Docker 搭建 Memos

相关推荐
镜子AI1 小时前
镜子AI案例工程复盘:用Python给GEO效果做抽样检测与置信区间估计
开发语言·人工智能·python
木井巳1 小时前
【JavaEE】SpringBoot 统一功能处理: 拦截器、统一返回与全局异常
java·spring boot·后端·spring·java-ee
春涧草茶1 小时前
慢就是快15-1 多进程 多线程
开发语言·python
pan_junbiao1 小时前
Go语言中的空白标识符
开发语言·后端·golang
qq_377572771 小时前
typora install linux ubuntu
linux·ubuntu
卡卡~~1 小时前
C++学习
开发语言·c++
John_Hui1 小时前
CentOS7安装Nginx
linux·服务器·nginx
qetfw1 小时前
Bash 基础:脚本执行、引号与命令替换验证
linux·开发语言·chrome·bash
怪力左手1 小时前
cuda-toolkit离线安装
linux·运维·人工智能