ARG NUSQLITE3_DIR="/usr/local/lib/nusqlite3" ARG NUSQLITE3_PATH="${NUSQLITE3_DIR}/libnusqlite3.so" ### STAGE 0: Build client ### FROM node:20-alpine AS build-client WORKDIR /client COPY /client /client RUN npm ci && npm cache clean --force RUN npm run generate ### STAGE 1: Build server ### FROM node:20-alpine AS build-server ARG NUSQLITE3_DIR ARG TARGETPLATFORM ENV NODE_ENV=production RUN apk add --no-cache --update \ curl \ make \ python3 \ g++ \ unzip WORKDIR /server COPY index.js package* /server COPY /server /server/server RUN case "$TARGETPLATFORM" in \ "linux/amd64") \ curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-x64.zip" ;; \ "linux/arm64") \ curl -L -o /tmp/library.zip "https://github.com/mikiher/nunicode-sqlite/releases/download/v1.2/libnusqlite3-linux-musl-arm64.zip" ;; \ *) echo "Unsupported platform: $TARGETPLATFORM" && exit 1 ;; \ esac && \ unzip /tmp/library.zip -d $NUSQLITE3_DIR && \ rm /tmp/library.zip RUN npm ci --only=production ### STAGE 2: Create minimal runtime image ### FROM node:20-alpine ARG NUSQLITE3_DIR ARG NUSQLITE3_PATH # Install only runtime dependencies RUN apk add --no-cache --update \ tzdata \ ffmpeg \ tini WORKDIR /app # Copy compiled frontend and server from build stages COPY --from=build-client /client/dist /app/client/dist COPY --from=build-server /server /app COPY --from=build-server /usr/local/lib/nusqlite3 /usr/local/lib/nusqlite3 EXPOSE 80 ENV PORT=80 ENV NODE_ENV=production ENV CONFIG_PATH="/config" ENV METADATA_PATH="/metadata" ENV SOURCE="docker" ENV NUSQLITE3_DIR=${NUSQLITE3_DIR} ENV NUSQLITE3_PATH=${NUSQLITE3_PATH} ENTRYPOINT ["tini", "--"] CMD ["node", "index.js"]