From 67cd83ec66df3df3bc958540f093007f10a15c79 Mon Sep 17 00:00:00 2001 From: serogaq <36307024+serogaq@users.noreply.github.com> Date: Fri, 6 Dec 2024 23:27:12 +0300 Subject: [PATCH 1/2] 6 / new sub headers --- .env.example | 5 +++- docker-compose.yml | 8 ++++-- sub/subController.go | 64 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 72 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index 5f23ebc1..faf177ce 100644 --- a/.env.example +++ b/.env.example @@ -4,4 +4,7 @@ BUILD_WITH_ANTIZAPRET="0" XUI_SERVER_IP="" XUI_PANEL_DOMAIN="" XUI_SUB_DOMAIN="" -XUI_VLESS_SNI="" \ No newline at end of file +XUI_VLESS_SNI="" +#XUI_SUB_PROFILE_TITLE="" +#XUI_SUB_SUPPORT_URL="" +#XUI_SUB_PROFILE_WEB_PAGE_URL="" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index cf76df52..0b5bdead 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -32,14 +32,18 @@ services: - "traefik.tcp.routers.vless.service=3x-ui-inbound-443" - "traefik.tcp.services.3x-ui-inbound-443.loadbalancer.server.port=443" volumes: - - $PWD/db/:/etc/x-ui/ - - $PWD/cert/:/root/cert/ + - ./db/:/etc/x-ui/ + - ./cert/:/root/cert/ + - ./announce.txt:/etc/x-ui/announce.txt environment: PUID: 1000 PGID: 1000 XRAY_VMESS_AEAD_FORCED: "false" TZ: Europe/Moscow XUI_SERVER_IP: "${XUI_SERVER_IP}" + XUI_SUB_PROFILE_TITLE: "${XUI_SUB_PROFILE_TITLE:-}" + XUI_SUB_SUPPORT_URL: "${XUI_SUB_SUPPORT_URL:-}" + XUI_SUB_PROFILE_WEB_PAGE_URL: "${XUI_SUB_PROFILE_WEB_PAGE_URL:-}" tty: true restart: unless-stopped diff --git a/sub/subController.go b/sub/subController.go index edd34481..ba33e52b 100644 --- a/sub/subController.go +++ b/sub/subController.go @@ -4,6 +4,7 @@ import ( "encoding/base64" "net" "strings" + "io/ioutil" "os" "github.com/gin-gonic/gin" @@ -74,6 +75,23 @@ func (a *SUBController) subs(c *gin.Context) { host = c.Request.Host } } + var profileTitle string + profileTitle = os.Getenv("XUI_SUB_PROFILE_TITLE") + if profileTitle == "" { + profileTitle = subId + } + var supportUrl string + supportUrl = os.Getenv("XUI_SUB_PROFILE_TITLE") + if supportUrl == "" { + supportUrl = os.Getenv("XUI_SUB_DOMAIN") + } + var profileWebPageUrl string + profileWebPageUrl = os.Getenv("XUI_SUB_PROFILE_WEB_PAGE_URL") + if profileWebPageUrl == "" { + profileWebPageUrl = os.Getenv("XUI_SUB_DOMAIN") + } + var announceText string + announceText = getAnnounceText() subs, header, err := a.subService.GetSubs(subId, host) if err != nil || len(subs) == 0 { c.String(400, "Error!") @@ -86,7 +104,12 @@ func (a *SUBController) subs(c *gin.Context) { // Add headers c.Writer.Header().Set("Subscription-Userinfo", header) c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval) - c.Writer.Header().Set("Profile-Title", subId) + c.Writer.Header().Set("Profile-Title", profileTitle) + c.Writer.Header().Set("Support-Url", supportUrl) + c.Writer.Header().Set("Profile-Web-Page-Url", profileWebPageUrl) + if announceText != "" { + c.Writer.Header().Set("Announce", announceText) + } if a.subEncrypt { c.String(200, base64.StdEncoding.EncodeToString([]byte(result))) @@ -115,6 +138,23 @@ func (a *SUBController) subJsons(c *gin.Context) { host = c.Request.Host } } + var profileTitle string + profileTitle = os.Getenv("XUI_SUB_PROFILE_TITLE") + if profileTitle == "" { + profileTitle = subId + } + var supportUrl string + supportUrl = os.Getenv("XUI_SUB_PROFILE_TITLE") + if supportUrl == "" { + supportUrl = os.Getenv("XUI_SUB_DOMAIN") + } + var profileWebPageUrl string + profileWebPageUrl = os.Getenv("XUI_SUB_PROFILE_WEB_PAGE_URL") + if profileWebPageUrl == "" { + profileWebPageUrl = os.Getenv("XUI_SUB_DOMAIN") + } + var announceText string + announceText = getAnnounceText() jsonSub, header, err := a.subJsonService.GetJson(subId, host) if err != nil || len(jsonSub) == 0 { c.String(400, "Error!") @@ -123,12 +163,32 @@ func (a *SUBController) subJsons(c *gin.Context) { // Add headers c.Writer.Header().Set("Subscription-Userinfo", header) c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval) - c.Writer.Header().Set("Profile-Title", subId) + c.Writer.Header().Set("Profile-Title", profileTitle) + c.Writer.Header().Set("Support-Url", supportUrl) + c.Writer.Header().Set("Profile-Web-Page-Url", profileWebPageUrl) + if announceText != "" { + c.Writer.Header().Set("Announce", announceText) + } c.String(200, jsonSub) } } +func getAnnounceText() (string) { + announceFilePath := "/etc/x-ui/announce.txt" + _, err := os.Stat(announceFilePath) + if os.IsNotExist(err) { + return "" + } + + content, err := ioutil.ReadFile(announceFilePath) + if err != nil { + return "" + } + + return string(content) +} + func getHostFromXFH(s string) (string, error) { if strings.Contains(s, ":") { realHost, _, err := net.SplitHostPort(s) From 2576975bb9137efc305e1aca0d0c3ddafdb2a674 Mon Sep 17 00:00:00 2001 From: serogaq <36307024+serogaq@users.noreply.github.com> Date: Fri, 6 Dec 2024 23:27:23 +0300 Subject: [PATCH 2/2] 6 / build image tar on mac --- x-ui.sh | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) mode change 100644 => 100755 x-ui.sh diff --git a/x-ui.sh b/x-ui.sh old mode 100644 new mode 100755 index cb5ac099..8c815263 --- a/x-ui.sh +++ b/x-ui.sh @@ -18,9 +18,6 @@ function LOGI() { echo -e "${green}[INF] $* ${plain}" } -# check root -[[ $EUID -ne 0 ]] && LOGE "ERROR: You must be root to run this script! \n" && exit 1 - # Check OS and set release variable if [[ -f /etc/os-release ]]; then source /etc/os-release @@ -28,6 +25,8 @@ if [[ -f /etc/os-release ]]; then elif [[ -f /usr/lib/os-release ]]; then source /usr/lib/os-release release=$ID +elif command -v sw_vers &> /dev/null; then + release="macos" else echo "Failed to check the system OS, please contact the author!" >&2 exit 1 @@ -36,7 +35,11 @@ fi echo "The OS release is: $release" os_version="" -os_version=$(grep "^VERSION_ID" /etc/os-release | cut -d '=' -f2 | tr -d '"' | tr -d '.') +if [[ "${release}" != "macos" ]]; then + os_version=$(grep "^VERSION_ID" /etc/os-release | cut -d '=' -f2 | tr -d '"' | tr -d '.') + # check root + [[ $EUID -ne 0 ]] && LOGE "ERROR: You must be root to run this script! \n" && exit 1 +fi if [[ "${release}" == "arch" ]]; then echo "Your OS is Arch Linux" @@ -86,6 +89,8 @@ elif [[ "${release}" == "ol" ]]; then if [[ ${os_version} -lt 8 ]]; then echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1 fi +elif [[ "${release}" == "macos" ]]; then + echo "Your OS is MacOS" else echo -e "${red}Your operating system is not supported by this script.${plain}\n" echo "Please ensure you are using one of the following supported operating systems:" @@ -103,6 +108,7 @@ else echo "- Oracle Linux 8+" echo "- OpenSUSE Tumbleweed" echo "- Amazon Linux 2023" + echo "- MacOS (build only)" exit 1 fi @@ -1277,6 +1283,11 @@ run_speedtest() { speedtest } +build_image_tar() { + docker compose version; + docker compose --progress plain build --no-cache && docker save -o 3x-ui.tar 3x-ui:latest && echo "Image saved: 3x-ui.tar"; +} + create_iplimit_jails() { # Use default bantime if not passed => 15 minutes local bantime="${1:-15}" @@ -1684,6 +1695,7 @@ show_menu() { ${green}23.${plain} Enable BBR ${green}24.${plain} Update Geo Files ${green}25.${plain} Speedtest by Ookla + ${green}99.${plain} Build Docker Image (tar archive) " show_status echo && read -p "Please enter your selection [0-25]: " num @@ -1767,6 +1779,9 @@ show_menu() { 25) run_speedtest ;; + 99) + build_image_tar + ;; *) LOGE "Please enter the correct number [0-25]" ;;