Appwrite 2.5.0 配置参数详解
Appwrite 2.5.0 的 .env 参数按十组逐项详解:_APP_OPTIONS_FORCE_HTTPS、Console 注册白名单、_APP_STORAGE_LIMIT 三项修改级实测(含修改前后真实接口回显),覆盖运行环境、域名网络、密钥安全、数据库、缓存、存储、函数计算、维护统计与端口参数,附高频 20 项生产建议速查表。
Appwrite 2.5.0 配置参数详解
本文所有参数行为均在 2026-10-18 于 Appwrite 2.5.0 实测环境逐项验证,修改前后对比的接口回显均为真实输出。参数全集约 220 个,本文按「运行环境 / 域名网络 / Console 控制 / 密钥安全 / 数据库 / 缓存 / 存储 / 函数计算 / 维护统计 / 端口」十组覆盖高频参数,并附速查表;未列出的长尾参数(VCS 代码托管、OAuth 供应商、SMTP 细分项)见官方环境变量总表。
一、环境信息
| 项目 | 内容 |
|---|---|
| 实测日期 | 2026-10-18 |
| 实测版本 | Appwrite 2.5.0(/v1/health/version 实测返回 {"version":"2.5.0"}) |
| 部署形态 | 官方安装器生成的 Compose 栈,17 个服务(部署过程见《Appwrite Docker Compose 部署指南》) |
| 配置文件 | 部署目录下 .env(8188 字节,221 行)+ docker-compose.yml |
| 管理账号 | admin@example.com / q1w2e3r4 |
| 实测项目 | quzuo-demo(组织 quzuo-org 下) |
查看当前生效的关键参数:
grep -E '_APP_ENV=|_APP_EDITION=|_APP_LOCALE=|_APP_DOMAIN=|_APP_DB_ADAPTER=|_APP_STORAGE_LIMIT=|_APP_HTTP_PORT=' .env
实测回显:
_APP_ENV="production"
_APP_EDITION="self-hosted"
_APP_LOCALE="en"
_APP_DOMAIN="localhost"
_APP_DB_ADAPTER="postgresql"
_APP_STORAGE_LIMIT="30000000"
_APP_HTTP_PORT="8102"
二、.env 文件与生效机制
2.1 文件结构
.env 按功能域分组排列,行格式为 KEY="value"(布尔/开关用 enabled/disabled 字符串,非 true/false)。安装器按部署参数预填:--http-port=8102 写入 _APP_HTTP_PORT,--database=postgresql 写入 _APP_DB_ADAPTER 及 _APP_DB_HOST。首次生成时 _APP_OPENSSL_KEY_V1、_APP_NOTIFICATIONS_TRACKING_SECRET、_APP_GEO_SECRET 三个密钥为随机值,每次生成不同,升级重装时必须沿用旧值。
2.2 修改后如何生效
所有变量在服务进程启动时读取,修改 .env 后必须重建 appwrite 服务进程:
docker compose up -d appwrite
实测回显:
Container appwrite Starting
Container appwrite Started
约 8~10 秒后 /v1/health 恢复 {"status":"pass"},新变量即已生效。变量改动会即时反映到接口行为(下文三组实测可证)。个别参数同时影响多个服务(如 _APP_STORAGE_LIMIT 校验发生在 API 进程,_APP_HTTP_PORT 影响网关),需重建对应服务或整个栈。
三、运行环境与系统类
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_ENV | production | 运行环境标识。development 时日志更冗长;生产必须 production |
_APP_EDITION | self-hosted | 运行版别标识,自托管固定 self-hosted |
_APP_LOCALE | en | 默认区域(影响新用户默认 locale、邮件模板语言) |
_APP_SYSTEM_EMAIL_NAME | Appwrite | 系统邮件发件人名 |
_APP_SYSTEM_EMAIL_ADDRESS | noreply@appwrite.io | 系统邮件发件地址,生产应改为自有域名 |
_APP_SYSTEM_TEAM_EMAIL | team@appwrite.io | 系统告警收件地址 |
_APP_WORKER_PER_CORE | 6 | 每核 worker 数,影响异步并发能力 |
_APP_LOGGING_FORMAT | pretty | 日志格式(pretty/json) |
_APP_COMPRESSION_ENABLED | enabled | HTTP 响应压缩开关 |
_APP_COMPRESSION_MIN_SIZE_BYTES | 1024 | 触发压缩的最小响应体积 |
四、域名与 HTTPS 类(含 _APP_OPTIONS_FORCE_HTTPS 实测)
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_DOMAIN | localhost | 主域名,控制台跳转、Cookie 域依赖它;生产必须改为真实域名 |
_APP_DOMAIN_FUNCTIONS | functions.localhost | 函数自定义域名的父域 |
_APP_DOMAIN_SITES | sites.localhost | Sites 站点父域 |
_APP_DOMAIN_TARGET | localhost | 自定义域名 CNAME 指向的目标 |
_APP_DOMAIN_TARGET_A / _AAAA | 127.0.0.1 / ::1 | 自定义域名 A/AAAA 记录指向 |
_APP_DOMAIN_TARGET_CNAME | localhost | 同上 CNAME 形式 |
_APP_CUSTOM_DOMAIN_DENY_LIST | example.com,test.com,... | 禁止用户绑定的域名黑名单 |
_APP_OPTIONS_FORCE_HTTPS | disabled | 强制 HTTP→HTTPS 跳转 |
_APP_OPTIONS_FUNCTIONS_FORCE_HTTPS | disabled | 函数域名的同款开关 |
_APP_ROUTER_AUTO_CERTIFICATES | enabled | 自动签发 TLS 证书 |
_APP_DNS | 8.8.8.8 | 域名解析校验用的 DNS |
4.1 实测:开启 _APP_OPTIONS_FORCE_HTTPS
把 .env 中 _APP_OPTIONS_FORCE_HTTPS="disabled" 改为 "enabled" 并重建 appwrite 服务后:
curl -s -i http://127.0.0.1:8102/v1/health
实测回显:
HTTP/1.1 301 Moved Permanently
Content-Length: 0
Content-Type: text/html
Date: Sun, 18 Oct 2026 12:22:41 GMT
Location: https://127.0.0.1/v1/health
Server: swoole-http-server
所有 HTTP 请求被 301 到同路径 HTTPS。改回 disabled 重建后恢复正常 API 响应。结论:该开关只控制「是否跳转」,不负责证书——生产开启它的前提是网关已配好 443 证书(_APP_ROUTER_AUTO_CERTIFICATES=enabled 时依赖 _APP_DOMAIN 可解析到本机)。
五、Console 访问控制类(含白名单实测)
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_CONSOLE_WHITELIST_ROOT | enabled | 限制根管理员数量(首个注册后关闭后续) |
_APP_CONSOLE_WHITELIST_EMAILS | 空 | 允许注册 console 的邮箱白名单(逗号分隔) |
_APP_CONSOLE_WHITELIST_IPS | 空 | 允许访问 console 的 IP 白名单 |
_APP_CONSOLE_URL | 空 | 自建控制台地址(覆盖默认控制台) |
_APP_CONSOLE_SESSION_ALERTS | disabled | 新会话邮件提醒 |
_APP_CONSOLE_GITHUB_APP_ID / _SECRET | 空 | 控制台 GitHub 登录集成 |
5.1 实测:_APP_CONSOLE_WHITELIST_EMAILS
设置 _APP_CONSOLE_WHITELIST_EMAILS="admin@example.com" 并重建服务后,用白名单外邮箱注册 console 账号:
curl -s -X POST http://127.0.0.1:8102/v1/account \
-H 'X-Appwrite-Project: console' -H 'Content-Type: application/json' \
-d '{"userId":"unique()","email":"evil@test.com","password":"q1w2e3r4","name":"Evil"}'
实测回显:
{"message":"Console registration is restricted to specific emails. Contact your administrator for more information.","code":401,"type":"user_email_not_whitelisted","version":"2.5.0"}
白名单内但已存在的邮箱(注册请求越过了白名单检查,撞上根管理员数量限制):
{"message":"Sign up to the console is restricted. You can contact an administrator to update console sign up restrictions by setting _APP_CONSOLE_WHITELIST_ROOT to \"disabled\".","code":501,"type":"user_console_count_exceeded","version":"2.5.0"}
还原白名单为空后,任意邮箱注册同样返回 501 user_console_count_exceeded——_APP_CONSOLE_WHITELIST_ROOT=enabled 时全实例只允许 1 个根管理员。生产建议:ROOT 保持 enabled(单人运维)或 disabled + EMAILS 白名单(团队运维),二选一。
六、密钥与安全类
| 变量 | 说明 |
|---|---|
_APP_OPENSSL_KEY_V1 | 主加密密钥(256 hex 字符)。加密数据库内凭证/会话签名。丢失即无法解密存量数据,泄露需全员改密。首次生成后入库保管 |
_APP_NOTIFICATIONS_TRACKING_SECRET | 消息追踪签名密钥 |
_APP_GEO_SECRET | 地理查询服务间调用密钥 |
_APP_EXECUTOR_SECRET | API 与函数执行器之间的调用密钥,默认 your-secret-key,生产必须改 |
_APP_JOBS_SECRET | 编排器调用密钥,默认 your-secret-key,生产必须改 |
_APP_TRUSTED_HEADERS | 信任的来源 IP 头(默认 x-forwarded-for) |
_APP_TRUSTED_PROXIES | 信任的代理网段(默认含 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 等);若前面另有反代,加入其网段,否则限流/日志里的 IP 是代理 IP |
_APP_EMAIL_SECURITY / _APP_EMAIL_CERTIFICATES | 证书签发告警邮箱覆盖 |
_APP_LOCKING_ENABLED | enabled 时对账户/集合加分布式锁,防并发写冲突 |
七、数据库类
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_DB_ADAPTER | postgresql | 主库内核,postgresql/mariadb/mongodb 三选一,安装器参数决定 |
_APP_DB_HOST / _APP_DB_PORT | postgresql / 5432 | 主库地址 |
_APP_DB_SCHEMA | appwrite | 主库库名 |
_APP_DB_USER / _APP_DB_PASS | user / password | 主库账号,生产必须改 |
_APP_DB_ROOT_PASS | rootsecretpassword | 主库 root 密码,生产必须改 |
_APP_DB_ADAPTER_DOCUMENTSDB | mongodb | DocumentsDB(文档库)适配内核 |
_APP_DB_HOST_DOCUMENTSDB 等 | mongodb/27017 | DocumentsDB 连接参数 |
_APP_DOCUMENTSDB | disabled | DocumentsDB 总开关;开启前需部署 MongoDB 并配置连接 |
_APP_DB_ADAPTER_VECTORSDB | postgresql | 向量库适配内核 |
_APP_VECTORSDB | disabled | 向量库总开关 |
_APP_EMBEDDING | enabled | 文本向量嵌入能力开关 |
_APP_LIMIT_DATABASE_BATCH | 100 | 数据库批量写入单批上限 |
实测部署仅启用了 postgresql(安装器按 --database=postgresql 裁剪 compose,MongoDB/MariaDB 服务未纳入栈)。.env 中 DocumentsDB 指向 mongodb 但开关为 disabled,属于预留状态——开启 DocumentsDB 需要补部署 MongoDB 服务并改 compose,不是纯 .env 动作。
八、缓存与队列类
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_REDIS_HOST / _APP_REDIS_PORT | redis / 6379 | Redis 地址(队列、缓存、发布订阅、限流全靠它) |
_APP_REDIS_USER / _APP_REDIS_PASS | 空 | Redis 认证 |
_APP_MQTT_PORT | 8883 | Realtime MQTT TCP 端口 |
_APP_MQTT_WSS_PORT | 8084 | MQTT over WebSocket 端口 |
_APP_MQTT_REPLAY_DEPTH | 5 | 断线重连重放的事件条数 |
_APP_MQTT_MAX_PACKET_SIZE | 64000 | 单包上限(字节) |
九、存储类(含 _APP_STORAGE_LIMIT 实测)
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_STORAGE_DEVICE | local | 存储后端:local / s3 / do_spaces / backblaze / linode / wasabi |
_APP_STORAGE_S3_ACCESS_KEY 等 | 空 | S3 兼容后端凭证(S3/DO/Backblaze/Linode/Wasabi 各一组) |
_APP_STORAGE_LIMIT | 30000000(约 30MB) | 全实例单项目总存储限额字节 |
_APP_STORAGE_PREVIEW_LIMIT | 20000000 | 参与图片预览转换的文件大小上限 |
_APP_STORAGE_ANTIVIRUS | disabled | 病毒扫描开关(需补部署 ClamAV) |
_APP_FUNCTIONS_SIZE_LIMIT | 30000000 | 函数代码包体积上限 |
_APP_FUNCTIONS_BUILD_SIZE_LIMIT | 2000000000 | 函数构建产物上限 |
9.1 实测:_APP_STORAGE_LIMIT 的即时约束
把 _APP_STORAGE_LIMIT 从 30000000 改为 1024 并重建服务后,创建存储桶的 maximumFileSize 立即被压到新限额内:
curl -s -X POST http://127.0.0.1:8102/v1/storage/buckets \
-H 'X-Appwrite-Project: quzuo-demo' -H "X-Appwrite-Key: <API Key>" \
-H 'Content-Type: application/json' \
-d '{"bucketId":"docs","name":"Docs","permissions":["read(\"any\")","create(\"users\")"],"fileSecurity":false,"enabled":true,"maximumFileSize":30000000}'
实测回显(旧值 30000000 直接被拒):
{"message":"Invalid `maximumFileSize` param: Value must be a valid range between 1 and 1,024","code":400,"type":"general_argument_invalid","version":"2.5.0"}
改用 maximumFileSize=1024 建桶成功后,上传 2KB 文件:
{"message":"File size not allowed","code":400,"type":"storage_invalid_file_size","version":"2.5.0"}
上传 200B 文件成功(节选):
{"$id":"6ad4bab322e350def298","bucketId":"docs","$createdAt":"2026-10-18T12:25:23.152+00:00","name":"small.bin",...
结论:_APP_STORAGE_LIMIT 同时是「桶最大文件」与「上传请求」的双重天花板,修改即时生效、无需迁移。生产按业务文件尺寸规划,建议 ≥ 100MB(100000000)。
十、函数与计算类
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_FUNCTIONS_TIMEOUT | 900 | 单次函数执行超时(秒) |
_APP_FUNCTIONS_BUILD_TIMEOUT | 2700 | 构建超时(秒) |
_APP_FUNCTIONS_CONTAINERS | 10 | 热驻留函数容器上限 |
_APP_FUNCTIONS_CPUS / _APP_FUNCTIONS_MEMORY | 0(不限) | 单函数 CPU/内存配额(0 不限,生产建议设上限防打满宿主) |
_APP_FUNCTIONS_MEMORY_SWAP | 0 | 交换区配额 |
_APP_FUNCTIONS_RUNTIMES | node-16.0,node-22,php-8.0,python-3.9,ruby-3.0 | 允许的运行时列表 |
_APP_EXECUTOR_HOST | http://exc1/v1 | 执行器地址 |
_APP_EXECUTOR_RUNTIME_NETWORK | appwrite_runtimes | 运行时网络名 |
_APP_BUILDS_VOLUME | appwrite-builds | 构建产物卷名 |
_APP_SITES_TIMEOUT / _APP_SITES_RUNTIMES | 900 / static-1,node-22,flutter-3.29 | Sites 构建参数 |
十一、维护与用量统计类
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_MAINTENANCE_INTERVAL | 86400 | 维护任务周期(秒),每日清理一次 |
_APP_MAINTENANCE_RETENTION_EXECUTION | 1209600 | 函数执行日志保留 14 天 |
_APP_MAINTENANCE_RETENTION_AUDIT | 1209600 | 审计日志保留 14 天 |
_APP_MAINTENANCE_RETENTION_CACHE | 2592000 | 缓存保留 30 天 |
_APP_MAINTENANCE_RETENTION_ABUSE | 86400 | 限流记录保留 1 天 |
_APP_USAGE_STATS | enabled | 用量统计开关(写 ClickHouse) |
_APP_CONNECTIONS_DB_USAGE / _EXECUTIONS | http://appwrite:appwrite@clickhouse:8123/appwrite | ClickHouse 连接串(含账号密码,生产改密) |
_APP_USAGE_PASS | appwrite | 用量查询密码 |
_APP_GRAPHQL_INTROSPECTION | enabled | GraphQL 内省开关 |
_APP_GRAPHQL_MAX_COMPLEXITY / _MAX_DEPTH / _MAX_BATCH_SIZE | 250 / 3 / 10 | GraphQL 防护三件套 |
_APP_OPTIONS_ABUSE | enabled | API 限流开关 |
_APP_PWNED_PASSWORDS_DSN | none://localhost | 弱口令库校验(none 关闭) |
十二、端口与镜像版本类
| 变量 | 默认值 | 说明 |
|---|---|---|
_APP_HTTP_PORT | 8102(本文部署实测值,官方默认 80) | HTTP 宿主端口 |
_APP_HTTPS_PORT | 8143(本文实测值,官方默认 443) | HTTPS 宿主端口 |
_APP_MQTT_PORT / _APP_MQTT_WSS_PORT | 8883 / 8084 | MQTT 宿主端口 |
_APP_IMAGE | appwrite/appwrite | 核心服务镜像仓库 |
_APP_VERSION | 2.5.0 | 核心版本号,升级时改它 |
_APP_EXECUTOR_IMAGES | openruntimes/node:v5-16.0,...(7 个) | 运行时镜像清单 |
DOCKERHUB_PULL_USERNAME 等 | 空 | Docker Hub 拉取凭证(有速率限制时填) |
十三、参数速查表(高频 20 项)
| 变量 | 生产建议 |
|---|---|
_APP_DOMAIN | 改为真实域名(控制台/Cookie/证书全依赖) |
_APP_OPENSSL_KEY_V1 | 生成后妥善保管,永不更换除非泄露 |
_APP_EXECUTOR_SECRET / _APP_JOBS_SECRET | 改离默认值 your-secret-key |
_APP_DB_USER / _APP_DB_PASS / _APP_DB_ROOT_PASS | 全部改强密码 |
_APP_STORAGE_LIMIT | 按业务给足(默认 30MB 偏小) |
_APP_OPTIONS_FORCE_HTTPS | 网关证书就绪后 enabled |
_APP_CONSOLE_WHITELIST_ROOT / _EMAILS | 单管理员 enabled / 团队 disabled+白名单 |
_APP_SMTP_HOST 等五项 | 配置自有 SMTP,否则邮件类功能不可用 |
_APP_SMS_PROVIDER / _APP_SMS_FROM | 需短信登录/MFA 时配置 |
_APP_MAINTENANCE_RETENTION_EXECUTION / _AUDIT | 合规要求长保留时调大 |
_APP_FUNCTIONS_CPUS / _MEMORY | 设上限防单函数拖垮宿主 |
_APP_TRUSTED_PROXIES | 前置反代时加入其网段 |
_APP_SYSTEM_EMAIL_ADDRESS | 改为自有域名发件地址 |
_APP_USAGE_STATS | 统计需求关闭时可省 ClickHouse 负载 |
_APP_GRAPHQL_MAX_DEPTH | 默认 3 足够,勿随意放大 |
_APP_LIMIT_DATABASE_BATCH | 大批量导入场景调大 |
_APP_DB_ADAPTER | 部署时定死,后期切换等于重建数据层 |
_APP_HTTP_PORT / _APP_HTTPS_PORT | 按宿主端口规划改 |
_APP_FUNCTIONS_RUNTIMES | 只保留实际使用的运行时减少攻击面 |
_APP_STORAGE_DEVICE | 多实例/扩容场景切 S3 兼容后端 |
十四、FAQ
14.1 改了 .env 不生效?
变量在进程启动时读取。改完必须重建 appwrite 服务(docker compose up -d appwrite),只 restart 不会重读 env_file(restart 不重新注入环境变量)。判断是否生效:本文三组实测(FORCE_HTTPS 301 / 白名单 401 / 存储限额 400)都是重建后立刻可观测的行为变化,可任选一项做冒烟验证。
14.2 .env 里的引号能去掉吗?
不能随意去。安装器生成统一为 KEY="value" 带引号格式,Compose v2 的 env_file 解析会剥离引号;若混用带空格/特殊字符的值(如 _APP_TRUSTED_PROXIES 的逗号网段),保持引号最稳妥。空值变量写成 _APP_CONSOLE_WHITELIST_EMAILS=(无引号无值)即可,实测还原时如此操作并生效。
14.3 数据库适配器能从中途切换吗?
_APP_DB_ADAPTER 决定数据落在哪,切换等于换数据层:需先导出(REST API 遍历或官方迁移工具),再以新适配器重建部署导入。不要指望改个变量就完成切换。
14.4 哪些变量改动风险最高?
三类:_APP_OPENSSL_KEY_V1(动了全部加密数据失联)、_APP_DB_ADAPTER / _APP_DB_HOST(动了数据去向)、_APP_DOMAIN(动了 Cookie 域与证书签发,全部已登录会话失效)。这三类操作前先备份 postgresql 数据卷与 .env。
14.5 默认密钥必须改吗?
_APP_EXECUTOR_SECRET 与 _APP_JOBS_SECRET 默认 your-secret-key,_APP_DB_PASS 默认 password——内网也建议全改,这些是服务间信任的根。_APP_OPENSSL_KEY_V1 安装器已随机生成,无需手动改。
十五、参考链接
- 官方环境变量总表:https://appwrite.io/docs/advanced/self-hosting/environment-variables
- 官方配置指南:https://appwrite.io/docs/advanced/self-hosting/configuration
- 数据库后端配置:https://appwrite.io/docs/advanced/self-hosting/configuration/databases
- 部署过程与子网规划:《Appwrite Docker Compose 部署指南》
- 参数验证所用接口:《Appwrite 2.5.0 API 使用详解》