binilsn/up-timer

GitHub: binilsn/up-timer

一个基于 Rails 的自托管服务可用性监控仪表板,通过定时 HTTP 检测追踪服务健康状态、响应时间和故障事件,并提供公共状态页与角色权限管理。

Stars: 2 | Forks: 1

# UpTimer 用于跟踪服务健康状况、响应时间和事件的正常运行时间监控仪表板。 image ## 公共状态页 image ## 前置条件 - 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 ```
标签:Docker, Ruby on Rails, 内存转储, 可用性监控, 后端开发, 安全防御评估, 状态监控, 请求拦截, 运维监控