diff --git a/client/Dockerfile b/client/Dockerfile index 7eeed6b7..bccabe37 100644 --- a/client/Dockerfile +++ b/client/Dockerfile @@ -1,58 +1,50 @@ -# Install dependencies only when needed -FROM node:16-alpine AS deps +FROM node:17-alpine AS deps + # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat + WORKDIR /app + COPY package.json yarn.lock ./ + RUN yarn install --frozen-lockfile -# If using npm with a `package-lock.json` comment out above and use below instead -# COPY package.json package-lock.json ./ -# RUN npm ci +FROM node:17-alpine AS builder -# Rebuild the source code only when needed -FROM node:16-alpine AS builder WORKDIR /app + COPY --from=deps /app/node_modules ./node_modules COPY . . -# Next.js collects completely anonymous telemetry data about general usage. -# Learn more here: https://nextjs.org/telemetry -# Uncomment the following line in case you want to disable telemetry during the build. -ENV NEXT_TELEMETRY_DISABLED 1 -ARG API_URL http://localhost:3000 -ARG SECRET_KEY secret +ARG API_URL + +ENV NEXT_TELEMETRY_DISABLED=1 +ENV API_URL=${API_URL:-http://localhost:3000} RUN yarn build -# If using npm comment out above and use below instead -# RUN npm run build +FROM node:17-alpine AS runner -# Production image, copy all the files and run next -FROM node:16-alpine AS runner WORKDIR /app -ENV NODE_ENV production +ARG NODE_ENV -ENV NEXT_TELEMETRY_DISABLED 1 +ENV NEXT_TELEMETRY_DISABLED=1 +ENV NODE_ENV=${NODE_ENV:-production} RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs -# You only need to copy next.config.js if you are NOT using the default configuration COPY --from=builder /app/next.config.mjs ./ COPY --from=builder /app/public ./public COPY --from=builder /app/package.json ./package.json - -# 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 USER nextjs +ENV PORT=3001 + EXPOSE 3001 -ENV PORT 3001 - CMD ["node", "server.js"] diff --git a/docker-compose.yml b/docker-compose.yml index deebbbd3..27bcc14c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,43 +1,34 @@ -version: '3.8' services: server: - build: + build: context: ./server args: - SECRET_KEY: secret + - NODE_ENV=production + container_name: server restart: unless-stopped user: 1000:1000 environment: - - JWT_SECRET=change_me! # use `openssl rand -hex 32` to generate a strong secret - - SECRET_KEY=secret + - PORT + - JWT_SECRET=jwt_secret # change_me! # use `openssl rand -hex 32` to generate a strong secret + - SECRET_KEY=secret # change me! + - MEMORY_DB + - REGISTRATION_PASSWORD + - WELCOME_CONTENT + - WELCOME_TITLE + - ENABLE_ADMIN + - DRIFT_HOME ports: - "3000:3000" - networks: - - general - container_name: server client: build: context: ./client - network: host args: - API_URL: http://localhost:3000 - SECRET_KEY: secret + - API_URL=http://server:3000 + container_name: client restart: unless-stopped user: 1000:1000 environment: - - API_URL=http://localhost:3000 - - SECRET_KEY=secret + - API_URL=http://server:3000 + - SECRET_KEY=secret # change me! ports: - "3001:3001" - expose: - - 3001 - networks: - - general - # depends_on: - # server: - # condition: service_healthy - container_name: client - -networks: - general: - driver: bridge diff --git a/server/Dockerfile b/server/Dockerfile index 9cf0b962..a5c9bc5c 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -1,30 +1,35 @@ -# Install dependencies only when needed -FROM node:16-alpine AS deps +FROM node:17-alpine AS deps + # Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. RUN apk add --no-cache libc6-compat git + WORKDIR /app + COPY package.json yarn.lock tsconfig.json tslint.json ./ + RUN yarn install --frozen-lockfile -# If using npm with a `package-lock.json` comment out above and use below instead -# COPY package.json package-lock.json ./ -# RUN npm ci +FROM node:17-alpine AS builder -# Rebuild the source code only when needed -FROM node:16-alpine AS builder WORKDIR /app + COPY --from=deps /app/node_modules ./node_modules COPY . . -ENV NODE_ENV production + +ARG NODE_ENV + +ENV NODE_ENV=${NODE_ENV:-production} + RUN apk add --no-cache git -ARG SECRET_KEY secret +RUN yarn build:docker -RUN yarn build +FROM node:17-alpine AS runner -FROM node:16-alpine AS runner WORKDIR /app -ENV NODE_ENV production +ARG NODE_ENV + +ENV NODE_ENV=${NODE_ENV:-production} RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 drift @@ -34,8 +39,8 @@ COPY --from=builder /app/node_modules ./node_modules USER drift +ENV PORT=3000 + EXPOSE 3000 -ENV PORT 3000 - CMD ["node", "dist/index.js"] diff --git a/server/package.json b/server/package.json index 60979352..015b633b 100644 --- a/server/package.json +++ b/server/package.json @@ -7,6 +7,7 @@ "start": "cross-env NODE_ENV=production node dist/index.js", "dev": "cross-env NODE_ENV=development nodemon index.ts", "build": "mkdir -p ./dist && cp .env ./dist/.env && tsc -p ./tsconfig.json && tsc-alias -p ./tsconfig.json && yarn post-build", + "build:docker": "mkdir -p ./dist && cp .env.test ./dist/.env && tsc -p ./tsconfig.json && tsc-alias -p ./tsconfig.json && yarn post-build", "post-build": "cp package.json ./dist/package.json && cp yarn.lock ./dist/yarn.lock && cd dist && env NODE_ENV=production yarn install", "migrate:up": "ts-node migrate up", "migrate:down": "ts-node migrate down",