Skip to content

n13r/ndash

Repository files navigation

NDash - PowerDNS Admin Dashboard

NDash Dashboard License Built with

Built with GitHub Copilot (Grok Code Fast 1) - AI-assisted development for enhanced productivity and code quality.

Copyright (c) 2025 NDash Project - All rights reserved.

NDash adalah dashboard administrasi modern untuk PowerDNS yang dibangun dengan Express.js, EJS, Alpine.js, dan Shadcn UI components.

✨ Fitur

  • 🎨 Modern UI: Menggunakan Tailwind CSS dengan komponen Shadcn UI
  • ⚑ Reactive: Alpine.js untuk interaktivitas yang ringan
  • πŸ”Œ PowerDNS API: Integrasi lengkap dengan PowerDNS API
  • πŸ“Š Dashboard: Overview statistik dan monitoring
  • 🌐 Zone Management: Kelola DNS zones dengan mudah
  • πŸ“ Record Management: CRUD operations untuk DNS records
  • πŸ“ˆ Statistics: Visualisasi statistik server PowerDNS
  • ⚠️ Error Handling: Banner notifikasi error dengan tombol retry otomatis
  • πŸ”„ Auto Refresh: Refresh data secara manual dengan loading indicator

🎯 Error Handling

NDash dilengkapi dengan sistem error handling yang user-friendly:

  • Error Banner: Muncul secara otomatis ketika ada masalah koneksi ke PowerDNS API
  • Detailed Messages: Menampilkan pesan error yang jelas dan actionable
  • Retry Button: Tombol retry untuk mencoba koneksi ulang
  • Visual Indicators: Status server berubah warna (Online = hijau, Error/Offline = merah)
  • Graceful Degradation: UI tetap stabil meskipun backend error

Contoh error yang ditangani:

  • ECONNRESET: PowerDNS API tidak berjalan atau tidak dapat dijangkau
  • Network Error: Masalah koneksi jaringan
  • HTTP 500: Internal server error dari PowerDNS
  • Invalid Data: Format data yang tidak sesuai dari API

🌐 Split-Horizon DNS

NDash includes a built-in Split-Horizon DNS Proxy that provides different DNS responses based on client subnet:

Features

  • Client-aware responses: Different answers for internal vs external clients
  • CIDR subnet support: Configure IP ranges for internal/external networks
  • Real-time configuration: Changes apply immediately without restarting
  • DNS proxy server: Runs on port 5353 (configurable)

Configuration

{
  "enabled": true,
  "zones": [
    {
      "name": "dionipe.local",
      "internal": [
        {"name": "@", "type": "A", "value": "192.168.203.5"}
      ],
      "external": [
        {"name": "@", "type": "A", "value": "8.8.8.8"}
      ]
    }
  ],
  "subnets": {
    "internal": ["192.168.0.0/16", "10.0.0.0/8", "172.16.0.0/12"],
    "external": ["0.0.0.0/0"]
  }
}

Testing

# Test external response (from 127.0.0.1)
$ dig @127.0.0.1 -p 5353 dionipe.local
# Answer: 8.8.8.8

# Test internal response (from PowerDNS directly)
$ dig @127.0.0.1 dionipe.local  
# Answer: 192.168.203.5

How It Works

  1. Client Detection: Proxy identifies client IP and determines if it's internal or external
  2. Record Selection: Serves appropriate records based on client type
  3. Fallback: Forwards non-Split-Horizon queries to upstream DNS server
  4. Real-time Updates: Configuration reloads automatically when changed via web UI

Benchmarks (Local Development)

  • Server Response: ~19ms
  • HTML Size: ~23KB
  • API Response: ~20ms
  • Alpine.js Bindings: 76 (optimized)

Further Optimizations

Untuk production deployment, jalankan:

./bundle-resources.sh  # Bundle CDN resources locally

Ini akan mengurangi external requests dan meningkatkan loading speed.

Prerequisites

  • Node.js v16 atau lebih tinggi
  • PowerDNS server dengan API diaktifkan
  • npm atau yarn

Installation

  1. Clone atau extract project ini:
cd /opt/ndash
  1. Install dependencies:
npm install
  1. Copy file konfigurasi dan edit sesuai kebutuhan:
cp .env.example .env
nano .env
  1. Konfigurasi file .env:
PORT=3000
NODE_ENV=development

# PowerDNS API Configuration
PDNS_API_URL=http://localhost:8081
PDNS_API_KEY=your-powerdns-api-key-here

# Session Secret
SESSION_SECRET=change-this-to-a-random-secret-key
  1. Jalankan aplikasi:
# Development mode (dengan auto-reload)
npm run dev

# Production mode
npm start
  1. Buka browser dan akses:
http://localhost:3000

πŸ”§ Konfigurasi PowerDNS

Pastikan PowerDNS API sudah diaktifkan. Edit file konfigurasi PowerDNS (biasanya /etc/powerdns/pdns.conf):

# Enable API
api=yes
api-key=your-secure-api-key-here

# Bind API to localhost (atau IP tertentu)
webserver=yes
webserver-address=0.0.0.0
webserver-port=8081
webserver-allow-from=127.0.0.0/8,::1

Restart PowerDNS setelah mengubah konfigurasi:

systemctl restart pdns

Troubleshooting Authentication

Jika mendapat error Authentication by API Key failed:

  1. Periksa API Key: Pastikan api-key di PowerDNS config sama dengan PDNS_API_KEY di .env
  2. Periksa webserver-allow-from: Konfigurasi ini harus mengizinkan akses dari IP NDash server
  3. Test Direct API: curl -H "X-API-Key: your-key" http://localhost:8081/api/v1/servers
  4. Restart Services: Restart PowerDNS dan NDash setelah perubahan config

Environment Variables

# PowerDNS API Configuration
PDNS_API_URL=http://localhost:8081
PDNS_API_KEY=your-powerdns-api-key

# NDash Configuration
PORT=3000
NODE_ENV=development
SESSION_SECRET=your-session-secret

πŸ“ Struktur Project

ndash/
β”œβ”€β”€ lib/
β”‚   └── pdns-client.js      # PowerDNS API client
β”œβ”€β”€ public/
β”‚   β”œβ”€β”€ css/
β”‚   β”‚   └── style.css       # Custom styles
β”‚   └── js/
β”‚       └── app.js          # Frontend JavaScript
β”œβ”€β”€ views/
β”‚   β”œβ”€β”€ partials/
β”‚   β”‚   β”œβ”€β”€ header.ejs      # Header template
β”‚   β”‚   └── footer.ejs      # Footer template
β”‚   β”œβ”€β”€ index.ejs           # Dashboard page
β”‚   └── error.ejs           # Error page
β”œβ”€β”€ .env.example            # Environment variables template
β”œβ”€β”€ .gitignore             # Git ignore rules
β”œβ”€β”€ package.json           # Project dependencies
└── server.js              # Main application file

🎯 API Endpoints

Servers

  • GET /api/servers - Get all servers
  • GET /api/servers/:serverId/statistics - Get server statistics

Zones

  • GET /api/servers/:serverId/zones - Get all zones
  • GET /api/servers/:serverId/zones/:zoneId - Get specific zone
  • POST /api/servers/:serverId/zones - Create new zone
  • DELETE /api/servers/:serverId/zones/:zoneId - Delete zone

Records

  • PATCH /api/servers/:serverId/zones/:zoneId - Update records

πŸ› οΈ Development

Running in Development Mode

npm run dev

Ini akan menjalankan aplikasi dengan nodemon yang akan otomatis restart saat ada perubahan file.

Technology Stack

  • Backend: Express.js
  • View Engine: EJS (Embedded JavaScript)
  • Frontend Framework: Alpine.js
  • CSS Framework: Tailwind CSS
  • UI Components: Shadcn-inspired components
  • Icons: Lucide Icons
  • HTTP Client: Axios

πŸ”’ Security

  • Gunakan HTTPS di production
  • Ubah SESSION_SECRET dengan nilai random yang aman
  • Jangan expose PowerDNS API ke internet
  • Implementasikan authentication jika diperlukan
  • Batasi akses API PowerDNS dengan firewall

πŸ“ TODO / Roadmap

  • Authentication & Authorization
  • Record editing interface
  • Bulk operations
  • Search functionality
  • Export/Import zones
  • Activity logs
  • DNSSEC management
  • Multi-server support
  • Dark mode
  • Responsive mobile view improvements

🀝 Contributing

Kontribusi sangat diterima! Silakan fork project ini dan submit pull request.

πŸ“„ License

MIT License - lihat file LICENSE untuk detail.

πŸ‘¨β€πŸ’» Author

Created with ❀️ for the PowerDNS community

πŸ› Bug Reports

Jika menemukan bug atau masalah, silakan buat issue di repository ini.

πŸ’‘ Tips

  1. Backup: Selalu backup konfigurasi PowerDNS sebelum melakukan perubahan
  2. Testing: Test di environment development sebelum deploy ke production
  3. Monitoring: Pantau log aplikasi untuk debugging
  4. Performance: Gunakan reverse proxy (nginx/apache) di production

πŸ“š Resources


NDash - Modern PowerDNS Administration Made Easy

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors