Appwrite 2.5.0 配置参数详解

Appwrite 2.5.0 的 .env 参数按十组逐项详解:_APP_OPTIONS_FORCE_HTTPS、Console 注册白名单、_APP_STORAGE_LIMIT 三项修改级实测(含修改前后真实接口回显),覆盖运行环境、域名网络、密钥安全、数据库、缓存、存储、函数计算、维护统计与端口参数,附高频 20 项生产建议速查表。

AppwriteAppwriteBaaS2026/10/18

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_ENVproduction运行环境标识。development 时日志更冗长;生产必须 production
_APP_EDITIONself-hosted运行版别标识,自托管固定 self-hosted
_APP_LOCALEen默认区域(影响新用户默认 locale、邮件模板语言)
_APP_SYSTEM_EMAIL_NAMEAppwrite系统邮件发件人名
_APP_SYSTEM_EMAIL_ADDRESSnoreply@appwrite.io系统邮件发件地址,生产应改为自有域名
_APP_SYSTEM_TEAM_EMAILteam@appwrite.io系统告警收件地址
_APP_WORKER_PER_CORE6每核 worker 数,影响异步并发能力
_APP_LOGGING_FORMATpretty日志格式(pretty/json)
_APP_COMPRESSION_ENABLEDenabledHTTP 响应压缩开关
_APP_COMPRESSION_MIN_SIZE_BYTES1024触发压缩的最小响应体积

四、域名与 HTTPS 类(含 _APP_OPTIONS_FORCE_HTTPS 实测)

变量默认值说明
_APP_DOMAINlocalhost主域名,控制台跳转、Cookie 域依赖它;生产必须改为真实域名
_APP_DOMAIN_FUNCTIONSfunctions.localhost函数自定义域名的父域
_APP_DOMAIN_SITESsites.localhostSites 站点父域
_APP_DOMAIN_TARGETlocalhost自定义域名 CNAME 指向的目标
_APP_DOMAIN_TARGET_A / _AAAA127.0.0.1 / ::1自定义域名 A/AAAA 记录指向
_APP_DOMAIN_TARGET_CNAMElocalhost同上 CNAME 形式
_APP_CUSTOM_DOMAIN_DENY_LISTexample.com,test.com,...禁止用户绑定的域名黑名单
_APP_OPTIONS_FORCE_HTTPSdisabled强制 HTTP→HTTPS 跳转
_APP_OPTIONS_FUNCTIONS_FORCE_HTTPSdisabled函数域名的同款开关
_APP_ROUTER_AUTO_CERTIFICATESenabled自动签发 TLS 证书
_APP_DNS8.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_ROOTenabled限制根管理员数量(首个注册后关闭后续)
_APP_CONSOLE_WHITELIST_EMAILS空允许注册 console 的邮箱白名单(逗号分隔)
_APP_CONSOLE_WHITELIST_IPS空允许访问 console 的 IP 白名单
_APP_CONSOLE_URL空自建控制台地址(覆盖默认控制台)
_APP_CONSOLE_SESSION_ALERTSdisabled新会话邮件提醒
_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_SECRETAPI 与函数执行器之间的调用密钥,默认 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_ENABLEDenabled 时对账户/集合加分布式锁,防并发写冲突

七、数据库类

变量默认值说明
_APP_DB_ADAPTERpostgresql主库内核,postgresql/mariadb/mongodb 三选一,安装器参数决定
_APP_DB_HOST / _APP_DB_PORTpostgresql / 5432主库地址
_APP_DB_SCHEMAappwrite主库库名
_APP_DB_USER / _APP_DB_PASSuser / password主库账号,生产必须改
_APP_DB_ROOT_PASSrootsecretpassword主库 root 密码,生产必须改
_APP_DB_ADAPTER_DOCUMENTSDBmongodbDocumentsDB(文档库)适配内核
_APP_DB_HOST_DOCUMENTSDB 等mongodb/27017DocumentsDB 连接参数
_APP_DOCUMENTSDBdisabledDocumentsDB 总开关;开启前需部署 MongoDB 并配置连接
_APP_DB_ADAPTER_VECTORSDBpostgresql向量库适配内核
_APP_VECTORSDBdisabled向量库总开关
_APP_EMBEDDINGenabled文本向量嵌入能力开关
_APP_LIMIT_DATABASE_BATCH100数据库批量写入单批上限

实测部署仅启用了 postgresql(安装器按 --database=postgresql 裁剪 compose,MongoDB/MariaDB 服务未纳入栈)。.env 中 DocumentsDB 指向 mongodb 但开关为 disabled,属于预留状态——开启 DocumentsDB 需要补部署 MongoDB 服务并改 compose,不是纯 .env 动作。

八、缓存与队列类

变量默认值说明
_APP_REDIS_HOST / _APP_REDIS_PORTredis / 6379Redis 地址(队列、缓存、发布订阅、限流全靠它)
_APP_REDIS_USER / _APP_REDIS_PASS空Redis 认证
_APP_MQTT_PORT8883Realtime MQTT TCP 端口
_APP_MQTT_WSS_PORT8084MQTT over WebSocket 端口
_APP_MQTT_REPLAY_DEPTH5断线重连重放的事件条数
_APP_MQTT_MAX_PACKET_SIZE64000单包上限(字节)

九、存储类(含 _APP_STORAGE_LIMIT 实测)

变量默认值说明
_APP_STORAGE_DEVICElocal存储后端:local / s3 / do_spaces / backblaze / linode / wasabi
_APP_STORAGE_S3_ACCESS_KEY 等空S3 兼容后端凭证(S3/DO/Backblaze/Linode/Wasabi 各一组)
_APP_STORAGE_LIMIT30000000(约 30MB)全实例单项目总存储限额字节
_APP_STORAGE_PREVIEW_LIMIT20000000参与图片预览转换的文件大小上限
_APP_STORAGE_ANTIVIRUSdisabled病毒扫描开关(需补部署 ClamAV)
_APP_FUNCTIONS_SIZE_LIMIT30000000函数代码包体积上限
_APP_FUNCTIONS_BUILD_SIZE_LIMIT2000000000函数构建产物上限

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_TIMEOUT900单次函数执行超时(秒)
_APP_FUNCTIONS_BUILD_TIMEOUT2700构建超时(秒)
_APP_FUNCTIONS_CONTAINERS10热驻留函数容器上限
_APP_FUNCTIONS_CPUS / _APP_FUNCTIONS_MEMORY0(不限)单函数 CPU/内存配额(0 不限,生产建议设上限防打满宿主)
_APP_FUNCTIONS_MEMORY_SWAP0交换区配额
_APP_FUNCTIONS_RUNTIMESnode-16.0,node-22,php-8.0,python-3.9,ruby-3.0允许的运行时列表
_APP_EXECUTOR_HOSThttp://exc1/v1执行器地址
_APP_EXECUTOR_RUNTIME_NETWORKappwrite_runtimes运行时网络名
_APP_BUILDS_VOLUMEappwrite-builds构建产物卷名
_APP_SITES_TIMEOUT / _APP_SITES_RUNTIMES900 / static-1,node-22,flutter-3.29Sites 构建参数

十一、维护与用量统计类

变量默认值说明
_APP_MAINTENANCE_INTERVAL86400维护任务周期(秒),每日清理一次
_APP_MAINTENANCE_RETENTION_EXECUTION1209600函数执行日志保留 14 天
_APP_MAINTENANCE_RETENTION_AUDIT1209600审计日志保留 14 天
_APP_MAINTENANCE_RETENTION_CACHE2592000缓存保留 30 天
_APP_MAINTENANCE_RETENTION_ABUSE86400限流记录保留 1 天
_APP_USAGE_STATSenabled用量统计开关(写 ClickHouse)
_APP_CONNECTIONS_DB_USAGE / _EXECUTIONShttp://appwrite:appwrite@clickhouse:8123/appwriteClickHouse 连接串(含账号密码,生产改密)
_APP_USAGE_PASSappwrite用量查询密码
_APP_GRAPHQL_INTROSPECTIONenabledGraphQL 内省开关
_APP_GRAPHQL_MAX_COMPLEXITY / _MAX_DEPTH / _MAX_BATCH_SIZE250 / 3 / 10GraphQL 防护三件套
_APP_OPTIONS_ABUSEenabledAPI 限流开关
_APP_PWNED_PASSWORDS_DSNnone://localhost弱口令库校验(none 关闭)

十二、端口与镜像版本类

变量默认值说明
_APP_HTTP_PORT8102(本文部署实测值,官方默认 80)HTTP 宿主端口
_APP_HTTPS_PORT8143(本文实测值,官方默认 443)HTTPS 宿主端口
_APP_MQTT_PORT / _APP_MQTT_WSS_PORT8883 / 8084MQTT 宿主端口
_APP_IMAGEappwrite/appwrite核心服务镜像仓库
_APP_VERSION2.5.0核心版本号,升级时改它
_APP_EXECUTOR_IMAGESopenruntimes/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 安装器已随机生成,无需手动改。

十五、参考链接