Установка PowerDNS и PowerDNS Admin в Ubuntu Linux 20.04

Установка 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *