diff --git a/Docker/dev.Dockerfile b/Docker/dev.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..ed8cb5a5cb999f9a9c64181ffcbf6f3183f5d8d8 --- /dev/null +++ b/Docker/dev.Dockerfile @@ -0,0 +1,37 @@ +FROM node:18-alpine + +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* .npmrc* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + +COPY src ./src +COPY public ./public +COPY styles ./styles +COPY next.config.js . +COPY tailwind.config.js . +COPY postcss.config.js . +COPY theme.config.js . +COPY jsconfig.json . +# COPY tsconfig.json . +# COPY middleware.ts . + +# Next.js collects completely anonymous telemetry data about general usage. Learn more here: https://nextjs.org/telemetry +# Uncomment the following line to disable telemetry at run time +# ENV NEXT_TELEMETRY_DISABLED 1 + +# Note: Don't expose ports here, Compose will handle that for us + +# Start Next.js in development mode based on the preferred package manager +CMD \ + if [ -f yarn.lock ]; then yarn dev; \ + elif [ -f package-lock.json ]; then npm run dev; \ + elif [ -f pnpm-lock.yaml ]; then pnpm dev; \ + else yarn dev; \ + fi \ No newline at end of file diff --git a/Docker/prod.Dockerfile b/Docker/prod.Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..5577dad07a9ea5d86be978ec8bfc76d324dac349 --- /dev/null +++ b/Docker/prod.Dockerfile @@ -0,0 +1,99 @@ +FROM node:18-alpine AS base + +# Step 1. Rebuild the source code only when needed +FROM base AS builder + +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +# Omit --production flag for TypeScript devDependencies +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i; \ + # Allow install without lockfile, so example works even without Node.js installed locally + else echo "Warning: Lockfile not found. It is recommended to commit lockfiles to version control." && yarn install; \ + fi + +COPY src ./src +COPY public ./public +COPY styles ./styles +COPY next.config.js . +COPY tailwind.config.js . +COPY postcss.config.js . +COPY theme.config.js . +COPY jsconfig.json . +# COPY tsconfig.json . +# COPY middleware.ts . + +# Environment variables must be present at build time +# https://github.com/vercel/next.js/discussions/14030 +ARG NEXTAUTH_URL +ENV NEXTAUTH_URL=${NEXTAUTH_URL} +ARG NEXTAUTH_PUBLIC_API_URL +ENV NEXTAUTH_PUBLIC_API_URL=${NEXTAUTH_PUBLIC_API_URL} +ARG NEXT_PUBLIC_API_GEOLOCATION_KEY +ENV NEXT_PUBLIC_API_GEOLOCATION_KEY=${NEXT_PUBLIC_API_GEOLOCATION_KEY} +ARG NODE_ENV=${NODE_ENV:-production} +ENV NODE_ENV=${NODE_ENV} +ARG NEXTAUTH_SECRET +ENV NEXTAUTH_SECRET=${NEXTAUTH_SECRET} + + + + +# Next.js collects completely anonymous telemetry data about general usage. Learn more here: https://nextjs.org/telemetry +# Uncomment the following line to disable telemetry at build time +# ENV NEXT_TELEMETRY_DISABLED 1 + +# Build Next.js based on the preferred package manager +RUN \ + if [ -f yarn.lock ]; then yarn build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then pnpm build; \ + else yarn build; \ + fi + +# Note: It is not necessary to add an intermediate step that does a full copy of `node_modules` here + +# Step 2. Production image, copy all the files and run next +FROM base AS runner + +WORKDIR /app + +# Don't run production as root +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +USER nextjs + +COPY --from=builder /app/public ./public +COPY --from=builder /app/src ./src +COPY --from=builder /app/styles ./styles + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +# Environment variables must be redefined at run time +ARG NEXTAUTH_URL +ENV NEXTAUTH_URL=${NEXTAUTH_URL} +ARG NEXT_PUBLIC_API_URL +ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} +ARG NEXT_PUBLIC_API_GEOLOCATION_KEY +ENV NEXT_PUBLIC_API_GEOLOCATION_KEY=${NEXT_PUBLIC_API_GEOLOCATION_KEY} +ARG NODE_ENV=${NODE_ENV:-production} +ENV NODE_ENV=${NODE_ENV} +ARG NEXTAUTH_SECRET +ENV NEXTAUTH_SECRET=${NEXTAUTH_SECRET} +ARG NODE_TLS_REJECT_UNAUTHORIZED +ENV NODE_TLS_REJECT_UNAUTHORIZED=${NODE_TLS_REJECT_UNAUTHORIZED:-0} + + +# Uncomment the following line to disable telemetry at run time +# ENV NEXT_TELEMETRY_DISABLED 1 + +# Note: Don't expose ports here, Compose will handle that for us + +CMD ["node", "server.js"] \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000000000000000000000000000000000000..b79f358581b3d76b4f4e3cca3b35010ecd300dfa --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,30 @@ +services: + next-app-dev: + container_name: absensi-frontend-dev + image: absensi-frontend-dev + build: + context: . + dockerfile: ./Docker/dev.Dockerfile + + # Set environment variables directly in the docker-compose file + environment: + NEXTAUTH_URL: ${NEXTAUTH_URL} + NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} + + # Set envrionment variables based on the .env file + env_file: + - .env + volumes: + - ./src:/app/src + - ./public:/app/public + - ./styles:/app/styles + + restart: always + ports: + - 3000:3000 + networks: + - absensi-network + +networks: + absensi-network: + driver: bridge diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000000000000000000000000000000000000..a13f7589cff4da4cdd066ffe9df5240944e2ef40 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,25 @@ +services: + next-app: + container_name: absensi-frontend-prod + image: absensi-frontend-prod + build: + context: . + dockerfile: ./Docker/prod.Dockerfile + environment: + NEXTAUTH_URL: ${NEXTAUTH_URL} + NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} + NEXT_PUBLIC_API_GEOLOCATION_KEY: ${NEXT_PUBLIC_API_GEOLOCATION_KEY} + NODE_ENV: ${NODE_ENV} + NEXTAUTH_SECRET: ${NEXTAUTH_SECRET} + NODE_TLS_REJECT_UNAUTHORIZED: ${NODE_TLS_REJECT_UNAUTHORIZED:-0} + env_file: + - .env.production + restart: always + ports: + - 3002:3000 + networks: + - absensi-network-prod + +networks: + absensi-network-prod: + driver: bridge diff --git a/next.config.js b/next.config.js index 680badd990349abf75f798e908f68d8f2a65835a..b866ef000ee2682cb81ded2ad967f6c160822bbb 100644 --- a/next.config.js +++ b/next.config.js @@ -1,12 +1,17 @@ +const webpack = require('webpack'); const withPWA = require('next-pwa')({ dest: 'public', register: true, skipWaiting: true, - disable: process.env.NODE_ENV === 'development', // opsional + // disable: process.env.NODE_ENV === 'development', // opsional }); /** @type {import('next').NextConfig} */ const nextConfig = { + output: "standalone", + eslint: { + ignoreDuringBuilds: true, + }, // konfigurasi lain jika ada async rewrites() { return [ @@ -16,6 +21,12 @@ const nextConfig = { }, ]; }, + webpack: (config) => { + config.plugins.push( + new webpack.ContextReplacementPlugin(/face-api/) + ); + return config; + }, }; module.exports = withPWA(nextConfig); diff --git a/src/app/absensi/page.js b/src/app/absensi/page.js deleted file mode 100644 index 4b1a2d571a9a664809f2f4183749404efd22d27a..0000000000000000000000000000000000000000 --- a/src/app/absensi/page.js +++ /dev/null @@ -1,24 +0,0 @@ -"use client"; - -import { useState } from "react"; - -export default function AbsensiPage() { - const [waktu] = useState(new Date().toLocaleString()); - - const handleAbsen = () => { - alert("Absen berhasil pada " + waktu); - }; - - return ( -
-

Halaman Absensi

-

Waktu: {waktu}

- -
- ); -} diff --git a/src/app/login/page.js b/src/app/login/page.js index bd1af80aebafc2a9d3559cb4efe8ace4e1a0bd5d..af319ce12c334287148627a1f8106a385a94c540 100644 --- a/src/app/login/page.js +++ b/src/app/login/page.js @@ -1,12 +1,11 @@ 'use client' -import React, { useEffect, useState } from 'react'; +import React, { Suspense, useEffect, useState } from 'react'; import { Button, Form, Input } from 'antd'; import { signIn } from 'next-auth/react'; -import { useRouter, useSearchParams } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; - -export default function Login() { +function LoginForm() { const router = useRouter(); const searchParams = useSearchParams(); const error = searchParams.get('error'); @@ -66,3 +65,11 @@ export default function Login() { ); } + +export default function Login() { + return ( + + + + ); +} \ No newline at end of file