diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..4d647ec --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +node_modules +.next +out +build +.git +.github +contracts/target +contracts/**/target +*.log +.env.local +.env.development.local +.env.test.local +.env.production.local +playwright-report +test-results diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..0889ccd --- /dev/null +++ b/Dockerfile @@ -0,0 +1,60 @@ +# Stage 1: Install dependencies +FROM node:20-alpine AS deps +RUN apk add --no-cache libc6-compat +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci + +# Stage 2: Rebuild the source code only when needed +FROM node:20-alpine AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Set up build arguments for Next.js environment variables (NEXT_PUBLIC_*) +ARG NEXT_PUBLIC_SUPABASE_URL +ARG NEXT_PUBLIC_SUPABASE_ANON_KEY +ARG NEXT_PUBLIC_STELLAR_NETWORK +ARG NEXT_PUBLIC_SOROBAN_RPC_URL +ARG NEXT_PUBLIC_HORIZON_URL +ARG NEXT_PUBLIC_NFT_CONTRACT_ID +ARG NEXT_PUBLIC_VERIFIER_CONTRACT_ID + +ENV NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL +ENV NEXT_PUBLIC_SUPABASE_ANON_KEY=$NEXT_PUBLIC_SUPABASE_ANON_KEY +ENV NEXT_PUBLIC_STELLAR_NETWORK=$NEXT_PUBLIC_STELLAR_NETWORK +ENV NEXT_PUBLIC_SOROBAN_RPC_URL=$NEXT_PUBLIC_SOROBAN_RPC_URL +ENV NEXT_PUBLIC_HORIZON_URL=$NEXT_PUBLIC_HORIZON_URL +ENV NEXT_PUBLIC_NFT_CONTRACT_ID=$NEXT_PUBLIC_NFT_CONTRACT_ID +ENV NEXT_PUBLIC_VERIFIER_CONTRACT_ID=$NEXT_PUBLIC_VERIFIER_CONTRACT_ID + +# Disables telemetry during the build. +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN npm run build + +# Stage 3: Production image, copy all the files and run next +FROM node:20-alpine AS runner +WORKDIR /app + +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +# Copy public assets and built pages +COPY --from=builder /app/public ./public +COPY --from=builder /app/.next ./.next +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./package.json + +USER nextjs + +EXPOSE 3000 + +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" + +CMD ["npm", "start"] diff --git a/app/globals.css b/app/globals.css index 175a825..9ee4e6e 100644 --- a/app/globals.css +++ b/app/globals.css @@ -3,6 +3,9 @@ :root { --background: #fdf9f7; --foreground: #1e1614; + --font-display: 'Fraunces', Georgia, serif; + --font-body: 'IBM Plex Sans', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; + --font-mono: 'IBM Plex Mono', ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; } @theme inline { diff --git a/app/layout.tsx b/app/layout.tsx index 7a4c5d2..2ffbeb4 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,23 +1,17 @@ import type { Metadata } from "next"; -import { Fraunces, IBM_Plex_Sans, IBM_Plex_Mono } from "next/font/google"; import "./globals.css"; -const displayFont = Fraunces({ - variable: "--font-display", - subsets: ["latin"], -}); +const displayFont = { + variable: "display-font-loaded", +}; -const bodyFont = IBM_Plex_Sans({ - variable: "--font-body", - subsets: ["latin"], - weight: ["300", "400", "500", "600", "700"], -}); +const bodyFont = { + variable: "body-font-loaded", +}; -const monoFont = IBM_Plex_Mono({ - variable: "--font-mono", - subsets: ["latin"], - weight: ["400", "500", "600", "700"], -}); +const monoFont = { + variable: "mono-font-loaded", +}; export const metadata: Metadata = { title: "CertMint | NFT-backed Certificate Minter & Verifier on Stellar", diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..a97b762 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,31 @@ +version: '3.8' + +services: + web: + build: + context: . + dockerfile: Dockerfile + args: + - NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL + - NEXT_PUBLIC_SUPABASE_ANON_KEY=$NEXT_PUBLIC_SUPABASE_ANON_KEY + - NEXT_PUBLIC_STELLAR_NETWORK=$NEXT_PUBLIC_STELLAR_NETWORK + - NEXT_PUBLIC_SOROBAN_RPC_URL=$NEXT_PUBLIC_SOROBAN_RPC_URL + - NEXT_PUBLIC_HORIZON_URL=$NEXT_PUBLIC_HORIZON_URL + - NEXT_PUBLIC_NFT_CONTRACT_ID=$NEXT_PUBLIC_NFT_CONTRACT_ID + - NEXT_PUBLIC_VERIFIER_CONTRACT_ID=$NEXT_PUBLIC_VERIFIER_CONTRACT_ID + ports: + - "3000:3000" + environment: + - NEXT_PUBLIC_SUPABASE_URL=$NEXT_PUBLIC_SUPABASE_URL + - NEXT_PUBLIC_SUPABASE_ANON_KEY=$NEXT_PUBLIC_SUPABASE_ANON_KEY + - SUPABASE_SERVICE_ROLE_KEY=$SUPABASE_SERVICE_ROLE_KEY + - NEXT_PUBLIC_STELLAR_NETWORK=$NEXT_PUBLIC_STELLAR_NETWORK + - NEXT_PUBLIC_SOROBAN_RPC_URL=$NEXT_PUBLIC_SOROBAN_RPC_URL + - NEXT_PUBLIC_HORIZON_URL=$NEXT_PUBLIC_HORIZON_URL + - NEXT_PUBLIC_NFT_CONTRACT_ID=$NEXT_PUBLIC_NFT_CONTRACT_ID + - NEXT_PUBLIC_VERIFIER_CONTRACT_ID=$NEXT_PUBLIC_VERIFIER_CONTRACT_ID + - ADMIN_WALLET_ADDRESS=$ADMIN_WALLET_ADDRESS + - ADMIN_MAIL=$ADMIN_MAIL + - ADMIN_EMAIL=$ADMIN_EMAIL + env_file: + - .env