This guide deploys Poweradmin using Docker Compose with Ansible automation. The playbook sets up a complete PowerDNS backend stack with Poweradmin web interface.
Create inventory.ini:
[poweradmin_docker]
dns-admin.example.com ansible_host=192.168.1.100
[poweradmin_docker:vars]
poweradmin_domain=dns-admin.example.com
poweradmin_http_port=8080
enable_https=false
- name: Deploy Poweradmin with Docker Compose
hosts: poweradmin_docker
become: true
vars:
poweradmin_project_dir: /opt/poweradmin
poweradmin_version: "latest"
powerdns_version: "5.0.3"
poweradmin_http_port: 8080
pdns_api_key: "{{ lookup('password', '/dev/null chars=ascii_letters,digits length=32') }}"
pdns_db_password: "{{ lookup('password', '/dev/null chars=ascii_letters,digits length=32') }}"
mysql_root_password: "{{ lookup('password', '/dev/null chars=ascii_letters,digits length=32') }}"
poweradmin_db_password: "{{ lookup('password', '/dev/null chars=ascii_letters,digits length=32') }}"
tasks:
- name: Install Docker (Debian/Ubuntu)
ansible.builtin.apt:
update_cache: true
name:
- docker.io
- docker-compose
state: present
when: ansible_os_family == "Debian"
- name: Install Docker (RHEL)
ansible.builtin.dnf:
name:
- docker
- docker-compose
state: present
when: ansible_os_family == "RedHat"
- name: Create Poweradmin project directory
ansible.builtin.file:
path: "{{ poweradmin_project_dir }}"
state: directory
mode: "0755"
- name: Create subdirectories
ansible.builtin.file:
path: "{{ poweradmin_project_dir }}/{{ item }}"
state: directory
mode: "0755"
loop:
- init-pdns
- backups
- pdns-logs
- name: Deploy .env file
ansible.builtin.copy:
dest: "{{ poweradmin_project_dir }}/.env"
mode: "0600"
content: |
PDNS_API_KEY={{ pdns_api_key }}
PDNS_DB_PASSWORD={{ pdns_db_password }}
MYSQL_ROOT_PASSWORD={{ mysql_root_password }}
POWERADMIN_DB_PASSWORD={{ poweradmin_db_password }}
- name: Download PowerDNS schema
ansible.builtin.get_url:
url: "https://raw.githubusercontent.com/PowerDNS/pdns/master/modules/gmysqlbackend/schema.mysql.sql"
dest: "{{ poweradmin_project_dir }}/init-pdns/schema.sql"
mode: "0644"
- name: Deploy docker-compose.yml
ansible.builtin.copy:
dest: "{{ poweradmin_project_dir }}/docker-compose.yml"
mode: "0644"
content: |
version: '3.8'
services:
powerdns:
image: powerdns/pdns-auth-50:{{ powerdns_version }}
ports:
- "53:53/udp"
- "53:53/tcp"
environment:
- PDNS_AUTH_API_KEY=${PDNS_API_KEY}
- PDNS_gmysql-host=pdns-mysql
- PDNS_gmysql-user=pdns
- PDNS_gmysql-password=${PDNS_DB_PASSWORD}
- PDNS_gmysql-dbname=pdns
depends_on:
- pdns-mysql
pdns-mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=pdns
- MYSQL_USER=pdns
- MYSQL_PASSWORD=${PDNS_DB_PASSWORD}
volumes:
- pdns-mysql-data:/var/lib/mysql
- ./init-pdns:/docker-entrypoint-initdb.d
poweradmin:
image: poweradmin/poweradmin:{{ poweradmin_version }}
ports:
- "{{ poweradmin_http_port }}:80"
environment:
- POWERADMIN_PDNS_API_KEY=${PDNS_API_KEY}
- POWERADMIN_PDNS_DB_HOST=pdns-mysql
- POWERADMIN_PDNS_DB_PASS=${PDNS_DB_PASSWORD}
depends_on:
- pdns-mysql
volumes:
pdns-mysql-data:
- name: Start Poweradmin stack
community.docker.docker_compose:
project_src: "{{ poweradmin_project_dir }}"
state: present
detached: true
- name: Display completion message
ansible.builtin.debug:
msg: |
Poweradmin Docker deployment completed!
Access URL: http://{{ ansible_host }}:{{ poweradmin_http_port }}
Default admin: admin / admin (CHANGE IMMEDIATELY!)
ansible-playbook -i inventory.ini poweradmin-docker-install.yml
http://your-server:8080admin / admindocker compose psNeed help with Docker-based DNS infrastructure? We provide consulting for Docker Compose deployments, Kubernetes migrations, and production container orchestration. Contact office@linux-server-admin.com or visit our contact page.