Modern web geliştirmede Next.js, Remix, Nuxt ve Node.js tabanlı tam yığın (full-stack) mimariler endüstri standardı haline geldi. Sunucu taraflı oluşturma (SSR), Artımlı Statik Yenileme (ISR) ve API rotaları sayesinde hem kusursuz SEO hem de dinamik kullanıcı deneyimi sağlanabiliyor.
Ancak projenizi canlıya (production) taşırken en kritik karar başlar: Vercel veya AWS Amplify gibi yönetilen sunucusuz (serverless) platformları mı tercih etmelisiniz, yoksa kendi Sanal Özel Sunucunuzda (VPS / VDS) Coolify veya Docker ile bağımsız bir altyapı mı kurmalısınız?
İlk bakışta "Git push ile anında canlıya alma" kolaylığı sunan PaaS platformları cazip gelse de, projeniz büyüdükçe ortaya çıkan fahiş veri transfer (egress) ücretleri, sunucusuz soğuk başlangıç (cold start) gecikmeleri ve işlem süresi limitleri geliştiricileri kendi sunucularını yönetmeye yönlendirmektedir.
Bu kapsamlı rehberde, Next.js ve Node.js uygulamalarını kendi sunucunuzda sıfır maliyet sürpriziyle ve Vercel benzeri bir geliştirici deneyimiyle nasıl barındırabileceğinizi adım adım inceliyoruz.
1. Maliyet ve Mimari Karşılaştırması: Vercel vs Kendi VPS'in
Geliştiricilerin Vercel'den kendi sanal sunucularına geçiş yapmasındaki en temel etken öngörülemeyen faturalardır:
| Kriter | Vercel (Pro Plan) | Kendi VPS'in (Hetzner, Turhost vb.) |
|---|---|---|
| Aylık Sabit Taban Ücret | 20 USD / geliştirici (koltuk başı) | 5 - 15 USD / ay (Sabit Donanım Ücreti) |
| Bant Genişliği (Trafik) | 1 TB dahil; ek her 100 GB için 15 USD | 10 TB – 20 TB dahil veya Sınırsız (Kota aşım derdi yok) |
| Fonksiyon Çalışma Süresi (Timeout) | Maksimum 60 - 300 saniye (Hobi: 15s) | Sınırsız (Uzun süren cron, AI veya veri işleme görevleri) |
| Veritabanı Yakınlığı (Latency) | Bölgeye göre 30-100 ms ağ gecikmesi | Localhost veya aynı veri merkezinde 1 ms'nin altında doğrudan erişim |
| Görsel Optimizasyonu | 5.000 kaynak görsel dahil; sonrası ücretli | Sharp kütüphanesiyle sunucuda ücretsiz ve sınırsız |
| Dağıtım (Deployment) Deneyimi | Otomatik Git entegrasyonu | Coolify veya GitHub Actions ile aynı kolaylıkta |
[!WARNING] Trafik Patlaması ve Sürpriz Faturalar: Siteniz Reddit, Hacker News veya Ekşi Sözlük gibi platformlarda viral olduğunda ya da görselleriniz harici sitelerden doğrudan çekildiğinde (hotlinking), Vercel üzerinde tek bir gecede binlerce dolarlık bant genişliği faturasıyla karşılaşabilirsiniz. Kendi VPS'inizde ise sunucu hat kapasitesini doldurur ancak ay sonunda ek fatura çıkarmaz. Uygun fiyatlı sunucu seçenekleri için /en-ucuz-vps sayfamızı inceleyebilirsiniz.
2. Next.js output: 'standalone' Mimarisi
Geleneksel bir Node.js projesinde tüm node_modules klasörünü sunucuya yüklemek 500 MB – 2 GB arasında disk alanı ve yavaş derleme sürelerine yol açar. Next.js 14, 15 ve 16 sürümlerinde yer alan Standalone Çıktı Modu, uygulamanın çalışması için yalnızca ihtiyaç duyulan modülleri tespit ederek izole bir üretim paketi oluşturur.
next.config.ts Yapılandırması:
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
output: "standalone",
// Üretimde harici görsel optimizasyonu veya yerel sharp kullanımı
images: {
formats: ["image/avif", "image/webp"],
minimumCacheTTL: 86400,
},
};
export default nextConfig;
npm run build komutunu çalıştırdığınızda Next.js, .next/standalone klasörü içerisine minimal bir server.js ve sadece kullanılan bağımlılıkları kopyalar. Böylece Docker imaj boyutunuz 1.5 GB'tan 120 MB'a kadar düşer.
3. Üretim İçin Optimize Edilmiş Multi-Stage Dockerfile
Aşağıdaki Dockerfile, güvenlik ve hız için çok aşamalı (multi-stage) derleme kullanır, root yetkisi olmayan nextjs kullanıcısı ile çalışır:
# 1. Aşama: Bağımlılıklar
FROM node:22-alpine AS deps
RUN apk add --no-cache libc6-compat
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci
# 2. Aşama: Derleme (Builder)
FROM node:22-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
ENV NEXT_TELEMETRY_DISABLED=1
ENV NODE_ENV=production
RUN npm run build
# 3. Aşama: Üretim Çalışma Zamanı (Runner)
FROM node:22-alpine AS runner
WORKDIR /app
ENV NODE_ENV=production
ENV NEXT_TELEMETRY_DISABLED=1
ENV PORT=3000
ENV HOSTNAME="0.0.0.0"
RUN addgroup --system --gid 1001 nodejs
RUN adduser --system --uid 1001 nextjs
# Statik varlıkları ve standalone sunucuyu kopyala
COPY --from=builder /app/public ./public
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
CMD ["node", "server.js"]
4. Coolify ile Açık Kaynaklı "Kendi Vercel'ini Kur"
Kendi sunucunuzda Docker ve SSL yapılandırmalarıyla manuel uğraşmak istemiyorsanız, günümüzün en popüler açık kaynaklı PaaS aracı Coolify'dır.
Coolify Nedir ve Neler Sağlar?
- Tek Komutla Kurulum: Temiz bir Ubuntu 24.04 VPS üzerine tek bir bash komutuyla kurulur.
- GitHub & GitLab Entegrasyonu: Kodunuzu master/main dalına her push ettiğinizde otomatik derleme ve sıfır kesintili (zero-downtime) canlıya geçiş.
- Otomatik SSL: Traefik ters vekili sayesinde eklediğiniz her alan adı için Let's Encrypt SSL sertifikasını otomatik üretir ve yeniler.
- Dahili Veritabanları: Tek tıkla PostgreSQL, Redis, MySQL veya MongoDB konteynerleri açıp uygulamanıza iç ağ üzerinden bağlama.
- Çekirdek Başı Ücret Yok: Sunucunuzun donanımı yettiği kadar sınırsız web sitesi ve uygulama barındırabilirsiniz.
Coolify Kurulum Adımı (Ubuntu VPS):
# Temiz Ubuntu VPS üzerinde çalıştırın:
curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash
Kurulum tamamlandığında tarayıcınızdan http://SUNUCU_IP_ADRESINIZ:8000 adresine girerek yönetim panelinize erişebilir, GitHub reponuzu bağlayıp dakikalar içinde Next.js projenizi canlıya alabilirsiniz.
5. Manuel Kurulum: PM2 ve Nginx Reverse Proxy Mimarisi
Eğer Docker kullanmadan doğrudan Node.js çalışma zamanıyla devam etmek isterseniz, sektör standardı süreç yöneticisi PM2 ve web sunucusu Nginx ikilisidir.
1. PM2 Küme (Cluster) Modu ve Ekosistem Dosyası
Node.js varsayılan olarak tek iş parçacıklı (single-thread) çalışır. 4 çekirdekli bir sunucunuz varsa, tüm çekirdeklerden tam verim almak için PM2 cluster modunu kullanmalısınız:
// ecosystem.config.js
module.exports = {
apps: [
{
name: "nextjs-app",
script: ".next/standalone/server.js",
instances: "max", // Mevcut tüm vCPU çekirdeklerini kullanır
exec_mode: "cluster",
env: {
PORT: 3000,
NODE_ENV: "production",
},
// Bellek sızıntısına karşı koruma (2 GB'ı geçerse otomatik yeniden başlat)
max_memory_restart: "2G",
},
],
};
Uygulamayı başlatmak için:
pm2 start ecosystem.config.js
pm2 save
pm2 startup
2. Nginx Ters Vekil (Reverse Proxy) Yapılandırması
Nginx, gelen 80 ve 443 portundaki istekleri karşılar; statik dosyaları doğrudan disktan sunarak Node.js sürecine gereksiz yük binmesini engeller:
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# Gzip sıkıştırma
gzip on;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml image/svg+xml;
# Next.js statik dosyaları için uzun süreli tarayıcı önbelleği
location /_next/static/ {
alias /var/www/my-app/.next/static/;
expires 365d;
access_log off;
add_header Cache-Control "public, max-age=31536000, immutable";
}
# Public klasöründeki statik görseller
location /static/ {
alias /var/www/my-app/public/;
expires 30d;
access_log off;
}
# Dinamik SSR ve API istekleri için Node.js proxy
location / {
proxy_pass http://127.0.0.1:3000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
6. Node.js & Next.js İçin İdeal Sunucu Donanımı Nasıl Seçilir?
Next.js uygulamalarında sunucu ihtiyacı uygulamanın oluşturma (rendering) stratejisine göre değişir:
- Statik / ISR Ağırlıklı Siteler (Blog, Dokümantasyon, Katalog):
- Gereksinim: 1-2 vCPU, 2 GB RAM.
- Sayfalar ilk derlemede veya arka planda üretilip diskte tutulduğu için işlemci yükü çok düşüktür.
- Yoğun SSR ve Dinamik API İçeren Projeler (E-Ticaret, SaaS, B2B Portal):
- Gereksinim: 4 vCPU, 8 GB RAM, Enterprise NVMe SSD.
- Her kullanıcı isteğinde sunucuda React bileşenleri derlendiği ve veritabanı sorguları yapıldığı için yüksek tek çekirdek frekansı ve hızlı NVMe disk zorunludur.
- Bellek Yönetimi Uyarısı (OOM Koruması):
- Next.js derleme (
next build) işlemi sırasında TypeScript tip kontrolü ve Webpack/Turbopack optimizasyonları anlık olarak 2 - 4 GB RAM tüketebilir. - 2 GB RAM'e sahip giriş seviyesi bir VPS kullanıyorsanız, derleme esnasında sunucunun kilitlenmemesi için mutlaka en az 2-4 GB Swap (Takas Alanı) yapılandırılmalıdır.
- Next.js derleme (
Sunucunuzun güvenliğini sağlamak için Linux Sunucu Güvenliği ve Hardening Rehberi sayfamızı, disk hızının veritabanı üzerindeki etkilerini görmek için ise Veritabanı Hosting ve Performans Rehberi içeriğimizi inceleyebilirsiniz.
Özet ve Sonuç
- Hobi ve Hızlı Prototipleme İçin: Vercel'in ücretsiz katmanı hız ve kolaylık açısından rakipsizdir.
- Büyüyen Girişimler, E-Ticaret ve Yüksek Trafikli Siteler İçin: Vercel'in bant genişliği ve koltuk başı lisans ücretleri sürdürülemez hale gelir.
- En Dengeli Çözüm: 100 - 300 ₺ / ay bütçeyle kiralanan kaliteli bir NVMe VDS sunucu üzerine Coolify kurarak Vercel kolaylığında, ancak sınırsız bant genişliği ve tam donanım kontrolüyle çalışmaktır.
En avantajlı sunucu tekliflerini anlık TCMB kurları ve KDV dahil fiyatlarla karşılaştırmak için /vds-sunucu ve /vps kategorilerimizi ziyaret edebilirsiniz.