可以用 FRP 实现!FRP 适合已有 公网 IP(本地/路由器或线上服务器) 的场景,相比 Cloudflare Tunnel 更灵活可控,且无需依赖第三方域名托管。以下是 精准、可落地的 FRP 方案细节,适配你的技术栈(Docker + 本地服务 + 线上网站),重点优化配置规范性、安全性和稳定性:
https://gofrp.org/zh-cn/docs/setup/
一、FRP 方案核心逻辑
- 角色划分:
- 「服务端(frps)」:部署在 线上服务器(有公网 IP,如你的网站所在服务器),负责接收公网请求并转发;
- 「客户端(frpc)」:部署在 本地闲置电脑(运行 Umami 的 Docker 环境),负责将本地 Umami 服务(
localhost:3000)转发到服务端; - 「反向代理」:线上服务器用 Nginx/Caddy 配置 HTTPS,将域名请求转发到 FRP 服务端的映射端口,避免直接暴露端口。
- 数据流向:线上网站 → 公网域名(HTTPS)→ 线上服务器 Nginx → FRP 服务端 → FRP 客户端 → 本地 Umami 服务。
二、前提条件
- 线上服务器:
- 有公网 IP,开放 3 个端口(FRP 通信端口:如 7000;Umami 映射端口:如 8080;可选 FRP 面板端口:如 7500);
- 安装 Nginx/Caddy(用于 HTTPS 反向代理);
- 已申请域名(如
umami.your-domain.com),并将域名解析到该服务器公网 IP。
- 本地电脑:
- 已通过 Docker Compose 部署 Umami(参考上一轮的 Docker 配置,确保
localhost:3000可访问); - 安装 FRP 客户端(与服务端版本一致)。
- 已通过 Docker Compose 部署 Umami(参考上一轮的 Docker 配置,确保
- 网络权限:
- 本地电脑可访问互联网(能连接线上服务器的 FRP 通信端口);
- 路由器允许本地电脑对外访问(无需额外端口映射,FRP 是主动连接模式)。
三、详细实施步骤(分服务端/客户端/反向代理)
步骤 1:线上服务器部署 FRP 服务端(frps)
1.1 下载 FRP
选择最新稳定版(推荐 v0.50+,避免兼容性问题),下载对应服务器架构(如 Linux x86_64):
# 线上服务器执行(以 Linux x86_64 为例)
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar -zxvf frp_0.52.3_linux_amd64.tar.gz
mv frp_0.52.3_linux_amd64 /usr/local/frp
cd /usr/local/frp
1.2 配置 FRP 服务端(frps.ini)
创建/修改 frps.ini,核心配置认证、端口和日志,确保安全性和可监控:
[common]
# 1. 基础通信配置
bind_port = 7000 # FRP 客户端与服务端通信的端口(需开放服务器防火墙)
token = your_strong_frp_token # 认证令牌(必须设置,防止未授权连接,建议 ≥16 位随机字符串)
# 2. 可选:FRP 管理面板(用于查看连接状态)
dashboard_port = 7500 # 面板访问端口
dashboard_user = frp_admin # 面板登录用户名
dashboard_pwd = your_dashboard_password # 面板登录密码(强密码)
# 3. 日志配置(便于排查问题)
log_file = /var/log/frps.log
log_level = info # 日志级别:info/warn/error
log_max_days = 7 # 日志保留 7 天
# 4. 连接优化(减少断连)
tcp_keepalive = 60 # 每隔 60s 发送心跳包
max_pool_count = 5 # 最大连接池数量
1.3 配置 FRP 服务自启(系统服务)
创建系统服务文件,确保服务器重启后 frps 自动运行:
sudo tee /etc/systemd/system/frps.service <<EOF
[Unit]
Description=FRP Server (frps)
After=network.target
[Service]
Type=simple
User=root
WorkingDirectory=/usr/local/frp
ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
Restart=always # 异常自动重启
RestartSec=5 # 重启间隔 5s
[Install]
WantedBy=multi-user.target
EOF
# 启用并启动服务
sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps
# 验证状态(确保无报错)
sudo systemctl status frps
1.4 开放服务器端口(防火墙)
以 Ubuntu(ufw)为例,开放 FRP 通信端口、映射端口和面板端口:
# 开放 FRP 通信端口(7000)、Umami 映射端口(8080)、面板端口(7500)
sudo ufw allow 7000/tcp
sudo ufw allow 8080/tcp
sudo ufw allow 7500/tcp
sudo ufw reload
# 验证端口是否开放
sudo ufw status
步骤 2:本地电脑部署 FRP 客户端(frpc)
2.1 下载 FRP(与服务端版本一致)
根据本地电脑系统(Linux/macOS/Windows)下载对应版本:
# 示例:本地 Linux/macOS 下载(x86_64)
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar -zxvf frp_0.52.3_linux_amd64.tar.gz
mv frp_0.52.3_linux_amd64 ~/frp # 放到用户目录下
cd ~/frp
2.2 配置 FRP 客户端(frpc.ini)
核心配置:连接服务端、转发本地 Umami 服务,添加身份认证和连接优化:
[common]
# 1. 服务端信息(必须与 frps 配置一致)
server_addr = 你的线上服务器公网 IP # 如:123.45.67.89
server_port = 7000 # 与 frps 的 bind_port 一致
token = your_strong_frp_token # 与 frps 的 token 完全一致(大小写敏感)
# 2. 日志配置
log_file = ~/frp/frpc.log
log_level = info
log_max_days = 7
# 3. 连接优化(防止断连)
tcp_keepalive = 60
pool_count = 3
connect_timeout = 30 # 连接超时时间 30s
# 4. Umami 服务转发规则(核心)
[umami-tcp] # 规则名称(自定义,唯一)
type = tcp # 协议类型(Umami 是 HTTP 服务,用 tcp 转发更稳定)
local_ip = 127.0.0.1 # 本地 Umami 服务 IP(Docker 映射到本地,所以是 127.0.0.1)
local_port = 3000 # 本地 Umami 服务端口(与 Docker Compose 映射的端口一致)
remote_port = 8080 # 线上服务器暴露的端口(与服务端防火墙开放的 8080 一致)
use_compression = true # 开启数据压缩(减少带宽占用)
use_encryption = true # 开启数据加密(防止传输被窃听)
2.3 配置 FRP 客户端自启(按系统区分)
确保本地电脑重启后,frpc 自动连接服务端:
(1)Linux/macOS(系统服务)
# 创建系统服务文件(Linux)
sudo tee /etc/systemd/system/frpc.service <<EOF
[Unit]
Description=FRP Client (frpc)
After=network.target docker.service # 等待网络和 Docker 启动后再启动
Requires=docker.service
[Service]
Type=simple
User=jin # 替换为你的本地用户名(如 jin)
WorkingDirectory=/home/jin/frp # 替换为 frpc 所在目录
ExecStart=/home/jin/frp/frpc -c /home/jin/frp/frpc.ini
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 启用并启动
sudo systemctl daemon-reload
sudo systemctl enable frpc
sudo systemctl start frpc
# 验证状态
sudo systemctl status frpc
(2)Windows(任务计划程序)
- 新建批处理文件
start_frpc.bat,内容:@echo off cd /d "C:\Users\jin\frp" # 替换为 frpc 所在目录 frpc.exe -c frpc.ini - 打开「任务计划程序」→「创建基本任务」:
- 名称:
FRP Client,触发器选择「开机时」,操作选择「启动程序」,选择上述批处理文件; - 勾选「不管用户是否登录都要运行」和「以最高权限运行」,完成后测试启动。
- 名称:
步骤 3:线上服务器配置反向代理(HTTPS)
FRP 转发后,线上服务器的 8080 端口是 HTTP 协议,需配置 Nginx/Caddy 实现 HTTPS(避免浏览器拦截 Umami 跟踪脚本)。
3.1 申请免费 HTTPS 证书(Let’s Encrypt)
用 Certbot 快速申请证书(以 Nginx 为例):
# 安装 Certbot
sudo apt update && sudo apt install certbot python3-certbot-nginx -y
# 申请证书(替换为你的域名)
sudo certbot --nginx -d umami.your-domain.com
证书会自动保存到 /etc/letsencrypt/live/umami.your-domain.com/。
3.2 Nginx 配置(推荐)
创建 Nginx 配置文件 umami.conf:
server {
listen 80;
server_name umami.your-domain.com;
# 强制跳转 HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name umami.your-domain.com;
# HTTPS 证书配置
ssl_certificate /etc/letsencrypt/live/umami.your-domain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/umami.your-domain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3; # 仅支持安全协议
ssl_prefer_server_ciphers on;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
# 反向代理到 FRP 映射端口(8080)
location / {
proxy_pass http://127.0.0.1:8080; # 指向本地 FRP 服务端的 remote_port
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme; # 传递 HTTPS 协议标识
proxy_connect_timeout 60s; # 连接超时优化
proxy_read_timeout 60s;
}
# 安全头配置(防止 XSS、CSRF 等)
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";
}
3.3 启动 Nginx 并验证
# 检查配置文件语法
sudo nginx -t
# 重启 Nginx
sudo systemctl restart nginx
# 验证 HTTPS 访问
curl -I https://umami.your-domain.com
返回 200 OK 且 Server: nginx 说明配置成功,浏览器访问该域名应能打开 Umami 登录页。
步骤 4:线上网站集成 Umami 跟踪代码
与之前的方案一致,登录 Umami 后台(https://umami.your-domain.com),复制跟踪代码,修改脚本路径后添加到线上网站的 <head> 或 <body> 标签:
<!-- 替换为你的 Tracking ID 和域名 -->
<script async src="https://umami.your-domain.com/analytics.js" data-website-id="你的 Tracking ID"></script>
- 验证:访问线上网站,Umami 后台「Realtime」页面应实时显示访问数据。
四、关键优化配置(稳定性 + 安全性)
4.1 稳定性优化(避免断连/数据丢失)
- FRP 连接保活:
- 客户端/服务端均配置
tcp_keepalive = 60,定期发送心跳包,防止运营商断开长连接; - 本地电脑关闭休眠/睡眠(参考上一轮方案),确保 FRP 客户端持续运行。
- 客户端/服务端均配置
- Umami 数据持久化:
- 确保 Docker Compose 中
postgres-data目录正确挂载(ls ~/docker/umami/postgres-data应有文件); - 本地定期备份
postgres-data目录(如每周一次,压缩后上传云盘)。
- 确保 Docker Compose 中
- FRP 日志监控:
- 定期查看服务端/客户端日志,排查断连问题:
# 服务端查看日志 sudo tail -f /var/log/frps.log # 本地客户端查看日志 tail -f ~/frp/frpc.log
- 定期查看服务端/客户端日志,排查断连问题:
4.2 安全性优化(防止未授权访问)
- FRP 认证强化:
token必须设置为强密码(≥16 位,字母+数字+特殊字符),避免泄露;- 禁用 FRP 面板(若无需监控),或仅允许自己的 IP 访问面板:
# frps.ini 中添加面板 IP 白名单 dashboard_addr = 0.0.0.0 allow_ports = 8080 # 仅允许映射 8080 端口(限制端口范围)
- Umami 后台访问限制:
- Nginx 配置 IP 白名单,仅允许你的 IP 访问 Umami 后台(
/admin/*路径):# 在 443 服务器块中添加 location ^~ /admin/ { allow 你的公网 IP; # 如:111.222.333.444 deny all; # 拒绝其他所有 IP proxy_pass http://127.0.0.1:8080; # 其他 proxy_set_header 配置同上 } - 关闭 Umami 公开统计页面(「Settings」→「General」→ 取消勾选「Public Sharing」)。
- Nginx 配置 IP 白名单,仅允许你的 IP 访问 Umami 后台(
- 禁止直接访问 8080 端口:
- 服务器防火墙仅允许 Nginx 进程访问 8080 端口,禁止外部直接访问(可选,通过 Nginx 反向代理已间接实现)。
五、常见问题排查(精准定位)
- FRP 客户端连接失败:
- 检查服务端 IP/端口:
server_addr和server_port是否正确,服务器防火墙是否开放 7000 端口; - 检查 token 一致性:客户端和服务端的
token必须完全一致(大小写敏感); - 检查网络连通性:本地电脑执行
telnet 服务器IP 7000或nc -zv 服务器IP 7000,确认端口可达。
- 检查服务端 IP/端口:
- 公网访问 Umami 报 502 错误:
- 检查本地 Umami 服务:
curl http://localhost:3000能否访问(确保 Docker 容器正常运行); - 检查 FRP 转发状态:登录 FRP 面板(
https://服务器IP:7500),查看umami-tcp规则是否显示「在线」; - 检查 Nginx 配置:
proxy_pass是否指向127.0.0.1:8080,无拼写错误。
- 检查本地 Umami 服务:
- 线上网站数据不显示:
- 检查跟踪脚本路径:确保
src是https://umami.your-domain.com/analytics.js(与 Docker 配置的TRACKER_SCRIPT_NAME一致); - 检查浏览器控制台:F12 查看「Network」面板,是否有
analytics.js加载失败(广告拦截器可能拦截,暂时关闭测试); - 检查 Umami 日志:
docker-compose logs -f umami-app查看是否有跟踪请求记录。
- 检查跟踪脚本路径:确保
- FRP 连接不稳定(频繁断连):
- 开启
use_compression = true和use_encryption = true,减少网络波动影响; - 调整
tcp_keepalive为 30s,增加心跳频率; - 检查本地网络:是否使用 Wi-Fi 导致断连,建议切换有线网络。
- 开启
总结
FRP 方案完全适配你的需求,核心优势:自主可控(不依赖第三方隧道服务)、低延迟(直接转发)、配置灵活。通过「FRP 服务端+客户端」+「Nginx HTTPS 反向代理」的组合,可实现本地 Umami 稳定对外提供服务,线上网站无需修改核心架构,仅需添加跟踪代码即可完成集成。
配置重点在于 FRP 参数一致性、HTTPS 证书配置、IP 白名单限制,按上述步骤操作后,稳定性和安全性可满足个人网站的长期使用需求。
