Установка PowerDNS
Устанавливаем необходимые пакеты
# aptitude install pdns-server pdns-tools pdns-backend-pgsql
Создаем пользователя и базу данных
# su postgres
/$ psql
postgres=# CREATE USER pdns_user WITH PASSWORD 'Password';
postgres=# CREATE DATABASE pdns_db OWNER pdns_user;
postgres=# \q
$ exit
Пример конфигурации PowerDNS
Файл /etc/powerdns/pdns.conf:
allow-axfr-ips=45.138.27.6/32
also-notify=45.138.27.6
api=yes
api-key=SECRET_API_TOKEN
daemon=no
master=yes
default-soa-mail=chernousov@interlan.xyz
include-dir=/etc/powerdns/pdns.d
launch=gpgsql
local-address=0.0.0.0
security-poll-suffix=
setgid=pdns
setuid=pdns
webserver=yes
webserver-loglevel=normal
webserver-password=SECRET_API_TOKEN
webserver-port=11080
webserver-address=0.0.0.0
webserver-allow-from=0.0.0.0/0
gpgsql-host=127.0.0.1
gpgsql-dbname=pdns_db
gpgsql-user=pdns_user
gpgsql-password=SECRET_DB_PASSWORD
Инициализация схемы базы данных
Нормального механизма миграций не завезли и используем грузинское блюдо “ЖРИЧОДАЛИ” и инит скрипты и скрипты миграций в каталоге /usr/share/pdns-backend-pgsql/schema.
Всем удачи на этом этапе.
В идеале вы увидите примерно такой статус запуска сервиса:
# systemctl status pdns
● pdns.service - PowerDNS Authoritative Server
Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2022-12-18 15:26:32 +07; 6s ago
Docs: man:pdns_server(1)
man:pdns_control(1)
https://doc.powerdns.com
Main PID: 18702(pdns_server)
Tasks: 13(limit: 9297)
Memory: 6.5M
CGroup: /system.slice/pdns.service
└─18702 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no
дек 1815:26:32 srv-promo-01 pdns_server[18702]: PowerDNS Authoritative Server 4.2.1 (C)2001-2019 PowerDNS.COM BV
дек 1815:26:32 srv-promo-01 pdns_server[18702]: Using 64-bits mode. Built using gcc 9.2.1 20200202.
дек 1815:26:32 srv-promo-01 pdns_server[18702]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redis>
дек 1815:26:32 srv-promo-01 pdns_server[18702]: [webserver] Listening for HTTP requests on 0.0.0.0:11080
дек 1815:26:32 srv-promo-01 pdns_server[18702]: Master/slave communicator launching
дек 1815:26:32 srv-promo-01 pdns_server[18702]: Creating backend connection for TCP
дек 1815:26:32 srv-promo-01 systemd[1]: Started PowerDNS Authoritative Server.
дек 1815:26:32 srv-promo-01 pdns_server[18702]: About to create 3 backend threads for UDP
дек 1815:26:32 srv-promo-01 pdns_server[18702]: No master domains need notifications
дек 1815:26:33 srv-promo-01 pdns_server[18702]: Done launching threads, ready to distribute questions
Установка PowerDNS Admin
Установка необходимых пакетов и дополнительных инструментов
# apt install -y python3-dev git libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential curl
# curl -sL https://deb.nodesource.com/setup_14.x | bash -
# apt install -y nodejs
# curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
# echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
# apt update -y
# apt install -y yarn
Скачиваем последнюю версию из гита и подготавливаем виртуальное окружение
# git clone https://github.com/PowerDNS-Admin/PowerDNS-Admin.git /opt/powerdns-admin
# cd /opt/powerdns-admin/
# apt install python3.8-venv libmysqlclient-dev
# python3 -mvenv ./venv
# source ./venv/bin/activate
# pip install --upgrade pip
# pip install -r requirements.txt
Конфигурирование и тестовый запуск
Копируем файл конфигурации и редактируем его.
# cp ./configs/development.py ./configs/production.py
# mcedit ./configs/production.py
По умолчанию используется внутренняя база данных Sqlite, сервис запускается на порту 9191. Применяем миграции, инициализируем окружение и проводим тестовый запуск.
# export FLASK_CONF=/opt/powerdns-admin/configs/production.py
# export FLASK_APP=./powerdnsadmin/__init__.py
# flask db upgrade
# yarn install --pure-lockfile
# flask assets build
# export FLASK_ENV=production
# ./run.py
В проде запуск проводим через gunicorn.
# gunicorn --pid /tmp/powerdnsadmin.pid --bind 0.0.0.0:9191 'powerdnsadmin:create_app()'
Подготавливаем запуск от имени пользователя pdns
# chown -R pdns:pdns /opt/powerdns-admin/
Сервис SystemD для запуска в файле /etc/systemd/system/powerdns-admin.service:
[Unit]
Description=PowerDNS-Admin
After=network.target
[Service]
Environment="FLASK_CONF=/opt/powerdns-admin/configs/production.py"
Environment="FLASK_APP=./powerdnsadmin/__init__.py"
Environment="FLASK_ENV=production"
PIDFile=/tmp/powerdns-admin.pid
User=pdns
Group=pdns
WorkingDirectory=/opt/powerdns-admin
ExecStart=/opt/powerdns-admin/venv/bin/gunicorn --pid /tmp/powerdnsadmin.pid --bind 0.0.0.0:9191 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Установка в виде сервиса и реверс-прокси для nginx стандартные.
Пример docker-compose.yml для запуска PowerDNS Admin
version: "3.9"
services:
pdns-admin:
image: ngoduykhanh/powerdns-admin:latest
ports:
- "9191:80"
logging:
driver: json-file
options:
max-size: 50m
volumes:
- /etc/hosts:/etc/hosts
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
healthcheck:
test: wget --output-document=- --quiet --tries=1 http://127.0.0.1/ || exit 1
start_period: 60s
interval: 30s
timeout: 20s
retries: 7
environment:
- SQLALCHEMY_DATABASE_URI=mysql://login:password@10.77.77.254/powerdns_admin
- GUNICORN_TIMEOUT=60
- GUNICORN_WORKERS=2
- GUNICORN_LOGLEVEL=DEBUG
- OFFLINE_MODE=False