呈上效果
共享访问链接
整体方案
因为我本地有NAS设备
,加上云服务器2核2G
部署了Halo后,性能很吃紧了,所以我的方案是:
本地NAS设备搭建Umami容器
通过FRP程序配合云服务器进行内网穿透
通过1penel/宝塔面板反向代理实现给博客提供需求。
搭建Umami容器
Umami 是一款开源的网站分析工具,可用于网站数据追踪、埋点等,具有隐私保护好、轻量级等特点。可以通过 Docker
容器来部署 Umami,将其部署在自己的服务器上,实现数据自主掌控。
项目地址:https://github.com/umami-software/umami
官方docker-compose.yml:https://github.com/umami-software/umami/blob/master/docker-compose.yml
搭建方式有很有,比如1penel/宝塔面板一键安装、克隆源码部署等等,不一一赘述了,采用其他方式部署请以官方文档为准。
绿联NAS Docker部署
我使用的docker-compose.yml
如下,一般不需更改。
version: '3'
services:
umami:
container_name: umami
image: umamisoftware/umami:postgresql-latest
ports:
- "3300:3000"
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
DATABASE_TYPE: postgresql
HASH_SALT: your-random-string-here
depends_on:
- db
restart: always
db:
container_name: umami-db
image: postgres:12-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
volumes:
- ./sql/schema.postgresql.sql:/docker-entrypoint-initdb.d/schema.postgresql.sql:ro
- ./umami-db-data:/var/lib/postgresql/data
restart: always
部署完成后访问:http://NASIP:3300
登录
Umami 安装将创建一个默认的管理员账户,默认用户密码:
admin/umami
, 需要登录并更改默认密码。Umami 系统默认使用英语,登录后可点击网站右上角的图标切换为中文。
登录后,点击头部的设置,选择个人资料,
及时修改账户密码
。
Frp内网穿透
这里先放个官方文档,后面时间写个详细的教程。
大概流程就是:
云服务器部署:FrpS
【可以1penel面板直接安装,设置密钥就行】
本地客户端部署:FrpC
【docker-compose.yml】参考
version: "3"
services:
frpc:
restart: unless-stopped
network_mode: host
volumes:
- /本NAS文件路径/Frpc/frpc.toml:/etc/frp/frpc.toml
container_name: Frpc
image: snowdreamtech/frpc
frpc.toml
文件格式参考
transport.tls.enable = true
serverAddr = "12.123.45.789" 云服务的IP地址/域名
serverPort = 7000 # 公网服务端通信端口
auth.token = "www.8dui.com" # 令牌,与公网服务端保持一致
[[proxies]]
name = "halo"
type = "tcp" # Frp 协议类型
localIP = "10.10.1.5" # 本地服务IP
localPort = 8090 # 本地8090端口
remotePort = 12345 # 暴露服务的公网入口,服务端反向代理端口
反向代理
这里以1Penel
为例
操作完成后,就可以通过域名正常访问Umami
。
Halo安装配置Umami插件
在
Umami
添加站点,将跟踪代码注入全局 head 标签
如果需要共享请打开共享链接
配置插件
至此配置基本完毕,但是你打开你的Umami,你会
发现惊喜
😂
修改反向代理配置文件
我这里有两个其他大佬写的文件,仅供参考
,均为增加项
# 动态设置 CORS
if ($http_origin ~* (https?://(www\.)?8dui\.com)) {
set $allow_origin $http_origin;
}
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
add_header Access-Control-Allow-Origin $allow_origin always;
add_header Access-Control-Allow-Origin 'https://www.8dui.com';
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
add_header Content-Security-Policy 'frame-ancestors www.8dui.com';
proxy_hide_header 'Access-Control-Allow-Origin';
proxy_hide_header 'Content-Security-Policy';
if ($request_method = 'OPTIONS') {
return 204;
}
但是不知道什么原因,也有可能是我配置问题,我配置后会出现奇奇怪怪的问题。
最后与AI深度探讨得出来下面完整的配置,目前使用没问题,也没有报错,仅供参考!
server {
listen 80 ;
listen 443 ssl http2 ;
server_name 你的域名;
# 日志配置
access_log /www/sites/你的域名/log/access.log main;
error_log /www/sites/你的域名/log/error.log;
# 通用代理头
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 https;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
# Let's Encrypt验证路径
location ^~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
expires 1d;
}
# HTTP强制跳转HTTPS
if ($scheme = http) {
return 301 https://$host$request_uri;
}
# SSL配置
ssl_certificate /www/sites/你的域名/ssl/fullchain.pem;
ssl_certificate_key /www/sites/你的域名/ssl/privkey.pem;
ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1;
ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
error_page 497 https://$host$request_uri;
add_header Strict-Transport-Security "max-age=31536000";
# CORS配置(关键修改:仅保留必要的头,避免与后端冲突)
add_header Access-Control-Allow-Origin "https://www.8dui.com" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS" always;
add_header Access-Control-Allow-Headers "DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization" always;
add_header Access-Control-Allow-Credentials "true" always;
# 隐藏后端可能冲突的头(关键修改:明确隐藏后端的Access-Control-Allow-Origin)
proxy_hide_header "Access-Control-Allow-Origin"; # 防止后端返回冲突头
proxy_hide_header "Content-Security-Policy";
# 处理OPTIONS请求
if ($request_method = 'OPTIONS' ) {
return 204;
}
# 反向代理所有请求到Umami容器
location / {
proxy_pass http://127.0.0.1:3300;
proxy_set_header Accept-Encoding "";
}
}
更新-20250808🔔
加入以下代码
proxy_hide_header 'Access-Control-Allow-Origin';
proxy_hide_header 'Content-Security-Policy';
add_header Access-Control-Allow-Origin 'https://www.tata.me'; #修改为实际域名地址
add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
if ($request_method = 'OPTIONS' ) {
return 204;
}
add_header Content-Security-Policy 'frame-ancestors www.tata.me'; #修改为实际域名地址