From ec507b05d65a54fa461852b1ed65f018ef89e008 Mon Sep 17 00:00:00 2001 From: npub15skvhry Date: Fri, 15 May 2026 12:53:15 +0330 Subject: [PATCH] minimize container size and caching --- ...cker-publish.yml => container-publish.yml} | 9 ++++++- .gitignore | 1 + Dockerfile | 26 ++++++++++-------- package.json | 1 + vite.config.server.ts | 27 +++++++++++++++++++ 5 files changed, 52 insertions(+), 12 deletions(-) rename .gitea/workflows/{docker-publish.yml => container-publish.yml} (85%) create mode 100644 vite.config.server.ts diff --git a/.gitea/workflows/docker-publish.yml b/.gitea/workflows/container-publish.yml similarity index 85% rename from .gitea/workflows/docker-publish.yml rename to .gitea/workflows/container-publish.yml index 446198d7..026482f0 100644 --- a/.gitea/workflows/docker-publish.yml +++ b/.gitea/workflows/container-publish.yml @@ -1,8 +1,13 @@ -name: Docker +name: Container Image Build and Publish on: push: branches: [master] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true env: REGISTRY: gitea.coracle.social @@ -32,6 +37,7 @@ jobs: with: images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} tags: | + type=sha type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} - name: Set up Docker Buildx @@ -45,6 +51,7 @@ jobs: with: context: . push: true + target: production platforms: linux/amd64,linux/arm64 tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} diff --git a/.gitignore b/.gitignore index 5839829b..fe2bed59 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ android/app/src/main/assets/public/ node_modules/ .pnpm-store/ build/ +build-server/ .svelte-kit/ .next/ diff --git a/Dockerfile b/Dockerfile index b158d36d..fe275539 100644 --- a/Dockerfile +++ b/Dockerfile @@ -6,22 +6,26 @@ # Pass --build-arg VITE_BUILD_HASH=$(git rev-parse --short HEAD) to stamp the build. # A .env in the build context is picked up by build.sh for branding config. -FROM node:22-bookworm - -RUN npm install -g pnpm@10.33.0 +# https://pnpm.io/docker#example-3-build-on-cicd +FROM node:24-slim AS builder +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable WORKDIR /app - -COPY package.json pnpm-lock.yaml ./ - -RUN pnpm i --frozen-lockfile - ENV NODE_OPTIONS=--max_old_space_size=16384 - +COPY package.json pnpm-lock.yaml ./ +RUN pnpm i --frozen-lockfile COPY . . - +ARG VITE_BUILD_HASH RUN pnpm run build +RUN pnpm run build:server +FROM node:24-slim AS production +ENV NODE_ENV=production +WORKDIR /app +COPY --from=builder /app/build /app/build +COPY --from=builder /app/build-server/server.js /app/server.js EXPOSE 3000 - +USER node CMD ["node", "server.js"] diff --git a/package.json b/package.json index 9fa9c685..3a7e7077 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,7 @@ "scripts": { "dev": "vite dev", "build": "./build.sh", + "build:server": "vite build --config vite.config.server.ts", "start": "node server.js", "release:android": "./build.sh && cap build android --androidreleasetype APK --signing-type apksigner", "tauri:dev": "tauri dev", diff --git a/vite.config.server.ts b/vite.config.server.ts new file mode 100644 index 00000000..240ce7fc --- /dev/null +++ b/vite.config.server.ts @@ -0,0 +1,27 @@ +import { defineConfig } from "vite" +import { builtinModules } from 'module' + +export default defineConfig({ + ssr: { + noExternal: true, // bundle every dependency + }, + build: { + target: 'node24', // match your Node.js version + outDir: 'build-server', + emptyOutDir: false, // don't wipe the frontend build output + ssr: true, // tells Vite this is a server-side build + minify: 'esbuild', // minify the output + lib: { + entry: 'server.js', // your server entry point + formats: ['es'], + fileName: () => 'server.js', + }, + rollupOptions: { + // Externalize only Node.js built-ins, bundle everything else + external: [ + ...builtinModules, + ...builtinModules.map(m => `node:${m}`), + ], + }, + }, +})