2026-02-24 20:44:16 +00:00
|
|
|
|
ARG ENV="dev"
|
|
|
|
|
|
|
2026-10-17 18:51:10 +00:00
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
# 1. Derleme: Vite build (rolldown). Çıktı yalnızca dist/ olarak ikinci aşamaya geçer.
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
FROM node:24.22-alpine AS build
|
|
|
|
|
|
ARG ENV
|
2026-10-16 21:13:31 +00:00
|
|
|
|
# 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
|
2026-02-24 20:44:16 +00:00
|
|
|
|
|
|
|
|
|
|
ENV GENERATE_SOURCEMAP=false
|
|
|
|
|
|
ENV NODE_OPTIONS=--max-old-space-size=16384
|
|
|
|
|
|
WORKDIR /app
|
|
|
|
|
|
COPY package.json package-lock.json ./
|
2026-08-13 08:41:48 +00:00
|
|
|
|
# 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.
|
2026-02-24 20:44:16 +00:00
|
|
|
|
RUN npm i && \
|
2026-08-13 08:41:48 +00:00
|
|
|
|
npm install @rolldown/binding-linux-x64-musl @rollup/rollup-linux-x64-musl --save-dev && \
|
2026-02-24 20:44:16 +00:00
|
|
|
|
npm rebuild rollup
|
|
|
|
|
|
COPY . .
|
2026-08-13 11:34:43 +00:00
|
|
|
|
|
|
|
|
|
|
# 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
|
2026-10-17 18:51:10 +00:00
|
|
|
|
|
|
|
|
|
|
# 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
|