diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..9950738
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,25 @@
+FROM node:22-slim AS builder
+
+WORKDIR /src
+
+ENV OUTPUT=standalone
+RUN corepack enable
+
+COPY pnpm-lock.yaml package.json .
+RUN pnpm install --frozen-lockfile
+
+COPY . .
+RUN pnpm build
+
+FROM gcr.io/distroless/nodejs22-debian12
+
+ENV NODE_ENV=production
+WORKDIR /usr/src
+
+COPY --chown=nonroot:nonroot ./public ./public
+COPY --from=builder --chown=nonroot:nonroot /src/.next/standalone ./
+COPY --from=builder --chown=nonroot:nonroot /src/.next/static ./.next/static
+
+USER nonroot
+EXPOSE 3000
+CMD ["server.js"]
diff --git a/app/page.tsx b/app/page.tsx
index 9ebe5eb..bb59e8c 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -7,11 +7,21 @@ export default function Home() {
>
diff --git a/next.config.ts b/next.config.ts
index 760becb..5eea982 100644
--- a/next.config.ts
+++ b/next.config.ts
@@ -11,4 +11,8 @@ const nextConfig: NextConfig = {
}
};
+if (process.env.OUTPUT === "standalone") {
+ nextConfig.output = "standalone";
+}
+
export default nextConfig;
diff --git a/package.json b/package.json
index 83853cb..167edba 100644
--- a/package.json
+++ b/package.json
@@ -15,7 +15,7 @@
},
"devDependencies": {
"typescript": "^5",
- "@types/node": "^20",
+ "@types/node": "^22.0.0",
"@types/react": "^19",
"@types/react-dom": "^19",
"@tailwindcss/postcss": "^4",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 85e8013..ffe099c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -22,8 +22,8 @@ importers:
specifier: ^4
version: 4.1.4
'@types/node':
- specifier: ^20
- version: 20.17.31
+ specifier: ^22.0.0
+ version: 22.15.2
'@types/react':
specifier: ^19
version: 19.1.2
@@ -301,8 +301,8 @@ packages:
'@tailwindcss/postcss@4.1.4':
resolution: {integrity: sha512-bjV6sqycCEa+AQSt2Kr7wpGF1bOZJ5wsqnLEkqSbM/JEHxx/yhMH8wHmdkPyApF9xhHeMSwnnkDUUMMM/hYnXw==}
- '@types/node@20.17.31':
- resolution: {integrity: sha512-quODOCNXQAbNf1Q7V+fI8WyErOCh0D5Yd31vHnKu4GkSztGQ7rlltAaqXhHhLl33tlVyUXs2386MkANSwgDn6A==}
+ '@types/node@22.15.2':
+ resolution: {integrity: sha512-uKXqKN9beGoMdBfcaTY1ecwz6ctxuJAcUlwE55938g0ZJ8lRxwAZqRz2AJ4pzpt5dHdTPMB863UZ0ESiFUcP7A==}
'@types/react-dom@19.1.2':
resolution: {integrity: sha512-XGJkWF41Qq305SKWEILa1O8vzhb3aOo3ogBlSmiqNko/WmRb6QIaweuZCXjKygVDXpzXb5wyxKTSOsmkuqj+Qw==}
@@ -518,8 +518,8 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
- undici-types@6.19.8:
- resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
+ undici-types@6.21.0:
+ resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
snapshots:
@@ -706,9 +706,9 @@ snapshots:
postcss: 8.5.3
tailwindcss: 4.1.4
- '@types/node@20.17.31':
+ '@types/node@22.15.2':
dependencies:
- undici-types: 6.19.8
+ undici-types: 6.21.0
'@types/react-dom@19.1.2(@types/react@19.1.2)':
dependencies:
@@ -910,4 +910,4 @@ snapshots:
typescript@5.8.3: {}
- undici-types@6.19.8: {}
+ undici-types@6.21.0: {}
diff --git a/renovate.json b/renovate.json
new file mode 100644
index 0000000..5db72dd
--- /dev/null
+++ b/renovate.json
@@ -0,0 +1,6 @@
+{
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
+ "extends": [
+ "config:recommended"
+ ]
+}