#!/bin/bash # frps 服务端一键部署脚本 # 功能:自动配置 frps.toml 并启动 Docker 容器 set -eo pipefail # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # 检查 Docker 服务 check_docker() { if ! command -v docker &>/dev/null; then echo -e "${RED}错误:Docker 未安装,请先安装 Docker${NC}" exit 1 fi if ! docker info &>/dev/null; then echo -e "${RED}错误:Docker 服务未运行,请先启动 Docker 服务${NC}" exit 1 fi echo -e "${GREEN}✓ Docker 服务可用${NC}" } # 准备配置文件和目录 prepare_config() { local config_dir="/data/frps" local config_file="$config_dir/frps.toml" echo -e "${YELLOW}正在准备 frps 配置文件...${NC}" mkdir -p "$config_dir" cat > "$config_file" <<'EOF' # ====================== # frp 服务端安全强化配置 # ====================== # 网络监听 bindAddr = "0.0.0.0" bindPort = 7000 #kcpBindPort = 7000 # 保持KCP支持(按需取消注释) quicBindPort = 7000 # 保持QUIC支持 # 端口设置 vhostHTTPPort = 8080 # HTTP代理端口 vhostHTTPSPort = 8443 # HTTPS代理端口 # 传输优化 transport.maxPoolCount = 2000 transport.tcpMux = true transport.tcpMuxKeepaliveInterval = 60 transport.tcpKeepalive = 7200 transport.tls.force = false # 生产环境建议改为true # 控制面板 webServer.addr = "0.0.0.0" webServer.port = 7500 webServer.user = "admin" webServer.password = "FrpS3cure@2024" webServer.pprofEnable = false # 日志配置 log.to = "/var/log/frps.log" log.level = "info" log.maxDays = 3 log.disablePrintColor = false # 认证配置 auth.method = "token" auth.token = "XH7#k9q$LzP2*4vN!R5tY8wC" # 端口控制 allowPorts = [ { start = 10000, end = 60000 } ] # 高级参数 maxPortsPerClient = 8 udpPacketSize = 1500 natholeAnalysisDataReserveHours = 168 EOF echo -e "${GREEN}✓ 配置文件已生成: $config_file${NC}" chmod 600 "$config_file" # 设置配置文件权限 } # 部署 Docker 容器 deploy_container() { local container_name="frps" local config_dir="/data/frps" # 停止并移除旧容器(如果存在) if docker ps -a --format '{{.Names}}' | grep -q "^$container_name$"; then echo -e "${YELLOW}发现已存在的容器,正在清理...${NC}" docker stop "$container_name" >/dev/null docker rm "$container_name" >/dev/null fi # 启动新容器 echo -e "${YELLOW}正在启动 frps 容器...${NC}" docker run -d \ --name "$container_name" \ --restart unless-stopped \ --network host \ -v "$config_dir/frps.toml:/etc/frp/frps.toml" \ -v "$config_dir/logs:/var/log" \ snowdreamtech/frps echo -e "${GREEN}✓ frps 容器已启动${NC}" } # 检查容器状态 check_status() { local container_name="frps" local max_retries=5 local retry_interval=2 echo -e "\n${YELLOW}正在检查容器状态...${NC}" for ((i=1; i<=max_retries; i++)); do if docker ps --filter "name=$container_name" --filter "status=running" | grep -q "$container_name"; then echo -e "${GREEN}✓ frps 运行正常${NC}" # 获取容器使用的端口 echo -e "\n======================" echo -e "${YELLOW}服务已启动,使用以下信息访问:${NC}" echo -e "控制面板: http://<服务器IP>:7500" echo -e "用户名: admin" echo -e "密码: FrpS3cure@2024" echo -e "\n客户端连接令牌: XH7#k9q$LzP2*4vN!R5tY8wC" echo -e "======================" exit 0 fi sleep "$retry_interval" done echo -e "${RED}错误:容器启动失败${NC}" docker logs "$container_name" exit 1 } # 主函数 main() { echo -e "\n${GREEN}===== frps 服务端部署脚本 =====${NC}" check_docker prepare_config deploy_container check_status } main