这是「Docker 好项目」系列的第 7 期。每期挑一个真正能在自己服务器上跑起来、并且能解决具体问题的项目,给出能直接复制的配置。

刷到一条有用的信息、冒出一个念头、临时记个车牌号——这些碎片的去处是哪?微信收藏夹翻不到、手机备忘录和电脑不同步、flomo 想导出全量数据得开会员。

更别提这些记录全躺在别人的服务器上:哪天服务关停、改收费、改隐私条款,你只能认。

Memos 换了个思路:一个自建的碎片笔记,单容器、默认 SQLite、界面像朋友圈但数据全在你自己服务器上。MIT 协议开源,63k stars,本月还在高频发版(写这篇时最新版 v0.31.0,2026-09-19 刚发布)。

Memos 项目

它到底能干什么

  • 快速记录:时间线式的输入框,打开就写,支持 Markdown、#标签、待办列表
  • 双向引用:memo 之间可以互相引用(Referenced by / Referencing),适合把想法串起来
  • 日历与地图(0.31 新增):按月浏览、按天补记;带位置的 memo 能在地图上看
  • Spaces 协作(0.31 新增):把 memo 组织进共享空间,邀请别人进来,相当于自建的朋友圈
  • Views 保存视图(0.31 新增):把常用筛选条件存成带图标的视图,老用户的 Shortcuts 会自动迁移
  • 附件与存储后端:图片、文件直接传,0.31 起可配多个命名存储后端(本地 / S3),还能把附件图插进正文
  • 导入导出:设置里一键导出 ZIP(含归档 memo、你写的评论、附件),换实例直接搬
  • API 与生态:REST + gRPC API,官方 Web Clipper 浏览器扩展,iOS 快捷指令往里推内容也很常见

它不做的是:不做树状目录、不做双层文件夹、不做双向链接式的知识图谱。Memos 的定位是轻、快、碎片的记录流,不是 Notion 那种知识库。

Memos 官方界面截图

部署前准备

  • 内存:Go 写的单二进制,空载 50MB 左右,1核512MB 的小鸡都带得动
  • 数据库:默认 SQLite,单机自用完全够;要外接数据库才需要 MySQL/PostgreSQL
  • 域名:建议配一个。记录是私密内容,走 HTTPS 反代比裸 IP 端口踏实得多
  • 端口:默认 5230

docker run 一行版

先跑起来感受一下:

docker run -d \
  --name memos \
  --restart unless-stopped \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  neosmemo/memos:0.31

浏览器打开 http://服务器IP:5230,注册的第一个账号自动成为管理员。

国内拉 Docker Hub 超时的话,换 ghcr 的同一份镜像:

docker run -d \
  --name memos \
  --restart unless-stopped \
  -p 5230:5230 \
  -v ~/.memos:/var/opt/memos \
  ghcr.io/usememos/memos:0.31

docker-compose 推荐版

正式用建议这样部署。新建目录和文件:

mkdir -p /opt/memos && cd /opt/memos

新建 docker-compose.yml:

services:
  memos:
    image: neosmemo/memos:0.31
    container_name: memos
    restart: unless-stopped
    ports:
      - "127.0.0.1:5230:5230"
    volumes:
      - ./data:/var/opt/memos
    environment:
      MEMOS_PORT: "5230"
      MEMOS_DRIVER: sqlite
      # MEMOS_INSTANCE_URL: https://memos.你的域名.com
      MEMOS_LOG_LEVEL: info

启动:

docker compose up -d
docker compose logs -f memos

日志里看到监听 5230 就成了。

每个配置项为什么这么写

配置 说明
neosmemo/memos:0.31 官方维护的滚动 tag,自动跟随 0.31 线的最新补丁版。要完全钉死就写 0.31.0。不要用 :latest——官方文档明确说它偏开发向,不适合生产
127.0.0.1:5230:5230 只绑本机回环,公网进不来,必须走反代。碎片笔记等于你的半个人生日志,不建议裸端口暴露。想在局域网直连(手机访问 IP:5230)就改回 "5230:5230",但务必确认实例是私有模式
./data:/var/opt/memos SQLite 数据库、附件、头像全在这里,这是唯一要备份的目录。用相对路径放 compose 同目录,搬家时整个目录拷走就行
MEMOS_PORT 二进制默认其实是 8081,官方镜像里已经设成 5230。这里显式写一遍是防止哪天换了镜像或升级后端口悄悄变了,compose 和端口映射对不上
MEMOS_DRIVER: sqlite 默认值,写出来是自解释。换 MySQL 写 mysql,换 PostgreSQL 写 postgres,两者都要再配 MEMOS_DSN 连接串
MEMOS_INSTANCE_URL 对外的规范地址,影响分享链接和资源 URL 的生成。注意它注释掉了,原因看下面「首次访问」
MEMOS_LOG_LEVEL 默认 info。排障时临时改成 debug,平时别开,日志会很吵

镜像还支持 MEMOS_UID / MEMOS_GID 覆盖容器内进程的用户(默认 UID/GID 10001,用户名 nonroot),启动脚本会自动修正挂载目录的属主。宿主机目录属主要求特殊时才需要动它。

1Panel 怎么搞

1Panel 的应用商店里能直接搜到 Memos,一键装最省事。两个提醒:

  • 商店版本可能滞后于上游,装完进容器详情看一下镜像 tag,太老就按上面的 compose 手动升级
  • 更可控的方式是 容器 → 编排 → 创建编排,把上面的 docker-compose.yml 原样贴进去,后续升级、改配置都在面板里点

用 1Panel 装的话,数据目录默认在 /opt/1panel/apps/memos/memos/data,备份时认准这个目录。

首次访问与私有模式

浏览器打开 http://服务器IP:5230,注册第一个账号——第一个注册的用户自动是管理员。

然后马上做两件事:

  1. 确认实例访问策略。0.31 起,公开/私有模式独立存储,不再跟着实例 URL 走。官方文档明确写了:全新实例如果启动时配了 MEMOS_INSTANCE_URL,访问策略会初始化为公开——这就是 compose 里那行被注释掉的原因:私人笔记第一次启动就全站公开,是灾难。进 设置 → 实例(ACCESS 策略)确认是 Private,之后再把对外 URL 补上,改 URL 不会动这个策略
  2. 关闭公开注册。设置里把「允许新用户注册」关掉,否则任何人都能在你的实例上开账号

界面右上角能切中文,左侧日历可以直接点某天补记。

通知与联动:Webhook 和 API

Memos 不是监控系统,没有「告警」概念,但它有两个往外吐数据的口子,玩法很多:

Webhook:设置里添加 Webhook 地址,memo 创建/更新时会回调你的接口——可以接到 n8n、Home Assistant、企业微信机器人上做联动。

一个 0.31 的安全坑:默认禁止回调到内网地址(防止 SSRF)。你的回调目标是 http://192.168.x.x 这类私网地址时会直接失败,要在环境变量里显式放行:

environment:
  MEMOS_WEBHOOK_PRIVATE_NETWORK_ALLOWLIST: "192.168.31.0/24"

写成具体的域名、IP 或 CIDR 列表,逗号分隔。老变量 MEMOS_ALLOW_PRIVATE_WEBHOOKS 是一刀切放行,已标记弃用,新部署别用它。

API 推送:设置里生成 Access Token,就能从任何地方往实例推 memo。iOS 快捷指令「复制选中文本 → POST 到 Memos」就是这么做的:

curl -X POST "https://memos.你的域名.com/api/v1/memos" \
  -H "Authorization: Bearer 你的AccessToken" \
  -H "Content-Type: application/json" \
  -d '{"content": "从命令行推一条记录 #灵感"}'

反向代理与 HTTPS

Memos 没有 WebSocket 依赖,普通 HTTP 反代即可,比前几期的项目都省心。

用第 2 期的 Nginx Proxy Manager:新建 Proxy Host,域名填 memos.你的域名,Forward 到 127.0.0.1:5230,SSL 页签一键签证书。

用 1Panel 更直接:网站 → 反代 → 新建,代理地址 http://127.0.0.1:5230,然后在网站设置里签 Let's Encrypt 证书。

配完记得回到设置,把 MEMOS_INSTANCE_URL 设成 https://memos.你的域名.com 再重启容器,分享链接和资源地址才会用对域名。

踩坑清单

  • 0.31 移除了 RSS:以前 https://实例地址/u/用户名/RSS.xml 这类订阅地址全部失效,靠 RSS 聚合自己 memo 的用法要换方案(比如用 API 自己拉)
  • Shortcut API 已删除:0.31 把 Shortcuts 迁移成 Views,第三方客户端和老脚本里调 Shortcut 接口的会报错,得改走 /api/v1/users/{user}/views
  • 首次启动配了 INSTANCE_URL 就是公开模式:见上文,私人部署务必进设置核对 ACCESS 策略
  • 挂载目录权限报错:容器内是非 root 用户(UID 10001)。正常情况下入口脚本会自动 chown;如果目录在特殊挂载(如某些 NFS)上 chown 失败,用 MEMOS_UID/MEMOS_GID 对齐宿主机属主
  • Docker Hub 拉不动:国内常态,换 ghcr.io/usememos/memos:0.31,内容是同一份
  • 升级跨大版本前先备份:0.31 有行为变更(管理员现在能读所有人的 memo,包括别人的私密内容和 Space 内容),多人共用的实例要提前告知
  • 别用 :latest:官方自己都说它偏开发向。钉 0.31 或 0.31.0

备份

SQLite 直接打包目录即可,稳妥起见先停容器再打包(避免打包到写了一半的数据库文件):

cd /opt/memos
docker stop memos
tar czf memos-backup-$(date +%F).tar.gz data/
docker start memos

恢复就是解包回去再启动:

cd /opt/memos && docker stop memos
tar xzf memos-backup-2026-09-20.tar.gz
docker start memos

0.31 还加了官方导出入口:设置 → Export & Import,导出的 ZIP 含归档 memo、你写的评论和附件,跨实例搬家比整目录拷贝更干净(但它只是个人导出,不含实例设置和别人的数据)。

把 tar 那条挂到 1Panel 计划任务或 crontab,每天凌晨跑一次,保留最近 14 份足够。

小结

Memos 是那种部署五分钟、从此每天都会打开的工具:资源占用几乎可以忽略,数据是一个能直接拷走的 SQLite 文件,界面快得像本地应用。

适合:flomo 用户想私有化、想要一个自建的「灵感流」、团队想要个轻量共享记事板。 不适合:需要树状知识库、深度双向链接、离线优先的重量级笔记场景——那是 Obsidian、思源笔记的领域,硬拿 Memos 当知识库会失望。

下期继续聊另一个 Docker 项目。


项目地址:https://github.com/usememos/memos 官方文档:https://www.usememos.com/docs