fix(version): derive server version from git at Docker build time

Coolify pulls from GitHub and runs docker compose build — no guaranteed
env vars like SOURCE_COMMIT. Previous approach relied on ARG/ENV
passthrough that silently defaulted to "dev".

Fix: install git in the builder stage, COPY .git into context, run
git describe --tags --always to derive the version, write it to
/app/server/.bf-version. version.ts reads this file as a fallback
between env vars and the "dev" literal.

Chain: BF_SERVER_VERSION env → BF_BUILD_VERSION env → .bf-version file
→ COOLIFY_GIT_COMMIT env → SOURCE_COMMIT env → "dev".

Also: fix .gitignore for rauc-signing/ (was under wrong path).
This commit is contained in:
Mitchell R 2026-05-21 16:02:21 +02:00
parent 653f2ce910
commit 7d81891b0e
No known key found for this signature in database
4 changed files with 29 additions and 10 deletions

3
.gitignore vendored
View file

@ -42,4 +42,5 @@ npm-debug.log*
# Misc
*.tgz
*.tsbuildinfo
/old-python/
# RAUC signing keys (generated locally, secrets set in GitHub Actions)
rauc-signing/

View file

@ -5,9 +5,9 @@ FROM node:24-trixie-slim AS builder
WORKDIR /app
# Build deps for argon2 + bsb-plugin-cli
# Build deps for argon2 + bsb-plugin-cli + git for version stamping
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential python3 \
build-essential python3 git \
&& rm -rf /var/lib/apt/lists/*
COPY package.json package-lock.json ./
@ -21,11 +21,20 @@ COPY server ./server
WORKDIR /app/server
RUN npm run build
# Derive version from git. Coolify clones the repo with .git intact so
# git describe / rev-parse work. Falls back to package.json version if
# .git is missing (e.g. if a .dockerignore later excludes it).
COPY .git /app/.git
RUN cd /app && \
GIT_VER="$(git describe --tags --always --dirty 2>/dev/null || echo '')" && \
if [ -z "$GIT_VER" ]; then GIT_VER="$(git rev-parse --short HEAD 2>/dev/null || echo '')"; fi && \
if [ -z "$GIT_VER" ]; then GIT_VER="$(node -p 'require("./package.json").version' 2>/dev/null || echo 'dev')"; fi && \
echo "$GIT_VER" > /app/server/.bf-version && \
echo "Baked version: $GIT_VER"
# ---- Runtime image ----
FROM node:24-trixie-slim
ARG BF_SERVER_VERSION=
# ffmpeg for camera snapshot capture (optional but needed for /admin/entities/:id/snapshot)
RUN apt-get update && apt-get install -y --no-install-recommends \
ca-certificates ffmpeg wget \
@ -53,6 +62,5 @@ USER betterframe
WORKDIR /app/server
ENV NODE_OPTIONS=--import=tsx
ENV BF_SERVER_VERSION=${BF_SERVER_VERSION}
CMD ["node", "--import", "tsx", "/app/node_modules/@bsb/base/lib/scripts/bsb-plugin-cli.js", "start"]

View file

@ -18,8 +18,7 @@ services:
context: .
dockerfile: deploy/docker/Dockerfile.server
args:
BF_SERVER_VERSION: ${BF_SERVER_VERSION:-${SOURCE_COMMIT:-dev}}
SOURCE_COMMIT: ${SOURCE_COMMIT:-}
BF_SERVER_VERSION: ${BF_SERVER_VERSION:-${COOLIFY_GIT_COMMIT:-${SOURCE_COMMIT:-dev}}}
container_name: betterframe-server
restart: unless-stopped
environment:
@ -28,8 +27,7 @@ services:
- BF_SQLITE_PATH=/var/lib/betterframe/betterframe.db
- BF_NODERED_URL=http://nodered:1880
- BF_SELF_URL=http://server:18080
- BF_SERVER_VERSION=${BF_SERVER_VERSION:-${SOURCE_COMMIT:-dev}}
- SOURCE_COMMIT=${SOURCE_COMMIT:-}
- BF_SERVER_VERSION=${BF_SERVER_VERSION:-${COOLIFY_GIT_COMMIT:-${SOURCE_COMMIT:-dev}}}
volumes:
- betterframe-data:/var/lib/betterframe
expose:

View file

@ -1,7 +1,19 @@
import { readFileSync } from "node:fs";
const BAKED_VERSION = (() => {
try {
const v = readFileSync("/app/server/.bf-version", "utf8").trim();
return v && v !== "dev" ? v : null;
} catch {
return null;
}
})();
export function serverVersion(): string {
return (
process.env.BF_SERVER_VERSION
|| process.env.BF_BUILD_VERSION
|| BAKED_VERSION
|| process.env.COOLIFY_GIT_COMMIT
|| process.env.SOURCE_COMMIT
|| "dev"