mirror of
https://github.com/BetterCorp/BetterFrame.git
synced 2026-05-26 17:56:34 +00:00
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:
parent
653f2ce910
commit
7d81891b0e
4 changed files with 29 additions and 10 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -42,4 +42,5 @@ npm-debug.log*
|
||||||
# Misc
|
# Misc
|
||||||
*.tgz
|
*.tgz
|
||||||
*.tsbuildinfo
|
*.tsbuildinfo
|
||||||
/old-python/
|
# RAUC signing keys (generated locally, secrets set in GitHub Actions)
|
||||||
|
rauc-signing/
|
||||||
|
|
|
||||||
|
|
@ -5,9 +5,9 @@ FROM node:24-trixie-slim AS builder
|
||||||
|
|
||||||
WORKDIR /app
|
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 \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
build-essential python3 \
|
build-essential python3 git \
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
COPY package.json package-lock.json ./
|
COPY package.json package-lock.json ./
|
||||||
|
|
@ -21,11 +21,20 @@ COPY server ./server
|
||||||
WORKDIR /app/server
|
WORKDIR /app/server
|
||||||
RUN npm run build
|
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 ----
|
# ---- Runtime image ----
|
||||||
FROM node:24-trixie-slim
|
FROM node:24-trixie-slim
|
||||||
|
|
||||||
ARG BF_SERVER_VERSION=
|
|
||||||
|
|
||||||
# ffmpeg for camera snapshot capture (optional but needed for /admin/entities/:id/snapshot)
|
# ffmpeg for camera snapshot capture (optional but needed for /admin/entities/:id/snapshot)
|
||||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
ca-certificates ffmpeg wget \
|
ca-certificates ffmpeg wget \
|
||||||
|
|
@ -53,6 +62,5 @@ USER betterframe
|
||||||
WORKDIR /app/server
|
WORKDIR /app/server
|
||||||
|
|
||||||
ENV NODE_OPTIONS=--import=tsx
|
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"]
|
CMD ["node", "--import", "tsx", "/app/node_modules/@bsb/base/lib/scripts/bsb-plugin-cli.js", "start"]
|
||||||
|
|
|
||||||
|
|
@ -18,8 +18,7 @@ services:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: deploy/docker/Dockerfile.server
|
dockerfile: deploy/docker/Dockerfile.server
|
||||||
args:
|
args:
|
||||||
BF_SERVER_VERSION: ${BF_SERVER_VERSION:-${SOURCE_COMMIT:-dev}}
|
BF_SERVER_VERSION: ${BF_SERVER_VERSION:-${COOLIFY_GIT_COMMIT:-${SOURCE_COMMIT:-dev}}}
|
||||||
SOURCE_COMMIT: ${SOURCE_COMMIT:-}
|
|
||||||
container_name: betterframe-server
|
container_name: betterframe-server
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
|
|
@ -28,8 +27,7 @@ services:
|
||||||
- BF_SQLITE_PATH=/var/lib/betterframe/betterframe.db
|
- BF_SQLITE_PATH=/var/lib/betterframe/betterframe.db
|
||||||
- BF_NODERED_URL=http://nodered:1880
|
- BF_NODERED_URL=http://nodered:1880
|
||||||
- BF_SELF_URL=http://server:18080
|
- BF_SELF_URL=http://server:18080
|
||||||
- BF_SERVER_VERSION=${BF_SERVER_VERSION:-${SOURCE_COMMIT:-dev}}
|
- BF_SERVER_VERSION=${BF_SERVER_VERSION:-${COOLIFY_GIT_COMMIT:-${SOURCE_COMMIT:-dev}}}
|
||||||
- SOURCE_COMMIT=${SOURCE_COMMIT:-}
|
|
||||||
volumes:
|
volumes:
|
||||||
- betterframe-data:/var/lib/betterframe
|
- betterframe-data:/var/lib/betterframe
|
||||||
expose:
|
expose:
|
||||||
|
|
|
||||||
|
|
@ -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 {
|
export function serverVersion(): string {
|
||||||
return (
|
return (
|
||||||
process.env.BF_SERVER_VERSION
|
process.env.BF_SERVER_VERSION
|
||||||
|| process.env.BF_BUILD_VERSION
|
|| process.env.BF_BUILD_VERSION
|
||||||
|
|| BAKED_VERSION
|
||||||
|| process.env.COOLIFY_GIT_COMMIT
|
|| process.env.COOLIFY_GIT_COMMIT
|
||||||
|| process.env.SOURCE_COMMIT
|
|| process.env.SOURCE_COMMIT
|
||||||
|| "dev"
|
|| "dev"
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue