lobe-chat
/
Dockerfile.database
245 строк · 7.5 Кб
1## Base image for all building stages
2FROM node:20-slim AS base
3
4ARG USE_CN_MIRROR
5
6ENV DEBIAN_FRONTEND="noninteractive"
7
8RUN \
9# If you want to build docker in China, build with --build-arg USE_CN_MIRROR=true
10if [ "${USE_CN_MIRROR:-false}" = "true" ]; then \
11sed -i "s/deb.debian.org/mirrors.ustc.edu.cn/g" "/etc/apt/sources.list.d/debian.sources"; \
12fi \
13# Add required package
14&& apt update \
15&& apt install ca-certificates proxychains-ng -qy \
16# Prepare required package to distroless
17&& mkdir -p /distroless/bin /distroless/etc /distroless/etc/ssl/certs /distroless/lib \
18# Copy proxychains to distroless
19&& cp /usr/lib/$(arch)-linux-gnu/libproxychains.so.4 /distroless/lib/libproxychains.so.4 \
20&& cp /usr/lib/$(arch)-linux-gnu/libdl.so.2 /distroless/lib/libdl.so.2 \
21&& cp /usr/bin/proxychains4 /distroless/bin/proxychains \
22&& cp /etc/proxychains4.conf /distroless/etc/proxychains4.conf \
23# Copy node to distroless
24&& cp /usr/lib/$(arch)-linux-gnu/libstdc++.so.6 /distroless/lib/libstdc++.so.6 \
25&& cp /usr/lib/$(arch)-linux-gnu/libgcc_s.so.1 /distroless/lib/libgcc_s.so.1 \
26&& cp /usr/local/bin/node /distroless/bin/node \
27# Copy CA certificates to distroless
28&& cp /etc/ssl/certs/ca-certificates.crt /distroless/etc/ssl/certs/ca-certificates.crt \
29# Cleanup temp files
30&& rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/*
31
32## Builder image, install all the dependencies and build the app
33FROM base AS builder
34
35ARG USE_CN_MIRROR
36ARG NEXT_PUBLIC_BASE_PATH
37ARG NEXT_PUBLIC_SERVICE_MODE
38ARG NEXT_PUBLIC_SENTRY_DSN
39ARG NEXT_PUBLIC_ANALYTICS_POSTHOG
40ARG NEXT_PUBLIC_POSTHOG_HOST
41ARG NEXT_PUBLIC_POSTHOG_KEY
42ARG NEXT_PUBLIC_ANALYTICS_UMAMI
43ARG NEXT_PUBLIC_UMAMI_SCRIPT_URL
44ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID
45
46ENV NEXT_PUBLIC_BASE_PATH="${NEXT_PUBLIC_BASE_PATH}"
47
48ENV NEXT_PUBLIC_SERVICE_MODE="${NEXT_PUBLIC_SERVICE_MODE:-server}" \
49APP_URL="http://app.com" \
50DATABASE_DRIVER="node" \
51DATABASE_URL="postgres://postgres:password@localhost:5432/postgres" \
52KEY_VAULTS_SECRET="use-for-build"
53
54# Sentry
55ENV NEXT_PUBLIC_SENTRY_DSN="${NEXT_PUBLIC_SENTRY_DSN}" \
56SENTRY_ORG="" \
57SENTRY_PROJECT=""
58
59# Posthog
60ENV NEXT_PUBLIC_ANALYTICS_POSTHOG="${NEXT_PUBLIC_ANALYTICS_POSTHOG}" \
61NEXT_PUBLIC_POSTHOG_HOST="${NEXT_PUBLIC_POSTHOG_HOST}" \
62NEXT_PUBLIC_POSTHOG_KEY="${NEXT_PUBLIC_POSTHOG_KEY}"
63
64# Umami
65ENV NEXT_PUBLIC_ANALYTICS_UMAMI="${NEXT_PUBLIC_ANALYTICS_UMAMI}" \
66NEXT_PUBLIC_UMAMI_SCRIPT_URL="${NEXT_PUBLIC_UMAMI_SCRIPT_URL}" \
67NEXT_PUBLIC_UMAMI_WEBSITE_ID="${NEXT_PUBLIC_UMAMI_WEBSITE_ID}"
68
69# Node
70ENV NODE_OPTIONS="--max-old-space-size=8192"
71
72WORKDIR /app
73
74COPY package.json ./
75COPY .npmrc ./
76
77RUN \
78# If you want to build docker in China, build with --build-arg USE_CN_MIRROR=true
79if [ "${USE_CN_MIRROR:-false}" = "true" ]; then \
80export SENTRYCLI_CDNURL="https://npmmirror.com/mirrors/sentry-cli"; \
81npm config set registry "https://registry.npmmirror.com/"; \
82echo 'canvas_binary_host_mirror=https://npmmirror.com/mirrors/canvas' >> .npmrc; \
83fi \
84# Set the registry for corepack
85&& export COREPACK_NPM_REGISTRY=$(npm config get registry | sed 's/\/$//') \
86# Enable corepack
87&& corepack enable \
88# Use pnpm for corepack
89&& corepack use pnpm \
90# Install the dependencies
91&& pnpm i \
92# Add sharp and db migration dependencies
93&& mkdir -p /deps \
94&& pnpm add sharp pg drizzle-orm --prefix /deps
95
96COPY . .
97
98# run build standalone for docker version
99RUN npm run build:docker
100
101## Application image, copy all the files for production
102FROM busybox:latest AS app
103
104COPY --from=base /distroless/ /
105
106COPY --from=builder /app/public /app/public
107
108# Automatically leverage output traces to reduce image size
109# https://nextjs.org/docs/advanced-features/output-file-tracing
110COPY --from=builder /app/.next/standalone /app/
111COPY --from=builder /app/.next/static /app/.next/static
112
113# copy dependencies
114COPY --from=builder /deps/node_modules/.pnpm /app/node_modules/.pnpm
115COPY --from=builder /deps/node_modules/pg /app/node_modules/pg
116COPY --from=builder /deps/node_modules/drizzle-orm /app/node_modules/drizzle-orm
117
118# Copy database migrations
119COPY --from=builder /app/src/database/server/migrations /app/migrations
120COPY --from=builder /app/scripts/migrateServerDB/docker.cjs /app/docker.cjs
121COPY --from=builder /app/scripts/migrateServerDB/errorHint.js /app/errorHint.js
122
123# Copy server launcher
124COPY --from=builder /app/scripts/serverLauncher/startServer.js /app/startServer.js
125
126RUN \
127# Add nextjs:nodejs to run the app
128addgroup -S -g 1001 nodejs \
129&& adduser -D -G nodejs -H -S -h /app -u 1001 nextjs \
130# Set permission for nextjs:nodejs
131&& chown -R nextjs:nodejs /app /etc/proxychains4.conf
132
133## Production image, copy all the files and run next
134FROM scratch
135
136# Copy all the files from app, set the correct permission for prerender cache
137COPY --from=app / /
138
139ENV NODE_ENV="production" \
140NODE_OPTIONS="--dns-result-order=ipv4first --use-openssl-ca" \
141NODE_EXTRA_CA_CERTS="" \
142NODE_TLS_REJECT_UNAUTHORIZED="" \
143SSL_CERT_DIR="/etc/ssl/certs/ca-certificates.crt"
144
145# set hostname to localhost
146ENV HOSTNAME="0.0.0.0" \
147PORT="3210"
148
149# General Variables
150ENV ACCESS_CODE="" \
151APP_URL="" \
152API_KEY_SELECT_MODE="" \
153DEFAULT_AGENT_CONFIG="" \
154SYSTEM_AGENT="" \
155FEATURE_FLAGS="" \
156PROXY_URL=""
157
158# Database
159ENV KEY_VAULTS_SECRET="" \
160DATABASE_DRIVER="node" \
161DATABASE_URL=""
162
163# Next Auth
164ENV NEXT_AUTH_SECRET="" \
165NEXT_AUTH_SSO_PROVIDERS="" \
166NEXTAUTH_URL=""
167
168# S3
169ENV NEXT_PUBLIC_S3_DOMAIN="" \
170S3_PUBLIC_DOMAIN="" \
171S3_ACCESS_KEY_ID="" \
172S3_BUCKET="" \
173S3_ENDPOINT="" \
174S3_SECRET_ACCESS_KEY=""
175
176# Model Variables
177ENV \
178# AI21
179AI21_API_KEY="" \
180# Ai360
181AI360_API_KEY="" \
182# Anthropic
183ANTHROPIC_API_KEY="" ANTHROPIC_PROXY_URL="" \
184# Amazon Bedrock
185AWS_ACCESS_KEY_ID="" AWS_SECRET_ACCESS_KEY="" AWS_REGION="" AWS_BEDROCK_MODEL_LIST="" \
186# Azure OpenAI
187AZURE_API_KEY="" AZURE_API_VERSION="" AZURE_ENDPOINT="" AZURE_MODEL_LIST="" \
188# Baichuan
189BAICHUAN_API_KEY="" \
190# DeepSeek
191DEEPSEEK_API_KEY="" \
192# Fireworks AI
193FIREWORKSAI_API_KEY="" FIREWORKSAI_MODEL_LIST="" \
194# GitHub
195GITHUB_TOKEN="" GITHUB_MODEL_LIST="" \
196197GOOGLE_API_KEY="" GOOGLE_PROXY_URL="" \
198# Groq
199GROQ_API_KEY="" GROQ_MODEL_LIST="" GROQ_PROXY_URL="" \
200# Hunyuan
201HUNYUAN_API_KEY="" HUNYUAN_MODEL_LIST="" \
202# Minimax
203MINIMAX_API_KEY="" \
204# Mistral
205MISTRAL_API_KEY="" \
206# Moonshot
207MOONSHOT_API_KEY="" MOONSHOT_PROXY_URL="" \
208# Novita
209NOVITA_API_KEY="" NOVITA_MODEL_LIST="" \
210# Ollama
211OLLAMA_MODEL_LIST="" OLLAMA_PROXY_URL="" \
212# OpenAI
213OPENAI_API_KEY="" OPENAI_MODEL_LIST="" OPENAI_PROXY_URL="" \
214# OpenRouter
215OPENROUTER_API_KEY="" OPENROUTER_MODEL_LIST="" \
216# Perplexity
217PERPLEXITY_API_KEY="" PERPLEXITY_PROXY_URL="" \
218# Qwen
219QWEN_API_KEY="" QWEN_MODEL_LIST="" \
220# SiliconCloud
221SILICONCLOUD_API_KEY="" SILICONCLOUD_MODEL_LIST="" SILICONCLOUD_PROXY_URL="" \
222# Spark
223SPARK_API_KEY="" \
224# Stepfun
225STEPFUN_API_KEY="" \
226# Taichu
227TAICHU_API_KEY="" \
228# TogetherAI
229TOGETHERAI_API_KEY="" TOGETHERAI_MODEL_LIST="" \
230# Upstage
231UPSTAGE_API_KEY="" \
232# Wenxin
233WENXIN_ACCESS_KEY="" WENXIN_SECRET_KEY="" \
234# 01.AI
235ZEROONE_API_KEY="" ZEROONE_MODEL_LIST="" \
236# Zhipu
237ZHIPU_API_KEY=""
238
239USER nextjs
240
241EXPOSE 3210/tcp
242
243ENTRYPOINT ["/bin/node"]
244
245CMD ["/app/startServer.js"]
246