feat: WGRplane Hybrid - Go-native with nftables + Multi-Webhook

This commit is contained in:
datadunia
2026-05-03 18:03:38 +07:00
parent 477f7830bb
commit 3eae539a56
33 changed files with 3091 additions and 4 deletions
+215
View File
@@ -0,0 +1,215 @@
# WGRplane - WireGuard Remote Plane Control
**WGRplane** adalah aplikasi kontrol WireGuard Remote Plane yang dibangun dengan fitur lengkap (paritas penuh dengan **WGDashboard**) ditambah integrasi **policy.json API**.
---
## Fitur Utama
- **Peer Management**: CRUD peer, generate QR code, export config
- **Real-time Monitoring**: Status peer, grafik trafik, riwayat koneksi
- **Scheduling & Automation**: Jadwal penghapusan/restriksi peer, reset data usage
- **Security**: Autentikasi dashboard (username/password), TOTP (2FA), API key
- **Multi-Server**: Akses multi WGDashboard instance via API keys
- **Plugins System**: Ekspansi fitur via plugin (experimental)
- **i18n & Themes**: Multi-bahasa, dark/light mode
---
## Arsitektur
```
wg0.conf (dengan/tanpa #Access)
wg-engine-api (Go) -- membaca API storage (api-policy.json)
↓ ↓
+-- GET /api/policy (merged: API + #Access fallback)
+-- POST /api/policy (write ke api-policy.json, trigger sync)
policy.json (merged: API overrides #Access)
wg-policy-engine.sh (tidak diubah)
iptables / ipset rules
```
### Tech Stack
| Komponen | Teknologi |
|-----------|------------|
| **WGRplane Backend** | Python + Flask |
| **WGRplane Frontend** | Vue.js 3 |
| **wg-engine-api** | Go (Golang) |
| **Database** | SQLite (default), PostgreSQL/MySQL via SQLAlchemy |
| **Desktop App** | ElectronJS + Vue.js |
---
## Port & Autentikasi
| Service | Port | Autentikasi |
|---------|------|---------------|
| WGRplane Dashboard | **10086** | Session-based + TOTP |
| wg-engine-api (Go) | **10087** | Custom header: `wg-rplane-datadunia` |
---
## API Endpoints (wg-engine-api)
### Autentikasi
Semua request harus menyertakan header:
```
wg-rplane-datadunia: <TOKEN>
```
### Endpoints
| Endpoint | Method | Deskripsi |
|----------|--------|-------------|
| `/api/policy` | GET | Ambil policy.json (merge: API + #Access fallback) |
| `/api/policy` | POST | Update policy (simpan ke api-policy.json, trigger sync) |
| `/api/reload` | POST | Trigger wg-policy-engine.sh untuk apply rules |
### Contoh Penggunaan
```bash
# Ambil policy
curl -H "wg-rplane-datadunia: VALID_TOKEN" http://localhost:10087/api/policy
# Update policy untuk client
curl -X POST \
-H "Content-Type: application/json" \
-H "wg-rplane-datadunia: VALID_TOKEN" \
-d '{"ip": "10.0.0.2", "access": ["1.1.1.1/32"], "internet": true}' \
http://localhost:10087/api/policy
# Trigger reload
curl -X POST \
-H "wg-rplane-datadunia: VALID_TOKEN" \
http://localhost:10087/api/reload
```
---
## Migration: #Access ke API
| Aspek | Detail |
|-------|--------|
| **Strategi** | API with #Access fallback (API dicoba pertama, fallback ke #Access) |
| **Precedence** | API policy OVERRIDE #Access untuk IP client yang sama |
| **Storage API** | `/etc/wireguard/api-policy.json` (terpisah dari policy.json) |
| **Locking** | Menggunakan `/var/lock/wg-policy.lock` (SAMA dengan script shell) |
| **Atomic Write** | Tulis ke tmp file → `mv` (mencegah corrupt saat crash) |
---
## Instalasi
### Prerequisites
```bash
# Python dependencies (WGRplane)
pip install -r requirements.txt
# Go dependencies (wg-engine-api)
cd wg-engine-api
go mod download
```
### Jalankan WGRplane (Python/Flask)
```bash
python app.py
# atau dengan Gunicorn
gunicorn -w 4 -b 0.0.0.0:10086 app:app
```
### Jalankan wg-engine-api (Go)
```bash
cd wg-engine-api
go build -o wg-engine-api .
./wg-engine-api &
# atau install ke /usr/local/bin/
cp wg-engine-api /usr/local/bin/
```
---
## Testing
### Bats (Shell Scripts)
```bash
apt install bats
bats /tests/policy.bats
```
### Go Tests (wg-engine-api)
```bash
cd wg-engine-api
go test ./...
```
### Manual QA
```bash
# Test auth
curl -H "wg-rplane-datadunia: wrong" http://localhost:10087/api/policy
# Expected: 401 Unauthorized
# Test policy retrieval
curl -H "wg-rplane-datadunia: VALID_TOKEN" http://localhost:10087/api/policy
# Test policy update
curl -X POST -H "Content-Type: application/json" \
-H "wg-rplane-datadunia: VALID_TOKEN" \
-d '{"ip": "10.0.0.2", "access": ["1.1.1.1/32"]}' \
http://localhost:10087/api/policy
# Verify iptables rules
wg-policy-ctl rules
```
---
## Deployment
### Systemd Services
WGRplane menggunakan systemd untuk manajemen service:
```bash
# Copy systemd units
cp wg-policy.service wg-policy-health.timer wg-policy-health.service /etc/systemd/system/
# Enable & start
systemctl daemon-reload
systemctl enable wg-policy.service
systemctl enable wg-policy-health.timer
systemctl start wg-policy.service
systemctl start wg-policy-health.timer
```
### Install Script
Gunakan `install.sh` untuk instalasi otomatis:
```bash
sudo ./install.sh install
```
---
## Dokumentasi Tambahan
- **Plan File**: `plan.md` (detail rencana implementasi 20 tasks dalam 7 fase)
- **AGENTS.md**: Panduan untuk AI agent dalam mengembangkan proyek ini
- **Parent Repo**: `https://git.datadunia.com/hainzero/WGRplane.git` (submodule di `/app`)
---
## Lisensi
Proyek ini mengikuti lisensi dari WGDashboard (donaldzou/WGDashboard) dan modifikasi untuk integrasi policy.json API.