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