mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2025-10-26 18:14:50 +00:00
Compare commits
9 commits
bd0a142f3b
...
1d76a90ae5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1d76a90ae5 | ||
|
|
3bad8a985c | ||
|
|
f27172b38a | ||
|
|
172f2ddaa7 | ||
|
|
d69af328dc | ||
|
|
ee0e3093ba | ||
|
|
8620b55bd6 | ||
|
|
a44697e2c6 | ||
|
|
85c328bb93 |
5 changed files with 89 additions and 110 deletions
20
install.sh
20
install.sh
|
|
@ -148,12 +148,16 @@ install_x-ui() {
|
||||||
# Download resources
|
# Download resources
|
||||||
if [ $# == 0 ]; then
|
if [ $# == 0 ]; then
|
||||||
tag_version=$(curl -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
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
|
||||||
|
echo -e "${yellow}Trying to fetch version with IPv4...${plain}"
|
||||||
|
tag_version=$(curl -4 -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||||
if [[ ! -n "$tag_version" ]]; then
|
if [[ ! -n "$tag_version" ]]; then
|
||||||
echo -e "${red}Failed to fetch x-ui version, it may be due to GitHub API restrictions, please try it later${plain}"
|
echo -e "${red}Failed to fetch x-ui version, it may be due to GitHub API restrictions, please try it later${plain}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
echo -e "Got x-ui latest version: ${tag_version}, beginning the installation..."
|
echo -e "Got x-ui latest version: ${tag_version}, beginning the installation..."
|
||||||
wget -N -O /usr/local/x-ui-linux-$(arch).tar.gz https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz
|
wget --inet4-only -N -O /usr/local/x-ui-linux-$(arch).tar.gz https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz
|
||||||
if [[ $? -ne 0 ]]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
echo -e "${red}Downloading x-ui failed, please be sure that your server can access GitHub ${plain}"
|
echo -e "${red}Downloading x-ui failed, please be sure that your server can access GitHub ${plain}"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
@ -170,13 +174,17 @@ install_x-ui() {
|
||||||
|
|
||||||
url="https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz"
|
url="https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz"
|
||||||
echo -e "Beginning to install x-ui $1"
|
echo -e "Beginning to install x-ui $1"
|
||||||
wget -N -O /usr/local/x-ui-linux-$(arch).tar.gz ${url}
|
wget --inet4-only -N -O /usr/local/x-ui-linux-$(arch).tar.gz ${url}
|
||||||
if [[ $? -ne 0 ]]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
echo -e "${red}Download x-ui $1 failed, please check if the version exists ${plain}"
|
echo -e "${red}Download x-ui $1 failed, please check if the version exists ${plain}"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
wget -O /usr/bin/x-ui-temp https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh
|
wget --inet4-only -O /usr/bin/x-ui-temp https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo -e "${red}Failed to download x-ui.sh${plain}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
# Stop x-ui service and remove old resources
|
# Stop x-ui service and remove old resources
|
||||||
if [[ -e /usr/local/x-ui/ ]]; then
|
if [[ -e /usr/local/x-ui/ ]]; then
|
||||||
|
|
@ -209,7 +217,11 @@ install_x-ui() {
|
||||||
config_after_install
|
config_after_install
|
||||||
|
|
||||||
if [[ $release == "alpine" ]]; then
|
if [[ $release == "alpine" ]]; then
|
||||||
wget -O /etc/init.d/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.rc
|
wget --inet4-only -O /etc/init.d/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.rc
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo -e "${red}Failed to download x-ui.rc${plain}"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
chmod +x /etc/init.d/x-ui
|
chmod +x /etc/init.d/x-ui
|
||||||
rc-update add x-ui
|
rc-update add x-ui
|
||||||
rc-service x-ui start
|
rc-service x-ui start
|
||||||
|
|
|
||||||
60
update.sh
60
update.sh
|
|
@ -69,18 +69,6 @@ arch() {
|
||||||
|
|
||||||
echo "Arch: $(arch)"
|
echo "Arch: $(arch)"
|
||||||
|
|
||||||
check_glibc_version() {
|
|
||||||
glibc_version=$(ldd --version | head -n1 | awk '{print $NF}')
|
|
||||||
|
|
||||||
required_version="2.32"
|
|
||||||
if [[ "$(printf '%s\n' "$required_version" "$glibc_version" | sort -V | head -n1)" != "$required_version" ]]; then
|
|
||||||
echo -e "${red}GLIBC version $glibc_version is too old! Required: 2.32 or higher${plain}"
|
|
||||||
_fail "Please upgrade to a newer version of your operating system to get a higher GLIBC version."
|
|
||||||
fi
|
|
||||||
echo "GLIBC version: $glibc_version (meets requirement of 2.32+)"
|
|
||||||
}
|
|
||||||
check_glibc_version
|
|
||||||
|
|
||||||
install_base() {
|
install_base() {
|
||||||
echo -e "${green}Updating and install dependency packages...${plain}"
|
echo -e "${green}Updating and install dependency packages...${plain}"
|
||||||
case "${release}" in
|
case "${release}" in
|
||||||
|
|
@ -125,30 +113,22 @@ update_x-ui() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "${green}Downloading new x-ui version...${plain}"
|
echo -e "${green}Downloading new x-ui version...${plain}"
|
||||||
if [ $# == 0 ]; then
|
|
||||||
tag_version=$(${curl_bin} -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" 2>/dev/null | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
tag_version=$(${curl_bin} -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" 2>/dev/null | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||||
|
if [[ ! -n "$tag_version" ]]; then
|
||||||
|
echo -e "${yellow}Trying to fetch version with IPv4...${plain}"
|
||||||
|
tag_version=$(${curl_bin} -4 -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
||||||
if [[ ! -n "$tag_version" ]]; then
|
if [[ ! -n "$tag_version" ]]; then
|
||||||
_fail "ERROR: Failed to fetch x-ui version, it may be due to GitHub API restrictions, please try it later"
|
_fail "ERROR: Failed to fetch x-ui version, it may be due to GitHub API restrictions, please try it later"
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
echo -e "Got x-ui latest version: ${tag_version}, beginning the installation..."
|
echo -e "Got x-ui latest version: ${tag_version}, beginning the installation..."
|
||||||
${wget_bin} -N -O /usr/local/x-ui-linux-$(arch).tar.gz https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz 2>/dev/null
|
${wget_bin} -N -O /usr/local/x-ui-linux-$(arch).tar.gz https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz 2>/dev/null
|
||||||
if [[ $? -ne 0 ]]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
_fail "ERROR: Downloading x-ui failed, please be sure that your server can access GitHub"
|
echo -e "${yellow}Trying to fetch version with IPv4...${plain}"
|
||||||
fi
|
${wget_bin} --inet4-only -N -O /usr/local/x-ui-linux-$(arch).tar.gz https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz 2>/dev/null
|
||||||
else
|
|
||||||
tag_version=$1
|
|
||||||
tag_version_numeric=${tag_version#v}
|
|
||||||
min_version="2.3.5"
|
|
||||||
|
|
||||||
if [[ "$(printf '%s\n' "$min_version" "$tag_version_numeric" | sort -V | head -n1)" != "$min_version" ]]; then
|
|
||||||
_fail "ERROR: Please use a newer version (at least v2.3.5). Exiting installation."
|
|
||||||
fi
|
|
||||||
|
|
||||||
url="https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz"
|
|
||||||
echo -e "Beginning to install x-ui $1"
|
|
||||||
${wget_bin} -N -O /usr/local/x-ui-linux-$(arch).tar.gz ${url} >/dev/null 2>&1
|
|
||||||
if [[ $? -ne 0 ]]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
_fail "ERROR: Download x-ui $1 failed, please check if the version exists."
|
_fail "ERROR: Failed to downloading x-ui, please be sure that your server can access GitHub"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -207,12 +187,16 @@ update_x-ui() {
|
||||||
|
|
||||||
echo -e "${green}Downloading and installing x-ui.sh script...${plain}"
|
echo -e "${green}Downloading and installing x-ui.sh script...${plain}"
|
||||||
${wget_bin} -O /usr/bin/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh >/dev/null 2>&1
|
${wget_bin} -O /usr/bin/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh >/dev/null 2>&1
|
||||||
if [ $? -eq 0 ]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
|
echo -e "${yellow}Trying to fetch x-ui with IPv4...${plain}"
|
||||||
|
${wget_bin} --inet4-only -O /usr/bin/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh >/dev/null 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
_fail "ERROR: Failed to downloading x-ui.sh script, please be sure that your server can access GitHub"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
chmod +x /usr/local/x-ui/x-ui.sh >/dev/null 2>&1
|
chmod +x /usr/local/x-ui/x-ui.sh >/dev/null 2>&1
|
||||||
chmod +x /usr/bin/x-ui >/dev/null 2>&1
|
chmod +x /usr/bin/x-ui >/dev/null 2>&1
|
||||||
else
|
|
||||||
_fail "ERROR: Failed to download x-ui.sh script."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo -e "${green}Changing owner...${plain}"
|
echo -e "${green}Changing owner...${plain}"
|
||||||
chown -R root:root /usr/local/x-ui >/dev/null 2>&1
|
chown -R root:root /usr/local/x-ui >/dev/null 2>&1
|
||||||
|
|
@ -223,16 +207,18 @@ update_x-ui() {
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ $release == "alpine" ]]; then
|
if [[ $release == "alpine" ]]; then
|
||||||
echo -e "${green}Downloading and installing startup unit...${plain}"
|
echo -e "${green}Downloading and installing startup unit x-ui.rc...${plain}"
|
||||||
${wget_bin} -O /etc/init.d/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.rc >/dev/null 2>&1
|
${wget_bin} -O /etc/init.d/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.rc >/dev/null 2>&1
|
||||||
if [ $? -eq 0 ]; then
|
if [[ $? -ne 0 ]]; then
|
||||||
|
${wget_bin} --inet4-only -O /etc/init.d/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.rc >/dev/null 2>&1
|
||||||
|
if [[ $? -ne 0 ]]; then
|
||||||
|
_fail "ERROR: Failed to downloading startup unit x-ui.rc, please be sure that your server can access GitHub"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
chmod +x /etc/init.d/x-ui >/dev/null 2>&1
|
chmod +x /etc/init.d/x-ui >/dev/null 2>&1
|
||||||
chown root:root /etc/init.d/x-ui >/dev/null 2>&1
|
chown root:root /etc/init.d/x-ui >/dev/null 2>&1
|
||||||
rc-update add x-ui >/dev/null 2>&1
|
rc-update add x-ui >/dev/null 2>&1
|
||||||
rc-service x-ui start >/dev/null 2>&1
|
rc-service x-ui start >/dev/null 2>&1
|
||||||
else
|
|
||||||
_fail "ERROR: Failed to download startup unit."
|
|
||||||
fi
|
|
||||||
else
|
else
|
||||||
echo -e "${green}Installing systemd unit...${plain}"
|
echo -e "${green}Installing systemd unit...${plain}"
|
||||||
cp -f x-ui.service /etc/systemd/system/ >/dev/null 2>&1
|
cp -f x-ui.service /etc/systemd/system/ >/dev/null 2>&1
|
||||||
|
|
|
||||||
|
|
@ -108,17 +108,11 @@
|
||||||
el: '#app',
|
el: '#app',
|
||||||
data: {
|
data: {
|
||||||
themeSwitcher,
|
themeSwitcher,
|
||||||
loadingStates: {
|
loadingStates: { fetched: false, spinning: false },
|
||||||
fetched: false,
|
user: { username: "", password: "", twoFactorCode: "" },
|
||||||
spinning: false
|
|
||||||
},
|
|
||||||
user: {
|
|
||||||
username: "",
|
|
||||||
password: "",
|
|
||||||
twoFactorCode: ""
|
|
||||||
},
|
|
||||||
twoFactorEnable: false,
|
twoFactorEnable: false,
|
||||||
lang: ""
|
lang: "",
|
||||||
|
animationStarted: false
|
||||||
},
|
},
|
||||||
async mounted() {
|
async mounted() {
|
||||||
this.lang = LanguageManager.getLanguage();
|
this.lang = LanguageManager.getLanguage();
|
||||||
|
|
@ -127,63 +121,50 @@
|
||||||
methods: {
|
methods: {
|
||||||
async login() {
|
async login() {
|
||||||
this.loadingStates.spinning = true;
|
this.loadingStates.spinning = true;
|
||||||
|
|
||||||
const msg = await HttpUtil.post('/login', this.user);
|
const msg = await HttpUtil.post('/login', this.user);
|
||||||
|
|
||||||
if (msg.success) {
|
if (msg.success) {
|
||||||
location.href = basePath + 'panel/';
|
location.href = basePath + 'panel/';
|
||||||
}
|
}
|
||||||
|
|
||||||
this.loadingStates.spinning = false;
|
this.loadingStates.spinning = false;
|
||||||
},
|
},
|
||||||
async getTwoFactorEnable() {
|
async getTwoFactorEnable() {
|
||||||
const msg = await HttpUtil.post('/getTwoFactorEnable');
|
const msg = await HttpUtil.post('/getTwoFactorEnable');
|
||||||
|
|
||||||
if (msg.success) {
|
if (msg.success) {
|
||||||
this.twoFactorEnable = msg.obj;
|
this.twoFactorEnable = msg.obj;
|
||||||
this.loadingStates.fetched = true;
|
this.loadingStates.fetched = true;
|
||||||
|
this.$nextTick(() => {
|
||||||
|
if (!this.animationStarted) {
|
||||||
|
this.animationStarted = true;
|
||||||
|
this.initHeadline();
|
||||||
|
}
|
||||||
|
});
|
||||||
return msg.obj;
|
return msg.obj;
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
initHeadline() {
|
||||||
|
const animationDelay = 2000;
|
||||||
|
const headlines = this.$el.querySelectorAll('.headline');
|
||||||
|
headlines.forEach((headline) => {
|
||||||
|
const first = headline.querySelector('.is-visible');
|
||||||
|
if (!first) return;
|
||||||
|
setTimeout(() => this.hideWord(first, animationDelay), animationDelay);
|
||||||
|
});
|
||||||
},
|
},
|
||||||
});
|
hideWord(word, delay) {
|
||||||
|
const nextWord = this.takeNext(word);
|
||||||
document.addEventListener("DOMContentLoaded", function () {
|
this.switchWord(word, nextWord);
|
||||||
var animationDelay = 2000;
|
setTimeout(() => this.hideWord(nextWord, delay), delay);
|
||||||
initHeadline();
|
},
|
||||||
|
takeNext(word) {
|
||||||
function initHeadline() {
|
return word.nextElementSibling || word.parentElement.firstElementChild;
|
||||||
animateHeadline(document.querySelectorAll('.headline'));
|
},
|
||||||
}
|
switchWord(oldWord, newWord) {
|
||||||
|
|
||||||
function animateHeadline(headlines) {
|
|
||||||
var duration = animationDelay;
|
|
||||||
headlines.forEach(function (headline) {
|
|
||||||
setTimeout(function () {
|
|
||||||
hideWord(headline.querySelector('.is-visible'));
|
|
||||||
}, duration);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function hideWord(word) {
|
|
||||||
var nextWord = takeNext(word);
|
|
||||||
switchWord(word, nextWord);
|
|
||||||
setTimeout(function () {
|
|
||||||
hideWord(nextWord);
|
|
||||||
}, animationDelay);
|
|
||||||
}
|
|
||||||
|
|
||||||
function takeNext(word) {
|
|
||||||
return word.nextElementSibling ? word.nextElementSibling : word.parentElement.firstElementChild;
|
|
||||||
}
|
|
||||||
|
|
||||||
function switchWord(oldWord, newWord) {
|
|
||||||
oldWord.classList.remove('is-visible');
|
oldWord.classList.remove('is-visible');
|
||||||
oldWord.classList.add('is-hidden');
|
oldWord.classList.add('is-hidden');
|
||||||
newWord.classList.remove('is-hidden');
|
newWord.classList.remove('is-hidden');
|
||||||
newWord.classList.add('is-visible');
|
newWord.classList.add('is-visible');
|
||||||
}
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const pm_input_selector = 'input.ant-input, textarea.ant-input';
|
const pm_input_selector = 'input.ant-input, textarea.ant-input';
|
||||||
|
|
|
||||||
|
|
@ -648,7 +648,7 @@
|
||||||
"ips" = "🔢 IP-адреса:\r\n{{ .IPs }}\r\n"
|
"ips" = "🔢 IP-адреса:\r\n{{ .IPs }}\r\n"
|
||||||
"serverUpTime" = "⏳ Время работы сервера: {{ .UpTime }} {{ .Unit }}\r\n"
|
"serverUpTime" = "⏳ Время работы сервера: {{ .UpTime }} {{ .Unit }}\r\n"
|
||||||
"serverLoad" = "📈 Нагрузка сервера: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n"
|
"serverLoad" = "📈 Нагрузка сервера: {{ .Load1 }}, {{ .Load2 }}, {{ .Load3 }}\r\n"
|
||||||
"serverMemory" = "📋 Диск сервера: {{ .Current }}/{{ .Total }}\r\n"
|
"serverMemory" = "📋 ОЗУ сервера: {{ .Current }}/{{ .Total }}\r\n"
|
||||||
"tcpCount" = "🔹 Количество TCP-соединений: {{ .Count }}\r\n"
|
"tcpCount" = "🔹 Количество TCP-соединений: {{ .Count }}\r\n"
|
||||||
"udpCount" = "🔸 Количество UDP-соединений: {{ .Count }}\r\n"
|
"udpCount" = "🔸 Количество UDP-соединений: {{ .Count }}\r\n"
|
||||||
"traffic" = "🚦 Трафик: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n"
|
"traffic" = "🚦 Трафик: {{ .Total }} (↑{{ .Upload }},↓{{ .Download }})\r\n"
|
||||||
|
|
|
||||||
4
x-ui.sh
4
x-ui.sh
|
|
@ -85,7 +85,7 @@ install() {
|
||||||
}
|
}
|
||||||
|
|
||||||
update() {
|
update() {
|
||||||
confirm "This function will forcefully reinstall the latest version, and the data will not be lost. Do you want to continue?" "y"
|
confirm "This function will update all x-ui components to the latest version, and the data will not be lost. Do you want to continue?" "y"
|
||||||
if [[ $? != 0 ]]; then
|
if [[ $? != 0 ]]; then
|
||||||
LOGE "Cancelled"
|
LOGE "Cancelled"
|
||||||
if [[ $# == 0 ]]; then
|
if [[ $# == 0 ]]; then
|
||||||
|
|
@ -93,7 +93,7 @@ update() {
|
||||||
fi
|
fi
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/main/install.sh)
|
bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/main/update.sh)
|
||||||
if [[ $? == 0 ]]; then
|
if [[ $? == 0 ]]; then
|
||||||
LOGI "Update is complete, Panel has automatically restarted "
|
LOGI "Update is complete, Panel has automatically restarted "
|
||||||
before_show_menu
|
before_show_menu
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue