aboutsummaryrefslogtreecommitdiffstats
path: root/docker/Dockerfile
diff options
context:
space:
mode:
Diffstat (limited to 'docker/Dockerfile')
-rw-r--r--docker/Dockerfile92
1 files changed, 92 insertions, 0 deletions
diff --git a/docker/Dockerfile b/docker/Dockerfile
new file mode 100644
index 00000000..7e439a45
--- /dev/null
+++ b/docker/Dockerfile
@@ -0,0 +1,92 @@
+################# Base Builder ##############
+FROM node:21-alpine AS base
+
+WORKDIR /app
+ENV PNPM_HOME="/pnpm"
+ENV PATH="$PNPM_HOME:$PATH"
+RUN corepack enable
+
+# 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
+
+COPY . .
+ENV NEXT_TELEMETRY_DISABLED 1
+ENV PUPPETEER_SKIP_DOWNLOAD true
+RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --frozen-lockfile
+
+# Build the db migration script
+RUN cd packages/db && \
+ pnpm dlx @vercel/ncc build migrate.ts -o /db_migrations && \
+ cp -R drizzle /db_migrations
+
+
+################# The Web builder ##############
+
+# Rebuild the source code only when needed
+FROM base AS web_builder
+
+WORKDIR /app/packages/web
+
+RUN pnpm next experimental-compile
+
+################# The Web App ##############
+
+FROM node:21-alpine AS web
+WORKDIR /app
+
+ENV NODE_ENV production
+ENV NEXT_TELEMETRY_DISABLED 1
+
+COPY --from=web_builder --chown=node:node /app/packages/web/.next/standalone ./
+COPY --from=web_builder /app/packages/web/public ./packages/web/public
+COPY --from=web_builder /db_migrations /db_migrations
+
+# 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 root
+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 ["/bin/sh", "-c", "(cd /db_migrations && node index.js) && node server.js"]
+
+################# The workers builder ##############
+
+FROM base AS workers_builder
+
+RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm deploy --filter @hoarder/workers --prod /prod
+
+################# The workers ##############
+
+FROM node:21-alpine AS workers
+WORKDIR /app
+
+# Install chromium needed for puppeteer
+RUN apk add --no-cache chromium runuser
+ENV CHROME_PATH "/usr/bin/chromium-browser"
+ENV BROWSER_EXECUTABLE_PATH "/app/start-chrome.sh"
+ENV BROWSER_USER_DATA_DIR="/tmp/chrome"
+
+COPY --from=workers_builder /prod packages/workers
+
+RUN corepack enable
+
+ADD docker/start-chrome.sh .
+RUN chmod +x start-chrome.sh
+
+WORKDIR /app/packages/workers
+
+USER root
+
+CMD ["pnpm", "run", "start:prod"]