feat: Add NordVPN NordLynx (WireGuard) integration (#3827)

* feat: Add NordVPN NordLynx (WireGuard) integration with dedicated UI and backend services.

* remove limit=10 to get all servers

* feat: add city selector to NordVPN modal

* feat: auto-select best server on country/city change

* feat: simplify filter logic and enforce > 7% load

* fix

---------

Co-authored-by: Sanaei <ho3ein.sanaei@gmail.com>
This commit is contained in:
Peter Liu
2026-04-19 23:41:50 +01:00
committed by GitHub
parent 59e9859225
commit 36b2a58675
20 changed files with 688 additions and 1 deletions
+22
View File
@@ -163,6 +163,7 @@
{{template "modals/dnsPresetsModal"}}
{{template "modals/fakednsModal"}}
{{template "modals/warpModal"}}
{{template "modals/nordModal"}}
<script>
const rulesColumns = [
{ title: "#", align: 'center', width: 15, scopedSlots: { customRender: 'action' } },
@@ -1056,6 +1057,9 @@
showWarp() {
warpModal.show();
},
showNord() {
nordModal.show();
},
async loadCustomGeoAliases() {
try {
const msg = await HttpUtil.get('/panel/api/custom-geo/aliases');
@@ -1429,6 +1433,19 @@
this.templateRuleSetter({ outboundTag: "warp", property: "domain", data: newValue });
}
},
nordTag: {
get: function () {
return this.templateSettings ? (this.templateSettings.outbounds.find((o) => o.tag.startsWith("nord-")) || { tag: "nord" }).tag : "nord";
}
},
nordDomains: {
get: function () {
return this.templateRuleGetter({ outboundTag: this.nordTag, property: "domain" });
},
set: function (newValue) {
this.templateRuleSetter({ outboundTag: this.nordTag, property: "domain", data: newValue });
}
},
torrentSettings: {
get: function () {
return ArrayUtils.doAllItemsExist(this.settingsData.protocols.bittorrent, this.blockedProtocols);
@@ -1446,6 +1463,11 @@
return this.templateSettings ? this.templateSettings.outbounds.findIndex((o) => o.tag == "warp") >= 0 : false;
},
},
NordExist: {
get: function () {
return this.templateSettings ? this.templateSettings.outbounds.findIndex((o) => o.tag.startsWith("nord-")) >= 0 : false;
},
},
enableDNS: {
get: function () {
return this.templateSettings ? this.templateSettings.dns != null : false;