3469 字
17 分钟
OpenStatus自托管

1. 项目介绍#

OpenStatus 是一个开源的服务可用性监控和状态页平台,可以用来监控网站、API、TCP 服务等,并通过状态页面向外部展示服务运行情况。

官方项目:

主要功能:

  • HTTP、TCP 等服务监控。
  • 多区域监控。
  • Private Location 私有探针。
  • 服务可用率统计。
  • 延迟及响应时间分析。
  • 自定义公开状态页。
  • 故障事件管理。
  • 通知与订阅。
  • API 和 MCP 集成。

2. 部署架构#

2.1 服务组成#

服务容器端口作用
db-migrate无数据库初始化及迁移
workflows3000后台工作流
server3001API 服务
dashboard3002管理后台
status-page3003公共状态页面
private-location8081(宿主机映射)探针数据接收服务
libsql8080数据库 HTTP 接口
libsql5001数据库 gRPC 接口
tinybird-local7181数据分析服务

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.comAPI 服务127.0.0.1:3001

8081 是探针数据接收入口,不应误配置成 API Server 的 3001 端口。

7181、8080、5001 等内部服务不需要公开到互联网。

3. 环境准备#

3.1 基础环境要求#

建议配置:

项目建议
操作系统Debian 12/13 或 Ubuntu 24.04
CPU2 核及以上
内存4 GB 起步,推荐 8 GB
硬盘30 GB 起步,按监控数据量扩展
Docker已安装
Docker ComposeCompose V2
Git已安装
Python3.12(用于安装 Tinybird CLI)

实际资源消耗取决于监控数量、数据保留时间及查询频率。

3.2 检查 Docker#

Terminal window
docker --version
docker compose version
git --version

确保能够正常执行。

3.3 安装 Python 3.12 环境#

Tinybird Classic CLI 的官方安装文档列出的 Python 支持版本为 3.8~3.12。

建议使用独立虚拟环境,避免污染系统 Python。

Terminal window
apt update
apt install -y \
python3 \
python3-venv \
python3-pip \
git \
curl \
ca-certificates

创建虚拟环境:

Terminal window
python3 -m venv /opt/tinybird-venv
source /opt/tinybird-venv/bin/activate

安装 CLI:

Terminal window
pip install --upgrade pip
pip install --upgrade tinybird

检查:

Terminal window
tb --version
tb --help

后续部署 Tinybird 时,需要在这个虚拟环境中执行 tb 命令。

注意:OpenStatus 官方部署流程使用 tb --local,不要将其替换成普通的 Tinybird Cloud 登录部署流程。


4. 下载项目#

创建项目目录:

Terminal window
mkdir -p /home/openstatus
cd /home/openstatus

克隆官方仓库:

Terminal window
git clone https://github.com/openstatushq/openstatus .

检查项目文件:

Terminal window
ls -lah

确认存在:

openstatus/
├── apps/
├── packages/
├── docker-compose.yaml
├── docker-compose.github-packages.yaml
├── .env.docker.example
└── ...

创建环境变量文件:

Terminal window
cp .env.docker.example .env.docker

后续所有配置都在 .env.docker 中完成。


5. 配置环境变量#

编辑:

Terminal window
nano .env.docker

5.1 必须配置的变量#

官方文档要求设置以下四项:

环境变量说明
AUTH_SECRET应用身份验证密钥
RESEND_API_KEY邮件服务 API Key
SELF_HOST启用自托管模式
NEXT_PUBLIC_URLDashboard 对外访问地址

生成随机密钥:

Terminal window
openssl rand -base64 48

再生成一个独立的 CRON_SECRET:

Terminal window
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 exist

5.3 检查配置#

Terminal window
grep -E '^(AUTH_SECRET|RESEND_API_KEY|SELF_HOST|NEXT_PUBLIC_URL|CRON_SECRET|TINYBIRD_URL)=' .env.docker

不要将包含真实密钥的 .env.docker 上传到 GitHub。

建议:

Terminal window
chmod 600 .env.docker

6. 启动 OpenStatus#

6.1 使用 Docker Compose 构建#

进入项目目录:

Terminal window
cd /home/openstatus

开启 BuildKit:

Terminal window
export DOCKER_BUILDKIT=1

启动服务:

Terminal window
docker compose up -d

首次启动需要拉取镜像、构建服务以及执行数据库迁移,等待一段时间即可。

官方 Compose 会自动执行 db-migrate,其他应用服务会等待数据库迁移完成。

6.2 查看容器状态#

Terminal window
docker compose ps

查看全部容器:

Terminal window
docker ps

查看启动日志:

Terminal window
docker compose logs -f

如果某个服务没有正常启动,可以单独查看:

Terminal window
docker compose logs --tail=100 dashboard
docker compose logs --tail=100 server
docker compose logs --tail=100 workflows
docker compose logs --tail=100 private-location

6.3 使用预构建镜像(可选)#

如果不想在本机编译项目,可以使用官方 GHCR 预构建镜像:

Terminal window
docker compose -f docker-compose.github-packages.yaml up -d

建议二选一,不要在没有确认 Compose 配置差异的情况下混合使用两种启动方式。


7. 部署 Tinybird Analytics#

这是整个部署中最重要的部分。

OpenStatus 使用 Tinybird 保存监控结果、延迟数据和统计指标。

如果不完成 Tinybird 初始化,即使 OpenStatus 和探针都运行正常,Dashboard 仍然可能没有监控数据。

7.1 进入 Tinybird 项目目录#

Terminal window
source /opt/tinybird-venv/bin/activate
cd /home/openstatus/packages/tinybird

确认项目文件:

Terminal window
ls -lah

这里包含 OpenStatus 使用的 Tinybird Datasources、Pipes 和 Endpoints。

7.2 部署 Tinybird 数据结构#

确认 Docker 中的 tinybird-local 已经启动:

Terminal window
docker ps | grep tinybird

修改默认数据结构

python3 <<'PY'
from pathlib import Path
import 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}")
PY
cd /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"
fi
done

执行本地部署:

Terminal window
tb --local deploy

这个命令会将 OpenStatus 所需的数据结构部署到本地 Tinybird。

部署内容包括:

  • Datasources:数据源。
  • Pipes:数据处理管道。
  • Endpoints:数据查询接口。

等待部署完成。

7.3 检查部署状态#

执行:

Terminal window
tb --local deployment ls

正常情况下可以看到:

-------------------------------------
| ID | Status | Created at |
-------------------------------------
| 1 | Live | 2026-10-30 ... |
-------------------------------------

这里需要特别注意:

Status 必须为:

Live

如果显示:

Staging

则需要执行:

Terminal window
tb --local deployment promote

再次检查:

Terminal window
tb --local deployment ls

确保部署状态已经变成 Live。

注意:Staging 状态下,Pipe 虽然可能已经存在,但实际查询仍可能返回 404。

7.4 获取 Tinybird Token#

执行:

Terminal window
tb --local info

在输出中找到:

Tinybird Local

复制其中的:

token

也可以通过命令直接提取:

Terminal window
tb --local info | grep '^token:' | awk '{print $2}'

保存这个 Token,后面需要使用。

特别注意:不要使用下面的方式获取 Token:

Terminal window
curl http://localhost:7181/tokens

官方文档明确指出,这个接口返回的 Token 可能属于另一个 Workspace。

即使 Ingest 看起来已经成功,Dashboard 查询也可能因为 Pipe 不存在而失败。

必须使用:

Terminal window
tb --local info

7.5 配置 Tinybird Token#

回到项目根目录:

Terminal window
cd /home/openstatus

编辑:

Terminal window
nano .env.docker

添加以下两个配置:

# Dashboard、Status Page、Server、Workflows 使用
TINY_BIRD_API_KEY=替换为刚刚获取的Token
# Private Location Ingest 使用
TINYBIRD_TOKEN=替换为刚刚获取的Token

两个变量必须使用完全相同的 Token。

这里是最容易出错的地方:

变量使用服务
TINY_BIRD_API_KEYNode.js 应用
TINYBIRD_TOKENGo Ingest 服务

只配置其中一个是不够的。

如果没有配置 TINYBIRD_TOKEN,Ingest 服务可能返回:

unexpected status code: 403

7.6 重启服务#

保存配置后执行:

Terminal window
docker compose up -d

等待容器重新加载环境变量。

检查:

Terminal window
docker compose ps

至此,Tinybird Analytics 的基础配置完成。


8. 验证 Analytics 数据链路#

不能只通过容器运行状态判断 Tinybird 是否配置成功,还需要实际测试 Pipe 查询。

8.1 获取 Token#

在项目目录下执行:

Terminal window
cd /home/openstatus/packages/tinybird
TOKEN=$(tb --local info | grep '^token:' | awk '{print $2}')

检查:

Terminal window
echo "$TOKEN"

8.2 测试 HTTP Metrics Pipe#

执行:

Terminal window
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 配置正常
404Pipe 不存在、部署未 Live 或 Token 不正确
401/403身份验证或 Token 权限问题
连接失败Tinybird 容器未启动或端口不可达

注意:该测试只验证 Pipe 的可查询性,并不代表已经存在实际监控数据。

8.3 检查 Ingest 服务#

Terminal window
docker compose logs -f private-location

后面部署探针并产生监控数据后,应关注日志中的:

tinybird.success=true

如果出现:

tinybird.success=false

优先检查:

  1. TINYBIRD_TOKEN 是否正确。
  2. TINY_BIRD_API_KEY 和 TINYBIRD_TOKEN 是否一致。
  3. Tinybird 是否已经完成 Live 部署。

9. 初始化工作空间#

9.1 访问 Dashboard#

默认地址:

http://服务器IP:3002

公开状态页:

http://服务器IP:3003

如果使用了 Nginx 反向代理,则通过配置好的 HTTPS 域名访问。

9.2 注册账号#

首次访问 Dashboard:

  1. 创建账号。
  2. 通过邮件完成 Magic Link 登录。
  3. 创建 Workspace。
  4. 进入工作空间管理页面。

邮件登录依赖前面配置的 Resend API Key。

9.3 工作空间功能限制#

官方指南指出,自托管 Workspace 的功能限制需要根据需求进行调整。

默认限制并不意味着所有功能无限制开放。

如果需要更多监控数量、区域、状态页组件、数据保留时间等,需要检查工作空间的 limits 配置。

可以先查询 Workspace:

Terminal window
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:latestIngest ServerOpenStatus 主服务器
ghcr.io/openstatushq/private-location:latestProbe 探针需要执行监控的服务器

其中:

  • 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#

在需要执行监控的服务器上执行:

Terminal window
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:8080

10.4 查看探针运行状态#

Terminal window
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 中:

  1. 进入 Monitors。
  2. 创建新的监控任务。
  3. 填写需要检测的目标 URL。
  4. 选择刚刚创建的 Private Location。
  5. 保存监控任务。

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 项目目录:

Terminal window
cd /home/openstatus

创建目录:

Terminal window
mkdir -p cron

11.3 创建 Dockerfile#

Terminal window
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#

Terminal window
nano cron/crontab

填写:

*/5 * * * * curl -sS -H "Authorization: ${CRON_SECRET}" http://workflows:3000/cron/private-location-health

这里使用 Docker 内部服务名称:

workflows:3000

不需要通过公网域名访问。

11.5 修改 Docker Compose#

打开:

Terminal window
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#

执行:

Terminal window
docker compose up -d

检查:

Terminal window
docker compose ps cron

查看日志:

Terminal window
docker compose logs -f cron

检查 Workflows 日志:

Terminal window
docker compose logs workflows | grep "private-location-health"

正常情况下,每 5 分钟可以看到类似:

private-location-health complete:
checked=2 toError=0 toActive=0

至此,定时健康检查配置完成。

第 4 篇,共 6 篇本文属于系列

OpenStatus自托管
https://blog.goodnightan.com/posts/complete-deployment-openstatus/
作者
晚安
发布于
2026-10-31
许可协议
CC BY-NC-SA 4.0

分享文章

生成精美分享图或复制链接,与更多人分享本文。

继续阅读

沿着主题读

基于共同的标签与分类

换条路线

从其他文章中稳定抽取