diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..fe40670 --- /dev/null +++ b/backend/Dockerfile @@ -0,0 +1,26 @@ +# Pre-requisite: run ./scripts/docker-prep.sh to pack @bytelyst/* tarballs +FROM node:22-alpine AS builder +WORKDIR /app + +COPY package.json package-lock.json ./ +COPY .tarballs/ ./.tarballs/ +RUN npm ci --ignore-scripts + +COPY tsconfig.json ./ +COPY src/ ./src/ +RUN npx tsc + +# Production stage +FROM node:22-alpine +WORKDIR /app +ENV NODE_ENV=production + +COPY package.json package-lock.json ./ +COPY .tarballs/ ./.tarballs/ +RUN npm ci --omit=dev --ignore-scripts + +COPY --from=builder /app/dist ./dist +COPY shared/ ./shared/ 2>/dev/null || true + +EXPOSE 4011 +CMD ["node", "dist/server.js"] diff --git a/web/Dockerfile b/web/Dockerfile new file mode 100644 index 0000000..2a37d57 --- /dev/null +++ b/web/Dockerfile @@ -0,0 +1,24 @@ +# Pre-requisite: run ./scripts/docker-prep.sh to pack @bytelyst/* tarballs +FROM node:22-alpine AS builder +WORKDIR /app + +COPY package.json package-lock.json ./ +COPY .tarballs/ ./.tarballs/ +RUN npm ci + +COPY . . + +ENV NEXT_TELEMETRY_DISABLED=1 +RUN npm run build + +FROM node:22-alpine +WORKDIR /app +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static +COPY --from=builder /app/public ./public 2>/dev/null || true + +EXPOSE 3000 +CMD ["node", "server.js"] diff --git a/web/next.config.ts b/web/next.config.ts index b95154b..3e1e73e 100644 --- a/web/next.config.ts +++ b/web/next.config.ts @@ -34,6 +34,7 @@ const securityHeaders = [ ]; const nextConfig: NextConfig = { + ...(process.env.VERCEL ? {} : { output: 'standalone' }), async headers() { return [ {