重构 frpc 配置流程:支持交互式填写 + 自动创建独立配置

- Step 2 新增 frpc 连接参数交互输入:FRPS_ADDR/FRPS_PORT/FRPS_TOKEN/PROXY_NAME
- 找不到 frpc 配置时自动创建 /etc/frp/frpc.toml 完整配置
- 已有配置时追加代理规则(自动备份)
- unified build_proxy_block() 函数统一管理 TOML/INI 格式
- frpc 启动逻辑:无 systemd 时自动 nohup 启动
- 部署总结显示真实 frps 地址
- 所有参数支持环境变量覆盖用于管道模式
This commit is contained in:
2026-07-02 15:01:17 +08:00
parent d9eccdfd81
commit 4da4ae9af8
+91 -65
View File
@@ -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"