Ana içeriğe geç

Next.js / Node.js uygulamasını sunucuya kurma#

Bilgisayarınızda npm run dev yazıyorsunuz, localhost:3000 açılıyor, her şey güzel. Sonra bunu internete koymanız gerekiyor ve dört ayrı problem aynı anda ortaya çıkıyor.

Bu sayfa dördünü sırayla çözer. Her adımda önce ne olduğunu, sonra Morpheus'a nasıl söyleyeceğinizi bulacaksınız.

Çözeceğimiz dört problem#

Problem Çözüm
Uygulama sunucuda çalışmalı Node.js kurulumu + üretim derlemesi
Terminali kapatınca durmamalı systemd servisi (veya PM2)
3000 portu değil, 443 açılmalı Nginx reverse proxy
Tarayıcı "güvenli değil" dememeli Let's Encrypt sertifikası

0. Önce alan adını yönlendirin#

Diğer her şeyden önce yapın, çünkü DNS yayılması zaman alır ve sertifika adımı buna bağlıdır.

Alan adınızın A kaydı sunucunuzun IP adresini göstermeli. VeriTeknik'te alan adınız varsa panelden DNS bölümünden yapabilirsiniz.

Morpheus ile

"example.com A kaydını 185.96.x.x adresine yönlendir"

DNS kaydı yönetimi Morpheus'un güvenilir olduğu yapılandırılmış işlerden biri; sunucu içi kurulumdan farklı olarak burada serbest komut çalıştırmıyor.

Yayıldığını doğrulayın:

dig +short example.com

1. Node.js kurun#

Dağıtımın kendi deposundaki Node genelde eskidir. NodeSource deposunu kullanın.

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v
curl -fsSL https://rpm.nodesource.com/setup_22.x | sudo bash -
sudo dnf install -y nodejs
node -v

Morpheus ile

"sunucuma Node.js 22 kur"

Morpheus dağıtımı kendisi tespit eder (cat /etc/os-release) ve doğru komutu seçer. aptdnf mi olduğunu düşünmenize gerek yok.


2. Kodu sunucuya alın ve derleyin#

sudo mkdir -p /var/www/uygulamam
sudo chown -R $USER:$USER /var/www/uygulamam
cd /var/www/uygulamam

git clone https://github.com/kullanici/repo.git .
npm ci
npm run build

Ortam değişkenleri

.env dosyanız git'te değildir (olmamalı da). Sunucuda elle oluşturun:

nano /var/www/uygulamam/.env.production

Veritabanı şifresi, API anahtarı gibi değerleri buraya koyun ve dosya iznini kısın:

chmod 600 /var/www/uygulamam/.env.production

Bu dosyayı Morpheus'a okutmayın. Sunucudaki sırlarınızı sohbete taşımayın; gerek de yok.


3. Servis haline getirin#

Terminali kapattığınızda uygulamanın ölmemesi ve sunucu yeniden başladığında kendi kendine kalkması için systemd servisi yazın.

sudo nano /etc/systemd/system/uygulamam.service
[Unit]
Description=Uygulamam (Next.js)
After=network.target

[Service]
Type=simple
User=www-data
WorkingDirectory=/var/www/uygulamam
EnvironmentFile=/var/www/uygulamam/.env.production
ExecStart=/usr/bin/npm run start
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now uygulamam
sudo systemctl status uygulamam

Restart=always satırı önemlidir: uygulama çökerse systemd tekrar başlatır.

Morpheus ile

"uygulamam için systemd servisi oluştur, /var/www/uygulamam dizininde npm run start çalıştırsın, çökerse yeniden başlasın"

Servis dosyası yazmak Morpheus'un iyi olduğu işlerden; ama oluşturduğu dosyayı bir kez okuyun. Sizin sunucunuz, sizin sorumluluğunuz.


4. Nginx reverse proxy#

Uygulamanız 3000 portunda çalışıyor. Ziyaretçi 443'e geliyor. Arasını Nginx bağlar.

sudo apt install -y nginx     # veya: sudo dnf install -y nginx
sudo nano /etc/nginx/sites-available/uygulamam
server {
    listen 80;
    server_name example.com www.example.com;

    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_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;
        proxy_cache_bypass $http_upgrade;
    }
}
sudo ln -s /etc/nginx/sites-available/uygulamam /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

3000 portunu dışarı açmayın

Uygulamanız yalnızca 127.0.0.1:3000 dinlemeli. Firewall'da 3000'i açmak, Nginx'i ve birazdan kuracağınız sertifikayı baypas edilebilir hale getirir. Dışarıya yalnızca 80 ve 443 açık olmalı:

sudo ufw allow 80,443/tcp
sudo ufw enable

5. HTTPS sertifikası#

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d example.com -d www.example.com

Certbot Nginx yapılandırmanızı kendisi düzenler ve otomatik yenileme zamanlayıcısını kurar. Yenilemeyi doğrulayın:

sudo certbot renew --dry-run

Morpheus ile

"example.com için Let's Encrypt sertifikası al ve otomatik yenilemeyi kur"


6. Güncelleme yaparken#

Yeni sürüm çıktığında:

cd /var/www/uygulamam
git pull
npm ci
npm run build
sudo systemctl restart uygulamam

Bunu Morpheus'a alışkanlık olarak öğretin

"bundan sonra 'uygulamayı güncelle' dediğimde: /var/www/uygulamam dizininde git pull, npm ci, npm run build yap ve uygulamam servisini yeniden başlat"

Morpheus bunu prosedür olarak hatırlar. Sonraki sefer sadece "uygulamayı güncelle" demeniz yeterli olur.


Kontrol listesi#

  • [ ] dig +short example.com sunucunuzun IP'sini dönüyor
  • [ ] systemctl status uygulamamactive (running)
  • [ ] sudo nginx -tsyntax is ok
  • [ ] https://example.com tarayıcıda kilit simgesiyle açılıyor
  • [ ] sudo ufw status → yalnızca 22, 80, 443 açık
  • [ ] Sunucuyu yeniden başlattığınızda site kendiliğinden geliyor
  • [ ] sudo certbot renew --dry-run hatasız

Bir şey tutmadıysa: Bir şeyler bozulduğunda.