Multi-page public site (Next.js), Node/Express backend with Postgres, and Vite admin/account app, restructured from a single-page layout into dedicated service, promotions, cases, about, FAQ, and blog pages for SEO. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013otXCiTZsxdZ4SJKZ9wUky
42 lines
1.5 KiB
Docker
42 lines
1.5 KiB
Docker
FROM node:20-alpine AS build
|
|
|
|
WORKDIR /app
|
|
COPY package.json package-lock.json* ./
|
|
RUN npm install
|
|
|
|
COPY . .
|
|
|
|
# NEXT_PUBLIC_* переменные встраиваются в клиентский бандл на этапе сборки.
|
|
ARG NEXT_PUBLIC_SITE_URL=https://top-sysops.ru
|
|
ARG NEXT_PUBLIC_CHAT_PROVIDER=none
|
|
ARG NEXT_PUBLIC_TOPTICKET_WIDGET_URL=
|
|
ARG NEXT_PUBLIC_TOPTICKET_WIDGET_KEY=
|
|
ARG NEXT_PUBLIC_CHATWOOT_BASE_URL=
|
|
ARG NEXT_PUBLIC_CHATWOOT_WEBSITE_TOKEN=
|
|
ENV NEXT_PUBLIC_SITE_URL=$NEXT_PUBLIC_SITE_URL \
|
|
NEXT_PUBLIC_CHAT_PROVIDER=$NEXT_PUBLIC_CHAT_PROVIDER \
|
|
NEXT_PUBLIC_TOPTICKET_WIDGET_URL=$NEXT_PUBLIC_TOPTICKET_WIDGET_URL \
|
|
NEXT_PUBLIC_TOPTICKET_WIDGET_KEY=$NEXT_PUBLIC_TOPTICKET_WIDGET_KEY \
|
|
NEXT_PUBLIC_CHATWOOT_BASE_URL=$NEXT_PUBLIC_CHATWOOT_BASE_URL \
|
|
NEXT_PUBLIC_CHATWOOT_WEBSITE_TOKEN=$NEXT_PUBLIC_CHATWOOT_WEBSITE_TOKEN
|
|
|
|
# BACKEND_INTERNAL_URL нужен и на этапе сборки (генерация sitemap исполняется
|
|
# как серверный код) - но реальные данные для sitemap читаются уже в рантайме,
|
|
# на сборку это не влияет, если бэкенд на этот момент недоступен.
|
|
ENV NEXT_TELEMETRY_DISABLED=1
|
|
|
|
RUN npm run build
|
|
|
|
FROM node:20-alpine AS run
|
|
|
|
WORKDIR /app
|
|
ENV NODE_ENV=production
|
|
ENV NEXT_TELEMETRY_DISABLED=1
|
|
|
|
COPY --from=build /app/public ./public
|
|
COPY --from=build /app/.next/standalone ./
|
|
COPY --from=build /app/.next/static ./.next/static
|
|
|
|
EXPOSE 3000
|
|
CMD ["node", "server.js"]
|