diff --git a/Dockerfile b/Dockerfile index 07371f77..487fa033 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,11 @@ FROM node:24-alpine AS builder -# OCI Image Labels - Build Args for dynamic values -ARG VERSION="dev" -ARG REVISION="" -ARG CREATED="" -ARG LICENSE="AGPL-3.0" - WORKDIR /app ARG BUILD=oss ARG DATABASE=sqlite -# Derive title and description based on BUILD type -ARG IMAGE_TITLE="Pangolin" -ARG IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" - -RUN apk add --no-cache curl tzdata python3 make g++ +RUN apk add --no-cache python3 make g++ # COPY package.json package-lock.json ./ COPY package*.json ./ @@ -23,41 +13,31 @@ RUN npm ci COPY . . -RUN echo "export * from \"./$DATABASE\";" > server/db/index.ts -RUN echo "export const driver: \"pg\" | \"sqlite\" = \"$DATABASE\";" >> server/db/index.ts - -RUN echo "export const build = \"$BUILD\" as \"saas\" | \"enterprise\" | \"oss\";" > server/build.ts - -# Copy the appropriate TypeScript configuration based on build type -RUN if [ "$BUILD" = "oss" ]; then cp tsconfig.oss.json tsconfig.json; \ - elif [ "$BUILD" = "saas" ]; then cp tsconfig.saas.json tsconfig.json; \ - elif [ "$BUILD" = "enterprise" ]; then cp tsconfig.enterprise.json tsconfig.json; \ - fi - -# if the build is oss then remove the server/private directory -RUN if [ "$BUILD" = "oss" ]; then rm -rf server/private; fi - -RUN if [ "$DATABASE" = "pg" ]; then npx drizzle-kit generate --dialect postgresql --schema ./server/db/pg/schema --out init; else npx drizzle-kit generate --dialect $DATABASE --schema ./server/db/$DATABASE/schema --out init; fi - -RUN mkdir -p dist -RUN npm run next:build -RUN node esbuild.mjs -e server/index.ts -o dist/server.mjs -b $BUILD -RUN if [ "$DATABASE" = "pg" ]; then \ - node esbuild.mjs -e server/setup/migrationsPg.ts -o dist/migrations.mjs; \ - else \ - node esbuild.mjs -e server/setup/migrationsSqlite.ts -o dist/migrations.mjs; \ - fi +RUN if [ "$BUILD" = "oss" ]; then rm -rf server/private; fi && \ + npm run set:$DATABASE && \ + npm run set:$BUILD && \ + npm run db:$DATABASE:generate && \ + npm run build:$DATABASE && \ + npm run build:cli # test to make sure the build output is there and error if not RUN test -f dist/server.mjs -RUN npm run build:cli - # Prune dev dependencies and clean up to prepare for copy to runner RUN npm prune --omit=dev && npm cache clean --force FROM node:24-alpine AS runner +# OCI Image Labels - Build Args for dynamic values +ARG VERSION="dev" +ARG REVISION="" +ARG CREATED="" +ARG LICENSE="AGPL-3.0" + +# Derive title and description based on BUILD type +ARG IMAGE_TITLE="Pangolin" +ARG IMAGE_DESCRIPTION="Identity-aware VPN and proxy for remote access to anything, anywhere" + WORKDIR /app # Only curl and tzdata needed at runtime - no build tools! @@ -66,11 +46,10 @@ RUN apk add --no-cache curl tzdata # Copy pre-built node_modules from builder (already pruned to production only) # This includes the compiled native modules like better-sqlite3 COPY --from=builder /app/node_modules ./node_modules - COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/dist ./dist -COPY --from=builder /app/init ./dist/init +COPY --from=builder /app/server/migrations ./dist/init COPY --from=builder /app/package.json ./package.json COPY ./cli/wrapper.sh /usr/local/bin/pangctl diff --git a/package.json b/package.json index 25d94c4d..1d40b67f 100644 --- a/package.json +++ b/package.json @@ -24,13 +24,13 @@ "set:enterprise": "echo 'export const build = \"enterprise\" as \"saas\" | \"enterprise\" | \"oss\";' > server/build.ts && cp tsconfig.enterprise.json tsconfig.json", "set:sqlite": "echo 'export * from \"./sqlite\";\nexport const driver: \"pg\" | \"sqlite\" = \"sqlite\";' > server/db/index.ts", "set:pg": "echo 'export * from \"./pg\";\nexport const driver: \"pg\" | \"sqlite\" = \"pg\";' > server/db/index.ts", - "next:build": "next build", + "build:next": "next build", "build:sqlite": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrationsSqlite.ts -o dist/migrations.mjs", "build:pg": "mkdir -p dist && next build && node esbuild.mjs -e server/index.ts -o dist/server.mjs && node esbuild.mjs -e server/setup/migrationsPg.ts -o dist/migrations.mjs", "start": "ENVIRONMENT=prod node dist/migrations.mjs && ENVIRONMENT=prod NODE_ENV=development node --enable-source-maps dist/server.mjs", "email": "email dev --dir server/emails/templates --port 3005", "build:cli": "node esbuild.mjs -e cli/index.ts -o dist/cli.mjs", - "format": "prettier --write ." + "format:write": "prettier --write ." }, "dependencies": { "@asteasolutions/zod-to-openapi": "8.4.0",