# PowerDNS: зони в базі даних і керування через API

> PowerDNS зберігає зони в MySQL замість файлів і відкриває REST API для автоматизації: встановлення, pdnsutil, GeoIP-бекенд і перевірка сервісу.

## Чим PowerDNS відрізняється від файлових DNS-серверів

BIND 9 зберігає кожну зону в окремому текстовому файлі — подробиці в статті [про авторитативний сервер на BIND 9](https://www.zevshost.net/uk/kb/bind9-avtoritativnyy-server/). PowerDNS Authoritative Server влаштований інакше: зони і записи живуть у реляційній базі — MySQL, PostgreSQL чи SQLite. Це зручно, коли зон тисячі і керує ними не адміністратор руками, а панель хостингу чи білінг через SQL-запити або REST API.

Друга відмінність — вбудований HTTP API, який дозволяє створювати зони і записи програмно, без редагування файлів і без rndc reload.

## Встановлення PowerDNS із бекендом MySQL

На Debian чи Ubuntu пакети ставляться так:

```
sudo apt update
sudo apt install pdns-server pdns-backend-mysql -y
```

Підключення до бази описується в `/etc/powerdns/pdns.conf`:

```
launch=gmysql
gmysql-host=localhost
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=CHANGE_ME
```

Схему таблиць створює готовий SQL-скрипт із пакета `pdns-backend-mysql`, після чого службу запускають командою `systemctl restart pdns`.

## Створення зони через pdnsutil

Керувати зонами з командного рядка найзручніше утилітою pdnsutil:

```
pdnsutil create-zone example.com ns1.example.com
pdnsutil add-record example.com www A 3600 203.0.113.10
pdnsutil add-record example.com @ MX 3600 "10 mail.example.com."
```

Кожна команда одразу записує дані в базу — окремого перезавантаження зони не потрібно, PowerDNS читає актуальні дані під час наступного запиту.

## Керування записами через REST API

Для автоматизації увімкніть вебсервер API в pdns.conf:

```
api=yes
api-key=CHANGE_ME
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
```

Після перезапуску зону можна створити одним запитом:

```
curl -X POST http://127.0.0.1:8081/api/v1/servers/localhost/zones \
  -H "X-API-Key: CHANGE_ME" \
  -H "Content-Type: application/json" \
  -d '{"name":"example.com.","kind":"Native"}'
```

Такий підхід застосовують панелі керування хостингом, які створюють зону автоматично в момент замовлення домену, без ручного втручання адміністратора.

## GeoIP-бекенд для гео-балансування

Модуль geoip дозволяє PowerDNS видавати різні IP-адреси залежно від країни чи континенту резолвера — це саме те завдання, яке розібрано в статті [про Anycast і GeoDNS](https://www.zevshost.net/uk/kb/anycast-geodns/). Бекенд підключається другим рядком launch і вказівкою на базу GeoIP:

```
launch+=geoip
geoip-database-files=/usr/share/GeoIP/GeoLite2-City.mmdb
```

Далі правила «регіон → відповідь» описуються в окремому YAML-файлі зони geoip-бекенда, який PowerDNS читає під час старту служби.

## Перевірка і моніторинг сервісу

Стан самої служби перевіряється через керувальний сокет:

```
pdns_control ping
dig @127.0.0.1 example.com A +short
```

Якщо відповіді немає, варто звіритися з журналом служби і перевірити права доступу до бази даних. Для зовнішньої перевірки опублікованої зони та її серійного номера підходять методи зі статті [про dig, dnsviz і типові помилки](https://www.zevshost.net/uk/kb/proverka-dns-zony-dig/). Окремо варто увімкнути DNSSEC-підпис зони командою `pdnsutil secure-zone`, якщо цього вимагає політика безпеки — загальні принципи описано в статті [про налаштування DNSSEC](https://www.zevshost.net/uk/kb/dnssec-nastroika/).

## Підсумок: чек-лист запуску PowerDNS

- Схему бази даних створено, служба pdns підключена до MySQL і стартує без помилок у журналі.
- Зони створюються через pdnsutil чи API, а не правкою SQL-таблиць вручну.
- Доступ до API обмежено локальною адресою чи VPN, ключ api-key не зберігається у відкритому репозиторії.
- База GeoIP регулярно оновлюється, інакше гео-політики почнуть видавати застарілі регіони.

---

Джерело: https://www.zevshost.net/uk/kb/powerdns-nastroika/
