From 1e26f7ec620406d043fdea45b240d60e3482ed2a Mon Sep 17 00:00:00 2001
From: Fedor Katurov <gotham48@gmail.com>
Date: Mon, 24 Mar 2025 17:42:00 +0700
Subject: [PATCH] add standalone build

---
 .dockerignore                       |  2 ++
 .forgejo/workflows/build.yml        |  2 +-
 docker/nextjs-standalone/Dockerfile | 49 +++++++++++++++++++++++++++++
 next.config.js                      |  1 +
 yarn.lock                           |  6 ++--
 5 files changed, 56 insertions(+), 4 deletions(-)
 create mode 100644 docker/nextjs-standalone/Dockerfile

diff --git a/.dockerignore b/.dockerignore
index 1168d108..0ec9738d 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -2,6 +2,8 @@
 node_modules
 out
 dist
+.husky
+.next
 .idea
 .history
 .vscode
diff --git a/.forgejo/workflows/build.yml b/.forgejo/workflows/build.yml
index 25d067df..7a3f0446 100644
--- a/.forgejo/workflows/build.yml
+++ b/.forgejo/workflows/build.yml
@@ -2,7 +2,7 @@ name: Build & Publish
 
 on:
   push:
-    branches: [master]
+    branches: [standalone]
 
 jobs:
   push_to_registry:
diff --git a/docker/nextjs-standalone/Dockerfile b/docker/nextjs-standalone/Dockerfile
new file mode 100644
index 00000000..58083a3e
--- /dev/null
+++ b/docker/nextjs-standalone/Dockerfile
@@ -0,0 +1,49 @@
+
+# Base ───────────────────────────────────────────────────────────────────────
+FROM node:14-alpine as base
+
+WORKDIR /opt/app
+
+ENV PATH /opt/app/node_modules/.bin:$PATH
+
+# Build ──────────────────────────────────────────────────────────────────────
+FROM base as builder
+
+ARG NEXT_PUBLIC_API_HOST
+ARG NEXT_PUBLIC_REMOTE_CURRENT
+ARG NEXT_PUBLIC_PUBLIC_HOST
+ARG NEXT_PUBLIC_BOT_USERNAME
+
+ENV NEXT_PUBLIC_API_HOST $NEXT_PUBLIC_API_HOST
+ENV NEXT_PUBLIC_REMOTE_CURRENT $NEXT_PUBLIC_REMOTE_CURRENT
+ENV NEXT_PUBLIC_PUBLIC_HOST $NEXT_PUBLIC_PUBLIC_HOST
+ENV NEXT_PUBLIC_BOT_USERNAME $NEXT_PUBLIC_BOT_USERNAME
+
+# ENV NEXT_PUBLIC_API_HOST https://vault48.org/api/
+# ENV NEXT_PUBLIC_REMOTE_CURRENT https://vault48.org/static/
+# ENV NEXT_PUBLIC_PUBLIC_HOST https://vault48.org/
+# ENV NEXT_PUBLIC_BOT_USERNAME vault48bot
+
+COPY package.json .
+COPY yarn.lock .
+
+RUN true  \
+  && yarn install --frozen-lockfile\
+  && yarn global add pkg \
+  && true
+
+COPY . /opt/app
+
+# pkg packs nodejs with given script, so we don't need it in next section
+RUN true  \
+  && yarn next build \
+  && true
+
+FROM node:14-alpine as runner
+
+COPY --from=builder /opt/app/public ./public
+COPY --from=builder /opt/app/.next/standalone .
+COPY --from=builder /opt/app/.next/static ./.next/static
+
+EXPOSE 3000
+ENTRYPOINT ["node", "server.js"]
\ No newline at end of file
diff --git a/next.config.js b/next.config.js
index 64e56747..c95c6aa1 100644
--- a/next.config.js
+++ b/next.config.js
@@ -9,6 +9,7 @@ const withTM = require('next-transpile-modules')([
 
 module.exports = withBundleAnalyzer(
   withTM({
+    output: 'standalone',
     /** rewrite old-style node paths */
     async rewrites() {
       return [
diff --git a/yarn.lock b/yarn.lock
index 30bb1ef1..464da01d 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -803,9 +803,9 @@ callsites@^3.0.0:
   integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
 
 caniuse-lite@^1.0.30001332:
-  version "1.0.30001564"
-  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001564.tgz"
-  integrity sha512-DqAOf+rhof+6GVx1y+xzbFPeOumfQnhYzVnZD6LAXijR77yPtm9mfOcqOnT3mpnJiZVT+kwLAFnRlZcIz+c6bg==
+  version "1.0.30001707"
+  resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001707.tgz"
+  integrity sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==
 
 chalk@^2.0.0:
   version "2.4.2"