diff --git a/install-chinese.sh b/install-chinese.sh index 5fe24eee..950481e6 100644 --- a/install-chinese.sh +++ b/install-chinese.sh @@ -1,7 +1,8 @@ #!/bin/bash -# 3x-ui 中文版安装脚本 -# 作者: 你的用户名 +# 3x-UI 中文全自动安装脚本 +# 预设:用户名=sinian,密码=sinian,端口=5321,路径=/a +# 自动安装 socat,自动申请 SSL 证书 # 颜色定义 RED='\033[0;31m' @@ -11,8 +12,14 @@ BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${GREEN}================================================${NC}" -echo -e "${GREEN} 3x-UI 中文版安装脚本${NC}" +echo -e "${GREEN} 3x-UI 中文全自动安装脚本${NC}" echo -e "${GREEN}================================================${NC}" +echo -e "${BLUE}预设配置:${NC}" +echo -e "用户名:${GREEN}sinian${NC}" +echo -e "密 码:${GREEN}sinian${NC}" +echo -e "端 口:${GREEN}5321${NC}" +echo -e "访问路径:${GREEN}/a${NC}" +echo -e "${BLUE}将自动安装 SSL 证书${NC}" echo "" # 检查 root 权限 @@ -21,96 +28,436 @@ if [[ $EUID -ne 0 ]]; then exit 1 fi -# 1. 安装原版 3x-ui -echo -e "${BLUE}步骤 1/3: 安装原版 3x-ui...${NC}" -bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/main/install.sh) +# 获取服务器 IP(自动检测) +get_server_ip() { + local ip="" + # 尝试多个 IP 服务 + local services=( + "https://api.ipify.org" + "https://4.ident.me" + "https://ifconfig.me" + "https://icanhazip.com" + "https://checkip.amazonaws.com" + ) + + for service in "${services[@]}"; do + ip=$(curl -s --max-time 3 "$service" 2>/dev/null) + if [[ -n "$ip" && "$ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo "$ip" + return 0 + fi + done + + # 如果 API 都失败,尝试本地获取 + ip=$(ip route get 1 | awk '{print $7}' | head -1) + echo "$ip" +} -if [ $? -ne 0 ]; then - echo -e "${RED}原版安装失败,请检查网络连接${NC}" - exit 1 -fi - -echo -e "${GREEN}原版安装成功${NC}" - -# 2. 下载中文管理脚本 -echo -e "${BLUE}步骤 2/3: 下载中文管理脚本...${NC}" - -# 创建备份 -if [ -f "/usr/local/x-ui/x-ui.sh" ]; then - cp /usr/local/x-ui/x-ui.sh /usr/local/x-ui/x-ui.sh.backup - echo "已备份原版脚本" -fi - -# 下载中文脚本 -wget -q -O /usr/local/x-ui/x-ui.sh https://raw.githubusercontent.com/sinian-liu/Original-3x-ui/main/x-ui.sh - -if [ $? -ne 0 ]; then - echo -e "${YELLOW}下载中文脚本失败,使用原版英文脚本${NC}" - if [ -f "/usr/local/x-ui/x-ui.sh.backup" ]; then - cp /usr/local/x-ui/x-ui.sh.backup /usr/local/x-ui/x-ui.sh +# 修复 Ubuntu 软件源(针对 Ubuntu 24.10) +fix_ubuntu_sources() { + if grep -q "Ubuntu 24.10" /etc/os-release 2>/dev/null; then + echo -e "${YELLOW}检测到 Ubuntu 24.10,修复软件源...${NC}" + + # 备份原文件 + cp /etc/apt/sources.list /etc/apt/sources.list.backup.3xui + + # 使用稳定的 Ubuntu 22.04 源 + cat > /etc/apt/sources.list << 'EOF' +deb http://archive.ubuntu.com/ubuntu jammy main restricted universe multiverse +deb http://archive.ubuntu.com/ubuntu jammy-updates main restricted universe multiverse +deb http://archive.ubuntu.com/ubuntu jammy-backports main restricted universe multiverse +deb http://security.ubuntu.com/ubuntu jammy-security main restricted universe multiverse +EOF + + # 更新源 + apt-get update >/dev/null 2>&1 + + if [ $? -eq 0 ]; then + echo -e "${GREEN}软件源修复成功${NC}" + else + echo -e "${YELLOW}软件源修复失败,继续安装...${NC}" + # 恢复备份 + mv /etc/apt/sources.list.backup.3xui /etc/apt/sources.list + fi fi -else - echo -e "${GREEN}中文脚本下载成功${NC}" - chmod +x /usr/local/x-ui/x-ui.sh - - # 替换系统命令 - ln -sf /usr/local/x-ui/x-ui.sh /usr/bin/x-ui - chmod +x /usr/bin/x-ui -fi +} -# 3. 设置默认中文 -echo -e "${BLUE}步骤 3/3: 设置中文环境...${NC}" - -if [ -f "/usr/local/x-ui/config.json" ]; then - # 备份原配置 - cp /usr/local/x-ui/config.json /usr/local/x-ui/config.json.backup +# 自动安装 socat(支持多系统) +install_socat_auto() { + echo -e "${BLUE}检测并安装 socat...${NC}" - # 设置中文语言 - if grep -q '"language":' /usr/local/x-ui/config.json; then - sed -i 's/"language": "en"/"language": "zh-CN"/g' /usr/local/x-ui/config.json - echo "已修改语言设置为中文" + # 检查是否已安装 + if command -v socat &>/dev/null; then + echo -e "${GREEN}socat 已安装${NC}" + return 0 + fi + + # 检测系统类型并安装 + if command -v apt-get &>/dev/null; then + echo -e "${YELLOW}检测到 Debian/Ubuntu 系统,使用 apt 安装${NC}" + apt-get update >/dev/null 2>&1 + apt-get install -y socat curl >/dev/null 2>&1 + + elif command -v yum &>/dev/null; then + echo -e "${YELLOW}检测到 CentOS/RHEL 系统,使用 yum 安装${NC}" + yum install -y socat curl >/dev/null 2>&1 + + elif command -v dnf &>/dev/null; then + echo -e "${YELLOW}检测到 Fedora 系统,使用 dnf 安装${NC}" + dnf install -y socat curl >/dev/null 2>&1 + + elif command -v apk &>/dev/null; then + echo -e "${YELLOW}检测到 Alpine 系统,使用 apk 安装${NC}" + apk add socat curl >/dev/null 2>&1 + + elif command -v pacman &>/dev/null; then + echo -e "${YELLOW}检测到 Arch 系统,使用 pacman 安装${NC}" + pacman -Sy --noconfirm socat curl >/dev/null 2>&1 + + elif command -v zypper &>/dev/null; then + echo -e "${YELLOW}检测到 openSUSE 系统,使用 zypper 安装${NC}" + zypper install -y socat curl >/dev/null 2>&1 + else - # 如果没有 language 字段,添加它 - sed -i 's/"panelSettings": {/"panelSettings": {\n "language": "zh-CN",/g' /usr/local/x-ui/config.json - echo "已添加语言设置为中文" + echo -e "${RED}无法检测包管理器,请手动安装 socat${NC}" + echo -e "${YELLOW}安装命令参考:${NC}" + echo -e "Debian/Ubuntu: apt install socat curl" + echo -e "CentOS/RHEL: yum install socat curl" + echo -e "Alpine: apk add socat curl" + return 1 fi - # 重启服务 - systemctl restart x-ui 2>/dev/null || rc-service x-ui restart 2>/dev/null - echo "服务已重启" -else - echo -e "${YELLOW}配置文件不存在,跳过语言设置${NC}" + # 验证安装 + if command -v socat &>/dev/null; then + echo -e "${GREEN}socat 安装成功${NC}" + return 0 + else + echo -e "${RED}socat 安装失败${NC}" + return 1 + fi +} + +# 修改原版 install.sh 的安装过程(静默安装) +install_xui_silent() { + echo -e "${BLUE}开始安装 3x-UI...${NC}" + + # 创建临时安装脚本 + cat > /tmp/install-3xui.sh << 'EOF' +#!/bin/bash + +# 静默安装函数 +install_xui() { + # 下载并安装 + bash <(curl -Ls https://raw.githubusercontent.com/MHSanaei/3x-ui/main/install.sh) >/tmp/xui-install.log 2>&1 + + # 等待安装完成 + sleep 5 + + # 设置固定配置 + if [ -f "/usr/local/x-ui/x-ui" ]; then + /usr/local/x-ui/x-ui setting -username "sinian" -password "sinian" -port 5321 -webBasePath "a" + return 0 + else + return 1 + fi +} + +# 尝试安装 +for i in {1..3}; do + echo "安装尝试 $i/3..." + if install_xui; then + echo "安装成功" + exit 0 + fi + sleep 2 +done + +echo "安装失败,请检查日志:/tmp/xui-install.log" +exit 1 +EOF + + chmod +x /tmp/install-3xui.sh + /tmp/install-3xui.sh + + if [ $? -eq 0 ]; then + echo -e "${GREEN}3x-UI 安装成功${NC}" + return 0 + else + echo -e "${RED}3x-UI 安装失败${NC}" + return 1 + fi +} + +# 自动申请 SSL 证书 +auto_setup_ssl() { + echo -e "${BLUE}自动申请 SSL 证书...${NC}" + + local server_ip=$(get_server_ip) + + if [[ -z "$server_ip" ]] || ! [[ "$server_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + echo -e "${RED}无法获取有效的服务器 IP,跳过 SSL 配置${NC}" + return 1 + fi + + echo -e "${GREEN}服务器 IP: ${server_ip}${NC}" + + # 停止面板释放端口 80 + systemctl stop x-ui >/dev/null 2>&1 + sleep 2 + + # 检查端口 80 是否被占用 + if ss -tulpn | grep -q ":80 "; then + echo -e "${YELLOW}端口 80 被占用,尝试释放...${NC}" + # 杀死占用端口 80 的进程(除了必要服务) + lsof -ti:80 | xargs kill -9 >/dev/null 2>&1 + sleep 2 + fi + + # 检查是否已安装 acme.sh + if ! command -v ~/.acme.sh/acme.sh &>/dev/null; then + echo -e "${YELLOW}安装 acme.sh...${NC}" + curl -s https://get.acme.sh | sh >/dev/null 2>&1 + ~/.acme.sh/acme.sh --upgrade --auto-upgrade >/dev/null 2>&1 + fi + + # 创建证书目录 + mkdir -p /root/cert/ip + + echo -e "${YELLOW}正在为 IP ${server_ip} 申请 SSL 证书...${NC}" + echo -e "${YELLOW}这可能需要几分钟,请稍候...${NC}" + + # 申请证书 + ~/.acme.sh/acme.sh --set-default-ca --server letsencrypt >/dev/null 2>&1 + ~/.acme.sh/acme.sh --issue \ + -d ${server_ip} \ + --standalone \ + --server letsencrypt \ + --certificate-profile shortlived \ + --days 6 \ + --httpport 80 \ + --force >/dev/null 2>&1 + + if [ $? -eq 0 ]; then + echo -e "${GREEN}SSL 证书申请成功${NC}" + + # 安装证书 + ~/.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" >/dev/null 2>&1 + + # 设置证书路径 + if [ -f "/usr/local/x-ui/x-ui" ]; then + /usr/local/x-ui/x-ui cert \ + -webCert /root/cert/ip/fullchain.pem \ + -webCertKey /root/cert/ip/privkey.pem >/dev/null 2>&1 + + echo -e "${GREEN}SSL 证书配置完成${NC}" + + # 启动面板 + systemctl start x-ui >/dev/null 2>&1 + sleep 2 + return 0 + fi + else + echo -e "${RED}SSL 证书申请失败${NC}" + echo -e "${YELLOW}可能原因:${NC}" + echo -e "1. 端口 80 未开放" + echo -e "2. 服务器 IP 无法从外部访问" + echo -e "3. 网络问题" + echo -e "${YELLOW}安装后可使用命令手动配置:x-ui 18 6${NC}" + + # 启动面板(即使 SSL 失败) + systemctl start x-ui >/dev/null 2>&1 + return 1 + fi +} + +# 安装中文管理脚本 +install_chinese_script() { + echo -e "${BLUE}安装中文管理脚本...${NC}" + + # 下载中文脚本 + local script_url="https://raw.githubusercontent.com/sinian-liu/3x-ui/main/x-ui.sh" + + if curl -s --head "$script_url" | head -n 1 | grep -q "200"; then + # 备份原脚本 + if [ -f "/usr/local/x-ui/x-ui.sh" ]; then + cp /usr/local/x-ui/x-ui.sh /usr/local/x-ui/x-ui.sh.backup + fi + + # 下载中文脚本 + curl -sL "$script_url" -o /usr/local/x-ui/x-ui.sh + + if [ $? -eq 0 ]; then + chmod +x /usr/local/x-ui/x-ui.sh + ln -sf /usr/local/x-ui/x-ui.sh /usr/bin/x-ui + + # 设置默认中文 + if [ -f "/usr/local/x-ui/config.json" ]; then + sed -i 's/"language": "en"/"language": "zh-CN"/g' /usr/local/x-ui/config.json 2>/dev/null + fi + + echo -e "${GREEN}中文脚本安装成功${NC}" + return 0 + fi + fi + + echo -e "${YELLOW}中文脚本下载失败,使用原版脚本${NC}" + return 1 +} + +# 显示安装结果 +show_installation_result() { + echo "" + echo -e "${GREEN}================================================${NC}" + echo -e "${GREEN} 3x-UI 安装完成!${NC}" + echo -e "${GREEN}================================================${NC}" + + local server_ip=$(get_server_ip) + local panel_info="" + + # 尝试获取面板信息 + if [ -f "/usr/local/x-ui/x-ui" ]; then + panel_info=$(/usr/local/x-ui/x-ui setting -show true 2>/dev/null) + fi + + # 提取端口和路径 + local port="5321" + local path="a" + + if echo "$panel_info" | grep -q "port:"; then + port=$(echo "$panel_info" | grep "port:" | awk '{print $2}' | tr -d ',') + fi + + if echo "$panel_info" | grep -q "webBasePath:"; then + path=$(echo "$panel_info" | grep "webBasePath:" | awk '{print $2}' | tr -d '",') + fi + + # 检查 SSL 证书 + local ssl_status="未配置" + local protocol="http" + + if [ -f "/root/cert/ip/fullchain.pem" ] && [ -f "/root/cert/ip/privkey.pem" ]; then + ssl_status="已配置" + protocol="https" + fi + + echo -e "${YELLOW}📋 安装摘要:${NC}" + echo "" + echo -e "${BLUE}登录信息:${NC}" + echo -e "用户名:${GREEN}sinian${NC}" + echo -e "密 码:${GREEN}sinian${NC}" + echo "" + echo -e "${BLUE}访问地址:${NC}" + + if [[ -n "$server_ip" ]]; then + echo -e "${GREEN}${protocol}://${server_ip}:${port}/${path}/${NC}" + + # 显示二维码(如果支持) + if command -v qrencode &>/dev/null; then + echo "" + echo -e "${BLUE}访问二维码:${NC}" + qrencode -t ANSI "${protocol}://${server_ip}:${port}/${path}/" + elif command -v curl &>/dev/null; then + echo "" + echo -e "${BLUE}生成访问链接:${NC}" + echo "复制上方链接到浏览器访问" + fi + else + echo -e "${GREEN}${protocol}://你的服务器IP:${port}/${path}/${NC}" + fi + + echo "" + echo -e "${BLUE}SSL 证书:${NC}${ssl_status}" + if [ "$ssl_status" = "已配置" ]; then + echo -e "有效期:约6天(自动续期)" + fi + + echo "" + echo -e "${BLUE}管理命令:${NC}" + echo -e "${GREEN}x-ui${NC} # 打开中文管理菜单" + echo -e "${GREEN}x-ui status${NC} # 查看状态" + echo -e "${GREEN}x-ui restart${NC} # 重启面板" + echo -e "${GREEN}x-ui 10${NC} # 查看当前设置" + echo -e "${GREEN}x-ui 18 6${NC} # 重新配置 SSL 证书" + echo "" + + if [ "$ssl_status" = "未配置" ]; then + echo -e "${YELLOW}⚠️ SSL 证书未配置${NC}" + echo -e "运行命令配置:${GREEN}x-ui 18 6${NC}" + echo -e "需要确保端口 80 开放" + fi + + echo -e "${BLUE}安全提示:${NC}" + echo -e "1. 首次登录后立即修改密码" + echo -e "2. 建议设置防火墙规则" + echo -e "3. 定期备份配置" + + echo "" + echo -e "${GREEN}================================================${NC}" +} + +# 主安装流程 +main() { + echo -e "${BLUE}[1/5] 准备安装环境...${NC}" + fix_ubuntu_sources + + echo -e "${BLUE}[2/5] 安装必要组件...${NC}" + install_socat_auto + + echo -e "${BLUE}[3/5] 安装 3x-UI 面板...${NC}" + if ! install_xui_silent; then + echo -e "${RED}面板安装失败,退出安装${NC}" + exit 1 + fi + + echo -e "${BLUE}[4/5] 配置 SSL 证书...${NC}" + auto_setup_ssl + + echo -e "${BLUE}[5/5] 安装中文管理脚本...${NC}" + install_chinese_script + + # 等待服务启动 + sleep 3 + + # 显示安装结果 + show_installation_result + + # 清理临时文件 + rm -f /tmp/install-3xui.sh /tmp/xui-install.log 2>/dev/null +} + +# 显示使用说明 +show_usage() { + echo -e "${GREEN}使用说明:${NC}" + echo "" + echo -e "一键安装命令:" + echo -e "${GREEN}bash <(curl -Ls https://raw.githubusercontent.com/sinian-liu/Original-3x-ui/main/install-chinese.sh)${NC}" + echo "" + echo -e "${BLUE}功能特点:${NC}" + echo -e "✅ 全自动安装,无需人工干预" + echo -e "✅ 预设用户名密码:sinian/sinian" + echo -e "✅ 固定端口:5321,访问路径:/a" + echo -e "✅ 自动安装 socat(支持多系统)" + echo -e "✅ 自动申请 SSL 证书" + echo -e "✅ 自动获取服务器 IP 并显示访问链接" + echo -e "✅ 中文管理界面" + echo "" + echo -e "${YELLOW}系统支持:${NC}" + echo -e "Ubuntu/Debian/CentOS/RHEL/Fedora/Alpine/Arch/openSUSE" + echo "" + echo -e "${RED}注意:${NC}" + echo -e "1. 需要 root 权限运行" + echo -e "2. 需要开放端口 80(SSL 证书申请)" + echo -e "3. 需要开放端口 5321(面板访问)" +} + +# 检查是否显示使用说明 +if [[ "$1" == "--help" ]] || [[ "$1" == "-h" ]]; then + show_usage + exit 0 fi -# 显示完成信息 -echo "" -echo -e "${GREEN}================================================${NC}" -echo -e "${GREEN} 3x-UI 中文版安装完成!${NC}" -echo -e "${GREEN}================================================${NC}" -echo "" -echo -e "${YELLOW}📢 重要信息:${NC}" -echo "" -echo -e "面板访问地址:${GREEN}http://你的服务器IP:54321${NC}" -echo -e "默认用户名:${GREEN}admin${NC}" -echo -e "默认密码:${GREEN}admin${NC}" -echo "" -echo -e "${YELLOW}🚀 使用方法:${NC}" -echo "" -echo -e "输入 ${GREEN}x-ui${NC} 打开中文管理菜单" -echo "" -echo -e "${YELLOW}🔧 常用命令:${NC}" -echo "" -echo -e "${GREEN}x-ui${NC} # 打开管理菜单" -echo -e "${GREEN}x-ui start${NC} # 启动面板" -echo -e "${GREEN}x-ui stop${NC} # 停止面板" -echo -e "${GREEN}x-ui restart${NC} # 重启面板" -echo -e "${GREEN}x-ui status${NC} # 查看状态" -echo -e "${GREEN}x-ui log${NC} # 查看日志" -echo -e "${GREEN}x-ui update${NC} # 更新面板" -echo "" -echo -e "${YELLOW}⚠️ 安全提示:${NC}" -echo -e "1. 请立即登录面板修改默认密码" -echo -e "2. 建议设置 SSL 证书(使用菜单选项 18)" -echo -e "3. 定期备份配置文件" -echo "" -echo -e "${GREEN}================================================${NC}" +# 执行安装 +main