在上一篇文章中,我们通过 Docker Compose 成功搭建了 Caddy 统一网关,并创建了一个独立的外部网络 web_network。
有了这个坚实的底层基础,今天我们要来部署一款非常强大、开源且注重隐私的 Web 流量统计工具 —— Umami(可完美替代 Google Analytics)。我们将把 Umami 接入到上文提到的 web_network 中,让 Caddy 自动为其实现 HTTPS 反向代理。
架构原理
在继续之前,我们先看一下整体的流量走向:
- 访客访问你的统计域名(如
analytics.yourdomain.com)。 - 请求到达 Caddy 容器(上文已部署,监听宿主机 80/443 端口)。
- Caddy 通过内部网络
web_network,直接将请求转发给 Umami 容器的3000端口。 - Umami 容器在后台与 PostgreSQL 数据库容器通信。
整个过程中,Umami 和数据库都不需要向宿主机暴露任何端口,极大地保证了服务器的安全。
部署步骤
第一步:准备工作目录
在服务器上为 Umami 创建一个独立的工作目录(建议与上文的 caddy-proxy 目录平级):
Bash
mkdir -p ~/umami && cd ~/umami
第二步:编写 docker-compose.yml
在 ~/umami 目录下创建 docker-compose.yml 文件。我们将定义两个服务:Umami 主程序和 PostgreSQL 数据库。
YAML
version: '3.8'
services:
umami-db:
image: postgres:15-alpine
container_name: umami_db
restart: unless-stopped
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami_user
POSTGRES_PASSWORD: your_secure_password # 请更改为你的强密码
volumes:
- ./postgres-data:/var/lib/postgresql/data
networks:
- web_network
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: umami_app
restart: unless-stopped
environment:
DATABASE_URL: postgres://umami_user:your_secure_password@umami-db:5432/umami
APP_SECRET: your_random_long_string_here # 填入一段随机长字符串,用于加密
depends_on:
- umami-db
# 注意:这里不需要暴露端口到宿主机(不需要 ports 映射)
networks:
- web_network
networks:
# 加入上文创建的、供 Caddy 统一调度的外部网络
web_network:
external: true
⚠️ 关键点:这里的
networks必须设置为external: true的web_network。这样,新部署的umami容器才能与上文部署的caddy容器处于同一网络下,实现互联互通。
第三步:启动 Umami 服务
在当前目录下执行命令,让数据库和 Umami 服务在后台运行:
Bash
docker-compose up -d
启动可能需要一两分钟,因为 Umami 首次运行会自动连接数据库并初始化表结构。你可以通过 docker-compose logs -f umami 查看初始化进度。
第四步:配置 Caddy 反向代理
关于 Caddy 容器的部署、web_network 网络的独立创建以及证书的自动申请逻辑,我们在上文中已经详细介绍并完成了部署。现在,我们只需要将 Umami 服务接入到现有的 Caddy 中即可。
进入你上文的 Caddy 配置目录(如 ~/caddy-proxy),修改 Caddyfile,追加 Umami 的域名和反向代理配置:
Nginx
# 上文已有的其他配置...
yourdomain.com {
reverse_proxy backend_service:8080
}
# 新增:Umami 统计服务的配置
analytics.yourdomain.com {
# 这里的 umami_app 对应 umami 容器的 container_name
reverse_proxy umami_app:3000
}
💡 提示:请确保
analytics.yourdomain.com的 DNS 解析已经指向了你的服务器 IP。
修改完成后,无需重启 Caddy 容器,只需在 Caddy 目录下执行热重载命令:
Bash
docker-compose exec -w /etc/caddy caddy caddy reload
Caddy 会在后台悄无声息地为你的新域名 analytics.yourdomain.com 申请 Let’s Encrypt / ZeroSSL 证书。
验证与使用
- 打开浏览器,访问
https://analytics.yourdomain.com。 - 你应该能看到满怀科技感的 Umami 登录界面。
- 默认管理员账号:
admin - 默认密码:
umami - 登录后,请务必第一时间前往设置(Settings)修改默认密码!
随后,你就可以在 Umami 后台“添加网站”,获取一小段 JS 统计代码,将其粘贴到你的博客或网站中。由于 Caddy 已经全自动帮我们配置好了 HTTPS 和 HTTP/3,你的统计代码在各种现代浏览器中都能完美、安全地加载。
总结
得益于我们在上文中设计的独立网络 web_network 方案,整个扩展过程变得极其丝滑。我们部署 Umami 时,无需担心端口冲突,也不需要手动配置复杂的 SSL 证书。只需要在 Umami 的 Compose 文件中声明加入该网络,并在 Caddyfile 中用容器名指向它,HTTPS 反向代理便大功告成!