欢迎光临
我们一直在努力

使用 Docker 搭建 Memos:自建轻量笔记与灵感记录平台

日常工作中,临时想到的选题、学习笔记、待办事项和服务器维护记录,往往分散在聊天收藏、备忘录和文本文件里,查找时需要来回切换。

Memos 是一款开源的自托管笔记应用,可以部署在自己的 Linux 云服务器上,通过浏览器记录文字、上传附件,并使用标签和搜索整理内容。

本文使用 Docker Compose 搭建 Memos,介绍管理员初始化、Markdown 笔记、图片与文件上传、分享链接、域名 HTTPS,以及数据备份、恢复和更新方法。部署示例固定使用 Memos 0.31.0,操作系统为 Ubuntu 24.04 LTS x86_64。

1. 项目介绍

Memos 适合用来保存短笔记、灵感、任务清单和日常记录。部署完成后,主要可以使用以下功能:

  • Markdown 笔记和任务列表
  • 图片与文件附件
  • 标签整理与内容搜索
  • 笔记可见性设置
  • 单条笔记分享链接
  • 手机浏览器访问
  • 个人笔记导出和导入

本次使用 SQLite 数据库和本地附件存储,不需要另外安装 MySQL 或 PostgreSQL。

笔记内容和附件会保存在服务器的数据目录中。后续重新创建容器时,只要继续挂载正确的数据目录,就可以继续使用原有数据;完整备份仍需要另外安排。

最终效果

2. 相关地址

Memos 官网:https://usememos.com

GitHub 项目:https://github.com/usememos/memos

官方文档:https://usememos.com/docs

本次版本说明:Memos v0.31.0

3. 搭建环境

Memos 的部署规模可以根据笔记数量、附件大小和使用人数调整。本次采用单机 SQLite 数据库,建议先使用独立的测试服务器完成部署。

本次建议使用以下配置:

  • CPU:建议 2 核及以上
  • 内存:建议 2GB 及以上
  • 磁盘:建议预留约 20GB 可用空间,根据附件和备份数量扩容
  • 系统:Ubuntu 24.04 LTS x86_64
  • Docker:需要安装 Docker Engine
  • Compose:需要使用 Docker Compose 插件,命令为 docker compose
  • Memos 版本:本次固定使用 0.31.0
  • 默认端口:5230,本教程仅绑定服务器本机回环地址
  • 数据磁盘:建议使用本地 SSD
  • 域名:准备一个独立子域名,用于配置 HTTPS

以上是本次教程的建议配置,不是官方最低配置。图片、文件附件和备份会持续占用磁盘空间,长期使用时需要预留余量。

本次教程推荐使用莱卡云 Linux 云服务器进行搭建。

如果只进行个人测试,可以先准备少量笔记和附件;如果计划长期保存工作记录与文件,应提前规划足够的磁盘和备份空间。

查看官网购买链接: https://www.lcayun.com

9折优惠码:bloglcayun

本文服务器命令在 root 的 Bash 终端执行。本机 SSH 隧道命令会单独注明,需要在自己电脑的 PowerShell 或终端运行。

教程中的 Caddy 会使用 TCP 80、443。已有网站占用这两个端口时,应使用另一台测试服务器,或把 Memos 接入原有代理,不要直接停止其他网站。

4. 搭建视频

配套视频演示以下操作:

  • 检查 Docker 与服务器环境
  • 创建 Memos 配置并启动容器
  • 创建管理员并设置访问策略
  • 配置域名和 HTTPS
  • 使用笔记、附件、标签和搜索
  • 创建并撤销分享链接
  • 备份数据并验证恢复

视频教程正在制作,完成后将在本节补充。下面的图文步骤可以独立使用。

5. 正式搭建

5.1 安装 Docker 和 Docker Compose

如果服务器尚未安装 Docker,可以参考本站之前整理的教程:

安装教程: 服务器上安装docker和docker-compose教程

需要注意,该旧文的 Compose 部分使用 docker-compose 1.29.2。本篇统一使用当前的 Compose 插件命令:

docker compose version

如果已经通过 Docker 官方 APT 软件源安装 Docker,但缺少 Compose 插件,可以执行:

apt update
apt install -y docker-compose-plugin

如果提示找不到软件包,应先按照 Docker 官方 Ubuntu 安装说明 配置官方软件源;新安装的长期使用环境也可以直接按该说明安装 Docker Engine 和 Compose 插件。

安装完成后检查:

docker --version
docker compose version
docker info

前两个命令应显示版本,docker info 应能连接到 Docker 服务。本文所有后续命令都使用带空格的 docker compose。

5.2 确认服务器环境

cat /etc/os-release
uname -m
nproc
free -h
df -h /

本篇演示系统为 Ubuntu 24.04,架构为 x86_64。同时检查 CPU、内存和磁盘余量,确认服务器能够正常访问镜像仓库。

系统与Docker版本

5.3 创建项目目录

先确认 /opt/memos 没有存放其他项目或旧版 Memos 数据,再创建目录:

mkdir -p /opt/memos/data /opt/memos/caddy-data /opt/memos/caddy-config
cd /opt/memos
pwd

最后一条命令应显示 /opt/memos。后续配置文件都在这个目录中创建,不要在不同目录之间混用命令。

6. 创建 Memos 环境配置

在 /opt/memos 创建 .env:

cat > .env <<'EOF'
MEMOS_IMAGE=neosmemo/memos:0.31.0
MEMOS_DOMAIN=memos.example.com
EOF

把 memos.example.com 替换成自己的真实域名,只填写主机名,不加 https://、端口或路径。

  • MEMOS_IMAGE:指定 Memos 镜像版本,便于部署和后续恢复。
  • MEMOS_DOMAIN:提供给应用与 HTTPS 代理使用的域名。

.env 是隐藏文件,可以使用 ls -la 查看。它主要为 Compose 提供变量替换,变量是否传入容器还取决于下一节的 environment 配置。

相关阅读: Docker Compose .env 环境变量配置教程

7. 编写 Docker Compose 配置

继续在 /opt/memos 创建 compose.yaml:

cat > compose.yaml <<'EOF'
name: memos
services:
  memos:
    image: ${MEMOS_IMAGE:?请先设置MEMOS_IMAGE}
    restart: unless-stopped
    environment:
      TZ: Asia/Shanghai
      MEMOS_PORT: "5230"
      MEMOS_DRIVER: sqlite
      MEMOS_DATA: /var/opt/memos
      MEMOS_INSTANCE_URL: https://${MEMOS_DOMAIN:?请先设置MEMOS_DOMAIN}
    ports:
      - "127.0.0.1:5230:5230"
    volumes:
      - /opt/memos/data:/var/opt/memos
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"

  caddy:
    image: caddy:2
    restart: unless-stopped
    depends_on:
      - memos
    environment:
      MEMOS_DOMAIN: ${MEMOS_DOMAIN:?请先设置MEMOS_DOMAIN}
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - ./caddy-data:/data
      - ./caddy-config:/config
    logging:
      driver: json-file
      options:
        max-size: "10m"
        max-file: "3"
EOF

其中几个配置需要理解:

配置作用
/opt/memos/data:/var/opt/memos将数据库和本地附件保存到宿主机固定目录
127.0.0.1:5230:5230只在服务器本机发布应用端口,初始化通过 SSH 隧道访问
MEMOS_DRIVER: sqlite使用 SQLite,不额外部署数据库容器
MEMOS_INSTANCE_URL设置对外访问地址,访问权限仍需在后台单独设置
caddy-data、caddy-config持久化 Caddy 的证书数据与配置状态
logging为两项服务分别设置日志轮转,减少日志持续增长

公网通过 Caddy 的 80、443 端口访问,Caddy 在 Docker 内部网络中连接 memos:5230。

持久化与端口配置

8. 创建 HTTPS 代理配置

在相同目录创建 Caddyfile:

cat > Caddyfile <<'EOF'
{$MEMOS_DOMAIN} {
    encode zstd gzip
    reverse_proxy memos:5230
}
EOF

{$MEMOS_DOMAIN} 由 Caddy 读取容器中的环境变量,不要改成 Compose 使用的变量语法。

这里先准备配置,第 13 节再启动 Caddy。先完成管理员初始化,可以避免首次创建账号的页面直接出现在公网。

9. 检查配置并启动 Memos

先检查 Compose 配置:

cd /opt/memos
docker compose config -q

没有报错且正常返回,表示配置可以解析。这一步不会检查域名解析和 HTTPS 证书。

只启动 Memos:

docker compose pull memos
docker compose up -d memos
docker compose ps

正常情况下可以看到 memos 服务运行,宿主机映射地址为 127.0.0.1:5230。此时尚未启动 caddy 是正常的。

测试服务器本机访问:

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:5230/

应获得正常的 HTTP 响应。刚启动时若暂时无法连接,稍等后重试,并按下一节查看日志。

配置检查与容器状态

10. 查看 Memos 运行日志

查看最近 100 行:

cd /opt/memos
docker compose logs --tail 100 memos

持续查看日志:

docker compose logs -f --tail 100 memos

按 Ctrl+C 退出日志查看,不会停止容器。

如果出现数据库、权限或目录错误,先根据日志处理。不要通过删除 /opt/memos/data 来尝试解决启动问题,该目录保存的是业务数据。

本文配置已经加入日志轮转。如果其他容器出现日志持续占用磁盘的问题,可以参考:

相关阅读: Docker 容器日志占满磁盘怎么办?日志清理与大小限制教程

11. 访问 Memos 并创建管理员

在自己电脑的 PowerShell 或终端新开一个窗口,执行:

ssh -p 22 -N -o ExitOnForwardFailure=yes -L 127.0.0.1:15230:127.0.0.1:5230 root@服务器IP

将 服务器IP 和 22 替换成实际服务器地址和 SSH 端口。连接后窗口保持打开,不出现远程命令提示符是 -N 参数的正常行为。

在自己电脑的浏览器打开:

http://127.0.0.1:15230

按首次使用页面的提示创建管理员账号。第一个用户会成为实例管理员,建议设置独立的强密码。

这里的 15230 是自己电脑的本地端口,5230 是服务器上的 Memos 端口。如果本地端口被占用,可以更换左侧的 15230,并同步修改浏览器地址。

首次账号初始化

12. 关闭公开注册并检查访问策略

登录后进入:

设置 → 系统 → 访问和策略

个人使用时建议设置为:

  • 开启“禁用用户注册”
  • 关闭“允许公开访问”
  • 保持“禁用密码登录”为关闭状态
  • 保存后重新打开页面,确认设置已经生效

这套设置限制普通匿名访问和公开注册。单条笔记的可见性、独立分享链接仍需分别管理,第 18 节会具体说明。

注册与公开访问设置

13. 配置域名和 HTTPS

13.1 检查域名与端口

为 .env 中的真实域名添加 A 记录,指向服务器公网 IPv4。只有服务器具备可用 IPv6 时,才添加对应的 AAAA 记录。

本次采用 DNS 直连。云服务器安全组和实际防火墙策略需要允许 TCP 80、443,SSH 仍保留原有端口。

检查服务器是否已有程序占用端口:

ss -lntp

如果已有 Nginx、Apache 或其他代理监听 80、443,不要直接运行本教程的 Caddy;应先按第 3 节的环境要求处理端口冲突。

13.2 启动 Caddy

cd /opt/memos
docker compose pull caddy
docker compose run --rm --no-deps caddy caddy validate --config /etc/caddy/Caddyfile --adapter caddyfile
docker compose up -d
docker compose logs --tail 100 caddy

配置检查通过以后,Caddy 会根据域名申请 HTTPS 证书,并在满足续期条件时自动续期。

浏览器访问自己的真实域名,例如:

https://memos.example.com

确认连接安全、没有证书警告,并使用刚才创建的账号登录。

证书签发失败时,检查域名解析、80/443 的外部可达性及 Caddy 日志。不要把跳过证书警告当成 HTTPS 配置成功。

域名访问正常后,可以在自己电脑的 SSH 隧道窗口按 Ctrl+C 结束隧道,后续直接通过 HTTPS 使用 Memos。

域名与HTTPS

14. 创建第一条 Markdown 笔记

在侧边栏打开“新建备忘录”,输入以下内容:

# 今天的灵感

把零散记录整理到自己的 Memos。

- [x] 完成部署
- [ ] 验证备份恢复

#学习 #服务器

保存前将可见性设为“私密”。保存后刷新页面,确认文字、任务列表和标签仍然存在。

可以继续新增“服务器维护记录”和“每周复盘”两条笔记,便于下一步测试搜索与分类。

Markdown笔记

15. 上传图片与文件附件

在笔记编辑器中使用附件上传入口,先上传一张测试图片和一个小型文本文件。

保存后分别检查:

  • 图片能否正常显示
  • 附件入口是否存在
  • 文件能否下载并正常打开
  • 刷新页面后是否仍然可用

本篇使用默认本地附件存储。附件大小限制以后台当前设置为准,不建议刚完成部署就批量上传大量文件。

如果以后改用对象存储或其他目录,已有附件与新附件的存储位置可能不同,备份时必须覆盖实际使用的全部位置。

图片与文件上传

16. 使用标签和搜索整理笔记

在笔记中添加 #学习、#服务器 等标签,可以按主题整理内容。

点击相应标签,检查是否只显示匹配的笔记;再从侧边栏搜索入口查找“备份”等正文关键词。

建议使用少量含义明确的标签。标签只用于整理内容,不会自动改变笔记的访问权限。

17. 在手机浏览器使用 Memos

在手机浏览器打开同一个 HTTPS 域名,登录后查看刚才的笔记和附件,再新增一条测试记录。

回到电脑端刷新页面,确认新记录已经保存到服务器。

本篇使用的是移动网页,不需要另外安装第三方客户端。手机无法访问时,先确认域名、证书和手机当前网络是否正常。

18. 设置笔记可见性并验证分享链接

Memos 的实例公开访问开关、单条笔记可见性和分享链接,需要分别理解。

个人笔记可以先设为“私密”。关闭实例“允许公开访问”后,普通笔记页面需要登录;仅把一条笔记设为公开,并不等于实例已允许匿名浏览。

需要分享一条笔记时,可以按以下步骤操作:

  1. 打开专门用于测试的笔记详情页。
  2. 在分享区域创建独立分享链接,并选择有效期。
  3. 用未登录的无痕窗口打开链接,检查笔记和附件。
  4. 回到原页面撤销链接。
  5. 在无痕窗口重新打开该链接,确认不能再通过它获取笔记内容。

有效分享链接本身会授予访问权限,即使笔记为私密、实例关闭公开访问,访客也可能通过该链接读取指定笔记及附件。关闭实例公开访问不会自动撤销已有分享链接。

限时分享设置

撤销链接不能收回别人此前已经下载或保存的内容。应用中的“私密”也不是端到端加密;Memos 0.31 的实例管理员具有读取和管理笔记的权限。

撤销分享验证

19. Memos 数据保存在什么位置?

按本文部署方式,主要文件位于:

路径内容
/opt/memos/dataMemos 数据目录,包含 SQLite 数据库和本地附件
/opt/memos/compose.yaml容器与挂载配置
/opt/memos/.env镜像版本和域名
/opt/memos/CaddyfileHTTPS 代理配置
/opt/memos/caddy-dataCaddy 证书等持久化数据
/opt/memos/caddy-configCaddy 配置状态

默认 SQLite 数据库文件为 memos_prod.db,本地附件通常保存在数据目录下的 assets 中。

查看磁盘余量与目录占用:

df -h /opt/memos
du -sh /opt/memos/data /opt/memos/caddy-data

不要手工移动数据库或重命名附件目录。准备改用数据盘时,应先备份、停机迁移数据,再修改挂载路径,并确认数据盘重启后仍会挂载。

20. 备份 Memos 数据库、附件和配置

只复制 Compose 文件不能恢复笔记,只保存数据库也可能遗漏本地附件。按本文目录布局,可以短暂停机后备份整个 /opt/memos。

确认 Memos 与 Caddy 已正常运行,在维护时段执行:

(
set -euo pipefail
umask 077
cd /opt/memos
mkdir -p /opt/memos-backups
backup_file="/opt/memos-backups/memos-$(date +%Y%m%d-%H%M%S).tar.gz"
trap 'docker compose start' EXIT
docker compose stop
tar -czf "$backup_file" -C /opt memos
tar -tzf "$backup_file" > /dev/null
sha256sum "$backup_file" > "$backup_file.sha256"
printf '备份文件:%s\n' "$backup_file"
)

外层括号让设置只在本次子 Shell 中生效;退出时的 trap 会尝试重新启动服务。备份过程会暂时中断访问,所需时间取决于数据量。

命令结束后再次确认服务恢复:

cd /opt/memos
docker compose ps
ls -lh /opt/memos-backups

将归档和 .sha256 校验文件一起复制到其他服务器、独立存储或本地设备,不能只留在原服务器。

备份包含业务数据、配置和证书私钥,应限制访问。若以后使用外部数据库或对象存储,还需要增加对应存储的备份。

“设置 → 导出和导入”适合导出自己的笔记,但不包含整个实例的全部账号、设置及其他用户数据,不能代替上面的完整备份。

备份文件与校验

21. 在独立目录验证备份恢复

备份包存在,不代表其中的数据一定能够恢复。下面使用本教程 0.31.0 创建的备份进行演练,原项目继续保留。

将备份文件名替换为实际名称,并确认 /opt/memos-restore-check 与同名容器尚未使用:

(
set -euo pipefail
backup_file='/opt/memos-backups/替换为实际备份文件.tar.gz'
test -f "$backup_file"
sha256sum -c "$backup_file.sha256"
tar -tzf "$backup_file" > /dev/null
test ! -e /opt/memos-restore-check
mkdir /opt/memos-restore-check
tar -xzf "$backup_file" -C /opt/memos-restore-check
docker run -d --name memos-restore-check \
  -p 127.0.0.1:5231:5230 \
  -e MEMOS_PORT=5230 \
  -e MEMOS_DRIVER=sqlite \
  -e MEMOS_DATA=/var/opt/memos \
  -e TZ=Asia/Shanghai \
  -v /opt/memos-restore-check/memos/data:/var/opt/memos \
  neosmemo/memos:0.31.0
)

在自己电脑新开一个终端窗口:

ssh -p 22 -N -o ExitOnForwardFailure=yes -L 127.0.0.1:15231:127.0.0.1:5231 root@服务器IP

浏览器打开 http://127.0.0.1:15231,使用备份中的原账号登录,检查笔记、标签、图片显示和文件下载。

验证结束后关闭本地隧道,并在服务器停止演练容器:

docker stop memos-restore-check

后续其他版本的备份,应使用与备份对应的镜像版本恢复。正式迁移到另一台服务器时,还需要处理域名解析、HTTPS 和实际访问策略。

独立恢复结果

22. 更新 Memos

升级前先阅读目标版本说明,完成第 20 节备份和第 21 节恢复验证。

编辑 /opt/memos/.env,把 MEMOS_IMAGE 改成已经核对的目标正式版本,再执行:

cd /opt/memos
docker compose config -q
docker compose pull memos
docker compose up -d --no-deps memos
docker compose images memos
docker compose ps
docker compose logs --tail 100 memos

重新登录,检查旧笔记、附件、搜索及分享状态。

本文固定了镜像版本。没有修改版本标签时,只执行 pull 不会自动升级到另一个版本。

新版本可能执行数据库迁移。升级异常时,应根据版本说明和升级前备份处理,不能只把镜像标签改回旧版就认为数据已经恢复。

镜像版本与维护检查

23. 常见问题

23.1 服务器 IP 加 5230 为什么打不开?

本文将 5230 绑定到服务器 127.0.0.1,公网不能直接访问是预期行为。首次初始化使用第 11 节的 SSH 隧道,日常使用第 13 节的 HTTPS 域名。

如果连服务器本机访问也失败,先执行:

cd /opt/memos
docker compose ps
docker compose logs --tail 100 memos
curl -v http://127.0.0.1:5230/

如果应用本机正常,而 SSH 隧道或 HTTPS 连接仍然失败,再检查相应端口、云安全组和防火墙。

相关阅读: 云服务器端口不通怎么办?Connection refused 与 timed out 排查教程

排查时应使用自己的 SSH 端口或 HTTPS 的 80、443,不需要为了照搬通用示例而开放 Memos 的 5230。

23.2 HTTPS 页面返回 502 怎么办?

查看两项服务的状态和日志:

cd /opt/memos
docker compose ps
docker compose logs --tail 100 memos caddy

本教程的代理目标是同一个 Compose 网络中的 memos:5230。Caddy 容器里的 127.0.0.1 指向 Caddy 容器自身,不能把代理目标直接改为宿主机写法。

23.3 图片或文件上传失败怎么办?

先检查磁盘空间、应用日志、后台上传大小限制,以及 /opt/memos/data 的实际挂载与权限。先用小图片和小文本文件测试,缩小问题范围。

如果使用 rootless Docker、手动指定容器用户或自定义附件目录,应按实际运行方式处理权限,不要直接把数据目录改成 777。

23.4 更新后为什么又出现初始化页面?

优先检查当前项目目录、.env、数据库配置和数据挂载是否指向原来的位置。

先保留旧目录与备份,在确认原因前不要重新创建管理员、覆盖数据库或清理数据卷。

24. Memos 适合什么人使用?

Memos 比较适合希望集中整理短笔记、灵感和任务清单,同时愿意维护服务器和备份的个人用户。

它也适合记录学习过程、项目进度和服务器维护事项。需要复杂排版、多人审批或完整文档协作的场景,应先确认其功能是否符合实际需求。

自托管意味着可以自行管理数据,也意味着需要自己负责磁盘、访问权限、软件更新和恢复验证。

25. 总结

通过本文步骤,可以使用 Docker Compose 在 Linux 云服务器上搭建 Memos,完成笔记记录、附件上传、标签搜索、手机网页访问和分享链接管理。

主要流程是准备 Docker 环境,创建项目和持久化目录,配置并启动 Memos,经 SSH 隧道创建管理员,再启用域名 HTTPS。

长期使用时,重点做好三件事:确认分享范围,定期备份数据库、附件和配置,并实际验证备份能否恢复。可以先从少量笔记开始使用,再逐步整理需要长期保存的内容。

赞(0)
未经允许不得转载:莱卡云 » 使用 Docker 搭建 Memos:自建轻量笔记与灵感记录平台