Many Notes 0.18.1 配置参数详解

Many Notes v0.18.1 配置参数全解:应用级环境变量(APP_URL/DB_*/OIDC_*/MAIL_*)、基座级 PHP/nginx/Reverb/Typesense 参数实测默认值、管理界面运行时设置、三级配置模型与生产配置模板,全部默认值取自运行实例实查。

Many NotesMany NotesPHPLaravelSQLiteOIDC2026/11/02

Many Notes 0.18.1 配置参数详解

目标:把 Many Notes v0.18.1 的三级配置(环境变量 / 运行时设置 / 基座镜像参数)逐项讲清,默认值全部取自部署实例的实查回显(采集日期 2026-11-01),并给出生产配置模板。实例部署过程见《Many Notes Docker Compose 部署指南》。

一、环境信息

  • 操作系统:Ubuntu 24.04(x86_64)
  • 应用:Many Notes v0.18.1,镜像 brufdev/many-notes:latest(digest sha256:4a61723eca84...)
  • 基座:serversideup/php v5.0.2(fpm-nginx),PHP 8.4.27,Debian 13,s6 监督
  • 框架:Laravel 13.29.0,Composer 2.10.3(php artisan about 实测)
  • 数据库:SQLite 3.46.1(php artisan db:show 实测),19 张表
  • 访问地址:http://localhost:8144(宿主端口 8144 → 应用 8080)
  • 演示账号:admin / q1w2e3r4

二、前置条件

本文所有「实查」基于一个已按官方 compose 启动并通过健康检查的实例。核对方式:

docker compose ps
many-notes-0.18.1-app  brufdev/many-notes:latest  Up (healthy)  0.0.0.0:8144->8080/tcp

参数查看的三种途径(本文实测命令):

# 途径一:容器环境变量与默认值(基座镜像 baked 值)
docker image inspect brufdev/many-notes:latest --format '{{range .Config.Env}}{{println .}}{{end}}' | head -20

# 途径二:应用运行时生效值
docker compose exec php php artisan config:show app | head -20

# 途径三:前端 props 暴露的元数据(版本/上传限制/设置开关)
curl -s http://localhost:8144/register | grep -o '"settings":{[^}]*}'

回显(实测):

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PHP_VERSION=8.4.27
PHP_MEMORY_LIMIT=256M
PHP_POST_MAX_SIZE=500M
NGINX_HTTP_PORT=8080
HEALTHCHECK_PATH=/healthcheck
...
{"settings":{"local_auth_enabled":true,"registration":true,"auto_update_check":true}}

三、配置模型总览

Many Notes 的配置分三层,互不混用:

层级载体修改方式生效时机典型参数
环境变量compose environment:编辑 compose.yaml → docker compose up -d容器重启APP_URL、DB_、OIDC_、MAIL_、PHP_
运行时设置settings 表(管理界面)浏览器 Admin → Settings即时注册开关、自动更新检查
基座镜像参数镜像 ENV 默认值环境变量覆盖容器重启NGINX_、PHP_FPM_、S6_*、SSL_MODE

⚠️ 注意:官方 compose 不挂载任何配置文件——没有 .env 落盘编辑的惯例,全部定制走环境变量。容器内虽存在 /var/www/html/.env(镜像内置默认),但它是构建产物,升级即被覆盖,不要直接改它。

四、应用级参数详解(Laravel 层)

4.1 应用标识与地址

参数默认值说明与实测
APP_NAMEMany Notes页面标题与邮件签名来源(MAIL_FROM_NAME 引用它)
APP_URLhttp://localhost最常改错的参数:资源绝对 URL、OIDC 回调、Reverb 广播地址均由它派生。宿主端口非 80 时必须写成完整可达地址(如 http://localhost:8144)
APP_ENVproduction镜像内置,勿改
APP_DEBUGfalse排障临时 true 可让页面直出异常栈;官方 FAQ 强调用完关闭(错误页暴露安装细节)
APP_TIMEZONEUTC官方文档给出的时区入口;国内部署建议 Asia/Shanghai
APP_LOCALEen界面语言,当前官方仅提供英文资源
APP_KEY镜像内置加密密钥(实测为 base64 值)。所有实例共享同一内置 key 是官方简化策略;对外网暴露实例建议自行生成并注入:docker compose exec php php artisan key:generate --show 取新值后以 APP_KEY 环境变量固定

4.2 数据库(DB_*)

实测默认(php artisan about 的 Drivers 段 + db:show):

Database ............................................................ sqlite
SQLite .............................................................. 3.46.1
Database ................................... database/sqlite/database.sqlite
Tables .................................................................. 19
参数默认值说明
DB_CONNECTIONsqlite可换 mariadb / mysql / pgsql(官方文档原文)
DB_HOST/DB_PORT/DB_DATABASE/DB_USERNAME/DB_PASSWORD未设仅外置数据库时需要;SQLite 模式下库文件固定在 database/sqlite 卷

19 张表按职责分组:核心域(users、vaults、vault_nodes、tags、tag_vault_node、vault_node_vault_node 链接表、user_vault 协作表、notifications、settings、social_accounts)、Laravel 设施(sessions、cache、cache_locks、jobs、job_batches、failed_jobs、password_reset_tokens、migrations)。会话与队列默认走数据库而非文件——这正是 compose 里看不到 redis 的原因。

4.3 认证(OIDC_* / SETTINGS_*)

本地认证开关:SETTINGS_LOCAL_AUTH_ENABLED(默认 true;实测运行时 props local_auth_enabled:true)。设 false 必须同时配置 OIDC 提供方与 OIDC_POST_LOGOUT_REDIRECT_URI,否则无人可登录。

单提供方五件套(官方 README 示例,Pocket ID 场景):

- OIDC_NAME=Pocket ID              # 登录按钮显示名
- OIDC_CLIENT_ID=${OIDC_CLIENT_ID}         # IdP 侧创建客户端后注入
- OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET} # 同上,勿明文入库
- OIDC_REDIRECT_URI=http://localhost:8144/oauth/oidc/callback
- OIDC_BASE_URL=https://your-pocketid-url  # IdP 发现文档根

多提供方(v0.18.0 新增,实测 config/oidc.php 源码):OIDC_PROVIDERS 以逗号/空白分隔名字列表,每个提供方按 OIDC_<名字大写>_* 前缀配置,支持键:NAME、CLIENT_ID、CLIENT_SECRET、REDIRECT_URI、BASE_URL、SCOPES、EMAIL_CLAIMS、VERIFY_JWT(默认 true)、CLOCK_SKEW(默认 0)、PROXY、TOKEN_AUTH_METHOD、POST_LOGOUT_REDIRECT_URI。名字限字母/数字/下划线,自动小写生成驱动名 oidc_<name>。

💡 技术拓展:自托管应用的认证接入不止 OIDC 一种形态。对比——

方式特点Many Notes 支持
本地账号自主可控,需管密码✅ 默认开
OIDC(发现文档)通用协议,一套配置通吃主流 IdP✅ 核心路径
专用 OAuth(GitHub/GitLab/Slack)免搭 IdP✅ 内置专用驱动(官方 OAuth 文档)
反代头认证(Authelia 等)应用零配置❌ 未提供

4.4 邮件(MAIL_*)

默认 MAIL_MAILER=log——注册验证/重置密码邮件写入日志而不外发(实测 php artisan about:Mail ... log)。生产多用户实例需 SMTP 八件套:MAIL_MAILER=smtp、MAIL_HOST、MAIL_PORT、MAIL_USERNAME=${SMTP_USER}、MAIL_PASSWORD=${SMTP_PASS}、MAIL_ENCRYPTION=tls、MAIL_FROM_ADDRESS、MAIL_FROM_NAME。系统级凭据用环境变量注入,不落正文。

4.5 搜索(TYPESENSE_*)

参数默认值(实测 config/scout.php)说明
SCOUT_DRIVERtypesense(镜像 .env 内置)Scout 引擎驱动
TYPESENSE_HOSTlocalhost内置服务,勿改
TYPESENSE_PORT8108容器内监听
TYPESENSE_API_KEYxyz默认弱 key:Typesense 仅监听容器回环地址、未映射宿主端口,单容器形态下风险可控;若改为外置 Typesense 服务必须换强 key
GLOG_minloglevel3Typesense 日志级别(0-3 = INFO→FATAL),排障设 2(官方 FAQ)

索引结构实测(collections 接口):单集合 vault_nodes,字段 vault_id/name/content(string)+ updated_at(int64, sort)。

4.6 广播(REVERB_*)

内置 Laravel Reverb,实测监听 0.0.0.0:6001(启动日志 INFO Starting server on 0.0.0.0:6001)。关键参数:REVERB_APP_ID/APP_KEY/APP_SECRET(镜像内置生成,实测 .env 存在)、REVERB_APP_MAX_MESSAGE_SIZE(内置 2000000)、REVERB_SERVER_PORT(默认 8080,镜像内改 6001 避让 nginx)、REVERB_SCHEME/REVERB_HOST/REVERB_PORT(客户端回连地址,由 APP_URL 推导——HTTPS 反代下若广播连不上,检查这三项是否指向了外部可达的 wss 地址)。

五、基座镜像参数详解(serversideup/php 层)

实测 docker image inspect 采集的 baked 默认值(节选,均可用环境变量覆盖):

参数默认值说明
NGINX_HTTP_PORT / NGINX_HTTPS_PORT8080 / 8443compose 端口映射右侧固定值
NGINX_CLIENT_MAX_BODY_SIZE100Mnginx 请求体上限,小于 PHP 的 500M——大附件导入先撞这里
NGINX_FASTCGI_BUFFER_SIZE8k(buffers 8 8k)FPM 响应缓冲
NGINX_SERVER_TOKENSoff隐藏 nginx 版本头
PHP_MEMORY_LIMIT256M单请求内存
PHP_POST_MAX_SIZE / PHP_UPLOAD_MAX_FILE_SIZE500M官方文档给出的上传扩容点(可设 1G)
PHP_MAX_FILE_UPLOADS20单请求文件数
PHP_MAX_EXECUTION_TIME99长导出/导入相关
PHP_FPM_PM_CONTROLondemand进程模式:按需拉起,低内存占用友好;高并发可改 dynamic(配套 PHP_FPM_PM_MAX_CHILDREN=20、PM_START_SERVERS=2、PM_MIN_SPARE_SERVERS=1、PM_MAX_SPARE_SERVERS=3)
PHP_OPCACHE_ENABLE / VALIDATE_TIMESTAMPS / REVALIDATE_FREQ1 / 0 / 2OPcache 已开且不校验时间戳——基座 NOTICE 明示:改代码需重启才生效(正常运维不涉及)
PHP_DATE_TIMEZONEUTC与 APP_TIMEZONE 分属两层,改时区两个都设
SSL_MODEoff置 mixed/full 可让镜像自签直出 HTTPS;官方推荐仍是前置反代
TRUSTED_PROXYcloudflare可信代理模式,自建反代下影响真实客户端 IP 解析
HEALTHCHECK_PATH/healthcheck健康探测路径,实测返回 OK
LOG_OUTPUT_LEVELwarn基座脚本日志级别
S6_BEHAVIOUR_IF_STAGE2_FAILS2任一监督服务失败即终止——全家桶的故障暴露策略

六、运行时设置(管理界面)

settings 表仅两项(实测模型 casts + 控制器源码),超级管理员在 Admin → Settings 修改,接口 PATCH /settings 实测:

请求: {"registration":false,"auto_update_check":true}
响应: 200 {"settings":{"registration":false,"auto_update_check":true}}
  • registration:全站注册开关。UPGRADING.md 特别提示 0.11 起该开关从 compose 迁到了界面——老配置迁移时要在界面重设。
  • auto_update_check:新版本自动检查提醒(实测 props metadata.latest_version 即其产物)。

七、生产配置模板

适用场景:16GB 内存 / NVMe SSD / 2-10 人团队内网笔记(HTTPS 由 Caddy/nginx 反代终结):

name: many-notes-0.18.1-prod

services:
  php:
    image: brufdev/many-notes@sha256:4a61723eca842b644ced386b17e189d143e97096c65ac80eadca13c6cd89a739
    container_name: many-notes-0.18.1-app
    restart: unless-stopped
    environment:
      - APP_URL=https://notes.example.com
      - APP_TIMEZONE=Asia/Shanghai
      - PHP_DATE_TIMEZONE=Asia/Shanghai
      - APP_KEY=${MANYNOTES_APP_KEY}
      - PHP_POST_MAX_SIZE=1G
      - PHP_UPLOAD_MAX_FILE_SIZE=1G
      - NGINX_CLIENT_MAX_BODY_SIZE=1G
      - PHP_FPM_PM_CONTROL=dynamic
      - PHP_FPM_PM_START_SERVERS=2
      - PHP_FPM_PM_MAX_CHILDREN=20
      - OIDC_NAME=Pocket ID
      - OIDC_CLIENT_ID=${OIDC_CLIENT_ID}
      - OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET}
      - OIDC_REDIRECT_URI=https://notes.example.com/oauth/oidc/callback
      - OIDC_BASE_URL=https://idp.example.com
      - MAIL_MAILER=smtp
      - MAIL_HOST=smtp.example.com
      - MAIL_PORT=465
      - MAIL_USERNAME=${SMTP_USER}
      - MAIL_PASSWORD=${SMTP_PASS}
      - MAIL_ENCRYPTION=ssl
      - MAIL_FROM_ADDRESS=notes@example.com
    volumes:
      - database:/var/www/html/database/sqlite
      - logs:/var/www/html/storage/logs
      - private:/var/www/html/storage/app/private
      - typesense:/var/www/html/typesense
    ports:
      - "127.0.0.1:8080:8080"   # 仅反代可达,不对公网暴露

volumes:
  database:
  logs:
  private:
  typesense:

模板要点:digest 锁版、127.0.0.1 绑定防直暴露、真实密钥全部 ${VAR} 注入(.env 文件权限 600)、上传三参数(PHP×2 + nginx)同步放大、时区双层设置。反代需转发 X-Forwarded-Proto(HTTPS 判定)与 WebSocket 升级头(/app/{appId}/... 广播路径转发到 6001 或经 nginx 同源转发)。

八、常见问题

8.1 改了 APP_URL 页面样式/登录跳转错乱

APP_URL 参与生成绝对资源地址。改后必须 docker compose up -d 重建(配置被 php artisan optimize 缓存,实测 about 显示 Config: CACHED);仅重启进程不够,因为缓存文件在构建阶段生成。

8.2 上传 200M 文件报 413

三层限制取最小:PHP_UPLOAD_MAX_FILE_SIZE(500M) > NGINX_CLIENT_MAX_BODY_SIZE(100M)——先撞 nginx。同时调 NGINX_CLIENT_MAX_BODY_SIZE 与两个 PHP 参数(实测默认值见第五章)。

8.3 搜索突然全空

Typesense 卷未持久化或索引丢失,官方 FAQ 流程:确认 typesense 卷挂载 → php artisan upgrade:reimport-data-into-typesense 重建(实测回显 All data was successfully reimported into Typesense)。

8.4 界面语言

当前无中文语言包(APP_LOCALE 仅 en 资源)。汉化需求可跟踪官方仓库 issues。

8.5 换 PostgreSQL 后升级报迁移失败

外置 DB 场景 compose 需 depends_on: condition: service_healthy(官方 MySQL 示例已含健康检查),数据库未就绪时启动迁移会失败;确认 DB 服务 healthy 后 docker compose restart php 即可重跑自动迁移。

九、参考链接

Many Notes 0.18.1 配置参数详解 - Quzuo