From 4e9fe816d5b17615c83ab9168e5bbffc54e59974 Mon Sep 17 00:00:00 2001 From: SysAdmin Agent Date: Sat, 21 Mar 2026 21:11:52 +0000 Subject: [PATCH] Fix version display: show actual version instead of 'vunknown' Root cause: Dockerfile build context is ./app/ but VERSION file is at repo root, so it's excluded from the Docker image. The context processor tried parent.parent.parent which resolves to / inside the container. Fix: - Context processor now checks APP_VERSION env var first, then tries multiple file paths (repo root for local dev, app/ dir for Docker) - Dockerfile accepts APP_VERSION build arg and sets it as ENV - compose.yml passes APP_VERSION build arg to all service builds Note: Deploy script needs `export APP_VERSION=$(cat VERSION)` before docker-compose build for the build arg to pick up the version. Co-Authored-By: Claude Opus 4.6 --- app/Dockerfile | 4 +++- app/core/context_processors.py | 22 +++++++++++++++++----- compose.yml | 20 ++++++++++++++++---- 3 files changed, 36 insertions(+), 10 deletions(-) diff --git a/app/Dockerfile b/app/Dockerfile index 1e6d6d2..37d4626 100644 --- a/app/Dockerfile +++ b/app/Dockerfile @@ -1,6 +1,8 @@ FROM python:3.12-slim +ARG APP_VERSION=unknown ENV PYTHONDONTWRITEBYTECODE=1 \ - PYTHONUNBUFFERED=1 + PYTHONUNBUFFERED=1 \ + APP_VERSION=$APP_VERSION RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential libpq-dev postgresql-client \ diff --git a/app/core/context_processors.py b/app/core/context_processors.py index 189d6bd..9fb63cc 100644 --- a/app/core/context_processors.py +++ b/app/core/context_processors.py @@ -1,3 +1,4 @@ +import os from pathlib import Path _VERSION = None @@ -6,9 +7,20 @@ _VERSION = None def app_version(request): global _VERSION if _VERSION is None: - version_file = Path(__file__).resolve().parent.parent.parent / "VERSION" - try: - _VERSION = version_file.read_text().strip() - except FileNotFoundError: - _VERSION = "unknown" + # 1. Environment variable (set in Docker/deployment) + _VERSION = os.environ.get("APP_VERSION", "").strip() + if not _VERSION: + # 2. Try VERSION file at common locations + base = Path(__file__).resolve().parent.parent # app/ + for candidate in [ + base.parent / "VERSION", # repo root (local dev) + base / "VERSION", # app/ dir (Docker) + ]: + try: + _VERSION = candidate.read_text().strip() + break + except FileNotFoundError: + continue + else: + _VERSION = "unknown" return {"APP_VERSION": _VERSION} diff --git a/compose.yml b/compose.yml index f64c8c6..4d74933 100644 --- a/compose.yml +++ b/compose.yml @@ -25,7 +25,10 @@ services: image: redis:7-alpine web: - build: ./app + build: + context: ./app + args: + APP_VERSION: ${APP_VERSION:-unknown} depends_on: db: condition: service_healthy @@ -62,7 +65,10 @@ services: command: ["gunicorn", "core.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "3"] worker: - build: ./app + build: + context: ./app + args: + APP_VERSION: ${APP_VERSION:-unknown} environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} @@ -88,7 +94,10 @@ services: command: ["celery", "-A", "core", "worker", "-l", "info"] beat: - build: ./app + build: + context: ./app + args: + APP_VERSION: ${APP_VERSION:-unknown} environment: - POSTGRES_DB=${POSTGRES_DB} - POSTGRES_USER=${POSTGRES_USER} @@ -114,7 +123,10 @@ services: command: ["celery", "-A", "core", "beat", "-l", "info"] mcp: - build: ./app + build: + context: ./app + args: + APP_VERSION: ${APP_VERSION:-unknown} depends_on: db: condition: service_healthy