Files
dock/frps
2025-11-22 21:11:54 +08:00

153 lines
3.9 KiB
Bash
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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