Skip to content
/ ndash Public

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

License

Notifications You must be signed in to change notification settings

dionipe/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

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

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published