Skip to content

Commit 66df284

Browse files
authored
build(selfhost): pin mutable docker image tags to current stable versions (#1271)
Pin the self-host stack's :latest image tags (pgbouncer, qdrant, ollama, litestream, prometheus, alertmanager, grafana, loki, promtail) to specific stable versions for reproducible, supply-chain-safe deploys.
1 parent 480f2c3 commit 66df284

1 file changed

Lines changed: 13 additions & 9 deletions

File tree

docker-compose.yml

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ services:
9191
# Transaction-mode pooler — allows hundreds of app clients with a small PG connection cap.
9292
# Set DATABASE_URL in gittensory to: postgres://gittensory:<pw>@pgbouncer:5432/gittensory
9393
pgbouncer:
94-
image: edoburu/pgbouncer:latest
94+
image: edoburu/pgbouncer:v1.25.2-p0
9595
restart: unless-stopped
9696
profiles: ["pgbouncer"]
9797
depends_on:
@@ -138,7 +138,7 @@ services:
138138
# QDRANT_URL=http://qdrant:6333 is set. Scales to millions of vectors with ANN search.
139139
# REST API: http://localhost:6333 gRPC: localhost:6334 Dashboard: http://localhost:6333/dashboard
140140
qdrant:
141-
image: qdrant/qdrant:latest
141+
image: qdrant/qdrant:v1.18.2
142142
restart: unless-stopped
143143
profiles: ["qdrant"]
144144
# Ports are bound to LOOPBACK (127.0.0.1), not 0.0.0.0: the app reaches Qdrant over the internal
@@ -172,7 +172,7 @@ services:
172172
# docker compose exec ollama ollama pull llama3.2
173173
# Then set AI_PROVIDER=ollama and AI_BASE_URL=http://ollama:11434/v1 in .env.
174174
ollama:
175-
image: ollama/ollama:latest
175+
image: ollama/ollama:0.30.10
176176
restart: unless-stopped
177177
profiles: ["ollama"]
178178
volumes:
@@ -182,7 +182,7 @@ services:
182182
# Continuous WAL backup of the SQLite DB to S3/B2/R2. Copy litestream.yml.example
183183
# → litestream.yml and fill in your bucket. Set LITESTREAM_* secrets in .env.
184184
litestream:
185-
image: litestream/litestream:latest
185+
image: litestream/litestream:0.5.12
186186
restart: unless-stopped
187187
profiles: ["litestream"]
188188
command: replicate
@@ -223,7 +223,7 @@ services:
223223
# Prometheus scrapes /metrics; Alertmanager routes alerts; Loki+Promtail collect logs;
224224
# Grafana visualises metrics AND logs. Grafana UI: http://localhost:3000 (admin / $GRAFANA_ADMIN_PASSWORD).
225225
prometheus:
226-
image: prom/prometheus:latest
226+
image: prom/prometheus:v3.12.0
227227
restart: unless-stopped
228228
profiles: ["observability"]
229229
volumes:
@@ -238,7 +238,7 @@ services:
238238
# Routes Prometheus alerts to your notification channel. Ships SILENT: alerts go to a
239239
# null receiver until you fill in a receiver in alertmanager/alertmanager.yml.
240240
alertmanager:
241-
image: prom/alertmanager:latest
241+
image: prom/alertmanager:v0.33.0
242242
restart: unless-stopped
243243
profiles: ["observability"]
244244
depends_on: [prometheus]
@@ -252,7 +252,7 @@ services:
252252
- "--storage.path=/alertmanager"
253253

254254
grafana:
255-
image: grafana/grafana:latest
255+
image: grafana/grafana:13.1.0
256256
restart: unless-stopped
257257
profiles: ["observability"]
258258
depends_on: [prometheus, loki]
@@ -271,7 +271,7 @@ services:
271271
# docker-proxy (NOT a raw socket) and ships their logs to Loki. Browse in Grafana → Explore →
272272
# Loki, e.g. {service="gittensory"} | json | level="error".
273273
loki:
274-
image: grafana/loki:latest
274+
image: grafana/loki:3.7.3
275275
restart: unless-stopped
276276
profiles: ["observability"]
277277
command: ["-config.file=/etc/loki/loki-config.yml"]
@@ -306,7 +306,7 @@ services:
306306
networks: [docker-proxy] # isolated — only Promtail joins this network
307307

308308
promtail:
309-
image: grafana/promtail:latest
309+
image: grafana/promtail:3.6.11
310310
restart: unless-stopped
311311
profiles: ["observability"]
312312
command: ["-config.file=/etc/promtail/promtail-config.yml"]
@@ -325,6 +325,10 @@ services:
325325
# public ports exposed. Generate an auth key at tailscale.com/settings/keys and
326326
# set TS_AUTHKEY= in .env. The gittensory service is reachable at the tailnet IP on port 8787.
327327
tailscale:
328+
# Kept on the `stable` release channel rather than a version tag: tailscale's ghcr tags use a
329+
# non-obvious scheme and the client is happiest tracking the current stable. For a fully immutable
330+
# pin, resolve a digest once: docker pull ghcr.io/tailscale/tailscale:stable && docker inspect \
331+
# --format='{{index .RepoDigests 0}}' ghcr.io/tailscale/tailscale:stable
328332
image: ghcr.io/tailscale/tailscale:stable
329333
restart: unless-stopped
330334
profiles: ["tailscale"]

0 commit comments

Comments
 (0)