From 43aa68e082e1a3c2e10442e4fcfa46d65c1afac4 Mon Sep 17 00:00:00 2001
From: kinghat <madLyfe@gmail.com>
Date: Wed, 13 Apr 2022 17:31:38 -0500
Subject: [PATCH] cleaned up multi-service compose (#75)

* cleaned up multi-service compose
* refactor docker setup
* add all ENVs and remove unneeded variables
* remove comments, unneeded vars and syntax
---
 client/Dockerfile   | 42 +++++++++++++++++-------------------------
 docker-compose.yml  | 41 ++++++++++++++++-------------------------
 server/Dockerfile   | 33 +++++++++++++++++++--------------
 server/package.json |  1 +
 4 files changed, 53 insertions(+), 64 deletions(-)

diff --git a/client/Dockerfile b/client/Dockerfile
index 7eeed6b..bccabe3 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 deebbbd..27bcc14 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 9cf0b96..a5c9bc5 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 6097935..015b633 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",