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