Updated code so it doenst build on server

This commit is contained in:
2025-09-05 13:35:48 +02:00
parent 778dcd8eb4
commit 700fa40416
8 changed files with 22 additions and 10 deletions

View File

@@ -7,6 +7,8 @@ RUN bun i --frozen-lockfile
COPY . . COPY . .
ENV NEXT_TELEMETRY_DISABLED=1 ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_ENV=production ENV NODE_ENV=production
ENV DOCKER=1
RUN bun run build
RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs && chown -R nextjs:nodejs . RUN addgroup --system --gid 1001 nodejs && adduser --system --uid 1001 nextjs && chown -R nextjs:nodejs .
@@ -15,4 +17,4 @@ EXPOSE 3000
ENV PORT=3000 ENV PORT=3000
ENV HOSTNAME="0.0.0.0" ENV HOSTNAME="0.0.0.0"
CMD ["bun", "container:build"] CMD ["bun", "container"]

View File

@@ -23,6 +23,7 @@
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"drizzle-orm": "^0.44.4", "drizzle-orm": "^0.44.4",
"lucide-react": "^0.539.0", "lucide-react": "^0.539.0",
"motion": "^12.23.12",
"next": "15.4.6", "next": "15.4.6",
"next-themes": "^0.4.6", "next-themes": "^0.4.6",
"postgres": "^3.4.7", "postgres": "^3.4.7",
@@ -674,6 +675,8 @@
"for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="],
"framer-motion": ["framer-motion@12.23.12", "", { "dependencies": { "motion-dom": "^12.23.12", "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg=="],
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
"function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="],
@@ -860,6 +863,12 @@
"mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="], "mkdirp": ["mkdirp@3.0.1", "", { "bin": { "mkdirp": "dist/cjs/src/bin.js" } }, "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg=="],
"motion": ["motion@12.23.12", "", { "dependencies": { "framer-motion": "^12.23.12", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng=="],
"motion-dom": ["motion-dom@12.23.12", "", { "dependencies": { "motion-utils": "^12.23.6" } }, "sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw=="],
"motion-utils": ["motion-utils@12.23.6", "", {}, "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
"nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="],

View File

@@ -14,8 +14,7 @@
"db:push": "drizzle-kit push", "db:push": "drizzle-kit push",
"db:up": "docker compose -f dev-db.yml up -d", "db:up": "docker compose -f dev-db.yml up -d",
"db:down": "docker compose -f dev-db.yml down", "db:down": "docker compose -f dev-db.yml down",
"container": "bun db:migrate && bun start", "container": "bun db:migrate && bun start"
"container:build": "bun run build && bun db:migrate && bun start"
}, },
"dependencies": { "dependencies": {
"@hookform/resolvers": "^5.2.1", "@hookform/resolvers": "^5.2.1",
@@ -37,6 +36,7 @@
"date-fns": "^4.1.0", "date-fns": "^4.1.0",
"drizzle-orm": "^0.44.4", "drizzle-orm": "^0.44.4",
"lucide-react": "^0.539.0", "lucide-react": "^0.539.0",
"motion": "^12.23.12",
"next": "15.4.6", "next": "15.4.6",
"next-themes": "^0.4.6", "next-themes": "^0.4.6",
"postgres": "^3.4.7", "postgres": "^3.4.7",

View File

@@ -98,7 +98,7 @@ export default function UserProfile() {
const userUpdateSchema = z.object({ const userUpdateSchema = z.object({
name: z.string().min(1), name: z.string().min(1),
image: z.string().url().optional() image: z.url().optional()
}) })
function UserUpdateForm({ name, image, email }: z.infer<typeof userUpdateSchema> & { email: string }) { function UserUpdateForm({ name, image, email }: z.infer<typeof userUpdateSchema> & { email: string }) {

View File

@@ -3,7 +3,7 @@ import { z } from "zod"
export const env = createEnv({ export const env = createEnv({
client: { client: {
NEXT_PUBLIC_BASE_URL: z.string().url() NEXT_PUBLIC_BASE_URL: z.url().default("https://l.mairimashita.org")
}, },
runtimeEnv: { runtimeEnv: {
NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL NEXT_PUBLIC_BASE_URL: process.env.NEXT_PUBLIC_BASE_URL

View File

@@ -26,5 +26,6 @@ export const env = createEnv({
}) })
}, },
experimental__runtimeEnv: process.env, experimental__runtimeEnv: process.env,
emptyStringAsUndefined: true emptyStringAsUndefined: true,
skipValidation: process.env.DOCKER === "1"
}) })

View File

@@ -3,7 +3,7 @@ import { z } from "zod"
import { env } from "./env/server" import { env } from "./env/server"
const gravatarSchema = z.object({ const gravatarSchema = z.object({
avatar_url: z.string().url() avatar_url: z.url()
}) })
export async function getGravatar(email: string) { export async function getGravatar(email: string) {

View File

@@ -1,12 +1,12 @@
import { z } from "zod" import { z } from "zod"
export const urlFormSchema = z.object({ export const urlFormSchema = z.object({
url: z.string().url("Please enter a valid URL"), url: z.url("Please enter a valid URL"),
slug: z.string().max(10, "Slug must be 10 characters or less") slug: z.string().max(10, "Slug must be 10 characters or less")
}) })
export const advancedUrlSchema = z.object({ export const advancedUrlSchema = z.object({
url: z.string().url("Please enter a valid URL"), url: z.url("Please enter a valid URL"),
slug: z.string().max(10, "Slug must be 10 characters or less").transform(v => v.trim() === "" ? null : v).nullable(), slug: z.string().max(10, "Slug must be 10 characters or less").transform(v => v.trim() === "" ? null : v).nullable(),
title: z.string().max(100, "Title must be 100 characters or less").transform(v => v.trim() === "" ? null : v).nullable(), title: z.string().max(100, "Title must be 100 characters or less").transform(v => v.trim() === "" ? null : v).nullable(),
maxVisits: z.number().int().positive().nullable(), maxVisits: z.number().int().positive().nullable(),
@@ -16,7 +16,7 @@ export const advancedUrlSchema = z.object({
}) })
export const editUrlSchema = z.object({ export const editUrlSchema = z.object({
url: z.string().url("Please enter a valid URL"), url: z.url("Please enter a valid URL"),
slug: z.string().min(1).max(10, "Slug must be 10 characters or less"), slug: z.string().min(1).max(10, "Slug must be 10 characters or less"),
title: z.string().max(100, "Title must be 100 characters or less").transform(v => v.trim() === "" ? null : v).nullable(), title: z.string().max(100, "Title must be 100 characters or less").transform(v => v.trim() === "" ? null : v).nullable(),
maxVisits: z.number().int().positive().nullable(), maxVisits: z.number().int().positive().nullable(),