Deployment Options - thakares/nx9-dns-server GitHub Wiki

Deployment Options

nx9-dns-server supports multiple deployment methods to fit your infrastructure needs. This page covers both traditional and containerized deployment options.

Traditional Deployment

Traditional deployment involves running nx9-dns-server directly on a host system, typically managed by systemd.

Prerequisites

  • Linux system with systemd
  • Appropriate permissions for binding to port 53 (DNS)
  • SQLite database access

Step-by-Step Deployment

  1. Prepare the Directory Structure

    sudo mkdir -p /var/nx9-dns-server
    sudo mkdir -p /var/log/nx9-dns-server
    sudo useradd -r -s /sbin/nologin dnsuser
    sudo chown -R dnsuser:dnsuser /var/nx9-dns-server /var/log/nx9-dns-server
    
  2. Copy the Binary and Configuration Files

    sudo cp target/release/dns_server /var/nx9-dns-server/
    sudo cp conf/dns_records.sql /var/nx9-dns-server/
    sudo cp scripts/preprocess-key.sh /var/nx9-dns-server/
    sudo cp scripts/soa-update.sh /var/nx9-dns-server/
    sudo chmod +x /var/nx9-dns-server/*.sh
    
  3. Prepare the DNS Database

    sudo sqlite3 /var/nx9-dns-server/dns.db < /var/nx9-dns-server/dns_records.sql
    sudo chown dnsuser:dnsuser /var/nx9-dns-server/dns.db
    
  4. Create a Systemd Service File

    Create /etc/systemd/system/dns-server.service:

    [Unit]
    Description=nx9 DNS Server
    After=network.target
    
    [Service]
    Type=simple
    User=dnsuser
    Group=dnsuser
    WorkingDirectory=/var/nx9-dns-server
    ExecStart=/var/nx9-dns-server/dns_server
    Restart=on-failure
    RestartSec=5
    LimitNOFILE=65536
    
    # Environment variables
    Environment="DNS_BIND=0.0.0.0:53"
    Environment="DNS_DB_PATH=/var/nx9-dns-server/dns.db"
    Environment="DNSSEC_KEY_FILE=/var/nx9-dns-server/Kanydomain.tld.key"
    Environment="DNS_FORWARDERS=8.8.8.8:53,1.1.1.1:53"
    Environment="DNS_NS_RECORDS=ns1.anydomain.tld.,ns2.anydomain.tld."
    Environment="RUST_LOG=info"
    
    # Security
    NoNewPrivileges=yes
    PrivateTmp=yes
    ProtectSystem=full
    ProtectHome=yes
    ReadWritePaths=/var/nx9-dns-server /var/log/nx9-dns-server
    CapabilityBoundingSet=CAP_NET_BIND_SERVICE
    AmbientCapabilities=CAP_NET_BIND_SERVICE
    
    [Install]
    WantedBy=multi-user.target
    
  5. Enable and Start the Service

    sudo systemctl daemon-reload
    sudo systemctl enable dns-server.service
    sudo systemctl start dns-server.service
    
  6. Check Service Status

    sudo systemctl status dns-server.service
    journalctl -u dns-server.service
    

Automated Deployment Script

For convenience, use the provided deploy.sh script:

#!/bin/bash

set -e

SRC_BIN="/home/youruser/apps/your-ddns/dns_server"
DEST_DIR="/var/nx9-dns-server"
DEST_BIN="$DEST_DIR/dns_server"
PREPROCESS_SCRIPT="$DEST_DIR/preprocess-key.sh"
SOA_UPDATE_SCRIPT="$DEST_DIR/soa-update.sh"

echo "🔐 Fixing permissions and running preprocess..."
sudo chmod +x "$PREPROCESS_SCRIPT"
sudo -u dnsuser "$PREPROCESS_SCRIPT"

echo "🛠 Updating SOA record..."
sudo chown dnsuser:dnsuser "$SOA_UPDATE_SCRIPT"
sudo chmod +x "$SOA_UPDATE_SCRIPT"
sudo -u dnsuser "$SOA_UPDATE_SCRIPT"

echo "📄 Verifying processed.key content..."
sudo cat "$DEST_DIR/processed.key"

echo "🛑 Stopping DNS server..."
sudo systemctl stop dns-server.service

echo "📦 Deploying new dns_server binary..."
sudo cp "$SRC_BIN" "$DEST_BIN"
sudo chown dnsuser:dnsuser "$DEST_DIR"

echo "🔁 Reloading systemd and restarting service..."
sudo systemctl daemon-reload
sudo systemctl restart dns-server.service

echo "📈 Checking service status..."
sudo systemctl status dns-server.service

Docker Deployment

Docker deployment offers a containerized approach with minimal host system requirements.

Prerequisites

  • Docker Engine
  • Docker Compose (optional, for more complex deployments)

Basic Docker Deployment

  1. Build the Docker Image

    # Clone the repository
    git clone https://github.com/thakares/nx9-dns-server.git
    cd nx9-dns-server
    
    # Build the Docker image
    docker build -t nx9-dns-server:latest .
    
  2. Run the Container

    # Create directories for persistent data
    mkdir -p ./data ./keys ./logs
    
    # Run with basic configuration
    docker run -d --name nx9-dns \
      -p 53:53/udp -p 53:53/tcp \
      -p 8080:8080 -p 8081:8081 \
      -v $(pwd)/data/dns.db:/var/nx9-dns-server/dns.db \
      -v $(pwd)/keys:/etc/nx9-dns-server/keys \
      -v $(pwd)/logs:/