allure-hub¶
Self-hosted Allure 3 reporting platform. A Go API serves the React frontend and all Allure reports from a single container - no nginx sidecar required.

Features¶
- Multi-environment / multi-project - organise reports by environment (staging, production) and project
- Two upload strategies - single streaming upload or chunked upload for large files
- Live upload tracking - real-time progress via SSE, visible across all connected clients
- Allure 3 reports - automatic history stitching for trend charts across builds
- Google OAuth + RBAC - role-based access:
admin,developer,viewer - API key authentication - issue scoped keys for CI pipelines; keys carry roles and are tracked with last-used timestamps
- Upload attribution - every build and upload session records who triggered it (OAuth email or
apikey:<name>) - Single container - Go binary + Allure CLI + React SPA in one image
- SQLite or PostgreSQL - SQLite for single-node; Postgres for HA
- Automatic data retention - background cleanup worker deletes expired reports on a configurable schedule; run history visible in the Settings UI
Architecture¶
flowchart TD
subgraph T["Transport - internal/transport"]
t1[HTTP router] --- t2[Handlers] --- t3[Middleware] --- t4[Auth]
end
subgraph U["Use-cases - internal/usecase"]
u1[EnvironmentService] --- u2[ProjectService] --- u3[ReportService]
u4[UploadService] --- u5[APIKeyService] --- u6[EventBus]
end
subgraph D["Domain - internal/domain"]
d1[Environment] --- d2[Project] --- d3[Build]
d4[UploadSession] --- d5[APIKey] --- d6[TrackedUser]
end
subgraph I["Infrastructure"]
r[Repository\nSQLite / Postgres]
s[Storage\nPVC filesystem]
a[Allure\nCLI wrapper]
end
T --> U --> D --> I
Data layout¶
graph TD
data["/data/"] --> db["allure-hub.db\n(SQLite metadata)"]
data --> env["{environmentID}/"]
env --> project["{projectID}/"]
project --> history["history/\n(persisted for trend charts)"]
project --> results["results/{buildID}/\n(unzipped allure-results)"]
project --> reports["reports/{buildID}/\n(allure generate output)"]
project --> uploads["uploads/{uploadId}/\n(chunk staging, cleaned after assembly)"]
Quick links¶
- Getting Started - local dev setup in 5 minutes
- Configuration - all environment variables
- Authentication - OAuth, RBAC, and API keys
- API Reference - full endpoint documentation
- Docker Deployment - production container setup