
1. 项目介绍
OpenStatus 是一个开源的服务可用性监控和状态页平台,可以用来监控网站、API、TCP 服务等,并通过状态页面向外部展示服务运行情况。
官方项目:
- GitHub:https://github.com/openstatushq/openstatus
- 官网:https://www.openstatus.dev/
- 官方自部署文档:https://www.openstatus.dev/docs/guides/self-hosting-openstatus
主要功能:
- HTTP、TCP 等服务监控。
- 多区域监控。
- Private Location 私有探针。
- 服务可用率统计。
- 延迟及响应时间分析。
- 自定义公开状态页。
- 故障事件管理。
- 通知与订阅。
- API 和 MCP 集成。
2. 部署架构
2.1 服务组成
| 服务 | 容器端口 | 作用 |
|---|---|---|
| db-migrate | 无 | 数据库初始化及迁移 |
| workflows | 3000 | 后台工作流 |
| server | 3001 | API 服务 |
| dashboard | 3002 | 管理后台 |
| status-page | 3003 | 公共状态页面 |
| private-location | 8081(宿主机映射) | 探针数据接收服务 |
| libsql | 8080 | 数据库 HTTP 接口 |
| libsql | 5001 | 数据库 gRPC 接口 |
| tinybird-local | 7181 | 数据分析服务 |
Private Location Probe 不属于上述核心 Compose 服务,需要另外部署。
2.2 数据流向
用户浏览器 | v Nginx 反向代理 | +---------+---------+ | | v v Dashboard Status Page :3002 :3003 | v API Server :3001 | +----+----+ | | v v Workflows libSQL :3000 :8080 ^ | | 状态更新 |Private Location Ingest :8081 ^ | | HTTP 数据上报 |Private Location Probe | v 被监控的目标服务
Probe / Ingest | v Tinybird Local :7181 | v ClickHouse 分析数据 | v Dashboard 图表统计2.3 推荐域名规划
以下使用示例域名,实际部署时替换成自己的域名。
| 域名 | 用途 | 代理目标 |
|---|---|---|
| status.example.com | 管理后台 | 127.0.0.1:3002 |
| status-page.example.com | 公开状态页 | 127.0.0.1:3003 |
| status-api.example.com | API 服务 | 127.0.0.1:3001 |
8081 是探针数据接收入口,不应误配置成 API Server 的 3001 端口。
7181、8080、5001 等内部服务不需要公开到互联网。
3. 环境准备
3.1 基础环境要求
建议配置:
| 项目 | 建议 |
|---|---|
| 操作系统 | Debian 12/13 或 Ubuntu 24.04 |
| CPU | 2 核及以上 |
| 内存 | 4 GB 起步,推荐 8 GB |
| 硬盘 | 30 GB 起步,按监控数据量扩展 |
| Docker | 已安装 |
| Docker Compose | Compose V2 |
| Git | 已安装 |
| Python | 3.12(用于安装 Tinybird CLI) |
实际资源消耗取决于监控数量、数据保留时间及查询频率。
3.2 检查 Docker
docker --versiondocker compose versiongit --version确保能够正常执行。
3.3 安装 Python 3.12 环境
Tinybird Classic CLI 的官方安装文档列出的 Python 支持版本为 3.8~3.12。
建议使用独立虚拟环境,避免污染系统 Python。
apt update
apt install -y \ python3 \ python3-venv \ python3-pip \ git \ curl \ ca-certificates创建虚拟环境:
python3 -m venv /opt/tinybird-venv
source /opt/tinybird-venv/bin/activate安装 CLI:
pip install --upgrade pippip install --upgrade tinybird检查:
tb --versiontb --help后续部署 Tinybird 时,需要在这个虚拟环境中执行 tb 命令。
注意:OpenStatus 官方部署流程使用 tb --local,不要将其替换成普通的 Tinybird Cloud 登录部署流程。
4. 下载项目
创建项目目录:
mkdir -p /home/openstatuscd /home/openstatus克隆官方仓库:
git clone https://github.com/openstatushq/openstatus .检查项目文件:
ls -lah确认存在:
openstatus/├── apps/├── packages/├── docker-compose.yaml├── docker-compose.github-packages.yaml├── .env.docker.example└── ...创建环境变量文件:
cp .env.docker.example .env.docker后续所有配置都在 .env.docker 中完成。
5. 配置环境变量
编辑:
nano .env.docker5.1 必须配置的变量
官方文档要求设置以下四项:
| 环境变量 | 说明 |
|---|---|
| AUTH_SECRET | 应用身份验证密钥 |
| RESEND_API_KEY | 邮件服务 API Key |
| SELF_HOST | 启用自托管模式 |
| NEXT_PUBLIC_URL | Dashboard 对外访问地址 |
生成随机密钥:
openssl rand -base64 48再生成一个独立的 CRON_SECRET:
openssl rand -hex 32将对应值填写到配置文件:
AUTH_SECRET=替换为生成的随机密钥
RESEND_API_KEY=替换为自己的Resend_API_Key
SELF_HOST=true
NEXT_PUBLIC_URL=https://status.example.com
CRON_SECRET=替换为生成的随机字符串其中:
AUTH_SECRET不要使用简单字符串。RESEND_API_KEY用于邮件发送,Magic Link 登录依赖邮件服务。NEXT_PUBLIC_URL应填写实际 Dashboard 地址。CRON_SECRET后面还会用于 Ingest 和 Workflows 之间的身份验证。
5.2 配置本地 Tinybird
这是整个部署过程中非常重要的配置。
在 .env.docker 中添加:
TINYBIRD_URL=http://tinybird-local:7181这样 OpenStatus 的应用服务就会访问 Docker 网络内的 Tinybird,而不是默认查询 Tinybird Cloud。
如果没有正确设置,Dashboard 中的统计图表可能出现:
The pipe 'endpoint__http_metrics_1d__v1' does not exist5.3 检查配置
grep -E '^(AUTH_SECRET|RESEND_API_KEY|SELF_HOST|NEXT_PUBLIC_URL|CRON_SECRET|TINYBIRD_URL)=' .env.docker不要将包含真实密钥的 .env.docker 上传到 GitHub。
建议:
chmod 600 .env.docker6. 启动 OpenStatus
6.1 使用 Docker Compose 构建
进入项目目录:
cd /home/openstatus开启 BuildKit:
export DOCKER_BUILDKIT=1启动服务:
docker compose up -d首次启动需要拉取镜像、构建服务以及执行数据库迁移,等待一段时间即可。
官方 Compose 会自动执行 db-migrate,其他应用服务会等待数据库迁移完成。
6.2 查看容器状态
docker compose ps查看全部容器:
docker ps查看启动日志:
docker compose logs -f如果某个服务没有正常启动,可以单独查看:
docker compose logs --tail=100 dashboarddocker compose logs --tail=100 serverdocker compose logs --tail=100 workflowsdocker compose logs --tail=100 private-location6.3 使用预构建镜像(可选)
如果不想在本机编译项目,可以使用官方 GHCR 预构建镜像:
docker compose -f docker-compose.github-packages.yaml up -d建议二选一,不要在没有确认 Compose 配置差异的情况下混合使用两种启动方式。
7. 部署 Tinybird Analytics
这是整个部署中最重要的部分。
OpenStatus 使用 Tinybird 保存监控结果、延迟数据和统计指标。
如果不完成 Tinybird 初始化,即使 OpenStatus 和探针都运行正常,Dashboard 仍然可能没有监控数据。
7.1 进入 Tinybird 项目目录
source /opt/tinybird-venv/bin/activate
cd /home/openstatus/packages/tinybird确认项目文件:
ls -lah这里包含 OpenStatus 使用的 Tinybird Datasources、Pipes 和 Endpoints。
7.2 部署 Tinybird 数据结构
确认 Docker 中的 tinybird-local 已经启动:
docker ps | grep tinybird修改默认数据结构
python3 <<'PY'from pathlib import Pathimport re
directory = Path("/home/openstatus/packages/tinybird/datasources")
changed = []
for file in directory.glob("*.datasource"): content = file.read_text() updated = content
def replace_ttl(match): days = int(match.group(1))
if days <= 30: return 'ENGINE_TTL "time + toIntervalMonth(1)"'
return match.group(0)
updated = re.sub( r'ENGINE_TTL "time \+ toIntervalDay\((\d+)\)"', replace_ttl, updated )
if updated != content: file.write_text(updated) changed.append(file.name)
print(f"修改完成,共修改 {len(changed)} 个文件:")
for name in changed: print(f" - {name}")PYcd /home/openstatus/packages/tinybird
for f in datasources/*.datasource; do if grep -qE 'toIntervalDay\((45|46|47)\)' "$f"; then echo "========== $f ==========" grep -nE 'ENGINE_PARTITION_KEY|ENGINE_TTL' "$f" fidone执行本地部署:
tb --local deploy这个命令会将 OpenStatus 所需的数据结构部署到本地 Tinybird。
部署内容包括:
- Datasources:数据源。
- Pipes:数据处理管道。
- Endpoints:数据查询接口。
等待部署完成。
7.3 检查部署状态
执行:
tb --local deployment ls正常情况下可以看到:
-------------------------------------| ID | Status | Created at |-------------------------------------| 1 | Live | 2026-10-30 ... |-------------------------------------这里需要特别注意:
Status 必须为:
Live如果显示:
Staging则需要执行:
tb --local deployment promote再次检查:
tb --local deployment ls确保部署状态已经变成 Live。
注意:Staging 状态下,Pipe 虽然可能已经存在,但实际查询仍可能返回 404。
7.4 获取 Tinybird Token
执行:
tb --local info在输出中找到:
Tinybird Local复制其中的:
token也可以通过命令直接提取:
tb --local info | grep '^token:' | awk '{print $2}'保存这个 Token,后面需要使用。
特别注意:不要使用下面的方式获取 Token:
curl http://localhost:7181/tokens官方文档明确指出,这个接口返回的 Token 可能属于另一个 Workspace。
即使 Ingest 看起来已经成功,Dashboard 查询也可能因为 Pipe 不存在而失败。
必须使用:
tb --local info7.5 配置 Tinybird Token
回到项目根目录:
cd /home/openstatus编辑:
nano .env.docker添加以下两个配置:
# Dashboard、Status Page、Server、Workflows 使用TINY_BIRD_API_KEY=替换为刚刚获取的Token
# Private Location Ingest 使用TINYBIRD_TOKEN=替换为刚刚获取的Token两个变量必须使用完全相同的 Token。
这里是最容易出错的地方:
| 变量 | 使用服务 |
|---|---|
| TINY_BIRD_API_KEY | Node.js 应用 |
| TINYBIRD_TOKEN | Go Ingest 服务 |
只配置其中一个是不够的。
如果没有配置 TINYBIRD_TOKEN,Ingest 服务可能返回:
unexpected status code: 4037.6 重启服务
保存配置后执行:
docker compose up -d等待容器重新加载环境变量。
检查:
docker compose ps至此,Tinybird Analytics 的基础配置完成。
8. 验证 Analytics 数据链路
不能只通过容器运行状态判断 Tinybird 是否配置成功,还需要实际测试 Pipe 查询。
8.1 获取 Token
在项目目录下执行:
cd /home/openstatus/packages/tinybird
TOKEN=$(tb --local info | grep '^token:' | awk '{print $2}')检查:
echo "$TOKEN"8.2 测试 HTTP Metrics Pipe
执行:
curl -s -o /dev/null -w '%{http_code}\n' \ -H "Authorization: Bearer $TOKEN" \ "http://localhost:7181/v0/pipes/endpoint__http_metrics_1d__v1.json?monitorId=1"预期结果:
200返回状态说明:
| HTTP 状态码 | 说明 |
|---|---|
| 200 | 查询成功,Analytics 配置正常 |
| 404 | Pipe 不存在、部署未 Live 或 Token 不正确 |
| 401/403 | 身份验证或 Token 权限问题 |
| 连接失败 | Tinybird 容器未启动或端口不可达 |
注意:该测试只验证 Pipe 的可查询性,并不代表已经存在实际监控数据。
8.3 检查 Ingest 服务
docker compose logs -f private-location后面部署探针并产生监控数据后,应关注日志中的:
tinybird.success=true如果出现:
tinybird.success=false优先检查:
TINYBIRD_TOKEN是否正确。TINY_BIRD_API_KEY和TINYBIRD_TOKEN是否一致。- Tinybird 是否已经完成 Live 部署。
9. 初始化工作空间
9.1 访问 Dashboard
默认地址:
http://服务器IP:3002公开状态页:
http://服务器IP:3003如果使用了 Nginx 反向代理,则通过配置好的 HTTPS 域名访问。
9.2 注册账号
首次访问 Dashboard:
- 创建账号。
- 通过邮件完成 Magic Link 登录。
- 创建 Workspace。
- 进入工作空间管理页面。
邮件登录依赖前面配置的 Resend API Key。
9.3 工作空间功能限制
官方指南指出,自托管 Workspace 的功能限制需要根据需求进行调整。
默认限制并不意味着所有功能无限制开放。
如果需要更多监控数量、区域、状态页组件、数据保留时间等,需要检查工作空间的 limits 配置。
可以先查询 Workspace:
curl -sS -X POST http://localhost:8080/ \ -H "Content-Type: application/json" \ -d '{"statements":["SELECT id, name FROM workspace"]}'根据实际 Workspace ID 决定是否调整功能限制。
官方文档提供了完整的 limits Schema 配置示例:
https://www.openstatus.dev/docs/guides/self-hosting-openstatus#part-3-application-configuration
建议先使用默认配置完成部署,再根据实际需求调整,不建议直接修改套餐或绕过付费授权机制。
10. 部署 Private Location 探针
10.1 理解两个不同的组件
OpenStatus 有两个名称相似的 Private Location 组件:
| 镜像 | 作用 | 部署位置 |
|---|---|---|
ghcr.io/openstatushq/openstatus-private-location:latest | Ingest Server | OpenStatus 主服务器 |
ghcr.io/openstatushq/private-location:latest | Probe 探针 | 需要执行监控的服务器 |
其中:
- Ingest Server 负责接收探针数据。
- Probe 负责实际检测目标服务。
官方 Compose 已经包含 Ingest Server,因此这里只需要额外部署 Probe。
10.2 创建 Private Location
进入 OpenStatus Dashboard:
Settings └── Private Locations └── Create Private Location创建一个新的 Private Location。
例如:
名称:VPS-HK创建成功后,复制系统生成的 Key。
这个 Key 后面需要配置到探针容器中。
10.3 部署 Probe
在需要执行监控的服务器上执行:
docker run -d \ --name openstatus-probe \ --restart unless-stopped \ -e OPENSTATUS_KEY=替换为PrivateLocation生成的Key \ -e OPENSTATUS_INGEST_URL=http://你的OpenStatus服务器IP:8081 \ ghcr.io/openstatushq/private-location:latest注意:
OPENSTATUS_INGEST_URL 必须指向 Ingest Server 的 8081 端口,而不是 API Server 的 3001 端口。
如果 Probe 和 OpenStatus 位于同一个 Docker 网络中,可以使用:
http://private-location:808010.4 查看探针运行状态
docker logs -f openstatus-probe正常情况下会出现类似日志:
Launching openstatus private location checker
Starting job for monitor 1 (https://google.com)
Monitor check for 1 (https://google.com)ingested with status "success" (code 200)如果出现上述日志,说明探针已经开始执行监控任务。
10.5 创建第一个监控任务
在 Dashboard 中:
- 进入 Monitors。
- 创建新的监控任务。
- 填写需要检测的目标 URL。
- 选择刚刚创建的 Private Location。
- 保存监控任务。
Probe 默认每 10 分钟刷新一次监控任务列表。
因此,创建或修改监控任务后,可能需要等待最多 10 分钟才能看到变化。
11. 配置定时任务
这是官方自部署指南中最后一个重要步骤。
OpenStatus 自托管需要额外配置定时任务,否则 Private Location 的健康状态检测可能无法正常工作。
11.1 定时任务的作用
private-location-health 主要负责:
- 检查 Private Location 是否定期上报。
- 判断探针是否离线。
- 将异常状态从
active更新为error。 - 在探针恢复后将状态从
error更新为active。 - 向 Workspace 成员发送状态变化通知。
- 记录状态变化审计日志。
官方建议每 5 分钟执行一次。
11.2 创建 Docker Cron 服务
进入 OpenStatus 项目目录:
cd /home/openstatus创建目录:
mkdir -p cron11.3 创建 Dockerfile
nano cron/Dockerfile填写:
FROM alpine:latest
RUN apk add --no-cache curl
COPY crontab /etc/crontabs/root
CMD ["crond", "-f", "-l", "2"]11.4 创建 Crontab
nano cron/crontab填写:
*/5 * * * * curl -sS -H "Authorization: ${CRON_SECRET}" http://workflows:3000/cron/private-location-health这里使用 Docker 内部服务名称:
workflows:3000不需要通过公网域名访问。
11.5 修改 Docker Compose
打开:
nano docker-compose.yaml在 services 下添加:
cron: build: ./cron container_name: openstatus-cron env_file: - .env.docker networks: - openstatus restart: unless-stopped注意:
这里的 openstatus 网络名称需要与你当前 Compose 文件实际定义的网络名称一致。
如果你的 Compose 网络名称不同,请使用实际网络名称。
11.6 启动 Cron
执行:
docker compose up -d检查:
docker compose ps cron查看日志:
docker compose logs -f cron检查 Workflows 日志:
docker compose logs workflows | grep "private-location-health"正常情况下,每 5 分钟可以看到类似:
private-location-health complete:checked=2 toError=0 toActive=0至此,定时健康检查配置完成。
监控与消息通知系列
连载中分享文章
生成精美分享图或复制链接,与更多人分享本文。
继续阅读
换条路线
从其他文章中稳定抽取
最后更新于 ,距今已过 0 天
部分内容可能已过时