A web-based control panel for PowerDNS http://www.poweradmin.org
  • PHP 73.2%
  • JavaScript 15.1%
  • HTML 6.6%
  • Shell 2.4%
  • CSS 1.9%
  • Other 0.7%
Find a file
2026-11-09 22:07:45 +02:00
.devcontainer chore(devcontainer): bump phpldapadmin/phpldapadmin in /.devcontainer 2026-11-07 22:16:52 +02:00
.doctum/theme/poweradmin style(docs): shrink the class reference headings a step 2026-09-15 18:07:06 +03:00
.github ci(deps): hold zircote/swagger-php below 7.0 on master until the 4.7.0 migration 2026-11-07 22:30:56 +02:00
.phan feat(cli): add a bin/poweradmin entry point with a zone:list command 2026-09-22 08:04:13 +03:00
addons fix(addons): match the Python DDNS client README example to its real options 2026-11-09 22:07:45 +02:00
assets fix(api): serve the Swagger UI from bundled assets instead of unpkg.com (closes #1865) 2026-11-07 09:12:35 +02:00
bin fix(deploy): match the deny blocks before the PHP handler in nginx.conf.example and keep the seed script CLI-only 2026-11-07 20:52:21 +02:00
config fix(import): cap the number of records in one zone file import 2026-11-08 08:54:22 +02:00
data chore(data): update TLD list from IANA 2026-10-11 20:18:43 +03:00
install fix(install): create the single sign-on link columns with the binary collation 2026-11-07 23:04:06 +02:00
lib fix(templates): require view access to the zone before saving it as a template 2026-11-09 07:26:22 +02:00
locale fix(locale): translate the zone import record cap message and drop the unused account lock message 2026-11-09 22:03:03 +02:00
playwright feat(templates): share a new zone template with groups from the add form (refs #1267) 2026-10-30 18:05:45 +02:00
sql fix(install): create the single sign-on link columns with the binary collation 2026-11-07 23:04:06 +02:00
templates fix(auth): default the Docker image to 20-character recovery codes and accept codes of any earlier length 2026-11-08 07:11:27 +02:00
tests fix(templates): require view access to the zone before saving it as a template 2026-11-09 07:26:22 +02:00
vendor fix(logs): keep posted values from planting fields or lines in audit logs and log DNSSEC private key exports 2026-11-08 07:45:53 +02:00
.dockerignore fix(docker): ship the record change email addon in the image 2026-10-22 03:34:20 +03:00
.gitattributes chore(cleanup): drop the dead Pages class, unread dnssec.debug key and duplicated CI steps 2026-09-15 19:03:27 +03:00
.gitignore chore: ignore the local notes folder 2026-10-26 07:55:49 +02:00
.hadolint.yaml ci: improve Dockerfile linting compliance and build optimization 2025-07-22 08:27:31 +03:00
.htaccess fix(deploy): deny config, lib, tests and vendor paths before the existing-file rule in .htaccess 2026-11-07 20:52:20 +02:00
.semgrepignore fix(api): serve the Swagger UI from bundled assets instead of unpkg.com (closes #1865) 2026-11-07 09:12:35 +02:00
caddy.conf.example docs(config): cap request body size in the nginx and caddy examples 2026-10-26 18:43:59 +02:00
cliff.toml chore(release): reference commits by short sha in generated notes 2026-09-04 22:08:09 +03:00
composer.json chore(composer): retry the doctum download so a brief server outage does not fail the docblock lint 2026-10-10 23:08:44 +03:00
composer.lock chore(deps): bump zircote/swagger-php 2026-11-07 22:42:57 +02:00
CONTRIBUTING.md docs(contributing): drop the retired develop branch note 2026-10-20 08:18:57 +03:00
docker-entrypoint.sh fix(auth): store MFA recovery codes with bcrypt and keep 10-character codes 2026-11-08 08:32:12 +02:00
DOCKER-SECRETS.md docs(docker): point Docker secrets at the documentation site 2026-08-16 09:48:19 +03:00
DOCKER.md fix(auth): store MFA recovery codes with bcrypt and keep 10-character codes 2026-11-08 08:32:12 +02:00
Dockerfile feat(ddns): accept /nic/update and use the client address when no IP is sent 2026-11-03 07:36:11 +02:00
doctum.php chore(docs): point the class reference source links at master now that develop is retired 2026-10-20 14:21:40 +03:00
dynamic_update.php fix(dnssec): rectify signed zones after a template is applied or a dynamic DNS update writes records 2026-11-02 13:03:15 +02:00
eslint.config.js test(e2e): assert the remaining computed conditions and enforce no-unused-vars 2026-09-23 11:45:34 +03:00
favicon.ico TTN #367 - Add favicon 2010-05-17 01:32:05 +00:00
index.php refactor(core): boot every entry point through one Kernel 2026-09-22 09:45:01 +03:00
LICENSE localisation templates were moved to locale directory, license to the root 2012-03-23 13:03:02 +02:00
nginx.conf.example fix(deploy): match the deny blocks before the PHP handler in nginx.conf.example and keep the seed script CLI-only 2026-11-07 20:52:21 +02:00
package.json chore(deps): bump eslint from 10.13.0 to 10.14.0 in the npm group 2026-11-07 22:16:57 +02:00
phpcs.xml perf(ci): run phpcs across four workers (#1468) 2026-08-24 15:04:16 +03:00
phpstan-baseline.neon refactor(core): read and write the session through one port 2026-09-22 16:07:35 +03:00
phpstan-complexity.neon chore: move cognitive complexity off the pull request gate 2026-08-03 08:09:01 +03:00
phpstan.neon fix(auth): check SAML responses against the advertised ACS URL so a port mapping in front of PHP does not refuse them 2026-10-25 21:30:24 +02:00
phpunit.xml.dist test: fail the suite on risky tests and add a local PHP 8.2-8.5 unit test run 2026-10-08 23:01:55 +03:00
playwright.config.js docs(e2e): document how to write isolated Playwright specs 2026-10-09 19:52:19 +03:00
psalm.xml refactor(core): group the dns domain services under their own namespace 2026-09-21 13:53:59 +03:00
README.md docs(readme): list MariaDB 10.6+ and MySQL 8.x as the supported MySQL-family databases (#1853) 2026-11-02 22:04:06 +02:00
robots.txt Initial import 2007-04-10 22:38:28 +00:00
SECURITY.md docs(security): ask for one vulnerability per report 2026-10-24 09:13:07 +03:00
transifex.yml refactor: standardize localization file names and remove unused templates 2023-12-04 19:51:56 +02:00

Poweradmin

release validations license php version docker pulls docker image size

Poweradmin is a DNS administration tool for PowerDNS that can be driven through a friendly web UI, a REST API, or both at the same time. Use the UI for day-to-day operations, the API for scripts and infrastructure-as-code, or run completely headless after the initial setup - the same validation runs on every path. It can work directly against the PowerDNS database (with API-assisted DNSSEC) or run entirely through the PowerDNS API in API backend mode.

DNSSEC-safe via the PowerDNS API. In API backend mode (4.3.0+) every change goes through the PowerDNS REST API, so PowerDNS itself keeps NSEC/NSEC3 chains correct and Poweradmin needs no access to its database. With the default SQL backend, set the PowerDNS API URL and key, and Poweradmin will rectify signed zones through the API after each change it makes. See PowerDNS API and DNSSEC.

Known issue: PowerDNS Auth 5.1.x drops one level of backslash escaping from records written through its API (PowerDNS issue 18159). In API backend mode, records holding \\ or \" can be changed or refused when any record with the same name and type is saved. Poweradmin warns before such saves; see PowerDNS API.

Zone editor with inline record management

docker run -d --name poweradmin -p 8080:80 -e DB_TYPE=sqlite -e PA_CREATE_ADMIN=1 poweradmin/poweradmin:latest

Features

  • All zone types (master, native, and slave), catalog zones with producer, consumer, and member management on PowerDNS 4.7+, supermasters, and zone templates
  • DNSSEC-safe via the PowerDNS API - API backend mode needs no direct access to the PowerDNS database, and the SQL backend rectifies signed zones through the API
  • Version-aware interface that adapts record types, metadata kinds, and terminology to the connected PowerDNS version
  • DNSSEC operations, plus a zone metadata editor for PowerDNS domainmetadata
  • REST API with OpenAPI documentation, and API keys that can be made read-only, restricted to specific operations, or scoped to specific zones
  • Bulk operations for records and reverse DNS, and secondary zone import over AXFR
  • Record change log with before/after snapshots of every record and zone change
  • Users, groups, and role-based permissions, with LDAP, SAML, OIDC, and TOTP two-factor authentication
  • 43 languages including right-to-left, light and dark themes, and full IPv6 support
  • Docker deployment with FrankenPHP

Full feature list

Automation

Poweradmin's REST API is wrapped by ready-made integrations, so zones can be managed from infrastructure tooling rather than a browser:

Screenshots

Login Screen

Login interface with multi-language support

Dashboard

Dashboard with quick actions and navigation

Zone Management

Zone list with sorting and filtering

Zone Metadata Editor

Poweradmin includes a zone metadata editor for PowerDNS domainmetadata. The editor supports:

  • selecting known metadata kinds with inline guidance
  • entering custom metadata kinds when needed
  • multi-value metadata such as ALLOW-AXFR-FROM using one row per value

Installation

For detailed installation instructions, please visit the official documentation.

Traditional Installation

  • Recommended method - via releases:
    • Get the latest stable release from releases
  • For specific needs - via Git:
    • Warning: The master branch carries the next release and may be unstable. For production use, stick with the release/4.4.x LTS branch or a specific version tag (e.g. v4.5.0), or pin the matching Docker tag (e.g. 4.5.0).

Docker Deployment

Quick Start with Docker:

docker run -d \
  --name poweradmin \
  -p 8080:80 \
  -e DB_TYPE=sqlite \
  -e PA_CREATE_ADMIN=1 \
  poweradmin/poweradmin:latest

Important:

  • DB_TYPE environment variable is required (sqlite, mysql, pgsql)
  • No admin user is created by default for security reasons. Use -e PA_CREATE_ADMIN=1 to create an admin user (a secure password will be auto-generated and shown in logs)

Want to drive PowerDNS from scripts instead of a browser? Add -e PA_API_ENABLED=true -e PA_API_DOCS_ENABLED=true and follow the Headless / API-First Quickstart - zero to scripted record updates in about five minutes.

  • Docker Hub: poweradmin/poweradmin
  • GitHub Container Registry: ghcr.io/poweradmin/poweradmin
  • Full documentation: DOCKER.md
  • Security with Docker Secrets: Docker Secrets

Features: Multi-database support (SQLite, MySQL, PostgreSQL), Docker secrets integration, FrankenPHP for enhanced performance.

Requirements

  • PHP 8.2 or higher (including 8.3, 8.4, 8.5, etc.)
  • PHP extensions: intl, gettext, openssl, filter, tokenizer, pdo, xml, pdo-mysql/pdo-pgsql/pdo-sqlite, ldap (optional)
  • MariaDB 10.6+, MySQL 8.x, PostgreSQL or SQLite database
  • PowerDNS Authoritative Server 4.x or 5.x, tested from 4.5 (see Platform Lifecycle for support dates)

Tested on

Officially tested versions:

  • master (4.6.0): PHP 8.2-8.5, PowerDNS 5.1.5, MariaDB 10.11, PostgreSQL 16.11
  • release/4.5.x: PHP 8.2, PowerDNS 5.1.5, MariaDB 10.11, PostgreSQL 16.11
  • release/4.4.x (LTS): PHP 8.2, PowerDNS 4.9.18, MariaDB 10.11, PostgreSQL 16.11
  • release/4.3.x (maintenance): PHP 8.2, PowerDNS 4.9.18, MariaDB 10.11, PostgreSQL 16.11
  • release/4.2.x (maintenance): PHP 8.2, PowerDNS 4.9.18, MariaDB 10.11, PostgreSQL 16.11
  • release/3.x (LTS): PHP 8.1, PowerDNS 4.7.4, MariaDB 10.11, MySQL 9.1, PostgreSQL 16.3, SQLite 3.45

Other PowerDNS versions: the development environment can also run PowerDNS 4.5, 4.6, 4.7, 4.8, 4.9 and 5.0 (PDNS_VERSION in .devcontainer/.env). Versions older than 4.5 are not tested. Many stable distributions still ship PowerDNS 4.x, so 4.x support stays.

Compatibility note: In the default SQL backend, Poweradmin operates primarily at the database level with PowerDNS, using the PowerDNS API for DNSSEC operations - the database schema stays relatively stable between PowerDNS releases, so compatibility is broad. In API backend mode, all operations go through the PowerDNS HTTP API instead. Since 4.4.0, the interface also detects the connected PowerDNS version and adjusts the available features accordingly.

Version Support

Version Status
4.5.x Current release
4.4.x LTS until December 2027, recommended for production. Last line with API v1
4.3.x, 4.2.x Last fixes only, end of life on 2027-01-31
3.9.x LTS until December 2027
4.1.x, 4.0.x, 3.8.x and older End of life, please upgrade

master holds 4.6.0 development and release/4.5.x takes 4.5.x fixes. The support rules, a timeline, and the PHP, PowerDNS and distribution support dates are on Version Support.

Contributing

We welcome contributions to Poweradmin! As the sole maintainer of this non-profit project, I work alongside our amazing contributors. See CONTRIBUTING.md for guidelines.

Support the Project

Poweradmin is independently developed and maintained. Your support helps keep the project alive and growing.

JetBrains logo.

JetBrains provides IDE licenses used for development of this project.

Organizations Supporting Development

PYUR
HLkomm Telekommunikations GmbH
IRAM
IRAM
stepping stone AG
stepping stone AG
VISTEC Internet Service GmbH
VISTEC Internet Service GmbH

Individual Donors

  • Stefano Rizzetto
  • Asher Manangan
  • Michiel Visser
  • Gino Cremer
  • Arthur Mayer
  • Dylan Blanqué
  • Tony Johnson
  • Deeefje
  • yBaca s.r.o.
  • Stephan Gogler
  • mcmufffin

Commercial support, upgrades, security reviews and sponsored feature development are available, see Support & Sponsorship or contact support@poweradmin.org. Donations are accepted through GitHub Sponsors, Open Collective and PayPal. Companies can receive an invoice directly or through Open Collective.

Community Projects

  • poweradmin-cli - Command-line interface for managing zones, records, users and groups through the Poweradmin REST API
  • poweradmin-go - Go SDK for the Poweradmin REST API
  • poweradmin-operator - Kubernetes operator for managing DNS zones and records via the Poweradmin API

Note

Poweradmin is an independent community project, not affiliated with PowerDNS.com or Open-Xchange.

License

This project is licensed under the GNU General Public License v3.0. See the LICENSE file for more details.