diff --git a/Dockerfile b/Dockerfile index e69de29..b09c8b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM node:22-slim AS base +ENV PNPM_HOME="/pnpm" +ENV PATH="$PNPM_HOME:$PATH" +RUN corepack enable + +# Stage 1: Install dependencies +FROM base AS deps +WORKDIR /app +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +# Stage 2: Build the application +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . +RUN pnpm run build + +# Stage 3: Production server +FROM base AS runner +WORKDIR /app +ENV NODE_ENV=production +COPY --from=builder /app/public ./public +COPY --from=builder /app/.next/standalone ./ +COPY --from=builder /app/.next/static ./.next/static + +EXPOSE 3000 +CMD ["pnpm", "run", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml index b607af8..5fe9957 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,16 +1,45 @@ ---- services: - postgres: - image: postgres:12.18 - restart: always + web: + build: . ports: - - "5432:5432" + - "3000:3000" environment: - - POSTGRES_USER=postgres - - POSTGRES_PASSWORD=admin - - POSTGRES_DB=website + - NODE_ENV=production + depends_on: + - db + networks: + - my_network + + db: + image: postgres:latest + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + # ports: + # this exposes the database to the public ... do we want that?? + # - "5432:5432" volumes: - - ial-website-data:/var/lib/postgresql/data + - postgres_data:/var/lib/postgresql/data + networks: + - my_network + + cron: + image: alpine/curl + command: > + sh -c " + echo '*/10 * * * * curl -X POST http://web:3000/db/clear' > /etc/crontabs/root && \ + crond -f -l 2 + " + depends_on: + - web + networks: + - my_network volumes: - ial-website-data: + postgres_data: + +networks: + my_network: + name: my_network + driver: bridge diff --git a/next.config.ts b/next.config.ts index 573edc3..c75280f 100644 --- a/next.config.ts +++ b/next.config.ts @@ -3,6 +3,8 @@ import {withPayload} from "@payloadcms/next/withPayload"; const nextConfig: NextConfig = { /* config options here */ + output: "standalone", + compress: false, }; export default withPayload(nextConfig); diff --git a/package.json b/package.json index b6fb38e..4aca15f 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,9 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev --turbo", + "dev": "next dev", "build": "next build", - "start": "next start", + "start": "node .next/standalone/server.js", "lint": "next lint", "payload": "cross-env PAYLOAD_CONFIG_PATH=./payload.config.ts payload" }, @@ -16,6 +16,7 @@ "@payloadcms/next": "^3.35.1", "@payloadcms/richtext-lexical": "^3.35.1", "cross-env": "^7.0.3", + "dayjs": "^1.11.13", "graphql": "^16.10.0", "motion": "^12.7.4", "next": "15.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f80ff94..73d3b2c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,9 @@ importers: cross-env: specifier: ^7.0.3 version: 7.0.3 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 graphql: specifier: ^16.10.0 version: 16.10.0 @@ -1309,6 +1312,9 @@ packages: dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -3710,6 +3716,8 @@ snapshots: dateformat@4.6.3: {} + dayjs@1.11.13: {} + debug@4.4.0: dependencies: ms: 2.1.3 diff --git a/src/app/(frontend)/components/home/News.tsx b/src/app/(frontend)/components/home/News.tsx index e8cca76..2678b2d 100644 --- a/src/app/(frontend)/components/home/News.tsx +++ b/src/app/(frontend)/components/home/News.tsx @@ -1,7 +1,7 @@ -import Button from "@/components/ui/button"; -import prisma from "@/lib/prisma"; +import Button from "~/components/ui/Button"; + import { ChevronRightIcon } from "@heroicons/react/20/solid"; -import dayjs from "dayjs"; +// import dayjs from "dayjs"; export default function News() { return ( @@ -26,20 +26,20 @@ export default function News() { } async function Gallery() { - const news = await prisma.news.findMany({ - where: { - draft: false, - }, - orderBy: { - date: "desc", - }, - take: 3, - }); + // const news = await prisma.news.findMany({ + // where: { + // draft: false, + // }, + // orderBy: { + // date: "desc", + // }, + // take: 3, + // }); // TODO: parse markdown return (
- {news.map((item) => ( + {/* {news.map((item) => (
{dayjs(item.date).format("DD/MM/YYYY")} @@ -53,7 +53,7 @@ async function Gallery() { Read more
- ))} + ))} */}
); } diff --git a/tsconfig.json b/tsconfig.json index d4a7c10..5c46c38 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -20,6 +20,7 @@ ], "paths": { "@/*": ["./src/*"], + "~/*": ["./src/app/(frontend)/*"], "@payload-config": ["./payload.config.ts"] } },