# BetterFrame server — BSB container with built plugins. # # sec-config.yaml is NOT baked in — mount it at runtime: # volumes: # - ./sec-config.yaml:/app/sec-config.yaml:ro # # Builder stage compiles TS + native deps (argon2). # Runtime stage uses the official BSB container. FROM node:24-trixie-slim AS builder WORKDIR /app RUN apt-get update && apt-get install -y --no-install-recommends \ build-essential python3 \ && rm -rf /var/lib/apt/lists/* COPY package.json package-lock.json ./ COPY server/package.json ./server/ COPY tsconfig.base.json ./ RUN npm ci && npm rebuild argon2 COPY server ./server WORKDIR /app/server RUN npm run build # ---- Runtime ---- FROM betterweb/service-base:node ARG BF_SERVER_VERSION=dev USER root # ffmpeg for camera snapshot capture RUN apt-get update && apt-get install -y --no-install-recommends \ ffmpeg \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /var/lib/betterframe && chown node:node /var/lib/betterframe WORKDIR /app # Copy built plugin + deps COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/server/lib ./lib COPY --from=builder /app/server/bsb-plugin.json ./bsb-plugin.json COPY --from=builder /app/server/package.json ./package.json COPY --from=builder /app/tsconfig.base.json ./tsconfig.base.json # Static web assets served by admin-http COPY --from=builder /app/server/lib/web-static ./lib/web-static # Bake version RUN echo "$BF_SERVER_VERSION" > /app/.bf-version VOLUME /var/lib/betterframe EXPOSE 18080 18081 18082 USER node