sozsoft-platform/ui/Sozsoft.Platform.Ui.Dockerfile
2026-10-17 21:51:10 +03:00

65 lines
3.2 KiB
Docker
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

ARG ENV="dev"
# ---------------------------------------------------------------------------
# 1. Derleme: Vite build (rolldown). Çıktı yalnızca dist/ olarak ikinci aşamaya geçer.
# ---------------------------------------------------------------------------
FROM node:24.22-alpine AS build
ARG ENV
# Node/npm sürümü package.json `volta` alanıyla aynıdır.
RUN apk add --no-cache ca-certificates && update-ca-certificates && \
npm install -g npm@12.2.0
ENV GENERATE_SOURCEMAP=false
ENV NODE_OPTIONS=--max-old-space-size=16384
WORKDIR /app
COPY package.json package-lock.json ./
# Vite 8 rolldown ile bundle ediyor; workbox-build hâlâ rollup çekiyor.
# Alpine (musl) native binding'leri lockfile'da optional olduğu için ikisi de elle kuruluyor.
RUN npm i && \
npm install @rolldown/binding-linux-x64-musl @rollup/rollup-linux-x64-musl --save-dev && \
npm rebuild rollup
COPY . .
# DevExtreme lisansı yalnızca build sırasında gerekli: prebuild:production adımı
# devextreme-license CLI'ı çalıştırıp src/devextreme-license.ts dosyasını üretiyor.
# CLI anahtarı sırasıyla DevExpress_License env'inden veya
# $HOME/.config/DevExpress/DevExpress_License.txt dosyasından okur; anahtar
# bulunamazsa TRIAL key üretir ve uygulamada değerlendirme sürümü uyarısı çıkar.
#
# GÜVENLİK: Gizli olan LCX ana anahtarıdır; imaj katmanında kalmaması için
# dosya yazma, build ve silme tek RUN içinde yapılıyor. ENV olarak da
# tanımlanmıyor, aksi halde `docker inspect` ile okunabilir hale gelirdi.
# Bundle'a gömülen LCP anahtarı ise türetilmiş, istemci tarafı anahtardır.
ARG DevExpress_License
RUN if [ -n "$DevExpress_License" ]; then \
mkdir -p "$HOME/.config/DevExpress" && \
printf '%s\n' "$DevExpress_License" > "$HOME/.config/DevExpress/DevExpress_License.txt"; \
else \
echo "UYARI: DevExpress_License boş. DevExtreme TRIAL anahtarıyla derleniyor."; \
fi; \
npm run build:production -- --mode $ENV; \
status=$?; \
rm -rf "$HOME/.config/DevExpress"; \
exit $status
# sitemap.xml / robots.txt proxy hedefi: .env.{ENV} dosyasındaki VITE_API_URL tek kaynaktır,
# nginx yapılandırmasına ikinci bir adres yazılmaz.
RUN grep -E '^VITE_API_URL=' ".env.$ENV" | cut -d= -f2- | tr -d "'\"\r\n" > /tmp/api-url && \
test -s /tmp/api-url
# ---------------------------------------------------------------------------
# 2. Çalışma: nginx statik sunucu. `vite preview` üretim sunucusu değildir (Vite bunu
# yalnızca yerel önizleme için tanımlar ve her dosyaya no-cache basar); başlıklar, SPA
# fallback'i ve eski sürüm chunk arşivi nginx/default.conf + nginx/40-archive-assets.sh ile
# burada verilir.
# ---------------------------------------------------------------------------
FROM nginx:1.27-alpine
COPY --from=build /app/dist /usr/share/nginx/html
COPY --from=build /tmp/api-url /tmp/api-url
COPY nginx/default.conf /tmp/default.conf.template
COPY --chmod=755 nginx/40-archive-assets.sh /docker-entrypoint.d/40-archive-assets.sh
RUN API_URL="$(cat /tmp/api-url)" envsubst '${API_URL}' < /tmp/default.conf.template > /etc/nginx/conf.d/default.conf && \
rm -f /tmp/default.conf.template /tmp/api-url && \
nginx -t
EXPOSE 80