想找 Google Analytics 的轻量替代品,又不希望网站访问数据离开自己的 VPS,Plausible Analytics 是一个适合小型网站、独立开发者和内容站的选择。它的界面简洁,默认不做跨站个人画像,统计脚本也比传统分析工具轻量。
不过,自托管 Plausible 不是只运行一个容器。生产环境至少要处理 PostgreSQL、ClickHouse、持久化卷、域名 HTTPS、管理员邮箱、备份和升级回滚。本文以 Ubuntu 24.04 LTS、Docker Compose 和 Caddy 为例,部署一套可以长期运行的 Plausible Community Edition。
| 工具 | 更适合的场景 | 主要取舍 |
|---|---|---|
| Plausible | 想要简单、快速、隐私友好的网站统计 | 深度报表和插件生态少于 Matomo |
| Umami | 只看访问量、来源、页面和事件,追求较低运维成本 | 高级分析和数据处理能力较少 |
| Matomo | 需要目标、漏斗、电商、站内搜索和详细访客分析 | 数据库、归档和升级维护更复杂 |
如果只需要轻量统计,可以先看 VPS 自建 Umami 网站统计教程。已经在使用 Matomo 的网站,则可以对照 VPS 搭建 Matomo 教程 评估迁移成本。Plausible 的优势是默认报告足够清楚,部署后不需要额外维护浏览器归档任务。
Plausible 会同时使用 Web 应用、PostgreSQL 和 ClickHouse。小型博客或企业站可以从下面的配置开始:
| 规模 | 建议配置 | 适用情况 |
|---|---|---|
| 每月 10 万页面浏览以内 | 2 核、4GB 内存、50GB SSD | 个人博客、落地页、小型企业站 |
| 每月 10 万至 100 万 | 4 核、8GB 内存、150GB SSD 起 | 多站点、持续投放广告的网站 |
| 超过 100 万 | 先压测,再拆分数据库或扩容 | 新闻站、SaaS 和高流量内容站 |
磁盘空间主要消耗在 ClickHouse 事件数据和 PostgreSQL 配置数据。上线前准备专用域名,例如 analytics.example.com,将 A / AAAA 记录指向 VPS。防火墙只开放 SSH、80 和 443,不要把 PostgreSQL 的 5432 或 ClickHouse 的 8123 映射到公网。
按照 Docker 官方文档安装 Docker Engine 和 Compose v2,然后确认版本:
docker --version
docker compose version
创建部署目录和备份目录:
sudo mkdir -p /opt/plausible/backups
sudo chown -R "$USER":"$USER" /opt/plausible
cd /opt/plausible
生成三组随机值并写入 .env:
openssl rand -hex 32
openssl rand -hex 32
openssl rand -hex 32
nano .env
chmod 600 .env
BASE_URL=https://analytics.example.com
SECRET_KEY_BASE=替换为第一组随机值
POSTGRES_PASSWORD=替换为第二组随机值
CLICKHOUSE_PASSWORD=替换为第三组随机值
DATABASE_URL=postgres://plausible:替换为第二组随机值@postgres:5432/plausible
CLICKHOUSE_DATABASE_URL=http://plausible:替换为第三组随机值@clickhouse:8123/plausible_events
BASE_URL 必须与最终访问地址完全一致。SECRET_KEY_BASE 投入生产后不要随意更换,否则会让已有会话和加密数据失效。
创建 /opt/plausible/compose.yaml:
services:
plausible:
image: ghcr.io/plausible/community-edition:v3.2.1
container_name: plausible
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
clickhouse:
condition: service_healthy
ports:
- "127.0.0.1:8000:8000"
env_file:
- .env
environment:
DISABLE_REGISTRATION: invite_only
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8000/api/health || exit 1"]
interval: 30s
timeout: 10s
retries: 10
start_period: 60s
logging:
driver: json-file
options:
max-size: "10m"
max-file: "3"
postgres:
image: postgres:16-alpine
container_name: plausible-postgres
restart: unless-stopped
env_file:
- .env
environment:
POSTGRES_DB: plausible
POSTGRES_USER: plausible
volumes:
- plausible_postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U plausible -d plausible"]
interval: 10s
timeout: 5s
retries: 20
clickhouse:
image: clickhouse/clickhouse-server:24.8-alpine
container_name: plausible-clickhouse
restart: unless-stopped
env_file:
- .env
environment:
CLICKHOUSE_DB: plausible_events
CLICKHOUSE_USER: plausible
CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT: "1"
volumes:
- plausible_clickhouse:/var/lib/clickhouse
- plausible_clickhouse_logs:/var/log/clickhouse-server
healthcheck:
test: ["CMD-SHELL", "wget -qO- http://127.0.0.1:8123/ping | grep -q Ok"]
interval: 10s
timeout: 5s
retries: 20
volumes:
plausible_postgres:
name: plausible_postgres
plausible_clickhouse:
name: plausible_clickhouse
plausible_clickhouse_logs:
name: plausible_clickhouse_logs
应用端口只绑定到 127.0.0.1:8000,数据库完全留在 Compose 内网。示例固定在 Plausible Community Edition v3.2.1 和 ClickHouse 24.8 系列,正式升级前仍要查看 Plausible 发布说明和兼容矩阵,不要在无人值守环境直接使用 latest。
启动并检查:
docker compose config >/dev/null
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=100 plausible
curl -I http://127.0.0.1:8000
sudo ss -lntp | grep ':8000'
如果看到 0.0.0.0:8000,说明端口绑定写错,应立即改回 127.0.0.1。
编辑 /etc/caddy/Caddyfile:
analytics.example.com {
encode zstd gzip
reverse_proxy 127.0.0.1:8000
request_body {
max_size 16MB
}
}
验证并重载:
sudo caddy validate --config /etc/caddy/Caddyfile
sudo systemctl reload caddy
curl -I https://analytics.example.com
Caddy 会自动申请和续期证书。如果使用 Cloudflare,DNS、代理模式和源站端口要保持一致,不要在 Caddy、CDN 和应用层配置互相冲突的强制跳转。更多细节可参考 VPS 用 Caddy 反向代理与自动 HTTPS。
浏览器打开 https://analytics.example.com,创建第一个管理员账号。建议使用专用邮箱和密码管理器生成的长密码。完成后添加网站,填写站点域名、报表时区和需要收集的事件,公开注册保持关闭。
复制 Plausible 提供的 JavaScript 代码,放在网站模板的 head 结束标签前。若使用 CSP,至少允许脚本加载域名和统计上报域名;如果脚本被缓存插件合并或延迟加载,先排除 Plausible 脚本。
用无痕窗口访问网站,在浏览器 Network 中确认出现 /api/event 请求,再回到 Plausible 实时面板核验。首页能打开不代表统计脚本已经生效。
邀请成员、重置密码和告警通知依赖邮件。根据所用 SMTP 服务在 .env 中补充:
[email protected]
SMTP_HOST_ADDR=smtp.example.com
SMTP_HOST_PORT=587
[email protected]
SMTP_USER_PWD=替换为SMTP专用密码
SMTP_HOST_SSL_ENABLED=false
修改后重建应用容器:
docker compose up -d --force-recreate plausible
docker compose logs --tail=100 plausible
端口 587 通常配合 STARTTLS,465 通常使用直接 TLS,具体以邮件服务商文档为准。不要使用个人邮箱主密码。
Plausible 默认不依赖 Cookie 和跨站个人画像,但自托管不自动等于合规。上线前检查:
- 隐私政策说明收集哪些页面、来源和设备信息,以及保存多久;
- 不要把邮箱、姓名、订单号等个人信息放入 URL、事件名称或自定义属性;
- 只创建真正需要的自定义事件,避免把表单内容原样上报;
- 如果所在地区或业务场景要求取得同意,在同意前暂停非必要统计;
- 定期删除不再需要的站点和成员,并保护管理员账号;
- 通过防火墙和 Caddy 限制入口,不把数据库端口交给公网。
“无 Cookie”降低了隐私风险,但仍需要结合访问日志、IP 处理、广告平台和业务所在地区做完整判断。
PostgreSQL 保存账号、站点和配置,ClickHouse 保存访问事件。只备份其中一个,恢复后会出现“能登录但历史报表为空”或“有数据但站点配置丢失”。
备份 PostgreSQL:
cd /opt/plausible
mkdir -p backups
docker compose exec -T postgres pg_dump \
-U plausible -d plausible --format=custom \
> "backups/plausible-postgres-$(date +%F-%H%M).dump"
备份 ClickHouse 数据卷时先停止写入:
docker compose stop plausible clickhouse
docker run --rm \
-v plausible_clickhouse:/source:ro \
-v "$PWD/backups:/backup" \
alpine sh -c 'tar -C /source -czf /backup/plausible-clickhouse.tar.gz .'
docker compose start clickhouse plausible
备份文件至少保留一份在另一台机器或对象存储,并限制访问权限。可以参考 VPS 备份与恢复演练 做加密、校验和定期恢复测试。
恢复结束后检查站点列表、历史报表、实时事件和管理员登录,不要只看容器是否为 running。
升级前保存当前镜像版本、Compose 文件以及 PostgreSQL、ClickHouse 备份。低峰期执行:
cd /opt/plausible
docker compose config >/dev/null
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=200 plausible
确认管理后台、统计脚本、实时事件和历史报表都正常后再结束升级窗口。如果新版本启动失败,恢复旧镜像标签和数据备份。不要在没有备份时执行 docker compose down -v,它会删除数据库卷。
日常观察资源:
docker stats --no-stream plausible plausible-postgres plausible-clickhouse
df -h
docker system df
ClickHouse 磁盘增长通常比 PostgreSQL 更快。为 Docker 数据盘、备份目录和日志设置告警,至少预留 20% 可用空间。
docker compose ps
docker compose logs --tail=200 plausible
curl -I http://127.0.0.1:8000
sudo journalctl -u caddy --no-pager -n 100
应用仍在启动时,Caddy 会暂时返回 502;如果持续出现,检查 SECRET_KEY_BASE、BASE_URL、数据库连接和容器内存。
docker compose logs --tail=200 postgres clickhouse
docker compose exec plausible getent hosts postgres clickhouse
Compose 网络中的主机名是服务名 postgres 和 clickhouse,不能写 localhost。修改 .env 密码不会自动修改已经初始化的数据库用户,必须同步更新数据库账号或按备份恢复流程处理。
在浏览器 Network 中检查 /api/event 的状态码、请求域名和 CSP 报错。常见原因包括站点域名填错、脚本被缓存插件延迟、广告拦截器阻止请求,以及网站使用了错误的 HTTP/HTTPS 地址。先用无痕窗口排除浏览器扩展影响。
docker compose exec clickhouse clickhouse-client --query 'SELECT 1'
docker compose logs --tail=200 clickhouse
df -h /var/lib/docker
检查 ClickHouse 是否健康、磁盘是否已满,以及升级后是否有迁移错误。如果只有某个时间段缺失,结合容器日志和 Caddy 访问日志判断是事件没有上报,还是分析数据库没有写入。
- 应用只监听 127.0.0.1:8000,5432 和 8123 未暴露公网
- BASE_URL、域名和 Caddy HTTPS 配置一致
- 管理员使用强密码,注册策略保持邀请制
- SMTP 邀请和密码重置邮件已经测试
- 浏览器能看到 /api/event,实时面板能收到测试访问
- 隐私政策、数据保留、自定义事件和同意机制已确认
- PostgreSQL 与 ClickHouse 都有异地备份
- 至少完成一次恢复演练,并能恢复历史报表
- 升级前固定版本并备份,升级后检查 502、事件和磁盘空间
完成这些步骤后,Plausible 才是一套可长期运行的 VPS 统计服务,而不是只适合临时体验的 Docker Demo。对于重视隐私、页面速度和数据自主权的网站,它在部署复杂度与统计能力之间取得了很好的平衡。
