Настройка web-админки для PowerDNS

Собственно, я знаю о двух проектах для этой цели:

  1. https://www.poweradmin.org/ (https://github.com/poweradmin/poweradmin)
  2. https://github.com/ngoduykhanh/PowerDNS-Admin

Первый написан на php, работает напрямую с БД, позволяет настроить практически всё. Имеет неприятную особенность – в записях типа TXT не сохраняет “, что напрочь ломает доступ к этим записям через api, которое требует, чтобы текстовые поля хранили информацию внутри экранированного ” блока. Хотя на функционирование самого сервера это не влияет. Добавляет несколько своих таблиц и полей в исходную БД. Не ведет никаких логов работы в вэб-интерфейсе.

Второй – сборная солянка из python3, flask, nodejs. Ставится через ж... В общем – муторно. Работает исключительно через api, хотя и добавляет несколько своих таблиц в БД. Ведёт лог работы в вэб-интерфейсе. НЕ СОЗДАЁТ SuperMaster сервера. Хотя в общем, ИМХО, удобнее первой админки.

Установку второй админки на Centos 7 (и Centos 8) мы и опишем. Предполагаем, что с настройкой БД и самого PowerDNS вы справились раньше.

Вообще, – для Centos 7 есть штатный мануал в виках – https://github.com/ngoduykhanh/PowerDNS-Admin/wiki/Running-PowerDNS-Admin-on-Centos-7/

Он абсолютно рабочий, как ни странно. Маленькие дополнения:

  • репозиторий https://centos7.iuscommunity.org/ius-release.rpm можно не ставить, как и python36u. Нужная версия питона всё равно будет вытащена дальше, скриптом
  • Код демона systemd для запуска админки автоматически (пути к рабочей папки исправьте на свои)
[Unit]
Description=PowerDNS-Admin Service
After=multi-user.target
[Service]
Type=idle
ExecStart=/usr/local/powerdns-admin/flask/bin/python3 /usr/local/powerdns-admin/run.py
[Install]
WantedBy=multi-user.target
  • В коде скрипта run.py замените debug = True на debug = False

Установка для Centos 8 имеет свои особенности. Для инсталляции можно ориентироваться на статью для Fedora 30 из той же wiki. Мы же рассмотрим нюансы установки админки при использовании в качестве БД PostgreSQL. Следуем инструкциям отсюда творчески их перерабатывая для Centos 8.
Итак:

Для сборки нам будет нужен пакет postgresql-server-devel, компиляторы и ещё кое-что)). Ставим:

dnf install postgresql-contrib postgresql-plpython3 postgresql-server-devel gcc gc make -y
dnf install python3 python3-devel python3-pip -y
dnf install mariadb-devel mariadb-common openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel -y
dnf install yarn npm -y
dnf install python3-pip-wheel python3-setuptools-wheel python3-wheel-wheel -y

Да, вы правильно видите – пакеты для mariadb мы всё равно ставим!!! Иначе потом не соберётся…

Теперь готовим питон

pip3 install --upgrade pip
pip install psycopg2

Дальше можно следовать инструкциям для Fedora 31.

В скрипте для systemd указываем системный python3.

Конфиг PowerDNS-Admin лежит в каталоге ./powerdnsadmin/default_config.py.

Для работы с постгресом, комментируем строки с остальными БД, оставляя в итоге что-то такое:

import os
basedir = os.path.abspath(os.path.abspath(os.path.dirname(__file__)))

### BASIC APP CONFIG
SALT = 'salt'
SECRET_KEY = 'secret'
BIND_ADDRESS = '127.0.0.1'
PORT = 9191
LOGIN_TITLE = "PDNS"

HSTS_ENABLED = False
OFFLINE_MODE = False

# TIMEOUT - for large zones
TIMEOUT = 10

# LOG CONFIG
LOG_LEVEL = 'DEBUG'
LOG_FILE = 'logfile.log'
# For Docker, leave empty string
#LOG_FILE = ''

# Upload
UPLOAD_DIR = os.path.join(basedir, 'upload')

# DATABASE CONFIG
SQLA_DB_USER = 'pdns'
SQLA_DB_PASSWORD = 'password'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'

#PGSQL
SQLALCHEMY_DATABASE_URI = 'postgresql://'+SQLA_DB_USER+':'\
+SQLA_DB_PASSWORD+'@'+SQLA_DB_HOST+'/'+SQLA_DB_NAME

SQLALCHEMY_MIGRATE_REPO = os.path.join(basedir, 'db_repository')
SQLALCHEMY_TRACK_MODIFICATIONS = True

# POWERDNS CONFIG
PDNS_STATS_URL = 'http://127.0.0.1:8081/'
PDNS_API_KEY = 'api_key'
PDNS_VERSION = '4.3.0'

#Default Auth
BASIC_ENABLED = True
SIGNUP_ENABLED = True

Обратите внимание – мы вешаем админку на локалхост! Доступ к ней в дальнейшем будет через nginx или апач.

Конфиг хоста для nginx:

server {
listen you_ip:80;
server_name server_dns_name;

access_log /var/log/nginx/pdns-ssl-access.log;

keepalive_timeout 60;

client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_redirect off;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k;
proxy_buffer_size 8k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_headers_hash_bucket_size 64;

location ~ ^/static/ {
include /etc/nginx/mime.types;
root /usr/local/powerdns-admin/powerdnsadmin;
location ~* \.(jpg|jpeg|png|gif)$ {
expires 365d;
}
location ~* ^.+.(css|js)$ {
expires 7d;
}
}

location / {
proxy_pass http://127.0.0.1:9191;
proxy_read_timeout 120;
proxy_connect_timeout 120;
proxy_redirect off;
}
}

Обсуждение закрыто.