binilsn/up-timer
GitHub: binilsn/up-timer
一个基于 Rails 的自托管服务可用性监控仪表板,通过定时 HTTP 检测追踪服务健康状态、响应时间和故障事件,并提供公共状态页与角色权限管理。
Stars: 2 | Forks: 1
# UpTimer
用于跟踪服务健康状况、响应时间和事件的正常运行时间监控仪表板。
## 公共状态页
## 前置条件
- Ruby 4.0.5(参见 `.ruby-version`)
- SQLite3
- [RVM](https://rvm.io)(推荐用于 Ruby 版本管理)
## 设置(开发环境)
```
# 克隆并进入项目
git clone https://github.com/binilsn/up-timer.git
cd up-timer
# 配置管理员邮箱(复制并编辑)
cp .env.example .env
# 编辑 .env 并填入你的邮箱以获取管理员权限:
# ADMIN_EMAILS=you@example.com
# 激活 Ruby(针对 RVM 用户)
rvm use
# 安装依赖项
bundle install
# 设置数据库
rails db:create
rails db:migrate
rails db:seed
# 启动开发服务器
bin/dev
```
`bin/dev` 会启动:
- **Web 服务器** (Puma),地址为 `http://localhost:3000`
- **CSS 监视器** (Tailwind CSS v4)
- **作业 worker** (SolidQueue),用于处理后台作业
## Docker
### 一键部署
```
docker run -d -p 3000:80 -e ADMIN_EMAILS=admin@example.com binilsn/up-timer:latest
```
在 `http://localhost:3000` 开启。`config/master.key` 已内置到镜像中。
| 变量 | 必需 | 默认值 | 描述 |
|---|---|---|---|
| `ADMIN_EMAILS` | ❌ | — | 逗号分隔的电子邮件,注册时将获得 admin 角色 |
| `SOLID_QUEUE_IN_PUMA` | ❌ | `true`(内置) | 在 Web 进程中运行后台作业 |
| `RAILS_MASTER_KEY` | ❌ | 内置在镜像中 | Rails 凭据密钥 |
仓库:[hub.docker.com/r/binilsn/up-timer](https://hub.docker.com/r/binilsn/up-timer)
## 认证
认证由 Rodauth 处理。
### 路由
| 路由 | 描述 |
|---|---|
| `/login` | 登录 |
| `/create-account` | 注册新用户 |
| `/logout` | 登出 |
登录后,用户将被重定向到 `/dashboard`。
### 管理员分配
设置 `ADMIN_EMAILS` 环境变量,使用逗号分隔的列表:
```
ADMIN_EMAILS=admin@example.com docker compose up -d
```
使用这些电子邮件注册的用户将获得 **admin** 角色。其他所有用户默认为 **viewer**。
## 基于角色的访问控制
| 角色 | 权限 |
|---|---|
| **viewer** | Dashboard、Nodes(查看)、Alerts(查看)、公共状态页 |
| **collaborator** | viewer 的所有权限 + Nodes (CRUD)、Alerts(创建/解决) |
| **admin** | 以上所有权限 + Integrations、Settings、用户晋升 |
### 设置管理员
设置 `ADMIN_EMAILS` 环境变量,使用逗号分隔的电子邮件列表:
```
ADMIN_EMAILS=alice@example.com,bob@example.com rails server
```
使用这些电子邮件注册的用户将被自动分配 **admin** 角色。其他所有用户默认为 **viewer**。
## 后台作业与调度器
SolidQueue 支持所有后台处理,其周期性调度在 `config/recurring.yml` 中定义。
### 周期性调度
| 任务 | 环境 | 频率 |
|---|---|---|
| `MonitorSchedulerJob` | dev + prod | 每 30 秒 |
| `DataRetentionJob` | dev + prod | 每天凌晨 3 点 |
| `SolidQueue::Job.clear_finished_in_batches` | 仅限 prod | 每小时的第 12 分钟 |
### 作业
| 作业 | 文件 | 目的 |
|---|---|---|
| `MonitorSchedulerJob` | `app/jobs/monitor_scheduler_job.rb` | 遍历所有 monitors,并为任何上次检查时间早于其配置的 `check_interval` 的 monitor 将一个 `MonitorCheckJob` 加入队列 |
| `MonitorCheckJob` | `app/jobs/monitor_check_job.rb` | 对 monitor 的 URL 执行 HTTP GET 请求;记录响应时间、状态码和 `up`/`down` 状态;管理 `Incident` 生命周期(首次失败时创建,恢复时解决所有打开的 incidents) |
| `DataRetentionJob` | `app/jobs/data_retention_job.rb` | 清除超过 30 天的 `MonitorCheck` 记录和已解决且超过 90 天的 `Incident` 记录 |
### 流程
```
flowchart TD
A[Solid Queue Recurring Schedule] -->|"every 30s"| B[MonitorSchedulerJob]
A -->|"daily at 3am"| D[DataRetentionJob]
A -->|"hourly :12"| E[Clear finished jobs
prod only] B -->|"performs for each
due monitor"| C[MonitorCheckJob] C -->|"HTTP GET"| F[Target URL] C -->|"records"| G[MonitorCheck] C -->|"updates status"| H[UptimeMonitor] C -->|"creates/resolves"| I[Incident] D -->|"deletes >30d"| G D -->|"deletes >90d resolved"| I ``` 使用 `bin/jobs` 启动 worker(已包含在 `bin/dev` 中)。 ## 创建受监控的 Endpoint 1. 登录并导航到 `/nodes` 2. 点击 **Create Node** 3. 填写名称、URL、检查间隔(秒)和超时时间(秒) 4. 调度器会在 30 秒内提取它 ## 邮件程序(开发环境) 电子邮件通过 [letter_opener](https://github.com/ryanb/letter_opener) 在浏览器中打开。无需 SMTP 配置。 ## 设计系统 有关完整的设计 token 规范(颜色、排版、组件),请参阅 `DESIGN.md`。 使用以下工具构建: - **Tailwind CSS v4** — 实用优先的 CSS - **Lucide** — 图标库 (CDN) - **Chartkick** + Chart.js — 柱状图/列状图 - **Stimulus** — JavaScript 片段(侧边栏切换、下拉菜单、密码切换) ## 技术栈 | 层级 | 技术 | |---|---| | 框架 | Rails 8.1 | | Ruby | 4.0.5 | | 数据库 | SQLite3 | | 认证 | Rodauth,基于 RBAC (viewer / collaborator / admin) | | CSS | Tailwind CSS v4 | | JS | Stimulus + Turbo | | 图表 | Chartkick + Chart.js | | 作业 | SolidQueue | | 邮件程序 | letter_opener (dev),带有 AlertMailer 的 Action Mailer | | 功能开关 | Flipper (email_notifications 切换) | | 图标 | Lucide | | 工具 | Tippy.js (tooltips)、Pagy (分页) | ## 创建 Release ``` # 打标签并推送 — CI 构建并推送到 Docker Hub git tag v1.0.0 git push origin v1.0.0 ``` 或者通过 UI 创建 [GitHub Release](https://github.com/binilsn/up-timer/releases) — 效果相同。 ## 测试 ``` rails test ```
## 公共状态页
## 前置条件
- Ruby 4.0.5(参见 `.ruby-version`)
- SQLite3
- [RVM](https://rvm.io)(推荐用于 Ruby 版本管理)
## 设置(开发环境)
```
# 克隆并进入项目
git clone https://github.com/binilsn/up-timer.git
cd up-timer
# 配置管理员邮箱(复制并编辑)
cp .env.example .env
# 编辑 .env 并填入你的邮箱以获取管理员权限:
# ADMIN_EMAILS=you@example.com
# 激活 Ruby(针对 RVM 用户)
rvm use
# 安装依赖项
bundle install
# 设置数据库
rails db:create
rails db:migrate
rails db:seed
# 启动开发服务器
bin/dev
```
`bin/dev` 会启动:
- **Web 服务器** (Puma),地址为 `http://localhost:3000`
- **CSS 监视器** (Tailwind CSS v4)
- **作业 worker** (SolidQueue),用于处理后台作业
## Docker
### 一键部署
```
docker run -d -p 3000:80 -e ADMIN_EMAILS=admin@example.com binilsn/up-timer:latest
```
在 `http://localhost:3000` 开启。`config/master.key` 已内置到镜像中。
| 变量 | 必需 | 默认值 | 描述 |
|---|---|---|---|
| `ADMIN_EMAILS` | ❌ | — | 逗号分隔的电子邮件,注册时将获得 admin 角色 |
| `SOLID_QUEUE_IN_PUMA` | ❌ | `true`(内置) | 在 Web 进程中运行后台作业 |
| `RAILS_MASTER_KEY` | ❌ | 内置在镜像中 | Rails 凭据密钥 |
仓库:[hub.docker.com/r/binilsn/up-timer](https://hub.docker.com/r/binilsn/up-timer)
## 认证
认证由 Rodauth 处理。
### 路由
| 路由 | 描述 |
|---|---|
| `/login` | 登录 |
| `/create-account` | 注册新用户 |
| `/logout` | 登出 |
登录后,用户将被重定向到 `/dashboard`。
### 管理员分配
设置 `ADMIN_EMAILS` 环境变量,使用逗号分隔的列表:
```
ADMIN_EMAILS=admin@example.com docker compose up -d
```
使用这些电子邮件注册的用户将获得 **admin** 角色。其他所有用户默认为 **viewer**。
## 基于角色的访问控制
| 角色 | 权限 |
|---|---|
| **viewer** | Dashboard、Nodes(查看)、Alerts(查看)、公共状态页 |
| **collaborator** | viewer 的所有权限 + Nodes (CRUD)、Alerts(创建/解决) |
| **admin** | 以上所有权限 + Integrations、Settings、用户晋升 |
### 设置管理员
设置 `ADMIN_EMAILS` 环境变量,使用逗号分隔的电子邮件列表:
```
ADMIN_EMAILS=alice@example.com,bob@example.com rails server
```
使用这些电子邮件注册的用户将被自动分配 **admin** 角色。其他所有用户默认为 **viewer**。
## 后台作业与调度器
SolidQueue 支持所有后台处理,其周期性调度在 `config/recurring.yml` 中定义。
### 周期性调度
| 任务 | 环境 | 频率 |
|---|---|---|
| `MonitorSchedulerJob` | dev + prod | 每 30 秒 |
| `DataRetentionJob` | dev + prod | 每天凌晨 3 点 |
| `SolidQueue::Job.clear_finished_in_batches` | 仅限 prod | 每小时的第 12 分钟 |
### 作业
| 作业 | 文件 | 目的 |
|---|---|---|
| `MonitorSchedulerJob` | `app/jobs/monitor_scheduler_job.rb` | 遍历所有 monitors,并为任何上次检查时间早于其配置的 `check_interval` 的 monitor 将一个 `MonitorCheckJob` 加入队列 |
| `MonitorCheckJob` | `app/jobs/monitor_check_job.rb` | 对 monitor 的 URL 执行 HTTP GET 请求;记录响应时间、状态码和 `up`/`down` 状态;管理 `Incident` 生命周期(首次失败时创建,恢复时解决所有打开的 incidents) |
| `DataRetentionJob` | `app/jobs/data_retention_job.rb` | 清除超过 30 天的 `MonitorCheck` 记录和已解决且超过 90 天的 `Incident` 记录 |
### 流程
```
flowchart TD
A[Solid Queue Recurring Schedule] -->|"every 30s"| B[MonitorSchedulerJob]
A -->|"daily at 3am"| D[DataRetentionJob]
A -->|"hourly :12"| E[Clear finished jobsprod only] B -->|"performs for each
due monitor"| C[MonitorCheckJob] C -->|"HTTP GET"| F[Target URL] C -->|"records"| G[MonitorCheck] C -->|"updates status"| H[UptimeMonitor] C -->|"creates/resolves"| I[Incident] D -->|"deletes >30d"| G D -->|"deletes >90d resolved"| I ``` 使用 `bin/jobs` 启动 worker(已包含在 `bin/dev` 中)。 ## 创建受监控的 Endpoint 1. 登录并导航到 `/nodes` 2. 点击 **Create Node** 3. 填写名称、URL、检查间隔(秒)和超时时间(秒) 4. 调度器会在 30 秒内提取它 ## 邮件程序(开发环境) 电子邮件通过 [letter_opener](https://github.com/ryanb/letter_opener) 在浏览器中打开。无需 SMTP 配置。 ## 设计系统 有关完整的设计 token 规范(颜色、排版、组件),请参阅 `DESIGN.md`。 使用以下工具构建: - **Tailwind CSS v4** — 实用优先的 CSS - **Lucide** — 图标库 (CDN) - **Chartkick** + Chart.js — 柱状图/列状图 - **Stimulus** — JavaScript 片段(侧边栏切换、下拉菜单、密码切换) ## 技术栈 | 层级 | 技术 | |---|---| | 框架 | Rails 8.1 | | Ruby | 4.0.5 | | 数据库 | SQLite3 | | 认证 | Rodauth,基于 RBAC (viewer / collaborator / admin) | | CSS | Tailwind CSS v4 | | JS | Stimulus + Turbo | | 图表 | Chartkick + Chart.js | | 作业 | SolidQueue | | 邮件程序 | letter_opener (dev),带有 AlertMailer 的 Action Mailer | | 功能开关 | Flipper (email_notifications 切换) | | 图标 | Lucide | | 工具 | Tippy.js (tooltips)、Pagy (分页) | ## 创建 Release ``` # 打标签并推送 — CI 构建并推送到 Docker Hub git tag v1.0.0 git push origin v1.0.0 ``` 或者通过 UI 创建 [GitHub Release](https://github.com/binilsn/up-timer/releases) — 效果相同。 ## 测试 ``` rails test ```
标签:Docker, Ruby on Rails, 内存转储, 可用性监控, 后端开发, 安全防御评估, 状态监控, 请求拦截, 运维监控