1. 为什么选择Umami+Docker组合监控网站?
在网站运营过程中,数据分析工具是了解用户行为的关键。不同于传统的Google Analytics,Umami是一款开源的、注重隐私保护的轻量级网站分析工具。它采用MIT许可证,不收集用户个人信息,不使用Cookie追踪,完全符合GDPR要求。实测下来,单个Umami实例内存占用仅50MB左右,比主流分析工具节省90%以上资源。
选择Docker部署方式主要基于三个考量:首先,Docker的隔离性避免了环境依赖冲突,特别适合Ubuntu这类长期运行的生产环境;其次,容器化部署让Umami的数据库(PostgreSQL)和应用服务完全解耦,后期维护升级更方便;最重要的是,Docker Compose可以一键编排所有服务,从安装到配置全程不超过10分钟。我在三个不同规格的Ubuntu服务器(18.04/20.04/22.04)上测试,部署过程完全一致。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖检查
2.1 硬件与系统要求
建议使用Ubuntu 20.04 LTS或更高版本,这个长期支持版本对Docker的兼容性最稳定。最低配置要求1核CPU、1GB内存(实测512MB也能运行但可能卡顿),存储空间需要至少10GB。如果是生产环境,推荐2核CPU+4GB内存配置。
检查系统架构(x86_64或ARM):
bash复制uname -m
更新系统包索引是必须的:
bash复制sudo apt update && sudo apt upgrade -y
2.2 Docker引擎安装
如果之前安装过旧版Docker,建议先彻底卸载:
bash复制sudo apt remove docker docker-engine docker.io containerd runc
官方推荐的Docker安装方式是通过仓库安装:
bash复制sudo apt install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
验证安装是否成功:
bash复制sudo docker run hello-world
注意:如果遇到"Virtualization support not detected"错误,需要进入BIOS开启VT-x/AMD-V虚拟化支持,或在Azure等云平台启用嵌套虚拟化。
2.3 Docker Compose安装
虽然新版Docker已内置compose插件,但建议单独安装兼容性更好的独立版本:
bash复制sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
验证版本:
bash复制docker-compose --version
3. Umami的Docker部署实战
3.1 准备部署目录结构
创建一个专用目录存放所有配置文件:
bash复制mkdir ~/umami && cd ~/umami
mkdir config db
3.2 编写docker-compose.yml
以下是经过优化的生产级配置,增加了资源限制和健康检查:
yaml复制version: '3'
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: umami-app
depends_on:
db:
condition: service_healthy
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
DATABASE_TYPE: postgresql
HASH_SALT: replace-with-a-random-string
volumes:
- ./config:/app/config
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:3000/api/health"]
interval: 30s
timeout: 5s
retries: 3
deploy:
resources:
limits:
cpus: '1'
memory: 512M
db:
image: postgres:15-alpine
container_name: umami-db
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
volumes:
- ./db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U umami"]
interval: 5s
timeout: 5s
retries: 5
重要:务必修改HASH_SALT环境变量,使用
openssl rand -hex 32生成随机字符串
3.3 启动服务并初始化
启动容器堆栈:
bash复制docker-compose up -d
观察日志确认无报错:
bash复制docker-compose logs -f
初始化数据库(约等待1分钟后执行):
bash复制docker-compose exec umami yarn run migrate
4. 系统配置与优化技巧
4.1 防火墙与反向代理配置
如果使用UFW防火墙,需放行端口:
bash复制sudo ufw allow 3000/tcp
推荐使用Nginx作为反向代理,示例配置:
nginx复制server {
listen 80;
server_name analytics.yourdomain.com;
location / {
proxy_pass http://localhost:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
启用HTTPS(Certbot示例):
bash复制sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d analytics.yourdomain.com
4.2 数据备份方案
创建每日数据库备份脚本~/umami/backup.sh:
bash复制#!/bin/bash
BACKUP_DIR="/path/to/backups"
DATE=$(date +%Y%m%d)
docker exec umami-db pg_dump -U umami umami > $BACKUP_DIR/umami_$DATE.sql
find $BACKUP_DIR -type f -name "umami_*.sql" -mtime +30 -delete
添加定时任务:
bash复制chmod +x ~/umami/backup.sh
(crontab -l ; echo "0 3 * * * /bin/bash ~/umami/backup.sh") | crontab -
4.3 性能调优参数
在docker-compose.yml中可添加以下PostgreSQL优化参数:
yaml复制environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
POSTGRES_HOST_AUTH_METHOD: trust
PGDATA: /var/lib/postgresql/data/pgdata
POSTGRES_INITDB_ARGS: --data-checksums
POSTGRES_SHARED_BUFFERS: 256MB
POSTGRES_EFFECTIVE_CACHE_SIZE: 768MB
5. 常见问题排查指南
5.1 容器启动失败排查
查看具体错误:
bash复制docker inspect umami-app --format='{{.State.Error}}'
常见错误1:端口冲突
bash复制netstat -tulnp | grep 3000
常见错误2:数据库连接超时
bash复制docker-compose exec db psql -U umami -c "\l"
5.2 数据统计异常处理
检查追踪脚本是否正常加载:
- 在网站HTML的中添加:
html复制<script async defer data-website-id="YOUR_ID" src="https://your-domain.com/umami.js"></script>
验证数据收集:
bash复制docker-compose exec db psql -U umami -c "SELECT * FROM event;"
5.3 升级与维护操作
安全升级步骤:
bash复制docker-compose pull
docker-compose down
docker-compose up -d
docker-compose exec umami yarn run migrate
回滚到特定版本:
bash复制docker-compose down
docker-compose run --rm umami yarn run migrate --down
docker-compose up -d --force-recreate --no-deps umami
6. 高级应用场景扩展
6.1 多网站监控配置
在Umami后台添加新网站后,会生成唯一的website_id。为不同网站使用不同追踪脚本:
html复制<!-- 主站 -->
<script async defer data-website-id="xxxx-xxxx-xxxx" src="/umami.js"></script>
<!-- 子站 -->
<script async defer data-website-id="yyyy-yyyy-yyyy" src="/umami.js"></script>
6.2 自定义事件追踪
示例:追踪按钮点击事件
javascript复制function trackButtonClick() {
umami.track('button-click', { buttonId: 'demo-btn' });
}
6.3 数据导出与分析
通过PostgreSQL直接导出CSV:
bash复制docker-compose exec db psql -U umami -c "\copy (SELECT * FROM session) TO '/tmp/sessions.csv' WITH CSV HEADER"
docker cp umami-db:/tmp/sessions.csv .
使用Metabase构建可视化看板:
yaml复制# 在docker-compose.yml中添加
metabase:
image: metabase/metabase
ports:
- "3001:3000"
depends_on:
- db
environment:
MB_DB_TYPE: postgres
MB_DB_DBNAME: umami
MB_DB_PORT: 5432
MB_DB_USER: umami
MB_DB_PASS: umami
MB_DB_HOST: db
