-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathDockerfile
194 lines (136 loc) · 5.07 KB
/
Dockerfile
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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# Use Node.js 20
FROM node:20-alpine AS base
RUN apk add --no-cache openssl openssl-dev
# Update Corepack
RUN corepack enable && npm i -g corepack@latest
# 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
WORKDIR /app
# Install dependencies based on the preferred package manager
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
RUN \
if [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \
else echo "Lockfile not found." && exit 1; \
fi
# Rebuild the source code only when needed
FROM base AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
# Environment variables must be present at build time
# https://github.com/vercel/next.js/discussions/14030
ARG JWT_SECRET
ENV JWT_SECRET=${JWT_SECRET}
ARG DISCORD_CLIENT_ID
ENV DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID}
ARG DISCORD_CLIENT_SECRET
ENV DISCORD_CLIENT_SECRET=${DISCORD_CLIENT_SECRET}
ARG DISCORD_REDIRECT_URI
ENV DISCORD_REDIRECT_URI=${DISCORD_REDIRECT_URI}
ARG DISCORD_TOKEN_URL
ENV DISCORD_TOKEN_URL=${DISCORD_TOKEN_URL}
ARG DISCORD_AUTHORIZE_URL
ENV DISCORD_AUTHORIZE_URL=${DISCORD_AUTHORIZE_URL}
ARG REDIS_URL
ENV REDIS_URL=${REDIS_URL}
ARG REDIS_TOKEN
ENV REDIS_TOKEN=${REDIS_TOKEN}
ARG STRIPE_SECRET_KEY
ENV STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
ARG STRIPE_WEBHOOK_SECRET
ENV STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
ARG NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
ENV NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY}
ARG NEXT_PUBLIC_PREMIUM_MONTHLY_PRICE_ID
ENV NEXT_PUBLIC_PREMIUM_MONTHLY_PRICE_ID=${NEXT_PUBLIC_PREMIUM_MONTHLY_PRICE_ID}
ARG NEXT_PUBLIC_PREMIUM_YEARLY_PRICE_ID
ENV NEXT_PUBLIC_PREMIUM_YEARLY_PRICE_ID=${NEXT_PUBLIC_PREMIUM_YEARLY_PRICE_ID}
ARG MONGODB_URI
ENV MONGODB_URI=${MONGODB_URI}
ARG UPSTASH_API_KEY
ENV UPSTASH_API_KEY=${UPSTASH_API_KEY}
ARG NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL}
ARG NEXT_PUBLIC_PAGE_URL
ENV NEXT_PUBLIC_PAGE_URL=${NEXT_PUBLIC_PAGE_URL}
ARG WEBHOOK_URL
ENV WEBHOOK_URL=${WEBHOOK_URL}
# Next.js collects completely anonymous telemetry data about general usage.
# Learn more here: https://nextjs.org/telemetry
# Uncomment the following line in case you want to disable telemetry during the build.
ENV NEXT_TELEMETRY_DISABLED 1
RUN corepack enable pnpm
RUN pnpm dlx prisma generate
RUN \
if [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm build; \
else echo "Lockfile not found." && exit 1; \
fi
# Production image, copy all the files and run next
FROM base AS runner
WORKDIR /app
ENV NODE_ENV production
# Uncomment the following line in case you want to disable telemetry during runtime.
ENV NEXT_TELEMETRY_DISABLED 1
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public
# Set the correct permission for prerender cache
RUN mkdir .next
RUN chown nextjs:nodejs .next
# Automatically leverage output traces to reduce image size
# https://nextjs.org/docs/advanced-features/output-file-tracing
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
# Environment variables must be present at build time
# https://github.com/vercel/next.js/discussions/14030
ARG JWT_SECRET
ENV JWT_SECRET=${JWT_SECRET}
ARG DISCORD_CLIENT_ID
ENV DISCORD_CLIENT_ID=${DISCORD_CLIENT_ID}
ARG DISCORD_CLIENT_SECRET
ENV DISCORD_CLIENT_SECRET=${DISCORD_CLIENT_SECRET}
ARG DISCORD_REDIRECT_URI
ENV DISCORD_REDIRECT_URI=${DISCORD_REDIRECT_URI}
ARG DISCORD_TOKEN_URL
ENV DISCORD_TOKEN_URL=${DISCORD_TOKEN_URL}
ARG DISCORD_AUTHORIZE_URL
ENV DISCORD_AUTHORIZE_URL=${DISCORD_AUTHORIZE_URL}
ARG REDIS_URL
ENV REDIS_URL=${REDIS_URL}
ARG REDIS_TOKEN
ENV REDIS_TOKEN=${REDIS_TOKEN}
ARG STRIPE_SECRET_KEY
ENV STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
ARG STRIPE_WEBHOOK_SECRET
ENV STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
ARG NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
ENV NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=${NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY}
ARG NEXT_PUBLIC_PREMIUM_MONTHLY_PRICE_ID
ENV NEXT_PUBLIC_PREMIUM_MONTHLY_PRICE_ID=${NEXT_PUBLIC_PREMIUM_MONTHLY_PRICE_ID}
ARG NEXT_PUBLIC_PREMIUM_YEARLY_PRICE_ID
ENV NEXT_PUBLIC_PREMIUM_YEARLY_PRICE_ID=${NEXT_PUBLIC_PREMIUM_YEARLY_PRICE_ID}
ARG MONGODB_URI
ENV MONGODB_URI=${MONGODB_URI}
ARG UPSTASH_API_KEY
ENV UPSTASH_API_KEY=${UPSTASH_API_KEY}
ARG NEXT_PUBLIC_PUBLISHER_ID
ENV NEXT_PUBLIC_PUBLISHER_ID=${NEXT_PUBLIC_PUBLISHER_ID}
ARG API_URL
ENV API_URL=${API_URL}
ARG API_KEY
ENV API_KEY=${API_KEY}
ARG NEXT_PUBLIC_API_URL
ENV NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL}
ARG NEXT_PUBLIC_PAGE_URL
ENV NEXT_PUBLIC_PAGE_URL=${NEXT_PUBLIC_PAGE_URL}
ARG WEBHOOK_URL
ENV WEBHOOK_URL=${WEBHOOK_URL}
USER nextjs
# Expose the port the app runs on
EXPOSE 2123
ENV PORT 2123
# server.js is created by next build from the standalone output
# https://nextjs.org/docs/pages/api-reference/next-config-js/output
CMD HOSTNAME="0.0.0.0" node server.js