Введение

Контейнеризация приложений стала стандартом де-факто в современной IT-инфраструктуре. В этой статье мы подробно рассмотрим, как развернуть PowerDNS — мощный DNS-сервер — в Docker-контейнере на операционной системе Debian 13. Это решение идеально подходит для тех, кто хочет обеспечить высокую доступность, простоту развертывания и масштабируемость DNS-инфраструктуры.

Почему PowerDNS в Docker?

PowerDNS — это высокопроизводительный DNS-сервер, который предлагает гибкость и мощные функции. Развертывание его в Docker-контейнере предоставляет несколько ключевых преимуществ:

  • Изоляция: PowerDNS работает в изолированной среде
  • Переносимость: Контейнеры можно легко переносить между системами
  • Масштабируемость: Простое масштабирование
  • Упрощенное обновление: Обновление версий без влияния на хост-систему

1: Установка Docker на Debian 13

Первым шагом установим Docker на вашу систему Debian 13.

#Выполните следующую команду, чтобы удалить все конфликтующие пакеты: 
for pkg in docker.io docker-doc docker-compose podman-docker containerd runc; do sudo apt-get remove $pkg; done
#Установка  репозитория
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
  $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
#Установка Docker 
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

2: Создание docker-compose.yml

Создадим файл docker-compose.yml для развертывания PowerDNS:

#Создадим дирикторию где будет находиться 
mkdir -p /opt/docker/powerdns
services:
  db:
    image: postgres:15
    container_name: pdns-db
    restart: unless-stopped
    environment:
      POSTGRES_USER: pdns
      POSTGRES_PASSWORD: yQt5z5T7mv4uQIw
      POSTGRES_DB: pdns  # Changed from powerdns to pdns
    volumes:
      - /opt/docker/powerdns/pdns-postgres:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U pdns -d pdns"]  # Added database name
      interval: 5s
      timeout: 5s
      retries: 5

  powerdns:
    image: pschiffe/pdns-pgsql:latest
    container_name: pdns
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
    environment:
      PDNS_gpgsql_host: db
      PDNS_gpgsql_user: pdns
      PDNS_gpgsql_password: yQt5z5T7mv4uQIw
      PDNS_gpgsql_dbname: pdns  # Changed from powerdns to pdns
      PDNS_api: "yes"
      PDNS_api_key: gBCq1ms7TEp8B3z
      PDNS_webserver: "yes"
      PDNS_webserver_address: "0.0.0.0"
      PDNS_webserver_allow_from: "0.0.0.0/0"
      PDNS_version_string: "powerdns-docker"
    ports:
      - "53:53"
      - "53:53/udp"
      - "8081:8081"

  pdns-admin:
    image: pschiffe/pdns-admin:latest
    container_name: pdns-admin
    restart: unless-stopped
    depends_on:
      db:
        condition: service_healthy
      powerdns:
        condition: service_started
    environment:
      PDNS_ADMIN_SQLA_DB_TYPE: postgres
      PDNS_ADMIN_SQLA_DB_HOST: db
      PDNS_ADMIN_SQLA_DB_USER: pdns
      PDNS_ADMIN_SQLA_DB_PASSWORD: yQt5z5T7mv4uQIw
      PDNS_ADMIN_SQLA_DB_NAME: pdns
      PDNS_ADMIN_SQLA_DB_PORT: 5432
      PDNS_ADMIN_SECRET_KEY: ZVHqGBjDaT9tJab
      PDNS_ADMIN_PDNS_API_URL: http://pdns.ruzatd.ru:8081
      PDNS_ADMIN_PDNS_API_KEY: gBCq1ms7TEp8B3z
      PDNS_ADMIN_PDNS_SERVER_VERSION: "4"
      # Добавьте эти переменные для настройки Caddy
      CADDY_PORT: 80
      CADDY_BIND: 0.0.0.0
    ports:
      - "9191:8080"
volumes:
  db_data:

Запуск PowerDNS в Docker

Запустим наши контейнеры с помощью Docker Compose:

cd /opt/docker/powerdns
docker compose up -d

Проверим статус контейнеров:

docker compose ps

Проверка работы PowerDNS

Проверим, что PowerDNS работает корректно:

# Проверяем логи
docker logs powerdns

Настройка резервного копирования

mkdir -p /usr/scripts/docker/powerdns
nano  /usr/scripts/docker/powerdns/backup_pdns.sh

Добавим в скрипт следующее содержимое:

#!/bin/bash
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_DIR="BACKUP_DIR\$DATE"
RETENTION_DAYS=30

# Создаем директорию для бекапов
mkdir -p $BACKUP_DIR

echo "Starting PowerDNS backup at $(date)"

# 1. Делаем дамп базы данных
echo "Creating database dump..."
docker exec pdns-db pg_dump -U pdns -d pdns | zstd -T0 -9 > $BACKUP_DIR/pdns_db_$DATE.sql.zst

# 2. Архивируем данные PostgreSQL с использованием zstd
echo "Archiving PostgreSQL data directory..."
tar -cf - /opt/docker/powerdns/pdns-postgres | zstd -T0 -9 > $BACKUP_DIR/pdns_data_$DATE.tar.zst

# 3. Копируем docker-compose файл
echo "Backing up docker-compose file..."
cp /path/to/your/docker-compose.yml $BACKUP_DIR/docker-compose_$DATE.yml

# 4. Проверяем целостность архивов
echo "Verifying backup integrity..."
zstd -t $BACKUP_DIR/pdns_db_$DATE.sql.zst && echo "Database backup integrity verified"
zstd -t $BACKUP_DIR/pdns_data_$DATE.tar.zst && echo "Data directory backup integrity verified"

# 5. Удаляем старые бекапы
echo "Cleaning up old backups (older than $RETENTION_DAYS days)..."
find $BACKUP_DIR -name "*.zst" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "*.yml" -mtime +$RETENTION_DAYS -delete

echo "Backup completed successfully at $(date)"
echo "Backup files:"
ls -lh $BACKUP_DIR/*_$DATE.*

Сделаем скрипт исполняемым и добавим в cron:

chmod +x /usr/scripts/docker/powerdns/backup_pdns.sh
crontab -e

Добавим строку для ежедневного резервного копирования:

0 2 * * * /usr/scripts/docker/powerdns/backup_pdns.sh

Заключение

В этой статье мы рассмотрели процесс развертывания PowerDNS в Docker-контейнере на Debian 13. Такой подход обеспечивает изоляцию сервиса, упрощает обновление и масштабирование DNS-инфраструктуры.

Ключевые преимущества решения:

  • Простота развертывания и управления
  • Высокая доступность и отказоустойчивость
  • Легкое масштабирование с помощью Docker Compose
  • Упрощенное резервное копирование и восстановление