diff --git a/Dockerfile b/Dockerfile index 69bfb7e..1f91328 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,3 @@ -ARG SOURCE_COMMIT=unknown - # Stage 1: Vite SPA build FROM node:22-slim AS build WORKDIR /app @@ -13,8 +11,6 @@ RUN npm run build # indirme için gerekli. Sunucu darlığında DT_ENABLED=0 ile kapatılabilir; # uygulama ve diğer tüm veri kaynakları Chromium olmadan da çalışır. FROM node:22-slim -ARG SOURCE_COMMIT -ENV APP_RELEASE=${SOURCE_COMMIT} ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update \ && apt-get install -y --no-install-recommends nginx ca-certificates curl \ @@ -32,6 +28,11 @@ RUN npm init -y >/dev/null \ && npx playwright install --with-deps chromium \ && npm cache clean --force +# Commit değişince ağır Chromium katmanını yeniden kurmadan yalnız yayın +# katmanlarını yenile. Coolify bu argümanı build içine açıkça geçirir. +ARG SOURCE_COMMIT=unknown +ENV APP_RELEASE=${SOURCE_COMMIT} + # Frontend COPY --from=build /app/dist /usr/share/nginx/html COPY --from=build /app/nginx.conf /etc/nginx/sites-available/default @@ -40,6 +41,8 @@ COPY --from=build /app/nginx.conf /etc/nginx/sites-available/default COPY --from=build /app/server ./server # Backend, ortak doğrulama ve iş kurallarını src/services altından import eder. COPY --from=build /app/src ./src +# .js importlarının ES module olarak doğrudan yüklenmesi için package type bilgisi. +COPY --from=build /app/package.json ./package.json # Kalıcı veri (Coolify'da /app/server/data volume olarak bağlı) RUN mkdir -p /app/server/data diff --git a/nginx.conf b/nginx.conf index a4c84c7..d8b2207 100644 --- a/nginx.conf +++ b/nginx.conf @@ -46,6 +46,14 @@ server { root /usr/share/nginx/html; try_files $uri =404; expires 30d; + # Bu blok kendi add_header direktifini kullandığı için üst seviyedeki + # başlıkları nginx otomatik miras almaz; güvenlik başlıklarını tekrarla. + add_header X-Content-Type-Options "nosniff" always; + add_header Referrer-Policy "no-referrer" always; + add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always; + add_header X-Frame-Options "DENY" always; + add_header Content-Security-Policy "default-src 'self'; base-uri 'self'; object-src 'none'; frame-ancestors 'none'; script-src 'self' https://accounts.google.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com; font-src 'self' https://fonts.gstatic.com data:; img-src 'self' data: blob: https:; connect-src 'self' https:; worker-src 'self' blob:; frame-src 'self' https://accounts.google.com" always; + add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; add_header Cache-Control "public, no-transform"; }