blob: 592c4cfd71e5c6cb6e5d484928f9cd198288767f (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
|
################# 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/apps/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/apps/web/.next/standalone ./
COPY --from=web_builder /app/apps/web/public ./apps/web/public
COPY --from=web_builder /db_migrations /db_migrations
# Set the correct permission for prerender cache
RUN mkdir -p ./apps/web/.next
RUN chown node:node ./apps/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/apps/web/.next/static ./apps/web/.next/static
WORKDIR /app/apps/web
USER root
EXPOSE 3000
ENV PORT 3000
# set hostname to localhost
ENV HOSTNAME "0.0.0.0"
ARG SERVER_VERSION=nightly
ENV SERVER_VERSION=${SERVER_VERSION}
# 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_workers,target=/pnpm/store pnpm deploy --node-linker=isolated --filter @hoarder/workers --prod /prod
################# The workers ##############
FROM node:21-alpine AS workers
WORKDIR /app
RUN apk add --no-cache monolith
COPY --from=workers_builder /prod apps/workers
RUN corepack enable
WORKDIR /app/apps/workers
USER root
ARG SERVER_VERSION=nightly
ENV SERVER_VERSION=${SERVER_VERSION}
CMD ["pnpm", "run", "start:prod"]
################# The cli builder ##############
FROM base AS cli_builder
WORKDIR /app/apps/cli
RUN pnpm run build
################# The cli ##############
FROM node:21-alpine AS cli
WORKDIR /app
COPY --from=cli_builder /app/apps/cli/dist/index.mjs apps/cli/index.mjs
WORKDIR /app/apps/cli
ARG SERVER_VERSION=nightly
ENV SERVER_VERSION=${SERVER_VERSION}
ENTRYPOINT ["node", "index.mjs"]
################# All-in-one ##############
# Start from the web container as its the one with the most configuration
FROM web AS aio
WORKDIR /app
ARG S6_OVERLAY_VERSION=3.2.0.0
ARG TARGETARCH
# Install s6-overlay
ADD https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-noarch.tar.xz /tmp
RUN tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz
RUN case ${TARGETARCH} in \
"amd64") S6_ARCH=x86_64 ;; \
"arm64") S6_ARCH=aarch64 ;; \
esac \
&& echo https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz -O /tmp/s6-overlay-${S6_ARCH}.tar.xz \
&& wget https://github.com/just-containers/s6-overlay/releases/download/v${S6_OVERLAY_VERSION}/s6-overlay-${S6_ARCH}.tar.xz -O /tmp/s6-overlay-${S6_ARCH}.tar.xz \
&& tar -C / -Jxpf /tmp/s6-overlay-${S6_ARCH}.tar.xz \
&& rm -f /tmp/s6-overlay-${S6_ARCH}.tar.xz
# Install runtime deps
RUN apk add --no-cache monolith
# Copy workers code
COPY --from=workers_builder /prod /app/apps/workers
RUN corepack enable
COPY --chmod=755 ./docker/root/etc/s6-overlay /etc/s6-overlay
ENTRYPOINT ["/init"]
|