Ndash
NDash adalah dashboard administrasi modern untuk PowerDNS yang dibangun dengan Express.js, EJS, Alpine.js, dan Shadcn UI components.
Install / Use
/learn @dionipe/NdashREADME
NDash - PowerDNS Admin Dashboard
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 dijangkauNetwork Error: Masalah koneksi jaringanHTTP 500: Internal server error dari PowerDNSInvalid 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
- Client Detection: Proxy identifies client IP and determines if it's internal or external
- Record Selection: Serves appropriate records based on client type
- Fallback: Forwards non-Split-Horizon queries to upstream DNS server
- 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
- Clone atau extract project ini:
cd /opt/ndash
- Install dependencies:
npm install
- Copy file konfigurasi dan edit sesuai kebutuhan:
cp .env.example .env
nano .env
- 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
- Jalankan aplikasi:
# Development mode (dengan auto-reload)
npm run dev
# Production mode
npm start
- 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:
- Periksa API Key: Pastikan
api-keydi PowerDNS config sama denganPDNS_API_KEYdi.env - Periksa webserver-allow-from: Konfigurasi ini harus mengizinkan akses dari IP NDash server
- Test Direct API:
curl -H "X-API-Key: your-key" http://localhost:8081/api/v1/servers - 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 serversGET /api/servers/:serverId/statistics- Get server statistics
Zones
GET /api/servers/:serverId/zones- Get all zonesGET /api/servers/:serverId/zones/:zoneId- Get specific zonePOST /api/servers/:serverId/zones- Create new zoneDELETE /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_SECRETdengan 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
- Backup: Selalu backup konfigurasi PowerDNS sebelum melakukan perubahan
- Testing: Test di environment development sebelum deploy ke production
- Monitoring: Pantau log aplikasi untuk debugging
- Performance: Gunakan reverse proxy (nginx/apache) di production
📚 Resources
NDash - Modern PowerDNS Administration Made Easy
Related Skills
node-connect
343.1kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
90.0kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
343.1kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
343.1kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
