İçeriğe geç
~/huseyin
en
Tüm yazılar
/1 dk okuma#nextjs#docker#nginx

Next.js'i Docker ile kendi sunucunda yayınlamak

Standalone çıktı, çok aşamalı bir Dockerfile ve önünde Nginx. Bu sitenin de yayında olduğu kurulum.

Next.js'i bir platforma bağlı kalmadan, kendi VPS'inde çalıştırmak düşündüğünden kolay. Bu site de aşağıdaki kurulumla yayında.

Standalone çıktıyı aç

next.config.ts içinde tek satır, derlemenin sadece çalışması için gereken dosyaları ayrı bir klasöre koymasını sağlar:

ts
const nextConfig = { output: "standalone" };

Böylece imajın içine bütün node_modules klasörü girmez. İmaj boyutu ciddi şekilde küçülür.

Çok aşamalı Dockerfile

Bağımlılıkları kur, derle, sonra sadece çıktıyı küçük bir imaja kopyala:

dockerfile
FROM node:22-alpine AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:22-alpine
WORKDIR /app
ENV NODE_ENV=production HOSTNAME=0.0.0.0 PORT=3000
COPY --from=build /app/.next/standalone ./
COPY --from=build /app/.next/static ./.next/static
COPY --from=build /app/public ./public
USER node
CMD ["node", "server.js"]

Önüne Nginx koy

Konteyner sadece 127.0.0.1:3000 üzerinde dinler. Dış dünyayla Nginx konuşur:

nginx
server {
  server_name example.com;
  location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
  }
}

Sertifika için sudo certbot --nginx -d example.com yeterli. Certbot yenilemeyi de kendisi kurar.

Güncelleme

Yeni sürümü yayına almak iki komut:

bash
docker compose build
docker compose up -d

İstersen bunu bir GitHub Actions iş akışına bağlayıp her main gönderiminde otomatik çalıştırabilirsin.

Aklında bir proje mi var?

Bir fikir, yarım kalmış bir iş ya da taşınması gereken bir sunucu. Ne olursa yaz, aynı gün dönerim.

İletişime geç