aboutsummaryrefslogtreecommitdiffstats
path: root/Dockerfile
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-02-13 19:44:20 +0000
committerMohamedBassem <me@mbassem.com>2024-02-13 19:44:20 +0000
commitff4482613ae70688e433d7c42784f0e24a569965 (patch)
treed76d6f7275c8d34837ca1d2d2086f73e012bc02a /Dockerfile
parentc883bee10ed40792c2ae35bdd9745649cfffa2f2 (diff)
downloadkarakeep-ff4482613ae70688e433d7c42784f0e24a569965.tar.zst
WIP: Add services to Dockerfile
Diffstat (limited to 'Dockerfile')
-rw-r--r--Dockerfile117
1 files changed, 117 insertions, 0 deletions
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 00000000..668c6a46
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,117 @@
+FROM node:21-alpine AS base
+
+# Install dependencies only when needed
+FROM base 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 \
+ make \
+ g++ \
+ py3-pip \
+ linux-headers
+WORKDIR /app
+
+# Install dependencies based on the preferred package manager
+COPY package.json yarn.lock .yarnrc.yml ./
+COPY packages/web/package.json ./packages/web/package.json
+COPY packages/db/package.json ./packages/db/package.json
+COPY packages/shared/package.json ./packages/shared/package.json
+COPY packages/workers/package.json ./packages/workers/package.json
+COPY packages/browser-extension/package.json ./packages/browser-extension/package.json
+RUN corepack enable && \
+ yarn install --immutable && \
+ cd packages/web && \
+ yarn install --immutable
+
+################# The Web App ##############
+
+# Rebuild the source code only when needed
+FROM base AS web_builder
+WORKDIR /app
+COPY --from=deps /app/node_modules ./node_modules
+COPY packages packages
+COPY package.json yarn.lock .yarnrc.yml .
+
+ENV NEXT_TELEMETRY_DISABLED 1
+
+RUN cd packages/db && \
+ yarn prisma generate
+
+RUN corepack enable && \
+ cd packages/web/ && \
+ yarn run build
+
+FROM base AS web
+WORKDIR /app
+
+ENV NODE_ENV production
+ENV NEXT_TELEMETRY_DISABLED 1
+
+# RUN addgroup --system --gid 1001 nodejs
+# RUN adduser --system --uid 1001 nextjs
+
+COPY --from=web_builder --chown=node:node /app/packages/web/.next/standalone ./
+COPY --from=web_builder /app/packages/web/public ./packages/web/public
+
+# Set the correct permission for prerender cache
+RUN mkdir -p ./package/web/.next
+RUN chown node:node ./packages/web/.next
+
+# Automatically leverage output traces to reduce image size
+# https://nextjs.org/docs/advanced-features/output-file-tracing
+COPY --from=web_builder --chown=node:node /app/packages/web/.next/static ./packages/web/.next/static
+
+WORKDIR /app/packages/web
+
+USER node
+
+EXPOSE 3000
+
+ENV PORT 3000
+# set hostname to localhost
+ENV HOSTNAME "0.0.0.0"
+
+# server.js is created by next build from the standalone output
+# https://nextjs.org/docs/pages/api-reference/next-config-js/output
+CMD ["node", "server.js"]
+
+
+################# Db migrations ##############
+
+FROM base AS db
+WORKDIR /app
+
+COPY --from=deps /app/node_modules ./node_modules
+COPY packages packages
+COPY package.json yarn.lock .yarnrc.yml .
+
+
+RUN cd packages/db && \
+ yarn prisma generate
+
+WORKDIR /app/packages/db
+USER node
+
+CMD ["yarn", "prisma", "migrate", "deploy"]
+# CMD ["ls", "-la", "/data"]
+
+
+################# The workers ##############
+
+FROM base AS workers
+WORKDIR /app
+
+# Install chromium needed for puppeteer
+RUN apk add chromium
+env PUPPETEER_EXECUTABLE_PATH "/usr/bin/chromium-browser"
+
+COPY --from=deps /app/node_modules ./node_modules
+COPY packages packages
+COPY package.json yarn.lock .yarnrc.yml .
+
+RUN cd packages/db && \
+ yarn prisma generate
+
+WORKDIR /app/packages/workers
+USER node
+
+CMD ["yarn", "run", "start:prod"]