diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..52d9508 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,15 @@ +/node_modules +/.pnp +.pnp.js + +/docker + +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +.vercel +.gitignore +.github +.next +.prettierrc \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..498b571 --- /dev/null +++ b/Makefile @@ -0,0 +1,23 @@ +build-dev: + docker-compose -f docker/docker-compose.dev.yml build --no-cache + +run-dev: + docker-compose -f docker/docker-compose.dev.yml up + +stop-dev: + docker-compose -f docker/docker-compose.dev.yml down + +rm-dev: + docker-compose -f docker/docker-compose.dev.yml down -v + +build-prod: + docker-compose -f docker/docker-compose.prod.yml build --no-cache + +run-prod: + docker-compose -f docker/docker-compose.prod.yml up + +stop-prod: + docker-compose -f docker/docker-compose.prod.yml down + +rm-prod: + docker-compose -f docker/docker-compose.prod.yml down -v diff --git a/README.md b/README.md index a0506a0..15569cb 100644 --- a/README.md +++ b/README.md @@ -45,6 +45,10 @@ Start the server pnpm dev ``` +### Using Docker + +This project provides a development and production Dockerfiles for your needs and a docker-compose to deploy locally the project with the required configuration. The development Dockerfile creates a volume pointing to /node_modules so you can match the files between your machine and the container, while the production Dockerfile will simply compile the code. There's a Makefile to build, run, stop the containers and remove their volumes if needed, or you can execute the commands directly from the project's root. + ### Setup Xata You will need to sign up with Xata and set up a database for the build. After registering for an account, please proceed with the following steps. diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev new file mode 100644 index 0000000..30a1e94 --- /dev/null +++ b/docker/Dockerfile.dev @@ -0,0 +1,21 @@ +FROM node:18-slim AS base + +RUN npm i -g pnpm + +FROM base AS dependencies + +COPY package*.json pnpm-lock.yaml ./ + +RUN pnpm install + +FROM base AS builder + +WORKDIR /app + +COPY . . + +COPY --from=dependencies /node_modules ./node_modules + +FROM builder AS dev + +CMD ["pnpm", "dev"] \ No newline at end of file diff --git a/docker/Dockerfile.prod b/docker/Dockerfile.prod new file mode 100644 index 0000000..853f175 --- /dev/null +++ b/docker/Dockerfile.prod @@ -0,0 +1,40 @@ +FROM node:18-alpine AS base + +RUN npm i -g pnpm + +FROM base AS dependencies + +COPY package*.json pnpm-lock.yaml ./ + +RUN pnpm install + +FROM base AS builder + +WORKDIR /app + +COPY . . + +COPY --from=dependencies /node_modules ./node_modules + +RUN pnpm build + +FROM builder AS prod + +ENV NODE_ENV production + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +RUN mkdir .next +RUN chown nextjs:nodejs .next + +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +CMD ["pnpm", "start"] \ No newline at end of file diff --git a/docker/docker-compose.dev.yml b/docker/docker-compose.dev.yml new file mode 100644 index 0000000..11bf2bd --- /dev/null +++ b/docker/docker-compose.dev.yml @@ -0,0 +1,17 @@ +version: '3.8' + +services: + app: + container_name: hacktoberfest_projects_dev + build: + context: ../ + dockerfile: docker/Dockerfile.dev + target: dev + environment: + - NODE_ENV=development + ports: + - 3000:3000 + volumes: + - ../:/app + - /app/node_modules + - /app/.next diff --git a/docker/docker-compose.prod.yml b/docker/docker-compose.prod.yml new file mode 100644 index 0000000..a38e4bd --- /dev/null +++ b/docker/docker-compose.prod.yml @@ -0,0 +1,12 @@ +version: '3.8' + +services: + app: + container_name: hacktoberfest_projects_prod + build: + context: ../ + dockerfile: docker/Dockerfile.prod + target: prod + restart: on-failure + ports: + - 3000:3000 diff --git a/next.config.mjs b/next.config.mjs index 1cad4e1..e0eb930 100644 --- a/next.config.mjs +++ b/next.config.mjs @@ -3,6 +3,14 @@ await import('./env.mjs'); /** @type {import('next').NextConfig} */ const config = { reactStrictMode: true, + swcMinify: true, + webpack: (config, context) => { + config.watchOptions = { + poll: 1000, + aggregateTimeout: 300 + } + return config + }, async redirects() { return [ {