1. 项目概述
Umami是一款开源的网站分析工具,它最大的特点就是轻量级和注重用户隐私。相比Google Analytics这样的商业解决方案,Umami完全自托管,不会收集用户数据,也不会在网站上加载第三方跟踪脚本。这对于注重隐私保护的开发者来说是个很好的选择。
我最近在自己的Ubuntu服务器上部署了Umami,并通过内网穿透实现了外部访问。整个过程涉及到Docker容器化部署、PostgreSQL数据库配置和内网穿透技术。下面我会详细分享整个实施过程,包括一些踩过的坑和优化建议。
2. 环境准备
2.1 系统要求
Umami可以运行在任何支持Docker的Linux系统上。我使用的是Ubuntu 22.04 LTS,但其他发行版如CentOS、Debian等也都可以。建议服务器配置至少:
- 1核CPU
- 2GB内存
- 20GB存储空间
这个配置足够支撑中小型网站的流量分析了。如果你的网站日PV超过10万,可能需要考虑更高配置。
2.2 Docker安装
Umami依赖Docker运行,所以首先需要安装Docker引擎。以下是Ubuntu系统下的安装步骤:
bash复制# 更新软件包索引
sudo apt-get update
# 安装必要的依赖
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
# 添加Docker官方GPG密钥
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 设置稳定版仓库
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 安装Docker引擎
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
安装完成后,验证Docker是否正常运行:
bash复制sudo docker run hello-world
如果看到"Hello from Docker!"的消息,说明安装成功。
注意:生产环境建议使用非root用户操作Docker,可以将用户加入docker组:
sudo usermod -aG docker $USER
3. Umami部署
3.1 准备部署目录
首先创建一个专门的工作目录:
bash复制mkdir ~/umami && cd ~/umami
这个目录将存放所有Umami相关的配置和数据文件。
3.2 编写docker-compose.yml
Umami官方推荐使用Docker Compose来部署,因为它同时需要PostgreSQL数据库。创建一个docker-compose.yml文件:
yaml复制version: '3.8'
services:
umami:
image: ghcr.io/umami-software/umami:latest
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:umamipass@db:5432/umami
DATABASE_TYPE: postgresql
HASH_SALT: your-very-long-and-random-salt-here-change-it
UMAMI_ADMIN_USERNAME: admin
UMAMI_ADMIN_PASSWORD: umami123
depends_on:
- db
restart: unless-stopped
networks:
- umami-network
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umamipass
volumes:
- ./pgdata:/var/lib/postgresql/data
restart: unless-stopped
networks:
- umami-network
networks:
umami-network:
driver: bridge
这个配置有几个关键点需要注意:
-
HASH_SALT:这是用于加密的安全盐值,应该替换为一个长随机字符串。可以使用
openssl rand -hex 32生成。 -
数据库凭证:默认使用了umami/umamipass,生产环境应该修改为更复杂的密码。
-
数据持久化:PostgreSQL数据会保存在./pgdata目录,确保数据不会丢失。
-
网络配置:专门创建了一个bridge网络让容器间可以通信。
3.3 启动Umami服务
使用以下命令启动服务:
bash复制docker-compose up -d
第一次运行会下载所需的镜像,可能需要几分钟时间。完成后可以通过以下命令检查容器状态:
bash复制docker-compose ps
应该看到两个容器都在运行状态。
3.4 访问Umami界面
Umami默认监听3000端口,可以在浏览器访问:
code复制http://你的服务器IP:3000
使用docker-compose.yml中设置的UMAMI_ADMIN_USERNAME和UMAMI_ADMIN_PASSWORD登录。
提示:如果无法访问,可能是防火墙阻止了3000端口。Ubuntu上可以使用:
sudo ufw allow 3000
4. 配置与优化
4.1 初始设置
首次登录后,建议立即:
- 修改默认管理员密码
- 添加你的网站到跟踪列表
- 生成跟踪代码并添加到网站
4.2 性能优化
对于生产环境,可以考虑以下优化措施:
-
Nginx反向代理:不建议直接暴露3000端口,应该通过Nginx配置HTTPS访问。
-
资源限制:在docker-compose.yml中为容器添加资源限制:
yaml复制umami:
# ...其他配置...
deploy:
resources:
limits:
cpus: '1'
memory: 1G
- 定期备份:PostgreSQL数据目录(pgdata)应该定期备份。
4.3 数据保留策略
Umami默认会永久保留所有数据。可以通过环境变量设置数据保留时间:
yaml复制environment:
# 保留30天的数据
DATABASE_RETENTION_DAYS: 30
5. 实现外部访问
5.1 为什么需要内网穿透
大多数个人开发者或小团队使用的服务器位于家庭网络或公司内网中,没有公网IP。要让外部用户访问内网的Umami服务,就需要内网穿透技术。
5.2 内网穿透方案选择
常见的内网穿透方案有:
- frp:开源方案,需要自备有公网IP的服务器
- Ngrok:商业方案,有免费版但限制较多
- 路由侠:国内服务,提供免费隧道
本文选择路由侠作为示例,因为它对个人开发者比较友好,有免费额度。
5.3 路由侠配置步骤
-
注册账号:前往路由侠官网注册账号
-
安装客户端:
bash复制wget https://dl.luyouxia.com:8443/v2/lyx-docker-x86_64.tar
docker load -i lyx-docker-x86_64.tar
- 启动容器:
bash复制docker run --name lyx -d --restart=always --net=host -e code=你的安装码 luyouxia/lyx
-
添加端口映射:
- 内网地址:服务器IP:3000
- 选择"原生端口"类型
-
获取公网地址:创建成功后,路由侠会提供一个公网访问地址
5.4 安全注意事项
-
HTTPS加密:路由侠提供的免费域名支持HTTPS,建议强制使用
-
访问控制:可以在Umami前面再加一层基础认证:
nginx复制location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://umami:3000;
}
- IP限制:如果只有特定IP需要访问,可以配置IP白名单
6. 常见问题解决
6.1 容器启动失败
问题现象:docker-compose up后容器立即退出
可能原因:
- 端口冲突(已有服务占用3000端口)
- 数据库初始化失败
- 内存不足
解决方案:
- 检查端口占用:
sudo lsof -i :3000 - 查看容器日志:
docker-compose logs - 增加服务器内存或调整Docker资源限制
6.2 数据库连接问题
错误信息:Error: connect ECONNREFUSED
解决方法:
- 确保db容器正常运行
- 检查DATABASE_URL配置是否正确
- 尝试重启容器:
docker-compose restart
6.3 数据统计不准确
可能原因:
- 跟踪代码未正确安装
- 浏览器插件拦截了跟踪请求
- 时区设置不正确
解决方案:
- 检查网站HTML是否包含Umami跟踪代码
- 测试禁用广告拦截插件
- 设置正确的时区环境变量:
TZ=Asia/Shanghai
7. 高级配置
7.1 使用自定义域名
如果你有自己的域名,可以:
- 在DNS解析中添加CNAME记录指向路由侠提供的域名
- 或者在Nginx中配置反向代理:
nginx复制server {
listen 80;
server_name analytics.yourdomain.com;
location / {
proxy_pass http://路由侠公网地址;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
7.2 邮件通知配置
Umami支持通过邮件发送报告,需要配置SMTP:
yaml复制environment:
SMTP_HOST: smtp.example.com
SMTP_PORT: 587
SMTP_SECURE: 'true'
SMTP_USERNAME: user@example.com
SMTP_PASSWORD: yourpassword
SMTP_FROM_EMAIL: no-reply@example.com
7.3 多网站管理
Umami支持同时跟踪多个网站:
- 登录后台
- 进入"设置" > "网站"
- 点击"添加网站"
- 为每个网站生成独立的跟踪代码
8. 替代方案比较
除了路由侠,还有其他内网穿透方案可选:
-
Cloudflare Tunnel:
- 优点:免费、无需开放端口
- 缺点:需要域名在Cloudflare托管
-
Tailscale:
- 优点:点对点加密,安全性高
- 缺点:需要客户端安装软件
-
Zerotier:
- 优点:配置简单
- 缺点:免费版限制100个设备
选择哪种方案取决于你的具体需求和技术偏好。
9. 维护与升级
9.1 日常维护
- 定期检查容器状态:
docker-compose ps - 监控资源使用:
docker stats - 查看日志:
docker-compose logs -f
9.2 版本升级
Umami更新时,只需:
bash复制docker-compose pull
docker-compose up -d
数据库会自动迁移,不会丢失数据。
9.3 数据备份
重要!定期备份PostgreSQL数据:
bash复制# 备份
docker exec umami_db_1 pg_dump -U umami umami > umami_backup.sql
# 恢复
cat umami_backup.sql | docker exec -i umami_db_1 psql -U umami umami
建议设置定时任务每周自动备份。
10. 使用体验分享
在实际使用Umami几个月后,我发现它确实比Google Analytics轻量很多,对网站性能影响几乎可以忽略。数据统计方面,基本功能都很完善,但缺少一些高级分析功能。
最大的优点是隐私保护,完全掌控自己的数据。不过这也意味着要自己负责服务器的维护和数据备份。
路由侠的内网穿透稳定性不错,免费版基本够用。如果对延迟敏感,可以考虑付费套餐或自建frp服务器。