Swetrix Docker Compose 部署指南
在一台 Ubuntu 服务器上用官方自托管编排(swetrix/selfhosting 仓库)从零部署 Swetrix 社区版 v5.4.1(前端 + API + nginx 统一入口 + ClickHouse + Redis 五服务),完成环境变量生成、服务启动、健康检查、首个账号注册、创建项目并验证事件上报出数的全流程。
Swetrix Docker Compose 部署指南
目标:在一台 Ubuntu 服务器上用官方自托管编排(
swetrix/selfhosting仓库)从零部署 Swetrix 社区版 v5.4.1(前端 + API + nginx 统一入口 + ClickHouse + Redis 五服务),完成环境变量生成、服务启动、健康检查、首个账号注册、创建项目并验证事件上报出数的全流程。已在 Ubuntu 22.04 服务器(Docker 27 + Compose v2)上实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04 LTS(x86_64)
- Docker:27.x,Docker Compose v2(
docker compose子命令形式) - Swetrix 版本:v5.4.1(官方最新稳定版,2026-08-04 发布;镜像
swetrix/swetrix-fe:v5.4.1约 633MB、swetrix/swetrix-api:v5.4.1约 1.1GB) - 依赖组件版本(官方编排锁定):ClickHouse
clickhouse/clickhouse-server:25.8-alpine、Redisredis:8.6-alpine、nginxnginx:1.31.1-alpine - 官方推荐资源:x86_64 / arm64 均可,内存至少 2GB(ClickHouse 为内存大头,官方附降内存配置,见第七章)
- 服务端口:nginx 入口监听 80(本文映射为宿主机 8131 示例,读者按自身端口替换);前端内部 3000、API 内部 5005、ClickHouse HTTP 8123、Redis 6379 均不直接对公网
- 服务器 IP:192.168.1.200(下文访问地址以它为准,读者按自身服务器 IP 替换)
- 部署目录:
/opt/swetrix(编排仓库内容落在此处)
二、镜像选型说明
| 服务 | 镜像 | 选型依据 |
|---|---|---|
| 前端 | swetrix/swetrix-fe:v5.4.1 | 官方 Docker Hub 镜像,与主仓库 Releases 版本号一一对应 |
| API | swetrix/swetrix-api:v5.4.1 | 官方 Docker Hub 镜像,同上;latest tag 同步指向最新稳定版 |
| 分析库 | clickhouse/clickhouse-server:25.8-alpine | 官方编排锁定;Swetrix 用 ClickHouse 同时存分析事件与业务事务数据 |
| 缓存 | redis:8.6-alpine | 官方编排锁定 |
| 入口 | nginx:1.31.1-alpine | 官方编排锁定,负责 / 与 /backend/ 路由 |
选型结论:五个镜像全部来自官方渠道且版本组合由官方编排文件锁定,直接照抄官方组合即可;升级 Swetrix 版本时只改两个 swetrix/* 镜像 tag,依赖库版本不建议自行大幅变更。Swetrix 不提供非 Docker 的官方分发(无裸机安装包、无系统包),Compose 是唯一官方自托管路径。
三、前置条件
- 服务器已安装 Docker 27+ 与 Docker Compose v2,当前用户在
docker组; - 宿主机入口端口空闲(本文用 8131,可用
ss -ltn | grep 8131自查); - 服务器可访问外网拉取镜像(官方镜像在 Docker Hub,国内网络缓慢时配置镜像加速或代理);
openssl命令可用(configure.sh生成随机凭据用);- 浏览器可访问服务器入口端口(注册账号与仪表盘操作用)。
四、部署步骤
4.1 获取官方自托管编排
Swetrix 的编排文件单独维护在 swetrix/selfhosting 仓库(主仓库 README 的 Self-hosting guide 指向它),结构如下:
selfhosting/
├── compose.yaml # 五服务编排
├── configure.sh # 交互式 .env 生成脚本
├── nginx/
│ └── config # nginx 反代配置(/ → 前端,/backend/ → API)
└── clickhouse/
├── README.md
├── reduce-logs.xml
├── disable-user-logging.xml
├── preserve-ram-config.xml
└── preserve-ram-user.xml
在服务器上获取编排文件(官方文档用 git clone,亦可直接下载压缩包):
sudo mkdir -p /opt/swetrix && sudo chown $USER /opt/swetrix && cd /opt/swetrix
git clone https://github.com/swetrix/selfhosting .
# 无法访问 GitHub 时可下载主干压缩包解压:
# curl -L https://codeload.github.com/swetrix/selfhosting/tar.gz/refs/heads/main -o sh.tgz && tar xzf sh.tgz --strip-components=1 && rm sh.tgz
4.2 生成环境变量(configure.sh)
运行官方配置脚本,交互生成 .env:
./configure.sh
脚本行为实录(实测要点):先做 preflight 检查并打印 Docker/Compose 版本,随后要求输入实例公共 URL(必填,自动去尾部斜杠),SECRET_KEY_BASE 直接回车自动生成,其余项脚本自动写入。最终生成的 .env 结构:
# Swetrix Frontend configuration
BASE_URL=http://192.168.1.200:8131
# Swetrix API configuration
SECRET_KEY_BASE=<自动生成的 64 字符随机串>
DEBUG_MODE=false
IP_GEOLOCATION_DB_PATH=
DISABLE_REGISTRATION=true
# Database credentials
REDIS_PASSWORD=
CLICKHOUSE_PASSWORD=<自动生成的 64 位十六进制串>
逐行说明:BASE_URL 必须是浏览器可达的地址(本例 http://192.168.1.200:8131,公网部署换域名);DISABLE_REGISTRATION=true 是官方默认的安全姿态——只放行首个注册用户;SMTP_MOCK 脚本不生成,需要控制台邮件模拟时手工追加 SMTP_MOCK=true(本文实验加此项,验证注册流程无需真实邮箱);参数逐项含义见 《Swetrix v5.4.1 配置参数详解》。
4.3 调整入口端口(可选)
官方编排把入口 nginx 的 80 端口直接映射到宿主机。若 80 已被占用或想用高位端口,编辑 compose.yaml 中 nginx-proxy 服务的端口映射(本文实验映射为 8131):
ports:
- "8131:80"
同时把 .env 的 BASE_URL 同步改为带新端口的地址,避免前端拼出错误链接。
4.4 启动编排
docker compose up -d
首次启动会按依赖顺序拉起:redis、clickhouse(带健康检查)→ swetrix-api(等待上述两者 healthy)→ swetrix 前端 → nginx-proxy(等待前后端 healthy)。全链路健康后(实测首启约 1–3 分钟,含 ClickHouse 初始化建库建表)查看状态:
docker compose ps
实测回显(五服务全部就绪,healthy 状态由各自内置健康检查驱动):
NAME STATUS PORTS
swetrix-v5.4.1-api Up 20 seconds (healthy) 5005/tcp
swetrix-v5.4.1-clickhouse Up 27 seconds (healthy) 8123/tcp, 9000/tcp, 9009/tcp
swetrix-v5.4.1-fe Up 20 seconds (healthy)
swetrix-v5.4.1-nginx Up 9 seconds 0.0.0.0:8131->80/tcp, [::]:8131->80/tcp
swetrix-v5.4.1-redis Up 26 seconds (healthy) 6379/tcp
4.5 健康检查与首次访问
官方两个应用镜像内置 wget --spider /ping 健康检查,可直接复现验证:
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8131/ # 前端入口
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8131/backend/ # API 经 nginx 转发
实测回显:
302
200
第一行 302 是预期行为:未登录访问前端根路径会被重定向到登录页(浏览器访问时自动跟随);第二行 200 说明 nginx → API 的 /backend/ 转发链路健康。浏览器打开 http://192.168.1.200:8131 进入 Swetrix 界面。
4.6 注册首个账号
入口页面右上角进入登录页,切换到注册(DISABLE_REGISTRATION=true 时仅首个用户可注册,注册入口在首个用户产生后自动关闭)。本文实验账号:
- 邮箱:
admin@example.com - 密码:
q1w2E3r4(实测服务端密码策略仅校验长度 8–72 位,无强度要求;出于安全习惯建议生产改用强口令)
注册也可以直接调 API 验证(端点 POST /backend/v1/auth/register)。注意请求体必须携带 checkIfLeaked 布尔字段(是否对照泄露密码库检查),缺失时直接 400:
curl -s -X POST http://192.168.1.200:8131/backend/v1/auth/register \
-H 'Content-Type: application/json' \
-d '{"email":"admin@example.com","password":"q1w2E3r4"}'
实测回显(缺字段被校验拦截):
{"message":"Bad Request Exception","error":"Bad Request","statusCode":400}
补上字段重试:
curl -s -X POST http://192.168.1.200:8131/backend/v1/auth/register \
-H 'Content-Type: application/json' \
-d '{"email":"admin@example.com","password":"q1w2E3r4","checkIfLeaked":false}'
实测回显(注册成功,直接签发 JWT 令牌对与用户信息,输出节选):
{"accessToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkODdjN2VjMS01NTNiLTRlNWQtYTQ1NC00ZjUxMDU1MzdmY2Qi…","refreshToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkODdjN2VjMS01NTNiLTRlNWQtYTQ1NC00ZjUxMDU1MzdmY2Qi…","user":{"id":"d87c7ec1-553b-4e5d-a454-4f5105537fcd","email":"admin@example.com", …}}
⚠️ 注意:注册响应即含
accessToken(约 30 分钟有效)与refreshToken,无需邮箱验证环节——自托管默认SMTP_MOCK未配置也无妨;后续 API 调用把accessToken放在Authorization: Bearer头中即可。
4.7 创建项目并验证事件上报
登录后创建项目(名称任意,如 demo),项目创建后得到 Project ID(本文实测为 SojpySDiPDTp 形态的 12 位串)。用管理 API 创建项目的实测:
curl -s -X POST http://192.168.1.200:8131/backend/v1/project \
-H "Authorization: Bearer <accessToken>" \
-H 'Content-Type: application/json' \
-d '{"name":"demo"}'
实测回显:
{
"id": "SojpySDiPDTp",
"name": "demo",
"websiteUrl": null
}
拿到 Project ID 后先用 Events API 直接验证数据链路(官方文档要求:User-Agent 与访客 X-Forwarded-For 必须携带,否则独立访客与实时访客统计失真):
curl -i -X POST http://192.168.1.200:8131/backend/log \
-H 'Content-Type: application/json' \
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/126 Safari/537.36' \
-H 'X-Forwarded-For: 89.160.20.112' \
-d '{"pid":"SojpySDiPDTp","pg":"/home","tz":"Europe/Berlin","lc":"en-US","ref":"https://www.google.com/"}'
实测回显(响应头节选):
HTTP/1.1 201 Created
Server: nginx/1.31.1
Content-Type: application/json; charset=utf-8
再补一条自定义事件(转化类上报):
curl -s -o /dev/null -w '%{http_code}\n' -X POST http://192.168.1.200:8131/backend/log/custom \
-H 'Content-Type: application/json' \
-H 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) Chrome/126' \
-H 'X-Forwarded-For: 89.160.20.112' \
-d '{"pid":"SojpySDiPDTp","ev":"signup","pg":"/home","meta":{"plan":"pro"}}'
实测回显:
201
刷新项目仪表盘,pageview、来源(Google)、国家维度(内置 GeoIP 库把 89.160.20.112 识别为瑞典 SE)与 signup 事件计数应即时可见;统计查询 API 的出数核对见 《Swetrix API 使用详解》。
五、数据持久化说明
| 数据 | 载体 | 说明 |
|---|---|---|
| 分析事件与业务数据 | 命名卷 swetrix-events-data(挂载 ClickHouse /var/lib/clickhouse) | 全部用户/项目/事件数据都在这一个卷里,备份即备份此卷 |
| nginx 路由配置 | bind mount ./nginx/config | 只读挂载,改路由规则后 docker compose restart nginx-proxy |
| ClickHouse 调优 | bind mount ./clickhouse/*.xml | 只读挂载四个 XML(见第七章) |
命名卷实体位于宿主机 /var/lib/docker/volumes/swetrix-v54x-stack_swetrix-events-data/_data(卷名前缀随 compose 项目名)。官方文档明确提醒:升级新版本通常附带数据库迁移,升级前必须备份该卷并按 Releases changelog 逐条执行。
六、环境变量表
.env 全量参数(默认值、逐项说明与源码级扩展变量)在配置篇逐条详解,此处给部署视角速查:
| 变量 | 必填 | 默认/生成方式 | 说明 |
|---|---|---|---|
BASE_URL | ✅ | configure.sh 交互输入 | 浏览器可达的实例地址 |
SECRET_KEY_BASE | ✅ | 回车自动生成 | 会话与鉴权签名密钥,更换会使全部会话失效 |
CLICKHOUSE_PASSWORD | ✅ | 自动生成 | 编排强校验,缺失拒绝启动 |
DISABLE_REGISTRATION | 建议 | true | 只放行首个注册用户 |
DEBUG_MODE | - | false | 保持关闭 |
IP_GEOLOCATION_DB_PATH | - | 空 | 内置 DB-IP Lite;付费库换这里 |
REDIS_PASSWORD | - | 空 | 建议生产补强口令 |
SMTP_* / FROM_EMAIL | - | 空 | 事务邮件;SMTP_MOCK=true 时打印到日志 |
OIDC_* | - | false/空 | 企业 SSO;回调 ${BASE_URL}/socialised |
GOOGLE_GSC_* / GOOGLE_GA4_* | - | 空 | Google 集成 OAuth 客户端 |
CLIENT_IP_HEADER | - | 空(=x-forwarded-for) | 反代/CDN 后必配,Cloudflare 用 cf-connecting-ip |
七、配置文件挂载(ClickHouse 降内存配置)
官方编排默认给 ClickHouse 挂载 4 个 XML,小站点(总量 <100 万事件)照单全收即可把分析库内存压在 250–500MB;逐文件解读与回调参数见 《Swetrix v5.4.1 配置参数详解》第六章。
八、等价 docker run
Compose 编排等价于以下逐条启动命令(示意理解用,实际部署请用编排文件——依赖健康检查与配置挂载手写极易出错)。内部网络先行,随后按依赖顺序启动:
docker network create swetrix-net
docker run -d --name redis --network swetrix-net redis:8.6-alpine
docker run -d --name clickhouse --network swetrix-net \
-e CLICKHOUSE_DB=analytics -e CLICKHOUSE_USER=default \
-e CLICKHOUSE_PASSWORD=q1w2E3r4 \
clickhouse/clickhouse-server:25.8-alpine
docker run -d --name swetrix-api --network swetrix-net \
-e SECRET_KEY_BASE=... -e CLICKHOUSE_HOST=http://clickhouse \
-e CLICKHOUSE_DATABASE=analytics -e CLICKHOUSE_PASSWORD=q1w2E3r4 \
-e REDIS_HOST=redis swetrix/swetrix-api:v5.4.1
docker run -d --name swetrix --network swetrix-net \
-e BASE_URL=http://192.168.1.200:8131 swetrix/swetrix-fe:v5.4.1
docker run -d --name nginx-proxy --network swetrix-net \
-p 8131:80 -v /opt/swetrix/nginx/config:/etc/nginx/conf.d/default.conf:ro \
nginx:1.31.1-alpine
九、常用运维命令
docker compose ps # 五服务健康状态
docker compose logs -f swetrix-api # API 日志(含 SMTP_MOCK 邮件)
docker compose restart nginx-proxy # 改 nginx 路由后重启
docker compose up -d --force-recreate swetrix-api # 改 .env 后重建后端使其生效
docker compose pull swetrix swetrix-api # 拉取新版本镜像
docker compose up -d # 滚动替换到新镜像(升级前先备份数据卷并读 changelog)
docker compose down # 停止并删除容器(保留数据卷)
docker compose down -v # 连同数据卷一并删除(数据将丢失,慎用)
十、常见问题
Q1:docker compose up 直接报 Set CLICKHOUSE_PASSWORD in .env?
编排对 CLICKHOUSE_PASSWORD 做了强校验(${CLICKHOUSE_PASSWORD:?...}),.env 缺失该变量时拒绝启动。跑一遍 ./configure.sh 或手工补上即可。
Q2:前端能打开但登录/注册一直转圈?
nginx 把 /backend/ 转发给 API:确认 docker compose ps 里 swetrix-api 为 healthy;若 API 反复重启,查 docker compose logs swetrix-api,常见原因是 ClickHouse 未就绪或 SECRET_KEY_BASE 缺失。
Q3:独立访客数与实际不符、地图全标在服务器位置?
事件里的访客 IP 被取成了反代地址。在反代与 Swetrix 之间校准 CLIENT_IP_HEADER(Cloudflare 设 cf-connecting-ip,常规反代 x-forwarded-for),改完 --force-recreate 重建后端。
Q4:注册提示已关闭?
DISABLE_REGISTRATION=true 是官方默认,只放行首个用户;要开放注册改 false 后重建 swetrix-api。
Q5:升级版本要注意什么? 官方 how-to 明确:Releases 通常带数据库迁移,升级前备份数据卷、按 changelog 逐条执行迁移说明,再换镜像 tag 重建。
十一、参考链接
- 官方自托管指南:https://swetrix.com/docs/selfhosting/how-to
- 自托管编排仓库:https://github.com/swetrix/selfhosting
- 环境变量参考:https://swetrix.com/docs/selfhosting/configuring
- 事件上报 API:https://swetrix.com/docs/events-api
- 主仓库:https://github.com/Swetrix/swetrix
- 本站配置篇:《Swetrix v5.4.1 配置参数详解》
- 本站 API 篇:《Swetrix API 使用详解》
- 本站认知篇:《Swetrix 介绍与选型指南》