Skip to content

PowerDNS DNS Manager

Overview

The PowerDNS plugin provides a full-featured authoritative DNS management interface. It supports zone management, record editing, DNSSEC, geo records, smart routing rules, and zone synchronisation between multiple StarkOne servers.

Requires the powerdns plugin to be enabled. All endpoints require superuser.

Status & Configuration

# PowerDNS service status
GET /api/powerdns/status

# Install PowerDNS (if not already installed)
POST /api/powerdns/install

# Get PowerDNS configuration
GET /api/powerdns/config

# Update configuration
POST /api/powerdns/config
{
  "allow-recursion": "127.0.0.1",
  "max-tcp-connections": "20"
}

# Statistics
GET /api/powerdns/stats

Zone Management

List Zones

GET /api/powerdns/zones

Create a Zone

POST /api/powerdns/zones
{
  "name": "example.com.",
  "kind": "Native",
  "nameservers": ["ns1.starkone.io.", "ns2.starkone.io."]
}

Get a Zone

GET /api/powerdns/zones/:zone

Delete a Zone

DELETE /api/powerdns/zones/:zone

Export / Import Zone (BIND format)

POST /api/powerdns/zones/:zone/export
POST /api/powerdns/zones/:zone/import
{ "zone_data": "example.com. 300 IN SOA ..." }

DNS Records

Update Records (low-level PowerDNS API format)

PATCH /api/powerdns/zones/:zone/records
{
  "rrsets": [
    {
      "name": "www.example.com.",
      "type": "A",
      "ttl": 300,
      "changetype": "REPLACE",
      "records": [
        { "content": "1.2.3.4", "disabled": false }
      ]
    }
  ]
}

Add Record (simplified)

POST /api/powerdns/zones/:zone/records/simple
{
  "name": "www",
  "type": "A",
  "content": "1.2.3.4",
  "ttl": 300
}

Delete Record (simplified)

DELETE /api/powerdns/zones/:zone/records/simple
{
  "name": "www",
  "type": "A"
}

Add Geo Record

Geo records route DNS responses based on the client's country:

POST /api/powerdns/zones/:zone/geo-record
{
  "name": "cdn",
  "default_ip": "1.2.3.4",
  "geo_rules": [
    { "country": "US", "ip": "5.6.7.8" },
    { "country": "EU", "ip": "9.10.11.12" }
  ]
}

DNSSEC

# Get DNSSEC status and keys
GET /api/powerdns/zones/:zone/dnssec

# Enable DNSSEC
POST /api/powerdns/zones/:zone/dnssec

# Disable DNSSEC
DELETE /api/powerdns/zones/:zone/dnssec

DNS Templates

Save and apply common zone record sets as templates:

# List templates
GET /api/powerdns/templates

# Create template
POST /api/powerdns/templates
{
  "name": "Standard Web + Mail",
  "records": [
    { "name": "@", "type": "A", "content": "{{IP}}", "ttl": 300 },
    { "name": "www", "type": "CNAME", "content": "@", "ttl": 300 },
    { "name": "@", "type": "MX", "content": "10 mail.{{DOMAIN}}", "ttl": 300 }
  ]
}

# Apply template to a zone
POST /api/powerdns/templates/:id/apply/:zone
{
  "variables": { "IP": "1.2.3.4", "DOMAIN": "example.com" }
}

# Update template
PUT /api/powerdns/templates/:id

# Delete template
DELETE /api/powerdns/templates/:id

Smart DNS Rules

Route DNS responses dynamically based on policies:

# List smart rules
GET /api/powerdns/smart-rules

# Create smart rule
POST /api/powerdns/smart-rules
{
  "name": "Fail-over to backup",
  "domain": "api.example.com",
  "primary_ip": "1.2.3.4",
  "backup_ip": "5.6.7.8",
  "check_url": "https://api.example.com/health"
}

PUT /api/powerdns/smart-rules/:id
DELETE /api/powerdns/smart-rules/:id

Replication Between PowerDNS Servers

GET /api/powerdns/replication
POST /api/powerdns/replication
{
  "servers": [
    { "host": "ns2.example.com", "api_key": "secret" }
  ]
}

Zone Sync (StarkOne-to-StarkOne)

Sync zones between multiple StarkOne servers:

# Get sync server list
GET /api/powerdns/sync-servers

# Save sync servers
POST /api/powerdns/sync-servers
{
  "servers": [
    { "host": "ns2.example.com", "token": "secret" }
  ]
}

# Push a zone to all sync servers
POST /api/powerdns/sync-push
{ "zone": "example.com." }

# Get sync status
GET /api/powerdns/sync-status

# Create sync API key
POST /api/powerdns/sync-api-key

Receiving endpoint (public, authenticated by X-StarkOne-Sync-Key header):

POST /api/powerdns/sync-zone
POST /api/powerdns/import-bind