|
|
|
FROM node:20-slim AS base |
|
|
|
ARG USE_CN_MIRROR |
|
|
|
ENV DEBIAN_FRONTEND="noninteractive" |
|
|
|
RUN \ |
|
|
|
if [ "${USE_CN_MIRROR:-false}" = "true" ]; then \ |
|
sed -i "s/deb.debian.org/mirrors.ustc.edu.cn/g" "/etc/apt/sources.list.d/debian.sources"; \ |
|
fi \ |
|
|
|
&& apt update \ |
|
&& apt install ca-certificates proxychains-ng -qy \ |
|
|
|
&& mkdir -p /distroless/bin /distroless/etc /distroless/etc/ssl/certs /distroless/lib \ |
|
|
|
&& cp /usr/lib/$(arch)-linux-gnu/libproxychains.so.4 /distroless/lib/libproxychains.so.4 \ |
|
&& cp /usr/lib/$(arch)-linux-gnu/libdl.so.2 /distroless/lib/libdl.so.2 \ |
|
&& cp /usr/bin/proxychains4 /distroless/bin/proxychains \ |
|
&& cp /etc/proxychains4.conf /distroless/etc/proxychains4.conf \ |
|
|
|
&& cp /usr/lib/$(arch)-linux-gnu/libstdc++.so.6 /distroless/lib/libstdc++.so.6 \ |
|
&& cp /usr/lib/$(arch)-linux-gnu/libgcc_s.so.1 /distroless/lib/libgcc_s.so.1 \ |
|
&& cp /usr/local/bin/node /distroless/bin/node \ |
|
|
|
&& cp /etc/ssl/certs/ca-certificates.crt /distroless/etc/ssl/certs/ca-certificates.crt \ |
|
|
|
&& rm -rf /tmp/* /var/lib/apt/lists/* /var/tmp/* |
|
|
|
|
|
FROM base AS builder |
|
|
|
ARG USE_CN_MIRROR |
|
ARG NEXT_PUBLIC_BASE_PATH |
|
ARG NEXT_PUBLIC_SENTRY_DSN |
|
ARG NEXT_PUBLIC_ANALYTICS_POSTHOG |
|
ARG NEXT_PUBLIC_POSTHOG_HOST |
|
ARG NEXT_PUBLIC_POSTHOG_KEY |
|
ARG NEXT_PUBLIC_ANALYTICS_UMAMI |
|
ARG NEXT_PUBLIC_UMAMI_SCRIPT_URL |
|
ARG NEXT_PUBLIC_UMAMI_WEBSITE_ID |
|
|
|
ENV NEXT_PUBLIC_BASE_PATH="${NEXT_PUBLIC_BASE_PATH}" |
|
|
|
|
|
ENV NEXT_PUBLIC_SENTRY_DSN="${NEXT_PUBLIC_SENTRY_DSN}" \ |
|
SENTRY_ORG="" \ |
|
SENTRY_PROJECT="" |
|
|
|
|
|
ENV NEXT_PUBLIC_ANALYTICS_POSTHOG="${NEXT_PUBLIC_ANALYTICS_POSTHOG}" \ |
|
NEXT_PUBLIC_POSTHOG_HOST="${NEXT_PUBLIC_POSTHOG_HOST}" \ |
|
NEXT_PUBLIC_POSTHOG_KEY="${NEXT_PUBLIC_POSTHOG_KEY}" |
|
|
|
|
|
ENV NEXT_PUBLIC_ANALYTICS_UMAMI="${NEXT_PUBLIC_ANALYTICS_UMAMI}" \ |
|
NEXT_PUBLIC_UMAMI_SCRIPT_URL="${NEXT_PUBLIC_UMAMI_SCRIPT_URL}" \ |
|
NEXT_PUBLIC_UMAMI_WEBSITE_ID="${NEXT_PUBLIC_UMAMI_WEBSITE_ID}" |
|
|
|
|
|
ENV NODE_OPTIONS="--max-old-space-size=8192" |
|
|
|
WORKDIR /app |
|
|
|
COPY package.json ./ |
|
COPY .npmrc ./ |
|
|
|
RUN \ |
|
|
|
if [ "${USE_CN_MIRROR:-false}" = "true" ]; then \ |
|
export SENTRYCLI_CDNURL="https://npmmirror.com/mirrors/sentry-cli"; \ |
|
npm config set registry "https://registry.npmmirror.com/"; \ |
|
echo 'canvas_binary_host_mirror=https://npmmirror.com/mirrors/canvas' >> .npmrc; \ |
|
fi \ |
|
|
|
&& export COREPACK_NPM_REGISTRY=$(npm config get registry | sed 's/\/$//') \ |
|
|
|
&& corepack enable \ |
|
|
|
&& corepack use pnpm \ |
|
|
|
&& pnpm i \ |
|
|
|
&& mkdir -p /deps \ |
|
&& pnpm add sharp --prefix /deps |
|
|
|
COPY . . |
|
|
|
|
|
RUN npm run build:docker |
|
|
|
|
|
FROM busybox:latest AS app |
|
|
|
COPY --from=base /distroless/ / |
|
|
|
COPY --from=builder /app/public /app/public |
|
|
|
|
|
|
|
COPY --from=builder /app/.next/standalone /app/ |
|
COPY --from=builder /app/.next/static /app/.next/static |
|
COPY --from=builder /deps/node_modules/.pnpm /app/node_modules/.pnpm |
|
|
|
|
|
COPY --from=builder /app/scripts/serverLauncher/startServer.js /app/startServer.js |
|
|
|
RUN \ |
|
|
|
addgroup -S -g 1001 nodejs \ |
|
&& adduser -D -G nodejs -H -S -h /app -u 1001 nextjs \ |
|
|
|
&& chown -R nextjs:nodejs /app /etc/proxychains4.conf |
|
|
|
|
|
FROM scratch |
|
|
|
|
|
COPY --from=app / / |
|
|
|
ENV NODE_ENV="production" \ |
|
NODE_OPTIONS="--dns-result-order=ipv4first --use-openssl-ca" \ |
|
NODE_EXTRA_CA_CERTS="" \ |
|
NODE_TLS_REJECT_UNAUTHORIZED="" \ |
|
SSL_CERT_DIR="/etc/ssl/certs/ca-certificates.crt" |
|
|
|
|
|
ENV HOSTNAME="0.0.0.0" \ |
|
PORT="7860" |
|
|
|
|
|
ENV ACCESS_CODE="" \ |
|
API_KEY_SELECT_MODE="" \ |
|
DEFAULT_AGENT_CONFIG="" \ |
|
SYSTEM_AGENT="" \ |
|
FEATURE_FLAGS="" \ |
|
PROXY_URL="" |
|
|
|
|
|
ENV \ |
|
|
|
AI21_API_KEY="" AI21_MODEL_LIST="" \ |
|
|
|
AI360_API_KEY="" AI360_MODEL_LIST="" \ |
|
|
|
ANTHROPIC_API_KEY="" ANTHROPIC_MODEL_LIST="" ANTHROPIC_PROXY_URL="" \ |
|
|
|
AWS_ACCESS_KEY_ID="" AWS_SECRET_ACCESS_KEY="" AWS_REGION="" AWS_BEDROCK_MODEL_LIST="" \ |
|
|
|
AZURE_API_KEY="" AZURE_API_VERSION="" AZURE_ENDPOINT="" AZURE_MODEL_LIST="" \ |
|
|
|
BAICHUAN_API_KEY="" BAICHUAN_MODEL_LIST="" \ |
|
|
|
CLOUDFLARE_API_KEY="" CLOUDFLARE_BASE_URL_OR_ACCOUNT_ID="" CLOUDFLARE_MODEL_LIST="" \ |
|
|
|
DEEPSEEK_API_KEY="" DEEPSEEK_MODEL_LIST="" \ |
|
|
|
FIREWORKSAI_API_KEY="" FIREWORKSAI_MODEL_LIST="" \ |
|
|
|
GITHUB_TOKEN="" GITHUB_MODEL_LIST="" \ |
|
|
|
GOOGLE_API_KEY="" GOOGLE_MODEL_LIST="" GOOGLE_PROXY_URL="" \ |
|
|
|
GROQ_API_KEY="" GROQ_MODEL_LIST="" GROQ_PROXY_URL="" \ |
|
|
|
HUGGINGFACE_API_KEY="" HUGGINGFACE_MODEL_LIST="" HUGGINGFACE_PROXY_URL="" \ |
|
|
|
HUNYUAN_API_KEY="" HUNYUAN_MODEL_LIST="" \ |
|
|
|
INTERNLM_API_KEY="" INTERNLM_MODEL_LIST="" \ |
|
|
|
MINIMAX_API_KEY="" MINIMAX_MODEL_LIST="" \ |
|
|
|
MISTRAL_API_KEY="" MISTRAL_MODEL_LIST="" \ |
|
|
|
MOONSHOT_API_KEY="" MOONSHOT_MODEL_LIST="" MOONSHOT_PROXY_URL="" \ |
|
|
|
NOVITA_API_KEY="" NOVITA_MODEL_LIST="" \ |
|
|
|
ENABLED_OLLAMA="" OLLAMA_MODEL_LIST="" OLLAMA_PROXY_URL="" \ |
|
|
|
OPENAI_API_KEY="" OPENAI_MODEL_LIST="" OPENAI_PROXY_URL="" \ |
|
|
|
OPENROUTER_API_KEY="" OPENROUTER_MODEL_LIST="" \ |
|
|
|
PERPLEXITY_API_KEY="" PERPLEXITY_MODEL_LIST="" PERPLEXITY_PROXY_URL="" \ |
|
|
|
QWEN_API_KEY="" QWEN_MODEL_LIST="" \ |
|
|
|
SENSENOVA_ACCESS_KEY_ID="" SENSENOVA_ACCESS_KEY_SECRET="" SENSENOVA_MODEL_LIST="" \ |
|
|
|
SILICONCLOUD_API_KEY="" SILICONCLOUD_MODEL_LIST="" SILICONCLOUD_PROXY_URL="" \ |
|
|
|
SPARK_API_KEY="" SPARK_MODEL_LIST="" \ |
|
|
|
STEPFUN_API_KEY="" STEPFUN_MODEL_LIST="" \ |
|
|
|
TAICHU_API_KEY="" TAICHU_MODEL_LIST="" \ |
|
|
|
TOGETHERAI_API_KEY="" TOGETHERAI_MODEL_LIST="" \ |
|
|
|
UPSTAGE_API_KEY="" UPSTAGE_MODEL_LIST="" \ |
|
|
|
WENXIN_ACCESS_KEY="" WENXIN_SECRET_KEY="" WENXIN_MODEL_LIST="" \ |
|
|
|
XAI_API_KEY="" XAI_MODEL_LIST="" \ |
|
|
|
ZEROONE_API_KEY="" ZEROONE_MODEL_LIST="" \ |
|
|
|
ZHIPU_API_KEY="" ZHIPU_MODEL_LIST="" |
|
|
|
USER nextjs |
|
|
|
EXPOSE 7860/tcp |
|
|
|
ENTRYPOINT ["/bin/node"] |
|
|
|
CMD ["/app/startServer.js"] |