文档配置

Rust · 0.1.0

数据库

选择 SQLite、PostgreSQL 或 MySQL,并区分数据库标识与应用版本。

选择能够维护的存储方案

SQLite 不需要独立数据库服务,适合单实例起步。未指定 DSN 时,服务使用数据目录中的 memos_prod.db。PostgreSQL 和 MySQL 需要配置 MEMOS_DRIVER 及对应的 MEMOS_DSN。不要让开发或测试实例连接生产数据。

连接与更新安全

为应用建立满足自身数据库结构操作需求的账号,限制网络访问,并按数据库驱动支持的选项配置 TLS。数据库结构升级在启动过程中执行。应用版本号变化不会重置数据,也不表示应该手动改数据库结构版本。更新前先备份,并验证恢复路径。

更换数据库引擎

修改 MEMOS_DRIVER 只会改变连接目标,不会转移笔记、用户或附件。切换访问流量前,应制定明确的数据转移流程,并核对归属、时间、附件及访问规则。笔记导出压缩包不等于完整数据库备份。

用明确的 DSN 选择数据库

先创建专用应用数据库,并准备有权创建和迁移其表结构的专用账号。服务支持 PostgreSQL URL 或键值式 DSN,以及 MySQL URL 或兼容的 tcp DSN。下面展示去敏的 URL 格式。替换全部占位值,对凭据中的保留字符进行百分号编码,实际 DSN 应通过密钥机制提供,别粘贴进共享终端或仓库。仓库的网络数据库 CI 目标为 PostgreSQL 17 与 MySQL 8.4。

# PostgreSQL DSN format, not a real credential:
postgresql://memos:REPLACE_ME@db.example.com:5432/memos?sslmode=verify-full

# MySQL DSN format, not a real credential:
mysql://memos:REPLACE_ME@db.example.com:3306/memos?tls=true

通过容器文件传入 DSN

使用本地 Docker 镜像时,准备一个仅包含 DSN 的文件,确保运行账号能读取(默认 UID/GID 为 10001)。以只读方式挂载并设置 MEMOS_DSN_FILE,不要同时设置 MEMOS_DSN。该功能由容器入口脚本提供,原生二进制应由服务管理器传入 MEMOS_DSN。网络数据库也不包含本地附件,因此仍需挂载 MEMOS_DATA。

docker run -d --name memos-db-test \
  -p 127.0.0.1:5231:5230 \
  -e MEMOS_DRIVER=postgres \
  -e MEMOS_DSN_FILE=/run/secrets/memos-dsn \
  --mount type=bind,src="$PWD/secrets/memos-dsn",dst=/run/secrets/memos-dsn,readonly \
  -v memos-db-test-data:/var/opt/memos   memos:local

docker logs --tail 100 memos-db-test
curl --fail http://127.0.0.1:5231/healthz

录入数据前确认连接目标

示例刻意使用独立测试容器、端口及卷。换用 MySQL 时把 driver 改为 mysql,并提供对应 DSN。健康检查通过且测试笔记能保存后重载,才说明基本连接路径可用;仍应独立确认实际连接的是预期数据库。证书错误应修复信任根与主机名,认证错误应检查账号授权,迁移错误应依据准确启动日志分析。不要直接降低 TLS 要求或篡改 schema-version 记录。