From 487ec74e0b867fdab53aa0a3b080c886e38ec06e Mon Sep 17 00:00:00 2001 From: Alireza Ahmadi Date: Fri, 25 Jul 2025 01:22:01 +0200 Subject: [PATCH 1/4] add mldsa65 --- sub/subJsonService.go | 1 + web/assets/js/model/inbound.js | 13 +++++++++++-- web/controller/server.go | 10 ++++++++++ web/html/form/reality_settings.html | 9 +++++++++ web/html/modals/inbound_modal.html | 12 +++++++++++- web/service/server.go | 26 ++++++++++++++++++++++++++ web/translation/translate.ar_EG.toml | 1 + web/translation/translate.en_US.toml | 2 +- web/translation/translate.es_ES.toml | 1 + web/translation/translate.fa_IR.toml | 1 + web/translation/translate.id_ID.toml | 1 + web/translation/translate.ja_JP.toml | 1 + web/translation/translate.pt_BR.toml | 1 + web/translation/translate.ru_RU.toml | 1 + web/translation/translate.tr_TR.toml | 1 + web/translation/translate.uk_UA.toml | 1 + web/translation/translate.vi_VN.toml | 1 + web/translation/translate.zh_CN.toml | 1 + web/translation/translate.zh_TW.toml | 1 + 19 files changed, 81 insertions(+), 4 deletions(-) diff --git a/sub/subJsonService.go b/sub/subJsonService.go index 008e1658..7bc4d1db 100644 --- a/sub/subJsonService.go +++ b/sub/subJsonService.go @@ -263,6 +263,7 @@ func (s *SubJsonService) realityData(rData map[string]any) map[string]any { rltyData["show"] = false rltyData["publicKey"] = rltyClientSettings["publicKey"] rltyData["fingerprint"] = rltyClientSettings["fingerprint"] + rltyData["mldsa65Verify"] = rltyClientSettings["mldsa65Verify"] // Set random data rltyData["spiderX"] = "/" + random.Seq(15) diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js index 8a19d79c..56c20b69 100644 --- a/web/assets/js/model/inbound.js +++ b/web/assets/js/model/inbound.js @@ -732,6 +732,7 @@ class RealityStreamSettings extends XrayCommonClass { maxClient = '', maxTimediff = 0, shortIds = RandomUtil.randomShortIds(), + mldsa65Seed = '', settings = new RealityStreamSettings.Settings() ) { super(); @@ -744,6 +745,7 @@ class RealityStreamSettings extends XrayCommonClass { this.maxClient = maxClient; this.maxTimediff = maxTimediff; this.shortIds = Array.isArray(shortIds) ? shortIds.join(",") : shortIds; + this.mldsa65Seed = mldsa65Seed; this.settings = settings; } @@ -754,7 +756,8 @@ class RealityStreamSettings extends XrayCommonClass { json.settings.publicKey, json.settings.fingerprint, json.settings.serverName, - json.settings.spiderX + json.settings.spiderX, + json.settings.mldsa65Verify, ); } return new RealityStreamSettings( @@ -767,6 +770,7 @@ class RealityStreamSettings extends XrayCommonClass { json.maxClient, json.maxTimediff, json.shortIds, + json.mldsa65Seed, settings, ); } @@ -782,6 +786,7 @@ class RealityStreamSettings extends XrayCommonClass { maxClient: this.maxClient, maxTimediff: this.maxTimediff, shortIds: this.shortIds.split(","), + mldsa65Seed: this.mldsa65Seed, settings: this.settings, }; } @@ -792,13 +797,15 @@ RealityStreamSettings.Settings = class extends XrayCommonClass { publicKey = '', fingerprint = UTLS_FINGERPRINT.UTLS_CHROME, serverName = '', - spiderX = '/' + spiderX = '/', + mldsa65Verify = '' ) { super(); this.publicKey = publicKey; this.fingerprint = fingerprint; this.serverName = serverName; this.spiderX = spiderX; + this.mldsa65Verify = mldsa65Verify; } static fromJson(json = {}) { return new RealityStreamSettings.Settings( @@ -806,6 +813,7 @@ RealityStreamSettings.Settings = class extends XrayCommonClass { json.fingerprint, json.serverName, json.spiderX, + json.mldsa65Verify ); } toJson() { @@ -814,6 +822,7 @@ RealityStreamSettings.Settings = class extends XrayCommonClass { fingerprint: this.fingerprint, serverName: this.serverName, spiderX: this.spiderX, + mldsa65Verify: this.mldsa65Verify }; } }; diff --git a/web/controller/server.go b/web/controller/server.go index e00a1206..22f89f2f 100644 --- a/web/controller/server.go +++ b/web/controller/server.go @@ -50,6 +50,7 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) { g.GET("/getDb", a.getDb) g.POST("/importDB", a.importDB) g.POST("/getNewX25519Cert", a.getNewX25519Cert) + g.POST("/getNewmldsa65", a.getNewmldsa65) } func (a *ServerController) refreshStatus() { @@ -198,3 +199,12 @@ func (a *ServerController) getNewX25519Cert(c *gin.Context) { } jsonObj(c, cert, nil) } + +func (a *ServerController) getNewmldsa65(c *gin.Context) { + cert, err := a.serverService.GetNewmldsa65() + if err != nil { + jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.getNewmldsa65Error"), err) + return + } + jsonObj(c, cert, nil) +} diff --git a/web/html/form/reality_settings.html b/web/html/form/reality_settings.html index 7d5e6fb9..aebb6c42 100644 --- a/web/html/form/reality_settings.html +++ b/web/html/form/reality_settings.html @@ -52,5 +52,14 @@ Get New Cert + + + + + + + + Get New Seed + {{end}} \ No newline at end of file diff --git a/web/html/modals/inbound_modal.html b/web/html/modals/inbound_modal.html index 8be213a8..f11df2e2 100644 --- a/web/html/modals/inbound_modal.html +++ b/web/html/modals/inbound_modal.html @@ -141,7 +141,17 @@ } inModal.inbound.stream.reality.privateKey = msg.obj.privateKey; inModal.inbound.stream.reality.settings.publicKey = msg.obj.publicKey; - } + }, + async getNewmldsa65() { + inModal.loading(true); + const msg = await HttpUtil.post('/server/getNewmldsa65'); + inModal.loading(false); + if (!msg.success) { + return; + } + inModal.inbound.stream.reality.mldsa65Seed = msg.obj.seed; + inModal.inbound.stream.reality.settings.mldsa65Verify = msg.obj.verify; + }, }, }); diff --git a/web/service/server.go b/web/service/server.go index 8e0a8096..d0d4bd18 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -709,3 +709,29 @@ func (s *ServerService) GetNewX25519Cert() (any, error) { return keyPair, nil } + +func (s *ServerService) GetNewmldsa65() (any, error) { + // Run the command + cmd := exec.Command(xray.GetBinaryPath(), "mldsa65") + var out bytes.Buffer + cmd.Stdout = &out + err := cmd.Run() + if err != nil { + return nil, err + } + + lines := strings.Split(out.String(), "\n") + + SeedLine := strings.Split(lines[0], ":") + VerifyLine := strings.Split(lines[1], ":") + + seed := strings.TrimSpace(SeedLine[1]) + verify := strings.TrimSpace(VerifyLine[1]) + + keyPair := map[string]any{ + "seed": seed, + "verify": verify, + } + + return keyPair, nil +} diff --git a/web/translation/translate.ar_EG.toml b/web/translation/translate.ar_EG.toml index e582c9cd..de350264 100644 --- a/web/translation/translate.ar_EG.toml +++ b/web/translation/translate.ar_EG.toml @@ -260,6 +260,7 @@ "resetInboundClientTrafficSuccess" = "تم إعادة تعيين حركة المرور" "trafficGetError" = "خطأ في الحصول على حركات المرور" "getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519." +"getNewmldsa65Error" = "حدث خطاء في الحصول على mldsa65." [pages.inbounds.stream.general] "request" = "طلب" diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml index 3dea80dc..07cfb1af 100644 --- a/web/translation/translate.en_US.toml +++ b/web/translation/translate.en_US.toml @@ -258,7 +258,7 @@ "resetInboundClientTrafficSuccess" = "Traffic has been reset." "trafficGetError" = "Error getting traffics." "getNewX25519CertError" = "Error while obtaining the X25519 certificate." - +"getNewmldsa65Error" = "Error while obtaining mldsa65." [pages.inbounds.stream.general] "request" = "Request" diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml index 54b7d5b8..9426d151 100644 --- a/web/translation/translate.es_ES.toml +++ b/web/translation/translate.es_ES.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "El tráfico ha sido reiniciado" "trafficGetError" = "Error al obtener los tráficos" "getNewX25519CertError" = "Error al obtener el certificado X25519." +"getNewmldsa65Error" = "Error al obtener el certificado mldsa65." [pages.inbounds.stream.general] "request" = "Pedido" diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml index 3861e7ef..22337949 100644 --- a/web/translation/translate.fa_IR.toml +++ b/web/translation/translate.fa_IR.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "ترافیک بازنشانی شد" "trafficGetError" = "خطا در دریافت ترافیک‌ها" "getNewX25519CertError" = "خطا در دریافت گواهی X25519." +"getNewmldsa65Error" = "خطا در دریافت گواهی mldsa65." [pages.inbounds.stream.general] "request" = "درخواست" diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml index dbed4130..a452a1bf 100644 --- a/web/translation/translate.id_ID.toml +++ b/web/translation/translate.id_ID.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "Lalu lintas telah direset" "trafficGetError" = "Gagal mendapatkan data lalu lintas" "getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519." +"getNewmldsa65Error" = "Terjadi kesalahan saat mendapatkan sertifikat mldsa65." [pages.inbounds.stream.general] "request" = "Permintaan" diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml index 0e50a2c8..8c1be2c7 100644 --- a/web/translation/translate.ja_JP.toml +++ b/web/translation/translate.ja_JP.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "トラフィックがリセットされました" "trafficGetError" = "トラフィックの取得中にエラーが発生しました" "getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。" +"getNewmldsa65Error" = "mldsa65証明書の取得中にエラーが発生しました。" [pages.inbounds.stream.general] "request" = "リクエスト" diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml index 5f13943e..789732b6 100644 --- a/web/translation/translate.pt_BR.toml +++ b/web/translation/translate.pt_BR.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "O tráfego foi reiniciado" "trafficGetError" = "Erro ao obter tráfegos" "getNewX25519CertError" = "Erro ao obter o certificado X25519." +"getNewmldsa65Error" = "Erro ao obter o certificado mldsa65." [pages.inbounds.stream.general] "request" = "Requisição" diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml index 687f7a97..c9e75262 100644 --- a/web/translation/translate.ru_RU.toml +++ b/web/translation/translate.ru_RU.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "Трафик сброшен" "trafficGetError" = "Ошибка получения данных о трафике" "getNewX25519CertError" = "Ошибка при получении сертификата X25519." +"getNewmldsa65Error" = "Ошибка при получении сертификата mldsa65." [pages.inbounds.stream.general] "request" = "Запрос" diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml index af9d1d19..dc10d12a 100644 --- a/web/translation/translate.tr_TR.toml +++ b/web/translation/translate.tr_TR.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "Trafik sıfırlandı" "trafficGetError" = "Trafik bilgisi alınırken hata oluştu" "getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu." +"getNewmldsa65Error" = "mldsa65 sertifikası alınırken hata oluştu." [pages.inbounds.stream.general] "request" = "İstek" diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml index 83e984b2..1a3ddc8d 100644 --- a/web/translation/translate.uk_UA.toml +++ b/web/translation/translate.uk_UA.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "Трафік скинуто" "trafficGetError" = "Помилка отримання даних про трафік" "getNewX25519CertError" = "Помилка при отриманні сертифіката X25519." +"getNewmldsa65Error" = "Помилка при отриманні сертифіката mldsa65." [pages.inbounds.stream.general] "request" = "Запит" diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml index d4c95f79..c35076b9 100644 --- a/web/translation/translate.vi_VN.toml +++ b/web/translation/translate.vi_VN.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng" "trafficGetError" = "Lỗi khi lấy thông tin lưu lượng" "getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519." +"getNewmldsa65Error" = "Lỗi khi lấy chúng tôi mldsa65." [pages.inbounds.stream.general] "request" = "Lời yêu cầu" diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml index 26cc3322..68e4d1e8 100644 --- a/web/translation/translate.zh_CN.toml +++ b/web/translation/translate.zh_CN.toml @@ -262,6 +262,7 @@ "resetInboundClientTrafficSuccess" = "流量已重置" "trafficGetError" = "获取流量数据时出错" "getNewX25519CertError" = "获取X25519证书时出错。" +"getNewmldsa65Error" = "获取mldsa65证书时出错。" [pages.inbounds.stream.general] "request" = "请求" diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml index 0875cf47..dc4e5c36 100644 --- a/web/translation/translate.zh_TW.toml +++ b/web/translation/translate.zh_TW.toml @@ -264,6 +264,7 @@ "resetInboundClientTrafficSuccess" = "流量已重置" "trafficGetError" = "取得流量資料時發生錯誤" "getNewX25519CertError" = "取得X25519憑證時發生錯誤。" +"getNewmldsa65Error" = "取得mldsa65憑證時發生錯誤。" [pages.inbounds.stream.general] "request" = "請求" From f5f4a530cce822d06937b500bb949966a935b390 Mon Sep 17 00:00:00 2001 From: mhsanaei Date: Sun, 27 Jul 2025 16:54:35 +0200 Subject: [PATCH 2/4] xray core v25.7.26 --- .github/workflows/release.yml | 2 +- DockerInit.sh | 2 +- go.mod | 5 +++-- go.sum | 10 ++++------ 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dabd77f1..074dddd0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -97,7 +97,7 @@ jobs: cd x-ui/bin # Download dependencies - Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.7.24/" + Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.7.26/" if [ "${{ matrix.platform }}" == "amd64" ]; then wget -q ${Xray_URL}Xray-linux-64.zip unzip Xray-linux-64.zip diff --git a/DockerInit.sh b/DockerInit.sh index eac1dbb2..686778cc 100755 --- a/DockerInit.sh +++ b/DockerInit.sh @@ -27,7 +27,7 @@ case $1 in esac mkdir -p build/bin cd build/bin -wget -q "https://github.com/XTLS/Xray-core/releases/download/v25.7.24/Xray-linux-${ARCH}.zip" +wget -q "https://github.com/XTLS/Xray-core/releases/download/v25.7.26/Xray-linux-${ARCH}.zip" unzip "Xray-linux-${ARCH}.zip" rm -f "Xray-linux-${ARCH}.zip" geoip.dat geosite.dat mv xray "xray-linux-${FNAME}" diff --git a/go.mod b/go.mod index 584dacf1..01bbd3ff 100644 --- a/go.mod +++ b/go.mod @@ -17,7 +17,7 @@ require ( github.com/shirou/gopsutil/v4 v4.25.6 github.com/valyala/fasthttp v1.63.0 github.com/xlzd/gotp v0.1.0 - github.com/xtls/xray-core v1.250608.1-0.20250724021908-4f45c5faa5f1 + github.com/xtls/xray-core v1.250726.0 go.uber.org/atomic v1.11.0 golang.org/x/crypto v0.40.0 golang.org/x/text v0.27.0 @@ -58,6 +58,7 @@ require ( github.com/lufia/plan9stats v0.0.0-20250317134145-8bc96cf8fc35 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mattn/go-sqlite3 v1.14.28 // indirect + github.com/miekg/dns v1.1.67 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pires/go-proxyproto v0.8.1 // indirect @@ -80,7 +81,7 @@ require ( github.com/valyala/fastjson v1.6.4 // indirect github.com/vishvananda/netlink v1.3.1 // indirect github.com/vishvananda/netns v0.0.5 // indirect - github.com/xtls/reality v0.0.0-20250723121014-c6320729d93b // indirect + github.com/xtls/reality v0.0.0-20250725142056-5b52a03d4fb7 // indirect github.com/yusufpapurcu/wmi v1.2.4 // indirect go.uber.org/mock v0.5.2 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect diff --git a/go.sum b/go.sum index 0c1fde04..8b1c019a 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= -github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0 h1:Wo41lDOevRJSGpevP+8Pk5bANX7fJacO2w04aqLiC5I= -github.com/OmarTariq612/goech v0.0.0-20240405204721-8e2e1dafd3a0/go.mod h1:FVGavL/QEBQDcBpr3fAojoK17xX5k9bicBphrOpP7uM= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= github.com/bytedance/sonic v1.13.3 h1:MS8gmaH16Gtirygw7jV91pDCN33NyMrPbN7qiYhEsF0= @@ -183,10 +181,10 @@ github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zd github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM= github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po= github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg= -github.com/xtls/reality v0.0.0-20250723121014-c6320729d93b h1:HOOsQYu7/EzvpegY7uHiaeI9H/6OsHAOkREnJthdUW8= -github.com/xtls/reality v0.0.0-20250723121014-c6320729d93b/go.mod h1:XxvnCCgBee4WWE0bc4E+a7wbk8gkJ/rS0vNVNtC5qp0= -github.com/xtls/xray-core v1.250608.1-0.20250724021908-4f45c5faa5f1 h1:5YFdWAwmW/pB7aMltnUmsRC8QY37817Q2m9WqVUVxPU= -github.com/xtls/xray-core v1.250608.1-0.20250724021908-4f45c5faa5f1/go.mod h1:dqSs+9mmzvOZRFxTaS0ktkQYG8TD9naApQPdnp/MUzA= +github.com/xtls/reality v0.0.0-20250725142056-5b52a03d4fb7 h1:Ript0vN+nSO33+Vj4n0mgNY5M+oOxFQJdrJ1VnwTBO0= +github.com/xtls/reality v0.0.0-20250725142056-5b52a03d4fb7/go.mod h1:XxvnCCgBee4WWE0bc4E+a7wbk8gkJ/rS0vNVNtC5qp0= +github.com/xtls/xray-core v1.250726.0 h1:uTUHUt/CQ1JQLip1pLkiwoS0pMvl6oCHJgur4M4orWQ= +github.com/xtls/xray-core v1.250726.0/go.mod h1:z2vn2o30flYEgpSz1iEhdZP1I46UZ3+gXINZyohH3yE= github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= From 71f13ebcbd1d15eb8d5bd6b88ddb2c96e08a287a Mon Sep 17 00:00:00 2001 From: X-Oracle <129892464+X-Oracle@users.noreply.github.com> Date: Sun, 27 Jul 2025 18:52:59 +0330 Subject: [PATCH 3/4] small improvement (#3277) --- install.sh | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/install.sh b/install.sh index 0c4922bb..e43cf2bf 100644 --- a/install.sh +++ b/install.sh @@ -144,6 +144,7 @@ config_after_install() { install_x-ui() { cd /usr/local/ + # Download resources if [ $# == 0 ]; then tag_version=$(curl -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/') if [[ ! -n "$tag_version" ]]; then @@ -174,30 +175,35 @@ install_x-ui() { exit 1 fi fi + wget -O /usr/bin/x-ui-temp https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh + # Stop x-ui service and remove old resources if [[ -e /usr/local/x-ui/ ]]; then systemctl stop x-ui rm /usr/local/x-ui/ -rf fi + # Extract resources and set permissions tar zxvf x-ui-linux-$(arch).tar.gz rm x-ui-linux-$(arch).tar.gz -f + cd x-ui chmod +x x-ui + chmod +x x-ui.sh # Check the system's architecture and rename the file accordingly if [[ $(arch) == "armv5" || $(arch) == "armv6" || $(arch) == "armv7" ]]; then mv bin/xray-linux-$(arch) bin/xray-linux-arm chmod +x bin/xray-linux-arm fi - chmod +x x-ui bin/xray-linux-$(arch) - cp -f x-ui.service /etc/systemd/system/ - wget -O /usr/bin/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh - chmod +x /usr/local/x-ui/x-ui.sh + + # Update x-ui cli and se set permission + mv -f /usr/bin/x-ui-temp /usr/bin/x-ui chmod +x /usr/bin/x-ui config_after_install + cp -f x-ui.service /etc/systemd/system/ systemctl daemon-reload systemctl enable x-ui systemctl start x-ui From 0ad708b1b633d7f7f08c18f9ed358809c9faa8b7 Mon Sep 17 00:00:00 2001 From: Mikhail Grigorev Date: Sun, 27 Jul 2025 20:24:11 +0500 Subject: [PATCH 4/4] Added list of services for get public IP address (IP v4 and v6) (#3216) * Fixed get public IP address * Remove https://ifconfig.io/ip and https://ipinfo.tw/ip --------- Co-authored-by: Mikhail Grigorev --- install.sh | 12 ++++++++---- web/service/server.go | 24 ++++++++++++++++-------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/install.sh b/install.sh index e43cf2bf..a1398712 100644 --- a/install.sh +++ b/install.sh @@ -7,6 +7,7 @@ yellow='\033[0;33m' plain='\033[0m' cur_dir=$(pwd) +show_ip_service_lists=("https://api.ipify.org" "https://4.ident.me") # check root [[ $EUID -ne 0 ]] && echo -e "${red}Fatal error: ${plain} Please run this script with root privilege \n " && exit 1 @@ -85,10 +86,13 @@ config_after_install() { local existing_hasDefaultCredential=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'hasDefaultCredential: .+' | awk '{print $2}') local existing_webBasePath=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'webBasePath: .+' | awk '{print $2}') local existing_port=$(/usr/local/x-ui/x-ui setting -show true | grep -Eo 'port: .+' | awk '{print $2}') - local server_ip=$(curl -s --max-time 3 https://api.ipify.org) - if [ -z "$server_ip" ]; then - server_ip=$(curl -s --max-time 3 https://4.ident.me) - fi + + for ip_service_addr in "${show_ip_service_lists[@]}"; do + local server_ip=$(curl -s --max-time 3 ${ip_service_addr} 2>/dev/null) + if [ -n "${server_ip}" ]; then + break + fi + done if [[ ${#existing_webBasePath} -lt 4 ]]; then if [[ "$existing_hasDefaultCredential" == "true" ]]; then diff --git a/web/service/server.go b/web/service/server.go index d0d4bd18..1bd8a55d 100644 --- a/web/service/server.go +++ b/web/service/server.go @@ -234,23 +234,31 @@ func (s *ServerService) GetStatus(lastStatus *Status) *Status { } // IP fetching with caching + showIp4ServiceLists := []string{"https://api.ipify.org", "https://4.ident.me"} + showIp6ServiceLists := []string{"https://api6.ipify.org", "https://6.ident.me"} + if s.cachedIPv4 == "" { - s.cachedIPv4 = getPublicIP("https://api.ipify.org") - if s.cachedIPv4 == "N/A" { - s.cachedIPv4 = getPublicIP("https://4.ident.me") + for _, ip4Service := range showIp4ServiceLists { + s.cachedIPv4 = getPublicIP(ip4Service) + if s.cachedIPv4 != "N/A" { + break + } } } if s.cachedIPv6 == "" && !s.noIPv6 { - s.cachedIPv6 = getPublicIP("https://api6.ipify.org") - if s.cachedIPv6 == "N/A" { - s.cachedIPv6 = getPublicIP("https://6.ident.me") - if s.cachedIPv6 == "N/A" { - s.noIPv6 = true + for _, ip6Service := range showIp6ServiceLists { + s.cachedIPv6 = getPublicIP(ip6Service) + if s.cachedIPv6 != "N/A" { + break } } } + if s.cachedIPv6 == "N/A" { + s.noIPv6 = true + } + status.PublicIP.IPv4 = s.cachedIPv4 status.PublicIP.IPv6 = s.cachedIPv6