Memos Docker 部署完整指南:5 步把笔记服务稳定跑上生产

发布时间:2026/8/30 10:52:19
Memos Docker 部署完整指南:5 步把笔记服务稳定跑上生产 Memos Docker 部署完整指南5 步把笔记服务稳定跑上生产【免费下载链接】memosOpen-source, self-hosted note-taking tool built for quick capture. Markdown-native, lightweight, and fully yours.项目地址: https://gitcode.com/GitHub_Trending/me/memos假设你有一台长期在线的服务器想把 Memos 这套自托管笔记服务装上去给团队或个人日常使用。要解决的事情其实很集中容器能稳定跑起来、笔记和附件数据不会丢、外部访问走域名和 HTTPS、出了问题能在第一时间发现。读完这篇文章你会用 Docker Compose 完成一次完整的 Memos Docker 部署覆盖关键配置、反向代理、数据备份与升级流程全部命令可直接复制执行。用一条 Compose 配置把 Memos 跑起来先解决跑起来的问题不手工拼镜像和启动参数直接复用仓库里预配置的 Compose 文件保证挂载路径、端口映射和镜像版本都是官方验证过的组合。仓库提供的 scripts/compose.yaml 只有几行它做了三件事拉取neosmemo/memos:stable镜像、把宿主机的~/.memos/挂载为容器内数据目录/var/opt/memos、把 5230 端口映射到宿主机。克隆仓库后用一条命令启动git clone https://gitcode.com/GitHub_Trending/me/memos cd memos # 用仓库自带 compose 文件启动首次会自动拉镜像 docker compose -f scripts/compose.yaml up -d数据落盘规则容器首次启动后SQLite 数据库文件memos_prod.db和附件目录都会出现在挂载目录里也就是宿主机上的~/.memos/。这个目录就是全部数据的所在地后文的备份和迁移都围绕它展开。启动完成后访问http://服务器IP:5230按页面引导完成实例初始化。如果打不开页面用docker compose -f scripts/compose.yaml logs memos看容器日志90% 的情况是端口被占用或挂载目录不存在。关键配置端口、时区与外部数据库跑通之后要解决配得对的问题。容器默认监听 5230、时区 UTC这两个值都由环境变量控制改 compose 即可不用重新构建镜像。scripts/Dockerfile 中设置了默认的MEMOS_PORT和TZ而 scripts/entrypoint.sh 支持用MEMOS_DSN_FILE从文件读取数据库连接串与MEMOS_DSN互斥这些环境变量在 compose 里直接声明services: memos: image: neosmemo/memos:stable container_name: memos volumes: - ~/.memos/:/var/opt/memos ports: # 宿主机端口:容器端口两侧保持一致改端口时两处都要改 - 8080:8080 environment: - TZAsia/Shanghai # 按所在时区修改 - MEMOS_PORT8080 # 容器监听端口需与上面 ports 一致 # - MEMOS_DSN_FILE/run/secrets/memos_dsn # 需要外部数据库时取消注释改端口时注意 compose 里ports和MEMOS_PORT必须同时改否则映射和监听对不上。当笔记量增长或需要多台机器共库时把默认的 SQLite 换成 MySQL/PostgreSQL。只需要加两个环境变量MEMOS_DRIVER指定驱动MEMOS_DSN给连接串含认证信息建议改用MEMOS_DSN_FILE挂载文件方式提供避免明文留在 compose 里environment: - MEMOS_DRIVERmysql # mysql 或 postgres - MEMOS_DSNmysql://用户名:密码数据库主机:3306/memos?parseTimeTruelocLocal数据库表结构无需手工建Memos 启动时会执行内置迁移已有 SQLite 数据的先把~/.memos/备份再参考项目文档做数据导入。用 Nginx 给 Memos 加反向代理与 SSL内网 IP 加端口号不适合长期访问这一节解决外面怎么安全地访问进来域名、HTTPS 终结、请求头透传都在 Nginx 一层完成Memos 容器只监听内网。下面的配置做基础转发。注意两个要点Host头必须透传Memos 依赖它生成正确的资源链接client_max_body_size放宽否则上传大附件会在代理层被 413 拒绝。把server_name和证书路径改成你自己的server { listen 443 ssl; server_name memo.example.com; # 改成你的域名 ssl_certificate /etc/nginx/certs/fullchain.pem; # 证书路径 ssl_certificate_key /etc/nginx/certs/privkey.pem; client_max_body_size 100m; # 覆盖上传附件的体积上限 location / { proxy_pass http://memos:5230; # 容器名:容器端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }如果 5230 端口只给 Nginx 用可以把 compose 里的ports映射删掉让 Memos 只存在于 Docker 内部网络宿主机上不再暴露任何 Memos 端口。对外域名确定后还可以设置MEMOS_INSTANCE_URLhttps://memo.example.com让实例链接、分享 URL 使用这个规范地址。安全与数据保护非 root 运行和定期备份这一节解决两件事容器权限是否收得住数据丢了能不能找回来。先说权限。scripts/Dockerfile 创建了 UID 10001 的nonroot用户scripts/entrypoint.sh 启动时会把数据目录属主修正为目标用户再用su-exec降权运行主进程。也就是说镜像本身已经做了非 root 化你不需要额外配置只需确认宿主机挂载的~/.memos/目录对容器可写首次启动 entrypoint 会自动 chown。数据保护靠定期备份。备份对象就是挂载目录包含数据库文件和附件。下面脚本打包数据目录并滚动保留 30 天把DATA_DIR换成你的实际路径然后挂到 crontab 每天执行#!/bin/bash DATA_DIR$HOME/.memos # 与 compose 挂载的目录一致 BACKUP_DIR$HOME/memos-backups TIMESTAMP$(date %Y%m%d_%H%M%S) mkdir -p $BACKUP_DIR tar -czf $BACKUP_DIR/memos_$TIMESTAMP.tar.gz -C $(dirname $DATA_DIR) $(basename $DATA_DIR) # 清理 30 天前的旧备份 find $BACKUP_DIR -name memos_*.tar.gz -mtime 30 -delete用外部数据库MySQL/PostgreSQL时数据备份对象改为数据库本身例如mysqldump~/.memos/里只剩附件两者都要纳入计划。监控、日志与升级让服务长期在线最后一节解决管得好服务挂了要能自动发现日志不能撑爆磁盘版本升级要有可回退的路径。给服务加上健康检查让编排系统和你的巡检脚本都能判断 Memos 是否真正存活。Alpine 基础镜像自带 BusyBox 的wget直接探测监听端口即可改过端口就同步改这里services: memos: healthcheck: test: [CMD, wget, --no-verbose, --tries1, --spider, http://127.0.0.1:8080/] interval: 30s timeout: 5s retries: 3限制日志体积避免 json-file 驱动无上限增长logging: driver: json-file options: max-size: 10m max-file: 3应用侧日志默认打到 stderr 并被容器收集级别可用MEMOS_LOG_LEVEL调整debug/info/warn/error排障时临时调成 debug平时保持 info。升级流程保持固定版本 可回退。日常使用stable标签没问题但正式环境建议在 compose 里写死具体的版本 tag升级时先改 tag 再执行# 1. 拉取指定 tag 的镜像tag 改为目标版本 docker compose -f scripts/compose.yaml pull memos # 2. 重建容器旧镜像仍保留在本地可回退 docker compose -f scripts/compose.yaml up -d # 3. 确认新容器健康、页面可访问 docker compose -f scripts/compose.yaml ps docker compose -f scripts/compose.yaml logs memos出问题回退只需把 tag 改回旧版本再执行一次up -d因为旧镜像和挂载的数据卷都没有被删除。上线前核对表部署完成前对照下面这张清单逐项确认能覆盖绝大多数生产事故compose 中镜像 tag 已固定不使用浮动的构建版本~/.memos/挂载存在且可写memos_prod.db已生成端口映射、MEMOS_PORT、Nginx 的proxy_pass三者一致Nginx 已配置 HTTPS并透传Host与X-Forwarded-*头client_max_body_size大于你预期的最大附件体积MEMOS_INSTANCE_URL已设为对外规范域名健康检查、日志轮转max-size/max-file已配置备份脚本已挂 cron并至少成功执行过一次、验证过可恢复外部访问模式下已在设置中确认实例的访问策略私有/公开符合预期按这份清单走完Memos 就已经具备了长期生产运行的基本形态配置可复现、数据可恢复、故障可发现、版本可回退。后续无论扩容还是迁移都在这四件事的基础上做增量即可。【免费下载链接】memosOpen-source, self-hosted note-taking tool built for quick capture. Markdown-native, lightweight, and fully yours.项目地址: https://gitcode.com/GitHub_Trending/me/memos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考