mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-01-13 01:02:46 +00:00
238 lines
7.5 KiB
Bash
238 lines
7.5 KiB
Bash
#!/bin/bash
|
||
|
||
# 3x-UI 一键静默安装脚本
|
||
# 修改自原版 install.sh,自动设置 sinian/sinian,端口5321,路径/a
|
||
|
||
# 颜色定义
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[0;33m'
|
||
BLUE='\033[0;34m'
|
||
plain='\033[0m'
|
||
|
||
cur_dir=$(pwd)
|
||
|
||
xui_folder="${XUI_MAIN_FOLDER:=/usr/local/x-ui}"
|
||
xui_service="${XUI_SERVICE:=/etc/systemd/system}"
|
||
|
||
# 预设值
|
||
PRESET_USERNAME="sinian"
|
||
PRESET_PASSWORD="sinian"
|
||
PRESET_PORT="5321"
|
||
PRESET_WEB_PATH="a"
|
||
|
||
# check root
|
||
[[ $EUID -ne 0 ]] && echo -e "${RED}Fatal error: ${plain} Please run this script with root privilege \n " && exit 1
|
||
|
||
# Check OS and set release variable
|
||
if [[ -f /etc/os-release ]]; then
|
||
source /etc/os-release
|
||
release=$ID
|
||
elif [[ -f /usr/lib/os-release ]]; then
|
||
source /usr/lib/os-release
|
||
release=$ID
|
||
else
|
||
echo "Failed to check the system OS, please contact the author!" >&2
|
||
exit 1
|
||
fi
|
||
echo "The OS release is: $release"
|
||
|
||
arch() {
|
||
case "$(uname -m)" in
|
||
x86_64 | x64 | amd64) echo 'amd64' ;;
|
||
i*86 | x86) echo '386' ;;
|
||
armv8* | armv8 | arm64 | aarch64) echo 'arm64' ;;
|
||
armv7* | armv7 | arm) echo 'armv7' ;;
|
||
armv6* | armv6) echo 'armv6' ;;
|
||
armv5* | armv5) echo 'armv5' ;;
|
||
s390x) echo 's390x' ;;
|
||
*) echo -e "${green}Unsupported CPU architecture! ${plain}" && rm -f install.sh && exit 1 ;;
|
||
esac
|
||
}
|
||
|
||
echo "Arch: $(arch)"
|
||
|
||
# 自动确认函数
|
||
auto_confirm() {
|
||
return 0
|
||
}
|
||
|
||
# 自动读取函数
|
||
auto_read() {
|
||
if [[ "$*" == *"port"* ]] || [[ "$*" == *"端口"* ]]; then
|
||
echo "$PRESET_PORT"
|
||
elif [[ "$*" == *"username"* ]] || [[ "$*" == *"用户名"* ]]; then
|
||
echo "$PRESET_USERNAME"
|
||
elif [[ "$*" == *"password"* ]] || [[ "$*" == *"密码"* ]]; then
|
||
echo "$PRESET_PASSWORD"
|
||
elif [[ "$*" == *"path"* ]] || [[ "$*" == *"路径"* ]]; then
|
||
echo "$PRESET_WEB_PATH"
|
||
elif [[ "$*" == *"[y/n]"* ]]; then
|
||
echo "y"
|
||
elif [[ "$*" == *"Choose"* ]] || [[ "$*" == *"选择"* ]]; then
|
||
echo "2"
|
||
else
|
||
echo ""
|
||
fi
|
||
}
|
||
|
||
# 替换原版函数
|
||
confirm() {
|
||
auto_confirm
|
||
return $?
|
||
}
|
||
|
||
# 静默安装基函数
|
||
install_base() {
|
||
case "${release}" in
|
||
ubuntu | debian | armbian)
|
||
apt-get update && apt-get install -y -q curl tar tzdata socat
|
||
;;
|
||
fedora | amzn | virtuozzo | rhel | almalinux | rocky | ol)
|
||
dnf -y update && dnf install -y -q curl tar tzdata socat
|
||
;;
|
||
centos)
|
||
if [[ "${VERSION_ID}" =~ ^7 ]]; then
|
||
yum -y update && yum install -y curl tar tzdata socat
|
||
else
|
||
dnf -y update && dnf install -y -q curl tar tzdata socat
|
||
fi
|
||
;;
|
||
arch | manjaro | parch)
|
||
pacman -Syu && pacman -Syu --noconfirm curl tar tzdata socat
|
||
;;
|
||
opensuse-tumbleweed | opensuse-leap)
|
||
zypper refresh && zypper -q install -y curl tar timezone socat
|
||
;;
|
||
alpine)
|
||
apk update && apk add curl tar tzdata socat
|
||
;;
|
||
*)
|
||
apt-get update && apt-get install -y -q curl tar tzdata socat
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# 静默配置函数
|
||
config_after_install() {
|
||
echo -e "${GREEN}正在使用预设配置...${plain}"
|
||
echo -e "${GREEN}用户名: $PRESET_USERNAME${plain}"
|
||
echo -e "${GREEN}密码: $PRESET_PASSWORD${plain}"
|
||
echo -e "${GREEN}端口: $PRESET_PORT${plain}"
|
||
echo -e "${GREEN}访问路径: /$PRESET_WEB_PATH/${plain}"
|
||
|
||
# 直接设置配置
|
||
${xui_folder}/x-ui setting -username "$PRESET_USERNAME" -password "$PRESET_PASSWORD" -port "$PRESET_PORT" -webBasePath "$PRESET_WEB_PATH"
|
||
|
||
# 自动配置 SSL
|
||
echo -e "${GREEN}正在自动配置 SSL 证书...${plain}"
|
||
local server_ip=$(curl -s --max-time 3 https://api.ipify.org || echo "127.0.0.1")
|
||
|
||
# 停止服务释放端口80
|
||
systemctl stop x-ui 2>/dev/null
|
||
|
||
# 配置 SSL
|
||
~/.acme.sh/acme.sh --issue -d ${server_ip} --standalone --httpport 80 --force 2>/dev/null
|
||
if [ $? -eq 0 ]; then
|
||
~/.acme.sh/acme.sh --installcert -d ${server_ip} \
|
||
--key-file /root/cert/ip/privkey.pem \
|
||
--fullchain-file /root/cert/ip/fullchain.pem \
|
||
--reloadcmd "systemctl restart x-ui"
|
||
|
||
${xui_folder}/x-ui cert -webCert /root/cert/ip/fullchain.pem -webCertKey /root/cert/ip/privkey.pem
|
||
fi
|
||
|
||
# 启动服务
|
||
systemctl start x-ui 2>/dev/null
|
||
|
||
echo -e "${GREEN}配置完成!${plain}"
|
||
}
|
||
|
||
# 主安装函数
|
||
install_x-ui() {
|
||
cd ${xui_folder%/x-ui}/
|
||
|
||
# 下载最新版本
|
||
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
|
||
tag_version=$(curl -4 -Ls "https://api.github.com/repos/MHSanaei/3x-ui/releases/latest" | grep '"tag_name":' | sed -E 's/.*"([^"]+)".*/\1/')
|
||
fi
|
||
|
||
echo -e "Got x-ui latest version: ${tag_version}, beginning the installation..."
|
||
curl -4fLRo ${xui_folder}-linux-$(arch).tar.gz https://github.com/MHSanaei/3x-ui/releases/download/${tag_version}/x-ui-linux-$(arch).tar.gz
|
||
|
||
curl -4fLRo /usr/bin/x-ui-temp https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.sh
|
||
|
||
# 停止旧服务
|
||
if [[ -e ${xui_folder}/ ]]; then
|
||
systemctl stop x-ui 2>/dev/null
|
||
rm ${xui_folder}/ -rf
|
||
fi
|
||
|
||
# 解压
|
||
tar zxvf x-ui-linux-$(arch).tar.gz
|
||
rm x-ui-linux-$(arch).tar.gz -f
|
||
|
||
cd x-ui
|
||
chmod +x x-ui bin/xray-linux-$(arch)
|
||
|
||
# 移动文件
|
||
mv -f /usr/bin/x-ui-temp /usr/bin/x-ui
|
||
chmod +x /usr/bin/x-ui
|
||
|
||
# 配置
|
||
config_after_install
|
||
|
||
# 安装服务
|
||
if [[ $release == "alpine" ]]; then
|
||
curl -4fLRo /etc/init.d/x-ui https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.rc
|
||
chmod +x /etc/init.d/x-ui
|
||
rc-update add x-ui
|
||
rc-service x-ui start
|
||
else
|
||
case "${release}" in
|
||
ubuntu | debian | armbian)
|
||
curl -4fLRo ${xui_service}/x-ui.service https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.service.debian
|
||
;;
|
||
*)
|
||
curl -4fLRo ${xui_service}/x-ui.service https://raw.githubusercontent.com/MHSanaei/3x-ui/main/x-ui.service.rhel
|
||
;;
|
||
esac
|
||
|
||
systemctl daemon-reload
|
||
systemctl enable x-ui
|
||
systemctl start x-ui
|
||
fi
|
||
|
||
# 安装中文脚本
|
||
curl -sL https://raw.githubusercontent.com/sinian-liu/3x-ui/main/x-ui.sh -o /usr/local/x-ui/x-ui.sh
|
||
chmod +x /usr/local/x-ui/x-ui.sh
|
||
ln -sf /usr/local/x-ui/x-ui.sh /usr/bin/x-ui
|
||
|
||
# 设置中文
|
||
sed -i 's/"language": "en"/"language": "zh-CN"/g' /usr/local/x-ui/config.json 2>/dev/null
|
||
|
||
echo -e "${GREEN}x-ui ${tag_version}${plain} installation finished!"
|
||
|
||
# 显示访问信息
|
||
local server_ip=$(curl -s --max-time 3 https://api.ipify.org || hostname -I | awk '{print $1}')
|
||
echo ""
|
||
echo -e "${GREEN}========================================${plain}"
|
||
echo -e "${GREEN} 安装完成!${plain}"
|
||
echo -e "${GREEN}========================================${plain}"
|
||
echo -e "用户名: ${PRESET_USERNAME}"
|
||
echo -e "密码: ${PRESET_PASSWORD}"
|
||
echo -e "访问地址: https://${server_ip}:${PRESET_PORT}/${PRESET_WEB_PATH}/"
|
||
echo -e "${GREEN}========================================${plain}"
|
||
}
|
||
|
||
# 安装 acme.sh
|
||
install_acme() {
|
||
curl -s https://get.acme.sh | sh
|
||
~/.acme.sh/acme.sh --upgrade --auto-upgrade
|
||
}
|
||
|
||
echo -e "${GREEN}开始静默安装...${plain}"
|
||
install_base
|
||
install_acme
|
||
install_x-ui
|