Poweradmin v4.4.3 配置参数详解
两层配置体系、环境变量到配置键的全量映射与逐组参数详解:数据库、DNS 通路、DNSSEC、会话安全、界面、PowerDNS API 集成与 REST API 开关,关键参数均带修改-验证-恢复实测闭环。
Poweradmin v4.4.3 配置参数详解
目标:把 Poweradmin v4.4.3 的配置体系一次讲透——两层配置文件的覆盖顺序、各组参数的含义与默认值,以及对每个关键参数执行的「修改 → 验证 → 恢复」实测闭环。本文全部回显取自一台按《Poweradmin v4.4.3 Docker Compose 部署指南》部署好的服务器,配合源码与官方镜像内出厂配置交叉验证。
一、配置体系与实验环境
1.1 两层配置文件与覆盖顺序
Poweradmin 的配置由两层 PHP 文件构成,后者覆盖前者中的同名键:
| 层 | 路径 | 角色 |
|---|---|---|
| 出厂默认层 | /app/config/settings.defaults.php | 官方发布的全部参数默认值(v4.4.3 共 855 行,17 个分组) |
| 用户覆盖层 | /app/config/settings.php | 传统部署时手工编辑的文件;官方部署形态下每次启动由环境变量自动重新生成 |
关键结论(决定排障思路):官方部署形态下 settings.php 是生成物——修改它而不改环境变量,重启后会被重新生成覆盖。持久生效的唯一途径是改环境变量。
1.2 实验环境
| 项目 | 取值 |
|---|---|
| 操作系统 | Ubuntu 22.04(root 用户) |
| Poweradmin | v4.4.3(官方 poweradmin/poweradmin:4.4.3) |
| PowerDNS Authoritative | 4.9.18(gmysql 后端,api=yes,监听 8081) |
| 数据库 | MariaDB 10.11 |
| 部署形态 | 部署篇同款三服务 Compose 栈;Poweradmin Web 端口 8131 |
| 示例账号 | 管理员 admin / q1w2e3r4 |
| 配置读取命令 | docker exec poweradmin-4.4.3-app cat /app/config/settings.php |
1.3 验证方法
每个关键参数按两级验证,全部在上述服务器上执行:
- 文件级:修改环境变量并重建服务后,读取生成的
settings.php,确认键值; - 行为级:用 curl 访问 Web 页面或 REST API,确认行为变化。
1.4 生成结果快照(本栈基线)
部署篇栈启动后生成的 settings.php 关键段实测(节选自 docker exec poweradmin-4.4.3-app cat /app/config/settings.php,下同):
'database' => [
'type' => 'mysql',
'host' => 'db',
'port' => '3306',
'user' => 'poweradmin',
'password' => 'q1w2e3r4',
'name' => 'powerdns',
'file' => '/db/pdns.db',
'pdns_db_name' => '',
...
],
'dns' => [
'backend' => 'sql',
'hostmaster' => 'hostmaster.example.com',
'ns1' => 'ns1.example.com',
'ns2' => 'ns2.example.com',
...
],
'misc' => [
'display_stats' => false,
'timezone' => 'Asia/Shanghai',
...
],
misc.timezone 取值 Asia/Shanghai 来自环境变量 PA_TIMEZONE;database.password 等来自 DB_PASS。环境变量 → 配置键的完整映射规则见第十节。
二、数据库连接参数(database 组)
2.1 参数总表
| 环境变量 | 配置键 | 默认值 | 说明 |
|---|---|---|---|
DB_TYPE | database.type | 无(必填) | mysql / pgsql / sqlite |
DB_HOST | database.host | 空 | MySQL/PostgreSQL 必填;localhost 走 socket,TCP 请用 IP |
DB_PORT | database.port | 3306 / 5432 | SQLite 忽略 |
DB_USER / DB_PASS | database.user / password | 空 | SQLite 忽略 |
DB_NAME | database.name | 空 | 库必须预先存在 |
DB_FILE | database.file | /db/pdns.db | 仅 SQLite 使用 |
DB_CHARSET | database.charset | latin1 | 建 Poweradmin 表所用字符集,可选 utf8 |
PA_PDNS_DB_NAME | database.pdns_db_name | 空 | Poweradmin 表与 PowerDNS 表分库时指定 PowerDNS 库名(仅 MySQL) |
DB_SSL / DB_SSL_VERIFY / DB_SSL_CA / DB_SSL_KEY / DB_SSL_CERT | database.ssl* | false / false / 空 | 连接加密(4.1.0 引入) |
PDNS_VERSION | — | 49 | PowerDNS 库 schema 版本(45-49),灌表时使用 |
2.2 两个 schema 的初始化
DB_NAME 库里会同时容纳两类表:Poweradmin 自身的 17 张表(users、perm_items、perm_templ、api_keys、log_api、log_zones 等)与 PowerDNS 的 7 张表(domains、records、cryptokeys、domain_metadata、comments、supermasters、tsigkeys)。部署篇实测:首次启动时 Poweradmin 自动灌入自己的表;设置 PA_INIT_PDNS_SCHEMA=true 后还会顺带灌入 PowerDNS 的 gmysql 表(合计 24 张,SHOW TABLES 回显见部署篇 3.2 节)。PA_INIT_PDNS_SCHEMA 在设置了 PA_PDNS_DB_NAME 时自动跳过(此时 PowerDNS 库由 PowerDNS 自己初始化)。
2.3 密码字符限制(实测坑)
出厂配置 settings.defaults.php 对 database.password 的注释原文:
'password' => 'your_password', // AVOID: quotes, backslashes, line breaks
单引号、双引号、反斜杠、换行会导致启动时的配置文件生成失败。本栈示例密码 q1w2e3r4 即刻意避开了全部特殊字符。LDAP 绑定密码(PA_LDAP_BIND_PASSWORD)有同样的限制。
三、DNS 数据通路参数(dns 组)
3.1 dns.backend:两种数据通路
| 环境变量 | 配置键 | 默认 | 取值 |
|---|---|---|---|
PA_DNS_BACKEND | dns.backend | sql | sql=直连 PowerDNS 数据库读写 domains/records 表;api=全部变更经 PowerDNS REST API 下发(4.3.0 引入) |
sql 模式下 Poweradmin 仍需要 PowerDNS API 连接用于 DNSSEC 操作(见第六节);api 模式下 Poweradmin 自身表仍需要一个数据库(用户、权限模板存在本地库),但 zone 数据不再直连。
3.2 新建 zone 的默认值
这组参数决定「新建 zone」表单与自动生成 SOA 的初始值,全部被部署篇的 example.com 实测覆盖(创建后 SOA 回显 ns1.example.com hostmaster.example.com ...):
| 环境变量 | 配置键 | 默认值 |
|---|---|---|
DNS_NS1 / DNS_NS2 / DNS_NS3 / DNS_NS4 | dns.ns1-ns4 | ns1.example.com / ns2.example.com / 空 |
DNS_HOSTMASTER | dns.hostmaster | hostmaster.example.com |
PA_DNS_TTL | dns.ttl | 86400 |
PA_DNS_TTL_REVERSE | dns.ttl_reverse | 空(回落到 dns.ttl) |
PA_DNS_SOA_REFRESH / PA_DNS_SOA_RETRY / PA_DNS_SOA_EXPIRE / PA_DNS_SOA_MINIMUM | dns.soa_* | 28800 / 7200 / 604800 / 86400 |
PA_DNS_ZONE_TYPE_DEFAULT | dns.zone_type_default | MASTER(可选 NATIVE) |
注意部署篇实测坑:zone 类型下拉提交的是大写 MASTER/NATIVE,小写会被 Invalid or unexpected input given. 拒绝——PA_DNS_ZONE_TYPE_DEFAULT 同样必须写大写。
3.3 输入校验类参数
| 配置键 | 环境变量 | 默认 | 说明 |
|---|---|---|---|
strict_tld_check | PA_DNS_STRICT_TLD_CHECK | false | 严格校验 TLD 合法性 |
top_level_tld_check | PA_DNS_TOP_LEVEL_TLD_CHECK | false | 禁止创建顶级域 zone |
third_level_check | PA_DNS_THIRD_LEVEL_CHECK | false | 禁止创建三级域 zone |
txt_auto_quote | PA_DNS_TXT_AUTO_QUOTE | false | 自动为 TXT 内容补引号 |
prevent_duplicate_ptr | PA_DNS_PREVENT_DUPLICATE_PTR | true | 批量操作中禁止同 IP 重复 PTR |
custom_tlds | PA_DNS_CUSTOM_TLDS | [] | 允许 CNAME 指向的自定义 TLD(如 dn42,home,internal) |
txt_auto_quote 默认关闭,与部署篇实测坑 4 直接相关:TXT 内容必须自带双引号,否则报 TXT record content must be enclosed in quotes.。内网环境批量录 TXT 时可设 PA_DNS_TXT_AUTO_QUOTE=true 免去手工引号。
3.4 实测闭环:TTL 与 zone 类型默认值
修改环境变量(节选):
PA_DNS_TTL: "3600"
PA_DNS_ZONE_TYPE_DEFAULT: NATIVE
重建后读取生成结果(实测回显):
'ttl' => 3600,
'zone_type_default' => 'NATIVE',
验证通过后已恢复为默认值 86400 / MASTER。
四、DNSSEC 参数(dnssec 组)
4.1 dnssec.enabled 与环境变量名
| 环境变量 | 配置键 | 默认 |
|---|---|---|
PA_DNSSEC_ENABLED | dnssec.enabled | false |
4.2 排障实录:PA_DNSSEC 是无效变量
第一轮实验把变量写成 PA_DNSSEC: "true",重建后读生成结果(实测回显):
'dnssec' => [
'enabled' => false,
],
服务不报任何错,变量被静默忽略。查官方镜像内启动脚本 /usr/local/bin/docker-entrypoint.sh 第 807 行:
dnssec_enabled=$(to_php_bool "${PA_DNSSEC_ENABLED:-false}")
正确变量名是 PA_DNSSEC_ENABLED。改为该名后重建(实测回显):
'dnssec' => [
'enabled' => true,
],
4.3 行为验证:界面入口变化
dnssec.enabled=false 时,zone 编辑页(/zones/1/edit)没有任何 DNSSEC 区块。设为 true 后同一页面渲染出 DNSSEC 区块(HTML 实测节选):
<!-- DNSSEC -->
<div class="col-md-4">
<h6 class="text-muted mb-3">DNSSEC</h6>
<form method="post" action="" class="d-inline">
<input type="hidden" name="_token" value="...">
<button class="btn btn-outline-success btn-sm" type="submit" name="sign_zone">
<i class="bi bi-shield-check me-1 text-success"></i>Sign zone
</button>
</form>
</div>
源码依据:/app/templates/default/edit.html 以 {% if pdnssec_use %} 控制该区块,控制器传入 'pdnssec_use' => $isDnsSecEnabled(取自 dnssec.enabled)。另经 OpenAPI 规范核验:Poweradmin 自身 REST API(v2)没有 DNSSEC 端点,签名操作只能在 Web 界面完成,或直接调用 PowerDNS 的 API(见第六节与 API 使用篇)。
实验后已把 PA_DNSSEC_ENABLED 移除,恢复默认关闭。
五、会话与安全参数(security 组)
5.1 security.session_key:最关键的安全项
| 环境变量 | 配置键 | 出厂默认 |
|---|---|---|
PA_SESSION_KEY | security.session_key | change_this_key(历史默认 p0w3r4dm1n) |
该 key 用于会话数据加密与密码恢复令牌派生,必须改为 ≥32 字符的随机串。出厂默认值在源码里被显式列入黑名单(/app/lib/BaseController.php):
private const MIN_SESSION_KEY_LENGTH = 32;
...
if (!is_string($key) || in_array($key, ['p0w3r4dm1n', 'change_this_key'], true)) {
return _('Default session encryption key is used, please set it in your configuration file.');
}
if (strlen($key) < self::MIN_SESSION_KEY_LENGTH) {
return _('Session encryption key is too short, please set a longer one in your configuration file.');
}
实测闭环:把 PA_SESSION_KEY 设为 12 字符的 pa-short-key 后重建。服务照常启动、启动日志显示 Configuration loaded successfully——短 key 不阻断启动。用 admin 登录后,页面头部渲染出告警横幅(实测回显):
Session encryption key is too short, please set a longer one in your configuration file.
该告警仅对管理员可见(源码:'session_key_error' => $perm_is_godlike ? ... : false)。恢复 37 字符 key 后横幅消失。结论:生产部署若忘记改 key,唯一的暴露面就是管理员登录后的横幅,务必在上线检查清单里加入此项。
5.2 密码策略(password_policy)
| 环境变量 | 配置键 | 默认 |
|---|---|---|
PA_PASSWORD_RULES_ENABLED | security.password_policy.enable_password_rules | true |
PA_PASSWORD_MIN_LENGTH | security.password_policy.min_length | 6 |
PA_PASSWORD_REQUIRE_UPPERCASE / ..._LOWERCASE / ..._NUMBERS / ..._SPECIAL | 同名键 | true / true / true / false |
PA_PASSWORD_ENCRYPTION | security.password_encryption | bcrypt(可选 argon2i、argon2id;md5 已在 4.3.0 移除) |
PA_PASSWORD_COST | security.password_cost | 12 |
实测闭环:设 PA_PASSWORD_MIN_LENGTH: "10" 后重建(实测回显):
'min_length' => 10,
注意部署篇管理员 q1w2e3r4(8 位)创建于该参数变更之前;策略只约束改密/新建用户时的输入,不追溯已有口令。
5.3 登录表单令牌:脚本化访问的前置条件
| 配置键 | 环境变量 | 默认 |
|---|---|---|
security.login_token_validation | PA_LOGIN_TOKEN_VALIDATION | true |
security.global_token_validation | PA_GLOBAL_TOKEN_VALIDATION | true |
两者默认开启(3.9.0 引入):登录表单和全部后台表单都要求一次性 CSRF 令牌。部署篇实测坑的直接原因即此——不先取令牌直接 POST 登录,一律被 302 打回登录页。脚本化登录的正确三步:
$ curl -s -c cookies.txt http://127.0.0.1:8131/login | grep -o 'name="_token" value="[^"]*"' | head -1 | sed 's/.*value="//;s/"//'
NM5M3TyMhTKS80fPm6I0--6gZv_xcjPGf-1sjgPL
$ curl -s -b cookies.txt -c cookies.txt -o /dev/null -X POST http://127.0.0.1:8131/login \
--data-urlencode "_token=NM5M3TyMhTKS80fPm6I0--6gZv_xcjPGf-1sjgPL" \
--data-urlencode "query_string=" --data-urlencode "userlang=en_EN" \
--data-urlencode "username=admin" --data-urlencode "password=q1w2e3r4" \
--data-urlencode "authenticate=Sign in"
$ curl -s -b cookies.txt -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8131/
200
生产环境不建议关闭这两项;仅在内网自动化测试且网络受控时考虑 PA_LOGIN_TOKEN_VALIDATION=false。
5.4 账户锁定(account_lockout)
| 环境变量 | 配置键 | 默认 |
|---|---|---|
PA_LOCKOUT_ENABLED | security.account_lockout.enable_lockout | false |
PA_LOCKOUT_ATTEMPTS | security.account_lockout.lockout_attempts | 5 |
PA_LOCKOUT_DURATION | security.account_lockout.lockout_duration | 15(分钟) |
PA_LOCKOUT_TRACK_IP | security.account_lockout.track_ip_address | true |
PA_LOCKOUT_CLEAR_ON_SUCCESS | security.account_lockout.clear_attempts_on_success | true |
公网可达的实例建议 PA_LOCKOUT_ENABLED=true。默认关闭,本轮未实测修改。
5.5 会话有效期
| 环境变量 | 配置键 | 默认 |
|---|---|---|
PA_SESSION_TIMEOUT | interface.session_timeout | 1800(30 分钟,单位秒) |
闲置超过该时长后需要重新登录。
六、PowerDNS API 集成参数(pdns_api 组)
| 环境变量 | 配置键 | 默认 | 说明 |
|---|---|---|---|
PA_PDNS_API_URL | pdns_api.url | 空 | 如 http://pdns:8081(3.7.0 引入) |
PA_PDNS_API_KEY | pdns_api.key | 空 | 与 PowerDNS pdns.conf 的 api-key 一致 |
PA_PDNS_SERVER_NAME | pdns_api.server_name | localhost | PowerDNS API 路径中的 server id |
PA_PDNS_API_TIMEOUT | pdns_api.timeout | 10 | 请求超时秒数(4.4.0 引入) |
PA_PDNS_WEBSERVER_USERNAME / ..._PASSWORD | pdns_api.webserver_* | 空 | PowerDNS webserver Basic Auth(抓取 /metrics 用) |
本栈实测取值(生成结果):
'pdns_api' => [
'display_name' => 'PowerDNS',
'url' => 'http://pdns:8081',
'key' => 'pa-pdns-api-key-4.4.3',
'server_name' => 'localhost',
'timeout' => 10,
...
],
与部署篇 pdns.conf 中 api-key=pa-pdns-api-key-4.4.3 对应。用途分两种场景:dns.backend='sql' 时仅 DNSSEC 签名/rectify 操作走该 API;dns.backend='api' 时它是唯一数据通路,此组参数变成必填。
七、REST API 开关参数(api 组)
7.1 api.enabled:总开关
| 环境变量 | 配置键 | 默认 |
|---|---|---|
PA_API_ENABLED | api.enabled | false |
PA_API_DOCS_ENABLED | api.docs_enabled | false |
PA_API_MAX_KEYS_PER_USER | api.max_keys_per_user | 5(管理员不限) |
PA_API_BASIC_AUTH_ENABLED / PA_API_BASIC_AUTH_REALM | api.basic_auth_* | false / Poweradmin API |
API key 的签发入口在 Web 界面「账户 → API Keys」(管理员可为自己或他人签发,pwa_ 前缀 64 位十六进制串)。注意 api.enabled 默认 false——部署篇与 API 使用篇能调通 /api/v2/* 的前提都是显式设了 PA_API_ENABLED=true。
实测闭环:把 PA_API_ENABLED 改为 "false" 重建后,携带有效 key 请求(实测回显):
$ curl -s -w '\nHTTP:%{http_code}\n' -H "X-API-Key: pwa_a5b5...(略)" http://127.0.0.1:8131/api/v2/zones
{"error":true,"message":"The API feature is disabled in the system configuration."}
HTTP:403
同一时刻 /api/docs 仍返回 200、Web 界面正常——docs_enabled 与 enabled 相互独立。恢复 "true" 后带 key 请求回到 200:
{"success":true,"data":{"zones":[{"id":1,"name":"example.com","type":"MASTER","created_at":null}]},"message":"Zones retrieved successfully","meta":{"timestamp":"2026-10-26 15:10:59"}}
7.2 排障对照表
| 现象 | 原因 | 处置 |
|---|---|---|
| 带 key 请求 401 | key 缺失/错误,或 API 未签发 | 界面重新签发,请求头用 X-API-Key |
带 key 请求 403 The API feature is disabled... | PA_API_ENABLED=false | 设 true 并重建服务 |
请求 /api/docs 404 | PA_API_DOCS_ENABLED=false | 设 true 并重建服务 |
PATCH /api/v2/... 返回 405 | 路由不支持该方法 | 按第九节方法表改用 PUT/DELETE |
八、界面显示参数(interface 组)
8.1 标题与品牌
| 环境变量 | 配置键 | 默认 |
|---|---|---|
PA_APP_TITLE | interface.title | Poweradmin(2.1.5 引入) |
PA_FAVICON_PATH / PA_LOGO_PATH | interface.favicon_path / logo_path | 空(用内置资源,4.4.0 引入) |
PA_THEME / PA_STYLE | interface.theme / style | default / light(4.0.0 引入) |
PA_BASE_URL_PREFIX | interface.base_url_prefix | 空(子路径部署如 /poweradmin,4.1.0 引入) |
PA_APPLICATION_URL | interface.application_url | 空(邮件里绝对链接的基础地址,密码重置/OIDC/SAML 必需) |
实测闭环:设 PA_APP_TITLE: PA-Lab 重建后,生成结果与页面双验证(实测回显):
'title' => 'PA-Lab',
<title>PA-Lab</title>
多套环境(生产/演练)共用同一套部署模板时,改标题是最快的区分手段。实验后已恢复默认。
8.2 语言与时区
| 环境变量 | 配置键 | 默认 | 说明 |
|---|---|---|---|
PA_DEFAULT_LANGUAGE | interface.language | en_EN | 界面默认语言 |
PA_ENABLED_LANGUAGES | interface.enabled_languages | 27 种语言串 | zh_CN 在默认列表内 |
PA_TIMEZONE | misc.timezone | UTC | 注意落在 misc 组(见 1.4 生成快照),影响界面时间显示与日志时间戳 |
8.3 列表与记录表单开关(节选)
| 环境变量 | 配置键 | 默认 | 说明 |
|---|---|---|---|
PA_ROWS_PER_PAGE | interface.rows_per_page | 10 | 列表分页大小 |
PA_SHOW_RECORD_ID | interface.show_record_id | false | 编辑页显示记录 ID 列 |
PA_SHOW_ADD_RECORD_FORM | interface.show_add_record_form | false | 常驻显示加记录表单 |
PA_SHOW_RECORD_EDIT_BUTTON / PA_SHOW_RECORD_DELETE_BUTTON | 同名键 | false | 每行独立的编辑/删除按钮 |
PA_SHOW_ZONE_COMMENTS | interface.show_zone_comments | true | 显示 zone 备注 |
PA_SHOW_PDNS_STATUS | interface.show_pdns_status | false | 仪表盘显示 PowerDNS 状态卡片 |
PA_DISPLAY_HOSTNAME_ONLY | interface.display_hostname_only | false | 记录名只显示主机名部分 |
PA_ENABLE_CONSISTENCY_CHECKS | interface.enable_consistency_checks | false | 开放数据库一致性检查页 |
实测闭环:设 PA_ROWS_PER_PAGE: "25" 后(实测回显):
'rows_per_page' => 25,
九、Poweradmin REST API 一览(配合 api 组)
api.enabled=true 且签发 key 后可用的全部端点(实查自本实例 /api/docs/v2/json 返回的 OpenAPI 规范,Poweradmin API V2 / 2.0.0,共 13 组资源):
/v2/zones get post
/v2/zones/{id} delete get put
/v2/zones/{id}/metadata get
/v2/zones/{id}/metadata/{kind} delete get put
/v2/zones/{id}/owners get post
/v2/zones/{id}/owners/{user_id} delete
/v2/zones/{id}/records get post
/v2/zones/{id}/records/bulk post
/v2/zones/{id}/records/{recordId} delete get put
/v2/zones/{id}/rrsets get patch post put
/v2/zones/{id}/rrsets/{name}/{type} delete get
/v2/users /v2/groups /v2/permissions /v2/permission-templates
/v2/zone-templates(含 /records 子资源)
鉴权统一走 X-API-Key 请求头;zone 的增删改查、记录与 rrsets 批量操作、用户/组/权限模板管理全部 API 化。完整的请求/响应实测与 curl 脚本见《Poweradmin v4.4.3 API 使用详解》。
十、其余分组参数速览
以下分组本轮未逐项实测修改,默认值实查自官方镜像内 settings.defaults.php(855 行,v4.4.3),标注「引入版本」便于评估升级影响:
10.1 logging 组(审计与诊断两套日志)
| 配置键 | 环境变量 | 默认 | 说明 |
|---|---|---|---|
logging.type / level | PA_LOGGING_TYPE / PA_LOGGING_LEVEL | null / info | 诊断日志(错误排查):null 关闭 / native 写 PHP error_log |
logging.database_enabled | PA_LOGGING_DATABASE_ENABLED | false | 审计日志入库(log_users/log_zones/log_groups 表) |
logging.syslog_enabled / syslog_identity / syslog_facility | PA_LOGGING_SYSLOG_* | false / poweradmin / LOG_USER | 审计日志发 syslog |
审计与诊断是两套独立系统:前者记录「谁改了什么」(增删改、登录登出),后者记录应用错误。合规要求留操作痕迹的部署开 database_enabled 或 syslog_enabled。
10.2 mail 组(密码重置/通知依赖)
| 配置键 | 环境变量 | 默认 |
|---|---|---|
mail.enabled | PA_MAIL_ENABLED | true |
mail.transport | PA_MAIL_TRANSPORT | php(可选 smtp/sendmail/logger) |
mail.from / from_name / return_path | PA_MAIL_FROM 等 | poweradmin@example.com |
mail.host / port / username / password / encryption / auth | PA_SMTP_* | 空 / 587 / 空 / 空 / tls / false |
密码重置(security.password_reset.enabled,默认 false)与用户名找回依赖邮件通路;transport=logger 时邮件内容写 error_log,是调试重置流程的免 SMTP 手段。
10.3 认证扩展:LDAP / OIDC / SAML
| 组 | 总开关环境变量 | 默认 | 关键子项 |
|---|---|---|---|
ldap | PA_LDAP_ENABLED | false | PA_LDAP_URI、PA_LDAP_BASE_DN、PA_LDAP_BIND_DN、PA_LDAP_BIND_PASSWORD、PA_LDAP_USER_ATTRIBUTE(OpenLDAP 用 uid,AD 用 sAMAccountName) |
oidc | PA_OIDC_ENABLED | false | 内置 azure/google/generic 提供商变量(PA_OIDC_AZURE_* 等 40+ 个),PA_OIDC_AUTO_PROVISION 默认 true,新用户默认挂 Guest 权限模板 |
saml | PA_SAML_ENABLED | false | 内置 azure/okta/auth0/keycloak/generic 提供商变量,PA_SAML_GENERIC_ALLOW_IDP_INITIATED 等(4.4.3 新增该键) |
三家默认全关;双因子认证 security.mfa.enabled(PA_MFA_ENABLED)同样默认 false,app_enabled/email_enabled 子开关默认 true。
10.4 modules 组与通知
| 配置键 | 环境变量 | 默认 | 说明 |
|---|---|---|---|
modules.csv_export.enabled | PA_MODULE_CSV_EXPORT_ENABLED | true | 记录列表 CSV 导出 |
modules.zone_import_export.* | PA_MODULE_ZONE_IMPORT_EXPORT_* | false | zone 文件导入导出(单文件上限 1MB、自动 TTL 300) |
modules.whois.* / modules.rdap.* | PA_MODULE_WHOIS_* / PA_MODULE_RDAP_* | false | WHOIS/RDAP 查询(默认仅管理员可用) |
modules.dns_wizards.* | PA_MODULE_DNS_WIZARDS_* | false | DMARC/SPF/DKIM/CAA 等记录向导 |
modules.email_previews.* | PA_MODULE_EMAIL_PREVIEWS_* | false | 邮件模板预览 |
notifications.zone_access_enabled | PA_NOTIFICATION_ZONE_ACCESS | false | zone 访问变更通知 |
十一、环境变量全量清单与无效变量排障
11.1 全量变量从哪里核对
官方镜像内 /usr/local/bin/docker-entrypoint.sh 是环境变量的唯一权威来源(官方文档站的环境变量表由 master 分支生成,包含 4.4.3 尚不存在的变量)。4.4.3 消费的 PA_* 变量共 180+ 个,提取命令与分组计数(实测):
$ docker exec poweradmin-4.4.3-app grep -o 'PA_[A-Z_0-9]*' /usr/local/bin/docker-entrypoint.sh | sort -u | wc -l
183
按前缀分组:数据库 DB_*(12 个)与 DNS 默认值 DNS_*(5 个);PA_DNS_* 22 个;安全 PA_PASSWORD_*/PA_LOCKOUT_*/PA_MFA_*/PA_PASSWORD_RESET_* 等 30+ 个;界面 PA_SHOW_*/PA_DISPLAY_*/PA_POSITION_* 等 20+ 个;认证 PA_LDAP_*/PA_OIDC_*/PA_SAML_* 合计 90+ 个;模块 PA_MODULE_* 18 个;API PA_API_* 5 个;PowerDNS 集成 PA_PDNS_* 8 个;邮件 PA_MAIL_*/PA_SMTP_* 12 个;管理员种子 PA_CREATE_ADMIN/PA_ADMIN_* 4 个。
11.2 排障实录:PA_WEB_ENABLED 在 4.4.3 无效
曾按官方文档站(master 分支生成)尝试 PA_WEB_ENABLED: "false" 以关闭 Web 界面、只留 API。重建后实测:GET / 照旧 302 到 /login、/login 200、带 key 的 /api/v2/zones 200——一切照常,变量无任何效果。回到 11.1 的提取清单核对:4.4.3 的 entrypoint 不消费 PA_WEB_ENABLED(它是后续 4.5+ 版本的特性)。结论:4.4.3 的 Web 界面无法用环境变量单独关闭;确有「仅 API」需求时,请升级版本或用反向代理在入口层封禁非 /api/ 路径。这也是「配置变量先查目标版本 entrypoint、再查文档站」的实证理由。
11.3 参数速查:五个高频坑
| 坑 | 现象 | 正确姿势 |
|---|---|---|
改 settings.php 手工文件 | 重启后被重新生成,改动丢失 | 官方部署形态下只改环境变量 |
PA_DNSSEC(无 _ENABLED) | DNSSEC 悄悄不开 | 用 PA_DNSSEC_ENABLED(4.2 实测) |
PA_WEB_ENABLED | 4.4.3 无效 | 该开关属 4.5+(11.2 实测) |
| 数据库密码含引号/反斜杠 | 启动时配置生成失败 | 密码只用字母数字与基础符号(2.3) |
| 会话 key 过短/未改 | 管理员登录后页面横幅告警 | ≥32 字符随机串(5.1 实测) |
十二、参考链接
- 本文实验底稿:《Poweradmin v4.4.3 介绍与选型指南》(版本考证与架构)、《Poweradmin v4.4.3 Docker Compose 部署指南》(实验环境复现步骤)
- 官方 Settings Reference:https://docs.poweradmin.org/reference/settings/(由源码生成,注意该页对应 master 分支;4.4.3 以本文镜像内
settings.defaults.php实测为准) - 出厂默认值源文件:https://github.com/poweradmin/poweradmin/blob/v4.4.3/config/settings.defaults.php
- Docker 环境变量官方文档:https://github.com/poweradmin/poweradmin/blob/master/docs/docker.md(10.2 节的版本差异即源于此)