Plane 配置参数详解
Plane v1.4.2 自托管配置体系详解:plane.env 全量变量分组表(端口/TLS、WEB_URL+CORS 联动、数据库/Redis/RabbitMQ 连接、SECRET_KEY、S3 凭证与 FILE_SIZE_LIMIT、限流、Webhook 白名单)、实例级数据库配置(God Mode 注册开关/SSO/SMTP 键与默认值源码核对)、配置修改生效规则与 SECRET_KEY 轮换实测(2026-10-27)。
Plane 配置参数详解
目标:把 Plane(makeplane/plane,官网 plane.so)社区版 v1.4.2 自托管实例的配置体系讲透——编排层
plane.env全量变量、后端设置代码的读取点、实例级数据库配置(God Mode)三层各管什么、怎么改、何时生效。本文基于官方编排模板逐项核对 + 运行中实例的设置源码抽查(2026-10-27 实测环境:v1.4.2 Compose 部署,部署过程见《Plane Docker Compose 部署实战》)。
一、配置体系总览:三层结构
Plane 自托管实例的配置分三层,生效路径与修改方式各不相同:
| 层 | 载体 | 管什么 | 修改方式 | 生效时机 |
|---|---|---|---|---|
| 编排层 | plane.env(官方 variables.env 改名而来) | 端口、域名、密钥、依赖连接、副本数、TLS 证书 | 编辑文件 | 需 docker compose up -d 重建对应服务 |
| 应用层 | Django settings(读取环境变量) | 上述变量的运行时消费(CORS、上传上限、限流等) | 间接(随编排层) | 随服务重建 |
| 实例层 | 数据库 InstanceConfiguration 表 | 注册开关、SSO、SMTP、第三方 Key 等运营配置 | 实例管理端(God Mode)或接口 | 即时生效(带缓存失效机制) |
三个要点(源码抽查证据,2026-10-27 于运行实例核对):
- 实例层配置的默认值来自环境变量:实例配置注册表用
os.environ.get("ENABLE_SIGNUP", "0")这类写法取 env 作初值,存库后以库内值为准(/code/plane/license/api/views/instance.py第 60–130 行)。 - 实例层修改后即时生效:相关接口挂了
@invalidate_cache装饰器(/code/plane/license/api/views/configuration.py第 64 行)。 - 编排层改动必须重建服务才生效,且部分变量之间有联动约束(
WEB_URL/CORS_ALLOWED_ORIGINS/端口必须一致,见第六章)。
二、plane.env 全量变量详解
以下为 v1.4.2 官方模板 variables.env(部署后为 plane.env)的全部变量,按功能分组。「实测值」列为本文部署实例的生效值(部署要点见《Plane Docker Compose 部署实战》4.2 节)。
2.1 全局与版本
| 变量 | 实测值/默认 | 说明 |
|---|---|---|
| APP_RELEASE | v1.4.2 | 全部服务统一使用的版本标签,升级改这一处即可 |
| APP_DOMAIN | localhost | 入口域名,TLS 证书签发与入口路由使用 |
| DOCKERHUB_USER | makeplane | 镜像命名空间 |
| PULL_POLICY | if_not_present | 拉取策略(升级时官方建议改 always) |
| CUSTOM_BUILD | false | 是否使用自定义构建 |
| DOCKER_PLATFORM | (注释,默认不启用) | ARM64 上对应版本无镜像时取消注释并设 linux/amd64 |
2.2 副本数(编排 replicas 取值)
| 变量 | 实测值 | 说明 |
|---|---|---|
| WEB_REPLICAS / SPACE_REPLICAS / ADMIN_REPLICAS | 1 | 三个前端服务副本数 |
| API_REPLICAS / WORKER_REPLICAS / BEAT_WORKER_REPLICAS | 1 | Django API 与 Celery 副本数(beat 固定单副本) |
| LIVE_REPLICAS | 1 | 实时协作服务副本数 |
2.3 入口端口与 TLS 证书
| 变量 | 实测值 | 说明 |
|---|---|---|
| LISTEN_HTTP_PORT | 8145(官方默认 80) | 入口 HTTP 监听端口(proxy 服务发布端口) |
| LISTEN_HTTPS_PORT | 8146(官方默认 443) | 入口 HTTPS 监听端口 |
| CERT_ACME_CA | https://acme-v02.api.letsencrypt.org/directory | ACME CA 地址(默认 Let's Encrypt 生产环境) |
| CERT_EMAIL | (空) | 签发证书的联系邮箱;要自动签证书就填 |
| CERT_ACME_DNS | (空) | DNS-01 挑战配置,格式 acme_dns <DNS服务商> <API_KEY>(模板注释) |
| TRUSTED_PROXIES | 0.0.0.0/0 | 信任的代理网段(在自有网关后面时收紧为实际网段更安全) |
| SITE_ADDRESS | :80 | proxy 服务内部监听地址,一般不动 |
2.4 站点地址与跨域(联动强约束)
| 变量 | 实测值 | 说明 |
|---|---|---|
| WEB_URL | http://localhost:8145 | 对外站点基准地址:邮件里的链接、跨域基准、分享链接都基于它;带端口要与 LISTEN_HTTP_PORT 一致 |
| CORS_ALLOWED_ORIGINS | http://localhost:8145 | 允许的跨域来源;设置代码按逗号/空白拆分为列表(settings/common.py 第 182–186 行实测核对),必须包含 WEB_URL 同源地址 |
| DEBUG | 0 | 调试模式开关,模板默认 0,生产保持 0 |
| API_BASE_URL | http://api:8000 | 前端服务访问 API 的栈内地址(走内部网络,不需对外) |
⚠️ 三个变量必须联动一致:
LISTEN_HTTP_PORT、WEB_URL、CORS_ALLOWED_ORIGINS。实测若 WEB_URL 带了 8145 端口而 CORS 没带(或反之),页面能打开但登录/数据请求会因跨域失败。端口冲突改法与后果实测见《Plane Docker Compose 部署实战》第七章 Q2。
2.5 数据库(PostgreSQL)
| 变量 | 实测值 | 说明 |
|---|---|---|
| PGHOST / PGDATABASE | plane-db / plane | 业务库地址与库名(栈内服务名) |
| POSTGRES_USER / POSTGRES_PASSWORD / POSTGRES_DB | plane / plane / plane | 建库三件套(POSTGRES_* 同时是 plane-db 服务初始化变量) |
| POSTGRES_PORT | 5432 | 数据库端口 |
| PGDATA | /var/lib/postgresql/data | 数据目录(对应 pgdata 卷) |
| DATABASE_URL | (空) | 整串连接串;接外部托管数据库时填它并注释掉栈内 plane-db(官方编排注释「Comment this if you already have」) |
2.6 缓存/队列中间件(Redis 与 RabbitMQ)
| 变量 | 实测值 | 说明 |
|---|---|---|
| REDIS_HOST / REDIS_PORT | plane-redis / 6379 | 缓存连接(v1.4.2 编排实际是 Valkey,Redis 协议兼容) |
| REDIS_URL | (空) | 整串连接串,接外部 Redis 时使用 |
| RABBITMQ_HOST / RABBITMQ_PORT | plane-mq / 5672 | Celery 队列连接 |
| RABBITMQ_USER / RABBITMQ_PASSWORD / RABBITMQ_VHOST | plane / plane / plane | 队列认证与虚拟主机 |
| AMQP_URL | (空) | 整串连接串,接外部 RabbitMQ 时使用 |
2.7 密钥(必须替换)
| 变量 | 实测值 | 说明 |
|---|---|---|
| SECRET_KEY | 64 位 hex(模板默认 change-this-key-on-deployment) | Django 会话签名/加密基准密钥;官方注释给出两种生成方式:python3 -c "from django.utils.crypto import get_random_secret_key; print(get_random_secret_key())" 或 openssl rand -hex 32。更换会使全部登录会话失效(实测见第六章) |
| LIVE_SERVER_SECRET_KEY | 64 位 hex(模板默认同上) | 实时协作(live)与后端的共享密钥,官方注释同样要求部署前替换、openssl rand -hex 32 生成 |
2.8 对象存储(S3/MinIO)
| 变量 | 实测值 | 说明 |
|---|---|---|
| USE_MINIO | 1 | 1=使用编排内建 MinIO;0=接外部 S3(同时把 AWS_* 指向外部端点) |
| AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY | access-key / secret-key | 对象存储凭证;USE_MINIO=1 时同时也是 MinIO 根凭证(两者必须一致) |
| AWS_S3_ENDPOINT_URL | http://plane-minio:9000 | S3 端点;USE_MINIO=1 时为栈内地址 |
| AWS_S3_BUCKET_NAME | uploads | 附件桶名 |
| AWS_REGION | (空) | AWS S3 区域(接真实 AWS 时填) |
| FILE_SIZE_LIMIT | 5242880(默认同值) | 单附件上限(字节,默认 5 MB);实测确认同时约束 DATA_UPLOAD_MAX_MEMORY_SIZE(settings/common.py 第 353、371 行核对) |
| MINIO_ENDPOINT_SSL | 0 | 强制 HTTPS 语义开关(外部对象存储为 HTTPS 时按需设 1) |
💡 附件实际上传链路(实测,详见部署篇 4.8 节):客户端先经
/api/assets/v2/...登记换预签名凭证,再直传入口域名的/uploads路径(proxy 转发到对象存储)。FILE_SIZE_LIMIT参与预签名策略的content-length-range条件,因此声明 size 与实际字节数不一致会被 400 拒绝。
2.9 性能与限流
| 变量 | 实测值 | 说明 |
|---|---|---|
| GUNICORN_WORKERS | 1(默认 2) | API 服务 gunicorn 进程数;实测环境为资源占用设 1,生产建议按 CPU 调 |
| API_KEY_RATE_LIMIT | 60/minute(默认同值) | API Key 请求限流(settings/common.py 第 154 行核对) |
| AUTHENTICATION_RATE_LIMIT | 10/minute(默认同值) | 匿名认证接口(魔链生成/登录/注册、邮箱登录)按 IP 限流,DRF 格式 <n>/<period>(官方模板注释) |
2.10 Webhook SSRF 防护白名单
| 变量 | 实测值 | 说明 |
|---|---|---|
| WEBHOOK_ALLOWED_IPS | (空) | 逗号分隔 IP/CIDR,允许作为 webhook 目标的私有网段(如 10.0.0.0/8,192.168.1.0/24) |
| WEBHOOK_ALLOWED_HOSTS | (空) | 逗号分隔主机名,绕过私有 IP SSRF 校验(适合内网服务,官方示例 silo.namespace.svc.cluster.local) |
三、实例级配置(数据库层 / God Mode)
实例层配置存在数据库 InstanceConfiguration 表,初值取自环境变量,之后可在实例管理端(God Mode,入口 /god-mode/)可视化修改,改后即时生效。v1.4.2 注册表全部键及默认值(2026-10-27 从运行实例源码 /code/plane/license/api/views/instance.py 逐项核对):
3.1 注册与认证策略
| 键 | 默认 | 说明 |
|---|---|---|
| ENABLE_SIGNUP | 0 | 是否允许任意人自助注册 |
| DISABLE_WORKSPACE_CREATION | 0 | 禁止普通用户自建工作区 |
| ENABLE_MAGIC_LINK_LOGIN | 1 | 魔法链接登录开关 |
| ENABLE_EMAIL_PASSWORD | 1 | 邮箱密码登录开关 |
3.2 SSO/OAuth
| 键 | 默认 | 说明 |
|---|---|---|
| IS_GOOGLE_ENABLED / IS_GITHUB_ENABLED / IS_GITLAB_ENABLED / IS_GITEA_ENABLED | 0 | 四类第三方登录开关(客户端凭证同样经 God Mode 填写) |
| GITHUB_APP_NAME | (空) | GitHub App 名称 |
| SLACK_CLIENT_ID | (空) | Slack 集成 |
3.3 SMTP 邮件(邀请/通知必配)
| 键 | 默认 | 说明 |
|---|---|---|
| ENABLE_SMTP | 0 | SMTP 总开关 |
| EMAIL_HOST / EMAIL_PORT | (空)/(空) | SMTP 服务器与端口 |
| EMAIL_HOST_USER / EMAIL_HOST_PASSWORD | (空) | SMTP 认证 |
| EMAIL_USE_TLS / EMAIL_USE_SSL | — | 加密方式(值 1 为启用,二者互斥使用) |
| EMAIL_FROM | (空) | 发件人地址 |
实例信息里 is_smtp_configured 直接取 bool(EMAIL_HOST)(configuration.py 第 159 行核对);God Mode 提供「发送测试邮件」能力(对应 EmailCredentialCheckEndpoint,用上述凭证建立连接发样例邮件);「停用邮件」端点会把 EMAIL_* 键清空、ENABLE_SMTP 置 0(configuration.py 第 72–79 行核对)。未配置 SMTP 的实例无法发出邀请邮件,新用户只能靠管理员在后台直接添加或开放自助注册。
3.4 第三方服务键
| 键 | 默认 | 说明 |
|---|---|---|
| POSTHOG_API_KEY / POSTHOG_HOST | (空) | 产品遥测(自托管可留空) |
| UNSPLASH_ACCESS_KEY | (空) | 封面图库 |
| LLM_API_KEY | (空) | AI 能力密钥 |
四、配置修改操作手册
改编排层(plane.env):编辑 → 重建 → 验证三步。以改端口为例(实测命令):
cd /opt/data/quzuo/tmp/plane/cli/plane-app
vi plane.env # 改 LISTEN_HTTP_PORT / WEB_URL / CORS_ALLOWED_ORIGINS
docker compose -f docker-compose.yaml --env-file plane.env up -d
# 实测回显(重建 8 个服务后):
# Container plane-142-stack-admin-1 Recreated
# Container plane-142-stack-admin-1 Started
# ...(web/space/api/worker/beat-worker/live/proxy 同样 Recreated → Started)
重建范围由 Compose 按 env 依赖自动判定:改端口/域名/密钥会重建全部应用服务,改数据库连接则连 migrator 一起重建。
改实例层(God Mode):浏览器进入 http://<地址>:8145/god-mode/,在 Authentication/Email 等页签修改后保存即生效;接口方式对应 /api/instances/(需实例管理员会话)。
五、实测:SECRET_KEY 轮换行为
在运行实例上做了完整的密钥轮换实验(2026-10-27,详见部署篇第七章 Q3):
- 改前
/api/users/me/返回 200; plane.env更换SECRET_KEY后up -d重建(实测 Recreated 8 个应用服务);- 旧会话 cookie 立即失效,
/api/users/me/返回 401; - 重新登录后恢复 200,业务数据(工作区/项目/Issue/附件)不受影响。
结论:SECRET_KEY 只影响会话与签名,不参与数据加密,轮换安全性好但要预期全员掉线;LIVE_SERVER_SECRET_KEY 同理影响实时协作连接。
六、常见问题(配置视角)
Q1:能用 q1w2e3r4 之类的演示密码吗?
不能。密码策略是产品内置(Django 校验器 + zxcvbn 熵值 ≥3),不是环境变量可关闭项,实测 q1w2e3r4 被拒(This password is too common.)。详见部署篇 4.6 节。
Q2:接外部 S3 的最小变量集?
USE_MINIO=0 + 外部 AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY/AWS_S3_ENDPOINT_URL/AWS_S3_BUCKET_NAME(AWS Region 按需),并在编排文件注释掉 plane-minio 服务(官方编排注释原话「Comment this if you already have an S3-compatible storage」)。同理外部数据库填 DATABASE_URL、外部 Redis 填 REDIS_URL、外部队列填 AMQP_URL。
Q3:改了 env 但没生效?
编排层变量必须 docker compose up -d 重建;Compose 按 env 内容变化自动判断重建哪些服务,只改了 plane.env 不重建是无效的。实例层配置(God Mode)才是即时生效。
Q4:FILE_SIZE_LIMIT 调大后仍传不了大文件?
检查三点:该变量同时约束 DATA_UPLOAD_MAX_MEMORY_SIZE(需重建 api/worker);代理层若另有 client_max_body_size 限制需同步;预签名直传声明 size 必须与实际字节一致(实测差 1 字节即 400 EntityTooLarge)。
Q5:官方文档里说的 SMTP/OAuth 配置在 plane.env 里找不到?
v1.4.2 的运营类配置(SMTP、SSO、遥测键)默认值走实例配置注册表(os.environ.get("EMAIL_HOST", "") 等),既可在 plane.env 预置,也可部署后在 God Mode 填写,存库生效。编排模板里没有这些键属正常。
七、参考链接
- 官方自托管配置与治理文档(Instance Admin/God Mode、Authentication、Email、External Services):https://developers.plane.so/self-hosting/govern/instance-admin 与同目录 communication、database-and-storage 页(总览入口 https://developers.plane.so/self-hosting/overview ,2026-10-27 查询)
- 官方编排模板 variables.env(v1.4.2,本文逐项核对底本):https://github.com/makeplane/plane/releases/download/v1.4.2/variables.env(2026-10-27 查询)
- 后端设置读取点(实测环境源码抽查):
settings/common.py(CORS 第 182 行、FILE_SIZE_LIMIT 第 353/371 行、WEB_URL 第 314/422 行、API_KEY_RATE_LIMIT 第 154 行)、license/api/views/instance.py(实例配置注册表第 60–130 行)、license/api/views/configuration.py(SMTP 键与测试端点) - 本专栏部署实测:《Plane Docker Compose 部署实战》
- 本专栏认知篇:《Plane 介绍与选型指南》
- 本专栏运维命令篇:《Plane 常用 CLI 命令与运维实战》