You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: CHANGELOG.md
+18-1Lines changed: 18 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -5,6 +5,19 @@ All notable changes to this project are documented in this file.
5
5
Format based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
6
6
This project adheres to [Semantic Versioning](https://semver.org/).
7
7
8
+
## [Unreleased]
9
+
10
+
## [0.7.8] - 2026-06-15
11
+
12
+
### Fixed
13
+
14
+
-**README badge embeds:** exempt `/api/v1/badge/*` from per-IP rate limiting and IP whitelist (with `/metrics` and `/api/v1/healthz`). Fixes broken `` images when `GGHSTATS_WHITELIST_PATHS` includes `/api/` or GitHub/camo proxies share one client IP bucket.
15
+
16
+
### Changed
17
+
18
+
-**Docs:** sync README version badge and install examples to **0.7.8**; note badge routes in middleware section; man page and env examples.
19
+
-**Docker release image:** Alpine **3.24** in `Dockerfile.release` (aligned with local `Dockerfile`).
20
+
8
21
## [0.7.7] - 2026-06-14
9
22
10
23
### Added
@@ -304,7 +317,11 @@ This project adheres to [Semantic Versioning](https://semver.org/).
304
317
- Project naming and module path finalized as `gghstats` (binary, Docker image, `GGHSTATS_*` environment variables).
305
318
- Toolchain and build base image aligned to Go **1.26.1**.
Or extract a [Release](https://github.com/hrodrig/gghstats/releases) tarball, or `go install github.com/hrodrig/gghstats/cmd/gghstats@latest`. Pin a version: `VERSION=v0.7.4 curl -fsSL …/install.sh | sh`.
126
+
Or extract a [Release](https://github.com/hrodrig/gghstats/releases) tarball, or `go install github.com/hrodrig/gghstats/cmd/gghstats@latest`. Pin a version: `VERSION=v0.7.8 curl -fsSL …/install.sh | sh`.
127
127
128
128
Open <http://localhost:8080> if you did not use **`--open`**. Data is stored in `./data/gghstats.db` (override with `GGHSTATS_DB`). A first sync may take a while if the default filter includes many repositories — narrow `GGHSTATS_FILTER` in [Configuration](#configuration) when you move beyond this smoke test.
129
129
@@ -167,7 +167,7 @@ Open <http://localhost:8080>. The template [`.env.example`](.env.example) docume
167
167
curl -fsSL https://raw.githubusercontent.com/hrodrig/gghstats/main/scripts/install.sh | sh
168
168
```
169
169
170
-
Downloads the latest [release](https://github.com/hrodrig/gghstats/releases) archive for your OS/arch into `/usr/local/bin` (override with `BINDIR=~/bin`). Review [`scripts/install.sh`](scripts/install.sh) before piping to `sh`; pin with `VERSION=v0.7.4`.
170
+
Downloads the latest [release](https://github.com/hrodrig/gghstats/releases) archive for your OS/arch into `/usr/local/bin` (override with `BINDIR=~/bin`). Review [`scripts/install.sh`](scripts/install.sh) before piping to `sh`; pin with `VERSION=v0.7.8`.
171
171
172
172
**From source (recommended for developers):**
173
173
@@ -182,15 +182,15 @@ This installs the binary to `$GOBIN` (default `$HOME/go/bin`). Ensure `$GOBIN` i
|**Linux tarball**|`tar -xzf gghstats_*_linux_*.tar.gz` from [Releases](https://github.com/hrodrig/gghstats/releases); verify `checksums.txt`|
188
188
|**FreeBSD**|`gghstats_*_freebsd_*.tar.gz` on [Releases](https://github.com/hrodrig/gghstats/releases); port + developer guide [`contrib/freebsd/README.md`](contrib/freebsd/README.md) (`gmake` in repo, `make` in ports tree) |
189
189
|**OpenBSD**|`gghstats_*_openbsd_*.tar.gz` on [Releases](https://github.com/hrodrig/gghstats/releases); [`contrib/openbsd/README.md`](contrib/openbsd/README.md) and port [`contrib/openbsd/port/`](contrib/openbsd/port/)|
190
190
|**macOS / Windows archives**|`.tar.gz` / `.zip` on [Releases](https://github.com/hrodrig/gghstats/releases)|
191
-
|**OCI image**|`ghcr.io/hrodrig/gghstats:v0.7.4` or `:latest` (multi-arch) |
191
+
|**OCI image**|`ghcr.io/hrodrig/gghstats:v0.7.8` or `:latest` (multi-arch) |
192
192
193
-
Replace `v0.7.4` and `amd64` with your [release](https://github.com/hrodrig/gghstats/releases) version and architecture (e.g. `arm64`).
193
+
Replace `v0.7.8` and `amd64` with your [release](https://github.com/hrodrig/gghstats/releases) version and architecture (e.g. `arm64`).
194
194
195
195
After install, validate the UI locally:
196
196
@@ -384,6 +384,8 @@ gghstats applies **per-IP token-bucket rate limiting** to all HTTP routes except
384
384
385
385
**Middleware order (outermost first):** IP whitelist → rate limiting → request logging → Prometheus HTTP metrics → route handlers.
386
386
387
+
**Always exempt** (no whitelist check, no rate limit): `/metrics`, `/api/v1/healthz`, and **`/api/v1/badge/*`** (README embeds; GitHub and other proxies must fetch SVG without auth or throttling).
388
+
387
389
**Defaults:** 120 requests per minute, burst of 20. For most dashboard browsing this is generous; adjust for high-traffic or protected deployments.
388
390
389
391
Behind a **reverse proxy** (nginx, Traefik, Caddy, haproxy), gghstats reads the client IP from `X-Forwarded-For` (preferred) or `X-Real-IP`. Ensure your proxy sets one of these headers, otherwise all requests appear to come from the proxy itself and share a single rate-limit bucket.
@@ -409,7 +411,7 @@ Inactive IPs are evicted from memory after 5 minutes of idle time.
409
411
410
412
gghstats supports optional IP-based access control via `GGHSTATS_WHITELIST`. When set, only requests from matching IPs or CIDR ranges are allowed; all others receive `403 Forbidden` with `{"error":"ip_not_whitelisted"}`.
411
413
412
-
By default the whitelist applies to **all routes** except `/metrics`and `/api/v1/healthz`. Scope it to specific paths with `GGHSTATS_WHITELIST_PATHS` (comma-separated prefixes, e.g. `/api/,/h2h`). Paths not listed remain publicly accessible.
414
+
By default the whitelist applies to **all routes** except `/metrics`, `/api/v1/healthz`, and **`/api/v1/badge/*`** (README embeds). Scope it to specific paths with `GGHSTATS_WHITELIST_PATHS` (comma-separated prefixes, e.g. `/api/,/h2h`). Paths not listed remain publicly accessible. Badge URLs stay public even when `/api/` is whitelisted.
0 commit comments