ARG NODE_VERSION="20.10" ARG ALPINE_VERSION="3.18" FROM node:${NODE_VERSION}-alpine${ALPINE_VERSION} AS node_base # ---- BUILDER BASE ---- FROM node_base AS builder_base RUN npm install pnpm -g RUN apk add --no-cache curl python3 make g++ # ---- RUNNER BASE ---- FROM node_base AS runner_base RUN apk add --no-cache curl openssl git RUN npm install pm2 -g # ---- BUILD DASHBOARD ---- FROM builder_base AS dashboard_builder WORKDIR /dashboard COPY ./pnpm-lock.yaml ./ RUN pnpm fetch COPY ./pnpm-workspace.yaml ./ COPY ./package*.json ./ COPY ./packages/shared ./packages/shared RUN pnpm install -r --prefer-offline COPY ./src ./src COPY ./tsconfig.json ./tsconfig.json COPY ./next.config.mjs ./next.config.mjs COPY ./public ./public COPY ./tests ./tests # Sentry COPY ./sentry.client.config.ts ./sentry.client.config.ts COPY ./sentry.edge.config.ts ./sentry.edge.config.ts COPY ./sentry.server.config.ts ./sentry.server.config.ts ARG SENTRY_AUTH_TOKEN ARG SENTRY_DISABLE_AUTO_UPLOAD ARG TIPI_VERSION ENV SENTRY_AUTH_TOKEN=${SENTRY_AUTH_TOKEN} ENV SENTRY_DISABLE_AUTO_UPLOAD=${SENTRY_DISABLE_AUTO_UPLOAD} ENV TIPI_VERSION=${TIPI_VERSION} ENV NEXT_SHARP_PATH=/app/node_modules/sharp RUN pnpm build # ---- BUILD WORKER ---- FROM builder_base AS worker_builder WORKDIR /worker ARG TARGETARCH ENV TARGETARCH=${TARGETARCH} ARG DOCKER_COMPOSE_VERSION="v2.23.3" RUN echo "Building for ${TARGETARCH}" RUN if [ "${TARGETARCH}" = "arm64" ]; then \ curl -L -o docker-binary "https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-linux-aarch64"; \ elif [ "${TARGETARCH}" = "amd64" ]; then \ curl -L -o docker-binary "https://github.com/docker/compose/releases/download/$DOCKER_COMPOSE_VERSION/docker-compose-linux-x86_64"; \ else \ echo "Unsupported architecture"; \ fi RUN chmod +x docker-binary COPY ./pnpm-lock.yaml ./ RUN pnpm fetch --ignore-scripts COPY ./pnpm-workspace.yaml ./ COPY ./packages ./packages RUN pnpm install -r --prefer-offline COPY ./packages/worker/build.js ./packages/worker/build.js COPY ./packages/worker/src ./packages/worker/src COPY ./packages/worker/package.json ./packages/worker/package.json COPY ./packages/worker/assets ./packages/worker/assets ARG SENTRY_AUTH_TOKEN ARG SENTRY_DISABLE_AUTO_UPLOAD ARG TIPI_VERSION ENV SENTRY_AUTH_TOKEN=${SENTRY_AUTH_TOKEN} ENV SENTRY_DISABLE_AUTO_UPLOAD=${SENTRY_DISABLE_AUTO_UPLOAD} ENV TIPI_VERSION=${TIPI_VERSION} RUN pnpm -r build --filter @runtipi/worker # ---- RUNNER ---- FROM runner_base AS app ENV NODE_ENV=production WORKDIR /worker COPY --from=worker_builder /worker/packages/worker/dist . COPY --from=worker_builder /worker/packages/worker/assets ./assets COPY --from=worker_builder /worker/docker-binary /usr/local/bin/docker-compose WORKDIR /dashboard COPY --from=dashboard_builder /dashboard/next.config.mjs ./ COPY --from=dashboard_builder /dashboard/public ./public COPY --from=dashboard_builder /dashboard/package.json ./package.json COPY --from=dashboard_builder /dashboard/.next/standalone ./ COPY --from=dashboard_builder /dashboard/.next/static ./.next/static WORKDIR / COPY ./start.prod.sh ./start.sh EXPOSE 3000 5000 CMD ["sh", "start.sh"]