diff --git a/ai/hwaishell.sh b/ai/hwaishell.sh index 2297da2..5e8ec5a 100644 --- a/ai/hwaishell.sh +++ b/ai/hwaishell.sh @@ -214,11 +214,18 @@ else log_info "系统已安装 frpc。" fi -# ================= 配置网关与映射端口 ================= -log_step "2/5" "配置动态网关参数:" +# ================= 配置网关与 frpc 代理参数 ================= +log_step "2/5" "配置 frpc 连接与网关端口参数:" +# frps 服务器连接信息 +FRPS_ADDR="${FRPS_ADDR:-$(read_or_default "请输入 frps 服务器地址 (例: 1.2.3.4): " "")}" +FRPS_PORT="${FRPS_PORT:-$(read_or_default "请输入 frps 服务器端口 (默认 7000): " "7000")}" +FRPS_TOKEN="${FRPS_TOKEN:-$(read_or_default "请输入 frps 认证 token (默认留空): " "")}" + +# 代理规则 +PROXY_NAME="${PROXY_NAME:-$(read_or_default "请输入代理名称 (默认 huawei-dynamic-gateway): " "huawei-dynamic-gateway")}" GATEWAY_PORT="${GATEWAY_PORT:-$(read_or_default "请输入 Python 动态网关的本地监听端口 (默认 8080): " "8080")}" -REMOTE_PORT="${REMOTE_PORT:-$(read_or_default "请输入你想在 frps 公网端暴露的端口 (默认 18000): " "18000")}" +REMOTE_PORT="${REMOTE_PORT:-$(read_or_default "请输入在 frps 公网端暴露的端口 (默认 18000): " "18000")}" # 端口有效性检查 if ! [[ "$GATEWAY_PORT" =~ ^[0-9]+$ ]] || [ "$GATEWAY_PORT" -lt 1 ] || [ "$GATEWAY_PORT" -gt 65535 ]; then @@ -230,45 +237,84 @@ if ! [[ "$REMOTE_PORT" =~ ^[0-9]+$ ]] || [ "$REMOTE_PORT" -lt 1 ] || [ "$REMOTE_ exit 1 fi -# ================= 查找 frpc 配置文件 ================= -log_step "3/5" "检测 frpc 配置文件位置以追加代理规则:" +# ================= 生成/追加 frpc 配置 ================= +log_step "3/5" "检测并生成 frpc 配置文件..." FRPC_CONFIG="" -FRPC_TYPE="" +FRPC_TYPE="toml" -# 按优先级查找配置文件 +# 按优先级查找现有配置文件 for path in "/etc/frp/frpc.toml" "/etc/frp/frpc.ini" "/usr/local/etc/frp/frpc.toml" "/usr/local/etc/frp/frpc.ini"; do if [ -f "$path" ]; then FRPC_CONFIG="$path" - [[ "$path" == *.toml ]] && FRPC_TYPE="toml" || FRPC_TYPE="ini" + [[ "$path" == *.ini ]] && FRPC_TYPE="ini" break fi done -# 如果没找到,尝试搜索(限制深度避免长时间等待) +# 如果没找到,搜索 if [ -z "$FRPC_CONFIG" ]; then FRPC_PATH_SEARCH=$(find /etc /usr/local/etc /opt /home -maxdepth 3 \( -name "frpc.toml" -o -name "frpc.ini" \) 2>/dev/null | head -n 1) if [ -n "$FRPC_PATH_SEARCH" ]; then FRPC_CONFIG="$FRPC_PATH_SEARCH" - [[ "$FRPC_PATH_SEARCH" == *.toml ]] && FRPC_TYPE="toml" || FRPC_TYPE="ini" + [[ "$FRPC_PATH_SEARCH" == *.ini ]] && FRPC_TYPE="ini" fi fi -APPEND_FRP="n" +# 构建代理规则块 +build_proxy_block() { + local type=$1 # toml | ini + if [ "$type" = "toml" ]; then + cat << BLK + +[[proxies]] +name = "${PROXY_NAME}" +type = "tcp" +localIP = "127.0.0.1" +localPort = ${GATEWAY_PORT} +remotePort = ${REMOTE_PORT} +BLK + else + cat << BLK + +[${PROXY_NAME}] +type = tcp +local_ip = 127.0.0.1 +local_port = ${GATEWAY_PORT} +remote_port = ${REMOTE_PORT} +BLK + fi +} + if [ -n "$FRPC_CONFIG" ]; then + # --- 已有 frpc 配置:追加代理规则 --- log_info "识别到 frpc 配置: $FRPC_CONFIG (${FRPC_TYPE})" if confirm_or_default "是否自动将华为云转发规则追加到该文件? (y/n, 默认 y): " "y"; then - APPEND_FRP="y" + if grep -q "${PROXY_NAME}" "$FRPC_CONFIG" 2>/dev/null; then + log_warn "frpc 配置中已存在 ${PROXY_NAME} 规则,跳过追加" + else + cp "$FRPC_CONFIG" "${FRPC_CONFIG}.backup.$(date +%Y%m%d%H%M%S)" + build_proxy_block "$FRPC_TYPE" >> "$FRPC_CONFIG" + log_info "代理规则已追加到 $FRPC_CONFIG (原配置已备份)" + fi fi else - log_warn "未找到 frpc 配置文件,跳过自动追加" - log_warn "请手动在 frpc 配置中添加以下规则:" - echo -e "${YELLOW}--- TOML 格式 ---${PLAIN}" - echo -e "[[proxies]]" - echo -e "name = \"huawei-dynamic-gateway\"" - echo -e "type = \"tcp\"" - echo -e "local_ip = \"127.0.0.1\"" - echo -e "local_port = ${GATEWAY_PORT}" - echo -e "remote_port = ${REMOTE_PORT}" + # --- 没有 frpc 配置:自动创建 --- + log_warn "未找到 frpc 配置文件" + if confirm_or_default "是否自动创建 frpc 配置文件并添加网关代理规则? (y/n, 默认 y): " "y"; then + FRPC_CONFIG="/etc/frp/frpc.toml" + mkdir -p /etc/frp + + # 生成主配置 + cat << BLK > "$FRPC_CONFIG" +serverAddr = "${FRPS_ADDR}" +serverPort = ${FRPS_PORT} +auth.method = "token" +auth.token = "${FRPS_TOKEN}" +BLK + # 追加代理规则 + build_proxy_block "toml" >> "$FRPC_CONFIG" + log_info "已创建 frpc 配置文件: $FRPC_CONFIG" + fi fi # ================= 安装 Python 依赖 ================= @@ -662,50 +708,29 @@ fi # 启动服务 safe_start_service "huawei-gateway" "$PYTHON_CMD /usr/local/bin/huawei_gateway.py $GATEWAY_PORT" -# ================= 追加 frpc 规则 ================= -if [[ "$APPEND_FRP" == "y" || "$APPEND_FRP" == "Y" ]] && [ -n "$FRPC_CONFIG" ] && [ -f "$FRPC_CONFIG" ]; then - if grep -q "huawei-dynamic-gateway" "$FRPC_CONFIG" 2>/dev/null; then - log_warn "frpc 配置中已存在 huawei-dynamic-gateway 规则,跳过追加" - else - # 备份原配置 - cp "$FRPC_CONFIG" "${FRPC_CONFIG}.backup.$(date +%Y%m%d%H%M%S)" - - if [ "$FRPC_TYPE" = "toml" ]; then - cat << EOF >> "$FRPC_CONFIG" - -[[proxies]] -name = "huawei-dynamic-gateway" -type = "tcp" -local_ip = "127.0.0.1" -local_port = $GATEWAY_PORT -remote_port = $REMOTE_PORT -EOF +# ================= 启动 frpc ================= +if [ -n "$FRPC_CONFIG" ] && [ -f "$FRPC_CONFIG" ]; then + if command -v frpc &>/dev/null; then + # 重启已运行的 frpc,或首次启动 + if has_systemd; then + if systemctl list-units --type=service 2>/dev/null | grep -q "frpc"; then + systemctl restart frpc 2>/dev/null && log_info "frpc 服务已重启" + else + systemctl enable frpc --now 2>/dev/null && log_info "frpc 服务已通过 systemd 启动" + fi else - cat << EOF >> "$FRPC_CONFIG" - -[huawei-dynamic-gateway] -type = tcp -local_ip = 127.0.0.1 -local_port = $GATEWAY_PORT -remote_port = $REMOTE_PORT -EOF - fi - log_info "frpc 代理规则已追加到 $FRPC_CONFIG" - log_info "原配置已备份" - fi - - # 重启 frpc - if has_systemd; then - if systemctl list-units --type=service 2>/dev/null | grep -q "frpc"; then - systemctl restart frpc 2>/dev/null && log_info "frpc 服务已重启" + restart_service "frpc" + nohup frpc -c "$FRPC_CONFIG" > /var/log/frpc.log 2>&1 & + echo $! > /var/run/frpc.pid + sleep 1 + if kill -0 "$(cat /var/run/frpc.pid)" 2>/dev/null; then + log_info "frpc 已通过 nohup 启动 (PID: $(cat /var/run/frpc.pid))" + else + log_warn "frpc 启动失败,查看日志: /var/log/frpc.log" + fi fi else - restart_service "frpc" - # 尝试直接启动 frpc - if command -v frpc &>/dev/null; then - nohup frpc -c "$FRPC_CONFIG" > /var/log/frpc.log 2>&1 & - log_info "frpc 已通过 nohup 启动" - fi + log_warn "frpc 未安装,跳过启动。配置文件已生成: $FRPC_CONFIG" fi fi @@ -714,9 +739,10 @@ echo -e "\n${BLUE}==================================================${PLAIN}" echo -e "${GREEN} 🎉 6小时长效缓存网关部署完成 🎉 ${PLAIN}" echo -e "${BLUE}==================================================${PLAIN}" echo -e "1. 动态网关状态:$(get_service_status huawei-gateway)" -echo -e "2. 健康检查: http://127.0.0.1:${GATEWAY_PORT}/health" -echo -e "3. 您的本地一劳永逸调用地址:" -echo -e " - ${GREEN}API Base URL:${PLAIN} http://【你的公网frps_IP】:$REMOTE_PORT/v2" +echo -e "2. frpc 配置: $FRPC_CONFIG" +echo -e "3. 健康检查: http://127.0.0.1:${GATEWAY_PORT}/health" +echo -e "4. 您的本地一劳永逸调用地址:" +echo -e " - ${GREEN}API Base URL:${PLAIN} http://${FRPS_ADDR}:${REMOTE_PORT}/v2" echo -e " - ${GREEN}API Key:${PLAIN} sk-anything" echo -e " - ${GREEN}Model:${PLAIN} glm-5.1"