From 369cd75bfefed2649ac50e804fbcb7583a91081e Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sat, 8 Aug 2026 15:51:24 +0200 Subject: [PATCH] static export + nginx, drop runtime server ~800MiB -> ~5MiB RAM --- .dockerignore | 5 +++++ Dockerfile | 31 +++++++------------------------ next.config.ts | 5 ++++- nginx.conf | 21 +++++++++++++++++++++ 4 files changed, 37 insertions(+), 25 deletions(-) create mode 100644 .dockerignore create mode 100644 nginx.conf diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..bce49f6 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +node_modules +.next +out +.git +.superpowers diff --git a/Dockerfile b/Dockerfile index 57bf94e..196a231 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,31 +1,14 @@ -FROM oven/bun:1 AS base +FROM oven/bun:1 AS build WORKDIR /app -FROM base AS install -RUN mkdir -p /temp/dev -COPY package.json bun.lock /temp/dev/ -RUN cd /temp/dev && bun install --frozen-lockfile +COPY package.json bun.lock ./ +RUN bun install --frozen-lockfile -RUN mkdir -p /temp/prod -COPY package.json bun.lock /temp/prod/ -RUN cd /temp/prod && bun install --frozen-lockfile --production - -FROM base AS prerelease -COPY --from=install /temp/dev/node_modules node_modules COPY . . - ENV NODE_ENV=production RUN bun run build -FROM base AS release - -COPY --from=prerelease /app/public ./public -COPY --from=prerelease /app/.next ./.next -COPY --from=prerelease /app/node_modules ./node_modules -COPY --from=prerelease /app/package.json ./package.json - -USER bun -EXPOSE 3000/tcp - -CMD ["bun", "run", "start"] - +FROM nginx:alpine +COPY --from=build /app/out /usr/share/nginx/html +COPY nginx.conf /etc/nginx/conf.d/default.conf +EXPOSE 80 diff --git a/next.config.ts b/next.config.ts index e9ffa30..00c940e 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,10 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + output: "export", + images: { + unoptimized: true, + }, }; export default nextConfig; diff --git a/nginx.conf b/nginx.conf new file mode 100644 index 0000000..6a32073 --- /dev/null +++ b/nginx.conf @@ -0,0 +1,21 @@ +server { + listen 80; + root /usr/share/nginx/html; + index index.html; + + location / { + try_files $uri $uri.html $uri/ =404; + } + + location /_next/static/ { + expires 1y; + add_header Cache-Control "public, immutable"; + } + + location /images/ { + expires 30d; + add_header Cache-Control "public"; + } + + error_page 404 /404.html; +}