A web-based control panel for PowerDNS http://www.poweradmin.org
  • PHP 68.8%
  • HTML 14.7%
  • JavaScript 10.4%
  • CSS 2.6%
  • Shell 2.5%
  • Other 0.8%
Find a file
2026-09-25 08:26:52 +03:00
.devcontainer chore(devcontainer): enable display_errors so strict_variables catches template gaps 2026-08-30 14:31:29 +03:00
.github chore(ci): keep the 4.6.0 Docker hardening fixes off the master backport report 2026-09-21 15:34:58 +03:00
.phan fix(config): exclude local settings.php from phpcs and Phan checks 2026-03-13 10:27:26 +02:00
addons fix(addons): name the address family parameter for each update 2026-08-25 09:19:46 +03:00
assets refactor(templates): move record selection handlers to helper.js and drop client-side ID parsing 2026-07-31 10:18:00 +03:00
config feat(auth): add oidc.require_verified_email to demand a verified address before linking 2026-09-22 19:51:06 +03:00
data chore: update public_suffix_list.dat 2026-09-03 07:34:26 +03:00
install refactor(install): replace the DNS hostname regex helper with a trait constant 2026-08-23 13:11:43 +03:00
lib fix(api): use the shared authentication check in the internal API 2026-09-25 08:26:52 +03:00
locale chore(locale): update the NAPTR service message and its translations 2026-09-25 08:26:52 +03:00
playwright test(e2e): match IDN fixture zones by display name in the search fallback 2026-09-15 18:19:43 +03:00
sql fix(sql): let the 4.5.0 MySQL update repair a 4.3.0 run that stopped at the zone backfill (refs #1563) 2026-09-19 18:44:01 +03:00
templates fix(templates): read the password policy flag the service actually provides 2026-09-23 15:44:16 +03:00
tests fix(records): make the NAPTR service pattern unambiguous so it cannot backtrack 2026-09-25 08:26:51 +03:00
vendor chore(deps): optimize vendor for production 2026-09-19 09:48:20 +03:00
.dockerignore docs(contributing): replace the stale Transifex workflow with the pull request flow for translations 2026-09-12 08:56:07 +03:00
.gitattributes docs(contributing): replace the stale Transifex workflow with the pull request flow for translations 2026-09-12 08:56:07 +03:00
.gitignore Merge branch 'master' into develop 2026-09-04 18:41:35 +03:00
.hadolint.yaml ci: improve Dockerfile linting compliance and build optimization 2025-07-22 08:27:31 +03:00
.htaccess fix(config): deny web access to SQLite database files in the shipped server configs 2026-08-13 22:47:28 +03:00
.php-cs-fixer.php chore(deps): Add PHP static analysis and formatting tools 2025-01-09 08:19:14 +02:00
.semgrepignore ci(security): silence noisy Semgrep HTML-template rules unfit for Twig 2026-04-21 21:34:14 +03:00
caddy.conf.example fix(config): deny web access to SQLite database files in the shipped server configs 2026-08-13 22:47:28 +03:00
cliff.toml chore(release): reference commits by short sha in generated notes 2026-09-04 22:08:07 +03:00
composer.json docs(contributing): replace the stale Transifex workflow with the pull request flow for translations 2026-09-12 08:56:07 +03:00
composer.lock chore(deps): bump the composer group with 7 updates 2026-09-19 06:03:04 +00:00
CONTRIBUTING.md docs(contributing): replace the stale Transifex workflow with the pull request flow for translations 2026-09-12 08:56:07 +03:00
docker-entrypoint.sh feat(auth): add oidc.require_verified_email to demand a verified address before linking 2026-09-22 19:51:06 +03:00
DOCKER-SECRETS.md docs(docker): point Docker secrets at the documentation site 2026-08-16 09:48:19 +03:00
DOCKER.md feat(auth): add oidc.require_verified_email to demand a verified address before linking 2026-09-22 19:51:06 +03:00
Dockerfile chore(deps): bump dunglas/frankenphp from 21b7f6f to 71c41d9 (#1498) 2026-08-29 09:46:04 +03:00
dynamic_update.php fix(zones): read the plain domain_id column for zone ownership in sql backend mode 2026-09-03 07:31:20 +03:00
favicon.ico TTN #367 - Add favicon 2010-05-17 01:32:05 +00:00
index.php fix(zones): read the plain domain_id column for zone ownership in sql backend mode 2026-09-03 07:31:20 +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(config): deny web access to SQLite database files in the shipped server configs 2026-08-13 22:47:28 +03:00
package.json chore(deps): update @playwright/test from 1.58.2 to 1.59.1 2026-04-05 07:48:25 +03:00
phpcs.xml perf(ci): run phpcs across four workers (#1468) 2026-08-24 15:04:16 +03:00
phpdoc.dist.xml refactor: deprecate legacy config system in favor of ConfigurationManager 2025-04-08 21:10:56 +03:00
phpstan-baseline.neon chore: document the phpstan suppressions that must not be deleted 2026-08-03 09:02:16 +03:00
phpstan-complexity.neon chore: move cognitive complexity off the pull request gate 2026-08-03 08:09:01 +03:00
phpstan.neon perf(ci): persist the phpstan result cache between runs 2026-08-24 15:38:25 +03:00
phpunit.xml.dist chore(deps): upgrade PHPUnit to 11.5 and Psalm to 6.15 2026-02-12 15:20:07 +02:00
playwright.config.js test(e2e): retry once locally to absorb parallel-load flakes 2026-07-21 18:41:33 +03:00
psalm.xml chore(ci): replace the psalm gate with a taint-analysis script 2026-08-01 14:36:40 +03:00
README.md docs(readme): list the release/4.4.x branch in the version table 2026-09-04 18:08:57 +03:00
robots.txt Initial import 2007-04-10 22:38:28 +00: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.

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), supermasters, and zone templates
  • Native PowerDNS API backend mode - manage zones without direct access to the PowerDNS database
  • 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 is used for development of the next major release and may be unstable. For production use, stick with the release/4.3.x branch or a specific version tag (e.g. v4.3.4), or use the stable Docker tag.

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)
  • MySQL 5.7.x/8.x, MariaDB, PostgreSQL or SQLite database
  • PowerDNS authoritative server 4.0.0+ (including 4.x and 5.x series)

Tested on

Officially tested versions:

  • release/4.4.x (current): PHP 8.2, PowerDNS 4.9.12, MariaDB 10.11, PostgreSQL 16.11
  • release/4.3.x (stable): PHP 8.2, PowerDNS 4.9.12, MariaDB 10.11, PostgreSQL 16.11
  • release/4.2.x (maintenance): PHP 8.2, PowerDNS 4.9.12, 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

User-reported compatibility:

  • PowerDNS 4.8.x, 4.9.x, and 5.0.x series have been reported to work correctly by community users

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

Poweradmin maintains multiple release branches:

Branch Status Support
develop Experimental 4.5.x experimental features, may be unstable
master Next release 4.5.0 development after the develop merge, may be unstable
release/4.4.x Current release 4.4.x releases - newest line, still hardening
release/4.3.x Stable Current stable line (recommended), patch releases and security updates
release/4.2.x Maintenance Security updates only, winding down
release/4.1.x End of support No further updates - upgrade to 4.3.x
release/4.0.x End of support No further updates - upgrade to 4.3.x
release/3.x LTS Bug fixes and security updates until December 2027

PHP Version Support

Important: Starting with version 4.2.x, the minimum required PHP version is 8.2. PHP 8.1 is no longer supported.

Poweradmin tracks the official PHP release lifecycle. PHP versions that have reached end-of-life are dropped from the next Poweradmin release; security-only versions remain supported until then. See docs.poweradmin.org → Requirements for the current supported range.

Long-Term Support (LTS)

The 3.9.x branch is designated as Long-Term Support (LTS), starting with version 3.9.8. This branch will receive bug fixes and security updates for at least two years, providing a stable option for organizations that prefer stability over immediate upgrades.

For more details, see the Poweradmin in 2025: Year in Review blog post.

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

For feature sponsorship, to speed up development of specific features, or to discuss ideas and issues, please contact me. Donations are accepted through GitHub Sponsors, Open Collective and PayPal. Companies can receive an invoice through Open Collective from anywhere, or directly for organizations within the EU.

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.