可以用 FRP 实现!FRP 适合已有 公网 IP(本地/路由器或线上服务器) 的场景,相比 Cloudflare Tunnel 更灵活可控,且无需依赖第三方域名托管。以下是 精准、可落地的 FRP 方案细节,适配你的技术栈(Docker + 本地服务 + 线上网站),重点优化配置规范性、安全性和稳定性:

https://gofrp.org/zh-cn/docs/setup/

一、FRP 方案核心逻辑

  1. 角色划分
    • 「服务端(frps)」:部署在 线上服务器(有公网 IP,如你的网站所在服务器),负责接收公网请求并转发;
    • 「客户端(frpc)」:部署在 本地闲置电脑(运行 Umami 的 Docker 环境),负责将本地 Umami 服务(localhost:3000)转发到服务端;
    • 「反向代理」:线上服务器用 Nginx/Caddy 配置 HTTPS,将域名请求转发到 FRP 服务端的映射端口,避免直接暴露端口。
  2. 数据流向:线上网站 → 公网域名(HTTPS)→ 线上服务器 Nginx → FRP 服务端 → FRP 客户端 → 本地 Umami 服务。

二、前提条件

  1. 线上服务器:
    • 有公网 IP,开放 3 个端口(FRP 通信端口:如 7000;Umami 映射端口:如 8080;可选 FRP 面板端口:如 7500);
    • 安装 Nginx/Caddy(用于 HTTPS 反向代理);
    • 已申请域名(如 umami.your-domain.com),并将域名解析到该服务器公网 IP。
  2. 本地电脑:
    • 已通过 Docker Compose 部署 Umami(参考上一轮的 Docker 配置,确保 localhost:3000 可访问);
    • 安装 FRP 客户端(与服务端版本一致)。
  3. 网络权限:
    • 本地电脑可访问互联网(能连接线上服务器的 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(任务计划程序)
  1. 新建批处理文件 start_frpc.bat,内容:
    @echo off
    cd /d "C:\Users\jin\frp"  # 替换为 frpc 所在目录
    frpc.exe -c frpc.ini
    
  2. 打开「任务计划程序」→「创建基本任务」:
    • 名称: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 OKServer: 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 稳定性优化(避免断连/数据丢失)

  1. FRP 连接保活
    • 客户端/服务端均配置 tcp_keepalive = 60,定期发送心跳包,防止运营商断开长连接;
    • 本地电脑关闭休眠/睡眠(参考上一轮方案),确保 FRP 客户端持续运行。
  2. Umami 数据持久化
    • 确保 Docker Compose 中 postgres-data 目录正确挂载(ls ~/docker/umami/postgres-data 应有文件);
    • 本地定期备份 postgres-data 目录(如每周一次,压缩后上传云盘)。
  3. FRP 日志监控
    • 定期查看服务端/客户端日志,排查断连问题:
      # 服务端查看日志
      sudo tail -f /var/log/frps.log
      # 本地客户端查看日志
      tail -f ~/frp/frpc.log
      

4.2 安全性优化(防止未授权访问)

  1. FRP 认证强化
    • token 必须设置为强密码(≥16 位,字母+数字+特殊字符),避免泄露;
    • 禁用 FRP 面板(若无需监控),或仅允许自己的 IP 访问面板:
      # frps.ini 中添加面板 IP 白名单
      dashboard_addr = 0.0.0.0
      allow_ports = 8080  # 仅允许映射 8080 端口(限制端口范围)
      
  2. 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」)。
  3. 禁止直接访问 8080 端口
    • 服务器防火墙仅允许 Nginx 进程访问 8080 端口,禁止外部直接访问(可选,通过 Nginx 反向代理已间接实现)。

五、常见问题排查(精准定位)

  1. FRP 客户端连接失败
    • 检查服务端 IP/端口:server_addrserver_port 是否正确,服务器防火墙是否开放 7000 端口;
    • 检查 token 一致性:客户端和服务端的 token 必须完全一致(大小写敏感);
    • 检查网络连通性:本地电脑执行 telnet 服务器IP 7000nc -zv 服务器IP 7000,确认端口可达。
  2. 公网访问 Umami 报 502 错误
    • 检查本地 Umami 服务:curl http://localhost:3000 能否访问(确保 Docker 容器正常运行);
    • 检查 FRP 转发状态:登录 FRP 面板(https://服务器IP:7500),查看 umami-tcp 规则是否显示「在线」;
    • 检查 Nginx 配置:proxy_pass 是否指向 127.0.0.1:8080,无拼写错误。
  3. 线上网站数据不显示
    • 检查跟踪脚本路径:确保 srchttps://umami.your-domain.com/analytics.js(与 Docker 配置的 TRACKER_SCRIPT_NAME 一致);
    • 检查浏览器控制台:F12 查看「Network」面板,是否有 analytics.js 加载失败(广告拦截器可能拦截,暂时关闭测试);
    • 检查 Umami 日志:docker-compose logs -f umami-app 查看是否有跟踪请求记录。
  4. FRP 连接不稳定(频繁断连)
    • 开启 use_compression = trueuse_encryption = true,减少网络波动影响;
    • 调整 tcp_keepalive 为 30s,增加心跳频率;
    • 检查本地网络:是否使用 Wi-Fi 导致断连,建议切换有线网络。

总结

FRP 方案完全适配你的需求,核心优势:自主可控(不依赖第三方隧道服务)、低延迟(直接转发)、配置灵活。通过「FRP 服务端+客户端」+「Nginx HTTPS 反向代理」的组合,可实现本地 Umami 稳定对外提供服务,线上网站无需修改核心架构,仅需添加跟踪代码即可完成集成。

配置重点在于 FRP 参数一致性、HTTPS 证书配置、IP 白名单限制,按上述步骤操作后,稳定性和安全性可满足个人网站的长期使用需求。