feat: initial commit

This commit is contained in:
nikola
2026-05-19 14:53:37 +02:00
commit ea7e728222
34 changed files with 680 additions and 0 deletions
+72
View File
@@ -0,0 +1,72 @@
# CI Observer Architecture
## What It Is
CI Observer is a read-only dashboard that polls GitHub Actions run data and renders a live CI status wall.
## Core Technologies
- Backend: Python 3.11 + FastAPI
- HTTP client: `httpx`
- Storage: SQLite (`/app/data/ci_observer.db`)
- Frontend: server-rendered static HTML/CSS/JS (no SPA framework)
- Runtime: Docker + Docker Compose
- Source control: GitHub
## High-Level Flow
```mermaid
flowchart LR
GH[GitHub Actions API] -->|poll runs| APP[FastAPI Poller]
APP -->|upsert| DB[(SQLite)]
UI[Browser] -->|GET /api/runs /api/filters /api/config| APP
APP -->|query| DB
APP -->|JSON + static assets| UI
```
## Runtime Components
```mermaid
flowchart TB
subgraph Runner_VM
C[Docker Container: ci-observer-dashboard-prod]
D[(Volume ./data -> /app/data)]
S[Static UI: index.html + app.js + styles.css]
A[FastAPI app/main.py]
C --> A
C --> S
C --> D
end
Browser -->|HTTP :8089| C
A -->|HTTPS calls| GitHubAPI[api.github.com]
```
## Data Model (Main Fields)
Stored run fields include:
- `repo`, `workflow`, `run_id`, `status`, `conclusion`
- `head_branch`, `head_sha`, `actor`
- `started_at`, `updated_at`, `duration_seconds`
- `html_url`
- `raw_json` (full run payload for future extensions)
## App Principles
- Read-only by design: no write-back to GitHub or pipeline control.
- Operational simplicity: one container, one DB file, one compose file per instance.
- Clear rollout model: feature branch on test port, then merge to `main`, then production deploy.
- Low blast radius: test instances isolated by folder, port, and SQLite volume path.
## Config Contract
Environment variables:
- `GITHUB_TOKEN`
- `GH_REPOS` (comma-separated)
- `GH_WORKFLOWS` (comma-separated workflow file names)
- `REFRESH_SECONDS`
- `DASHBOARD_TITLE`
Important:
- Current polling logic requires both `GH_REPOS` and `GH_WORKFLOWS`.
- If `GH_WORKFLOWS` is empty, polling does not start.
## Deployment Model Used
1. Build/test on temporary instance in `/webapps/ci-observer-dashboard-<feature>` on test port.
2. Validate UI/behavior.
3. Merge approved branch to `main`.
4. Production update from `/webapps/ci-observer-dashboard-prod` on `8089`.