# syntax = docker/dockerfile:1.4

##
## base
##
FROM node:20-slim AS base

ENV optDir /opt

WORKDIR ${optDir}

# install pnpm
RUN apt-get update && apt-get install -y ca-certificates wget --no-install-recommends \
  && wget -qO- https://get.pnpm.io/install.sh | ENV="$HOME/.shrc" SHELL="$(which sh)" sh -
ENV PNPM_HOME "/root/.local/share/pnpm"
ENV PATH "$PNPM_HOME:$PATH"

# install turbo
RUN pnpm add turbo --global



##
## partialrepos
##
FROM base AS partialrepos

ENV optDir /opt

WORKDIR ${optDir}

COPY . .
RUN turbo prune @growi/slackbot-proxy --docker



##
## deps-resolver
##
FROM base AS deps-resolver

ENV optDir /opt

WORKDIR ${optDir}

# copy files
COPY --from=partialrepos ${optDir}/out/json/ .
COPY --from=partialrepos ${optDir}/out/pnpm-lock.yaml ./pnpm-lock.yaml

RUN pnpm add node-gyp --global
RUN pnpm install --no-frozen-lockfile

# make artifacts
RUN tar -cf node_modules.tar \
  node_modules \
  apps/*/node_modules \
  packages/*/node_modules



##
## deps-resolver-prod
##
FROM deps-resolver AS deps-resolver-prod

RUN pnpm install --no-frozen-lockfile --prod
# make artifacts
RUN tar -zcf node_modules.tar.gz \
  node_modules \
  apps/*/node_modules \
  packages/*/node_modules



##
## builder
##
FROM base AS builder

ENV optDir /opt

WORKDIR ${optDir}

RUN yarn global add turbo

# copy files
COPY --from=partialrepos ${optDir}/out/full/ .
COPY --from=partialrepos ${optDir}/out/pnpm-lock.yaml ./pnpm-lock.yaml
COPY ["tsconfig.base.json", "./"]

# copy dependent packages
COPY --from=deps-resolver \
  ${optDir}/node_modules.tar ${optDir}/

# extract node_modules.tar
RUN tar -xf node_modules.tar
RUN rm node_modules.tar

# build
RUN turbo run build

# make artifacts
RUN tar -zcf packages.tar.gz \
  package.json \
  apps/*/package.json \
  apps/*/dist \
  apps/*/.env \
  packages/*/package.json \
  packages/*/dist



##
## release
##
FROM node:20-slim
LABEL maintainer Yuki Takei <yuki@weseek.co.jp>

ENV NODE_ENV production

ENV optDir /opt
ENV appDir ${optDir}/slackbot-proxy

# copy artifacts
COPY --from=deps-resolver-prod --chown=node:node \
  ${optDir}/node_modules.tar.gz ${appDir}/
COPY --from=builder --chown=node:node \
  ${optDir}/packages.tar.gz ${appDir}/

# extract artifacts as 'node' user
USER node
WORKDIR ${appDir}
RUN tar -xf node_modules.tar.gz \
  && tar -xf packages.tar.gz \
  && rm node_modules.tar.gz packages.tar.gz

WORKDIR ${appDir}/apps/slackbot-proxy

EXPOSE 8080

CMD ["node", "-r", "dotenv-flow/config", "dist/index.js"]
