Statik Hosting’in Ötesine Geçmek: AWS EC2 Üzerinde Node.js İletişim Formu API’si Dağıtımı
Günümüz web sitelerinin çoğu, etkileşimli özellikler sunarak kullanıcı deneyimini zenginleştirmeyi hedefler. Basit bir iletişim formu bile, kullanıcıdan gelen veriyi işleyip bir e-posta gönderme gibi dinamik bir arka uç işlemine ihtiyaç duyar. Statik hosting çözümleri, HTML, CSS ve JavaScript dosyalarını barındırmak için harika olsa da, sunucu tarafı mantığı gerektiren bu tür işlevsellikler için yetersiz kalır. Bu makalede, statik bir web sitesine dinamik bir iletişim formu eklemek amacıyla, Node.js tabanlı bir API’yi AWS EC2 üzerinde nasıl dağıtacağımızı adım adım inceleyeceğiz. Bu süreç, web geliştiricilerin projelerini bir sonraki seviyeye taşıması için kritik bir adımdır.
Neden Statik Hosting’den Öteye Geçmeliyiz?
Statik web siteleri, hızlı yükleme süreleri ve düşük maliyetleri nedeniyle popülerdir. Ancak belirli senaryolarda bu basitlik bir sınırlamaya dönüşebilir.
Statik Hosting’in Sınırları
Statik hosting, önceden oluşturulmuş dosyaları (HTML, CSS, JavaScript, resimler) doğrudan tarayıcıya sunar. Bu yapı, bir blog veya tanıtım sitesi gibi içerik odaklı siteler için idealdir. Ancak kullanıcı girişi alma, veritabanı işlemleri yapma, e-posta gönderme veya üçüncü taraf API’leriyle etkileşim kurma gibi sunucu tarafı mantığı gerektiren hiçbir işlemi doğrudan gerçekleştiremez. İletişim formları, yorum bölümleri veya kullanıcı kayıt sistemleri gibi özellikler bu kategoriye girer.
Dinamik İçeriğin Gerekliliği
Modern web siteleri genellikle kullanıcılarla etkileşim kurma ihtiyacı duyar. Bir iletişim formu, potansiyel müşterilerin sizinle kolayca iletişime geçmesini sağlar. Bu, statik bir sitenin temel işlevselliğini genişleten ve kullanıcı deneyimini önemli ölçüde artıran dinamik bir özelliktir. Dinamik içerik, web sitenizin sadece bilgi sunan bir platform olmaktan çıkıp, aktif bir etkileşim noktası haline gelmesini sağlar.
Sunucu Tarafı Mantığına Duyulan İhtiyaç
Bir iletişim formunun gönderilmesi, genellikle sunucu tarafında bir dizi işlemi tetikler: form verilerini doğrulamak, spam kontrolü yapmak, veritabanına kaydetmek (isteğe bağlı) ve en önemlisi, belirtilen bir e-posta adresine bildirim göndermek. Bu işlemlerin tamamı, bir sunucu ortamında çalışan bir arka uç uygulaması (API) gerektirir. Node.js, bu tür API’leri hızlı ve verimli bir şekilde geliştirmek için mükemmel bir seçimdir.
Node.js İletişim Formu API’si Oluşturma
İletişim formumuz için bir arka uç API’si oluşturmak, Node.js ve Express.js çerçevesini kullanarak oldukça basittir. E-posta gönderme işlemi için Nodemailer kütüphanesinden faydalanacağız.
Temel API Yapısı (Express.js)
Express.js, Node.js için minimalist ve esnek bir web uygulama çerçevesidir. Bir API oluşturmak için temel bir Express uygulaması kurarak başlayabiliriz.
// app.js
const express = require('express');
const bodyParser = require('body-parser');
const cors = require('cors'); // Gerekliyse CORS için
const app = express();
const port = process.env.PORT || 3000;
// Middleware'ler
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cors()); // Güvenlik açıkları için dikkatli yapılandırılmalı
// Basit bir test rotası
app.get('/', (req, res) => {
res.send('İletişim Formu API\'si çalışıyor!');
});
// Sunucuyu başlat
app.listen(port, () => {
console.log(API sunucusu http://localhost:${port} adresinde çalışıyor.);
});
E-posta Gönderme Mekanizması (Nodemailer)
Nodemailer, Node.js uygulamalarından e-posta göndermeyi kolaylaştıran bir modüldür. Gmail, Outlook gibi popüler SMTP servislerini veya özel SMTP sunucularını kullanabilir.
// app.js (devamı)
const nodemailer = require('nodemailer');
// Nodemailer taşıyıcı yapılandırması
const transporter = nodemailer.createTransport({
host: process.env.EMAIL_HOST, // Örn: 'smtp.gmail.com'
port: process.env.EMAIL_PORT, // Örn: 587 (TLS) veya 465 (SSL)
secure: process.env.EMAIL_SECURE === 'true', // true for 465, false for other ports
auth: {
user: process.env.EMAIL_USER, // E-posta adresiniz
pass: process.env.EMAIL_PASS // E-posta şifreniz veya uygulama şifreniz
}
});
// İletişim formu POST rotası
app.post('/contact', async (req, res) => {
const { name, email, message } = req.body;
if (!name || !email || !message) {
return res.status(400).json({ success: false, message: 'Lütfen tüm alanları doldurun.' });
}
try {
const mailOptions = {
from: process.env.EMAIL_USER,
to: process.env.RECIPIENT_EMAIL, // E-postaların gönderileceği adres
subject: Yeni İletişim Formu Mesajı: ${name},
html: Ad: ${name}
E-posta: ${email}
Mesaj: ${message}
};
await transporter.sendMail(mailOptions);
res.status(200).json({ success: true, message: 'Mesajınız başarıyla gönderildi!' });
} catch (error) {
console.error('E-posta gönderme hatası:', error);
res.status(500).json({ success: false, message: 'Mesaj gönderilirken bir hata oluştu.' });
}
});
Gerekli Bağımlılıklar ve Yapılandırma
Projemiz için package.json dosyasında gerekli bağımlılıkları tanımlamalı ve yüklemeliyiz.
{
"name": "contact-form-api",
"version": "1.0.0",
"description": "Node.js API for a contact form",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"dependencies": {
"body-parser": "^1.20.2",
"cors": "^2.8.5",
"dotenv": "^16.4.5",
"express": "^4.19.2",
"nodemailer": "^6.9.13"
}
}
npm install komutu ile bağımlılıkları yükleyin. Hassas bilgileri (e-posta şifresi vb.) doğrudan koda yazmak yerine .env dosyası kullanarak yönetmek en iyi uygulamadır. Bunun için dotenv paketini kullanırız. app.js dosyanızın en başına require('dotenv').config(); eklemeyi unutmayın.
AWS EC2 Ortamını Hazırlama
AWS EC2 (Elastic Compute Cloud), bulutta ölçeklenebilir sanal sunucular (instance'lar) sağlamamıza olanak tanır. Node.js API'mizi barındırmak için bir EC2 instance'ı kuracağız.
EC2 Instance Oluşturma (AMI, Instance Tipi, Key Pair)
- AWS Yönetim Konsolu'na giriş yapın ve EC2 servisine gidin.
- "Launch Instance" (Instance Başlat) butonuna tıklayın.
- AMI (Amazon Machine Image) Seçimi: Genellikle "Ubuntu Server 20.04 LTS" veya "Amazon Linux 2" gibi ücretsiz bir Linux dağıtımı seçmek iyi bir başlangıçtır.
- Instance Tipi Seçimi: Ücretsiz katman için "t2.micro" veya "t3.micro" (eğer destekleniyorsa) yeterli olacaktır. Daha fazla kaynak gerekiyorsa daha büyük tipler seçilebilir.
-
Key Pair Oluşturma: SSH ile sunucunuza güvenli bir şekilde bağlanmak için bir anahtar çifti (Key Pair) oluşturun veya mevcut birini seçin.
.pemdosyasını güvenli bir yerde saklayın. - Diğer ayarları (depolama, ağ vb.) varsayılan olarak bırakabilirsiniz.
Güvenlik Grubu Yapılandırması (Portlar: SSH, HTTP/HTTPS)
Güvenlik grupları, EC2 instance'ınızın ağ trafiğini kontrol eden sanal güvenlik duvarlarıdır.
- Instance başlatma sihirbazının "Configure Security Group" (Güvenlik Grubunu Yapılandır) adımında yeni bir güvenlik grubu oluşturun.
-
SSH (Port 22): Kendi IP adresinizden veya belirli bir IP aralığından (örneğin, şirketinizin IP adresi) erişime izin verin.
0.0.0.0/0seçeneği her yerden erişime izin verir ancak güvenlik riski taşır. -
HTTP (Port 80): Web sunucunuzun (Nginx) gelen HTTP isteklerini alabilmesi için her yerden (Anywhere -
0.0.0.0/0) erişime izin verin. - HTTPS (Port 443): Eğer SSL/TLS kullanacaksanız, HTTPS trafiği için de her yerden erişime izin verin.
- Node.js Uygulama Portu (Örn: 3000): Eğer uygulamanızı doğrudan bu port üzerinden dışarıya açmayacaksanız (ki Nginx kullanacağımız için açmayacağız), bu porta dışarıdan erişime izin vermenize gerek yoktur. Sadece Nginx'in erişebilmesi yeterlidir.
SSH ile Sunucuya Bağlanma
Instance'ınız çalışmaya başladıktan sonra, terminalinizden SSH kullanarak bağlanabilirsiniz.
ssh -i /path/to/your-key-pair.pem ubuntu@ec2-your-public-ip.compute-1.amazonaws.com
* /path/to/your-key-pair.pem: .pem dosyanızın yolu.
* ubuntu: Seçtiğiniz AMI'ye göre kullanıcı adı değişebilir (Amazon Linux için ec2-user).
* ec2-your-public-ip.compute-1.amazonaws.com: EC2 instance'ınızın genel DNS adı veya IP adresi.
Node.js Uygulamasını EC2'ye Dağıtma
Sunucumuza bağlandıktan sonra, Node.js API'mizi çalıştıracak ortamı kurmalı ve kodumuzu dağıtmalıyız.
Gerekli Yazılımların Kurulumu (Node.js, npm, git)
Ubuntu tabanlı bir sistem için:
sudo apt update
sudo apt install -y curl git
# Node.js ve npm kurulumu (NodeSource deposu önerilir)
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
Kurulumu kontrol edin:
node -v
npm -v
Projeyi Sunucuya Kopyalama (Git Clone veya SCP)
Git deposundan kopyalamak en yaygın yöntemdir:
git clone https://github.com/your-username/your-contact-form-api.git
cd your-contact-form-api
Eğer git kullanmıyorsanız, scp komutu ile yerel makinenizden dosya kopyalayabilirsiniz:
scp -i /path/to/your-key-pair.pem -r /path/to/local/project ubuntu@your-ec2-ip:/home/ubuntu/your-contact-form-api
Bağımlılıkları Yükleme ve Uygulamayı Çalıştırma
Proje dizinine girdikten sonra bağımlılıkları yükleyin:
npm install
.env dosyanızı sunucuya yüklemeyi veya manuel olarak oluşturmayı unutmayın. Örneğin:
nano .env
İçine gerekli ortam değişkenlerini yazın (EMAIL_HOST, EMAIL_PORT, EMAIL_USER, EMAIL_PASS, RECIPIENT_EMAIL, PORT=3000).
Uygulamayı test etmek için:
node app.js
Bu komut uygulamayı çalıştırır, ancak terminali kapattığınızda uygulama da durur. Bu yüzden bir süreç yöneticisi kullanacağız.
Uygulamayı Canlı Tutma ve Yönetme
Bir Node.js uygulamasının sürekli çalışır durumda kalması ve gelen istekleri yönetmesi için bazı araçlara ihtiyacımız var.
Süreç Yöneticisi Kullanımı (PM2)
PM2, Node.js uygulamalarını üretimde yönetmek için popüler bir süreç yöneticisidir. Uygulamaların çökmesini önler, yeniden başlatır ve yük dengeleme sağlar.
sudo npm install -g pm2
pm2 start app.js --name "contact-api"
pm2 save # Yeniden başlatmalarda uygulamayı otomatik başlatmak için
pm2 startup # Sistemi yeniden başlattığınızda PM2'nin otomatik başlamasını sağlar
PM2 komutları:
* pm2 list: Çalışan tüm uygulamaları listeler.
* pm2 logs contact-api: Uygulamanın loglarını gösterir.
* pm2 restart contact-api: Uygulamayı yeniden başlatır.
Nginx ile Ters Proxy Yapılandırması
Nginx, yüksek performanslı bir web sunucusu ve ters proxy'dir. Gelen HTTP/HTTPS isteklerini alır ve Node.js uygulamamıza yönlendirir. Bu, aynı zamanda güvenlik ve performans avantajları da sağlar.
sudo apt install -y nginx
sudo systemctl start nginx
sudo systemctl enable nginx
Nginx yapılandırma dosyası oluşturun:
sudo nano /etc/nginx/sites-available/contact-api
İçeriği aşağıdaki gibi düzenleyin (port 3000'de çalışan Node.js uygulamanız için):
server {
listen 80;
server_name your_domain_or_public_ip; # Alan adınızı veya EC2 IP'nizi buraya yazın
location / {
proxy_pass http://localhost:3000; # Node.js uygulamanızın çalıştığı port
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;
}
}
Yapılandırmayı etkinleştirin ve Nginx'i yeniden başlatın:
sudo ln -s /etc/nginx/sites-available/contact-api /etc/nginx/sites-enabled/
sudo nginx -t # Yapılandırma dosyasını test et
sudo systemctl restart nginx
Artık tarayıcınızdan http://your_domain_or_public_ip adresine giderek Node.js API'nizin Nginx üzerinden çalıştığını görebilirsiniz.
Otomatik Başlatma ve Güncelleme Stratejileri
PM2'nin pm2 startup komutu, sistem yeniden başlatıldığında Node.js uygulamanızın otomatik olarak başlamasını sağlar. Kod güncellemeleri için, Git deposunu çekip npm install ve pm2 restart contact-api komutlarını çalıştırmak yeterlidir. Daha gelişmiş dağıtım süreçleri için CI/CD (Continuous Integration/Continuous Deployment) araçları (örneğin Jenkins, GitHub Actions, AWS CodeDeploy) kullanılabilir.
Güvenlik ve Performans İyileştirmeleri
Uygulamamızın hem güvenli hem de verimli çalıştığından emin olmak önemlidir.
Güvenlik Grubu Kuralları ve Erişim Kontrolü
AWS Güvenlik Gruplarını mümkün olduğunca kısıtlı tutun. SSH portunu (22) yalnızca kendi IP adresinizden erişilebilir yapın. Node.js uygulamanızın çalıştığı portu (örneğin 3000) dış dünyaya açmayın; Nginx yalnızca localhost üzerinden erişecektir.
Ortam Değişkenleri ile Hassas Bilgileri Yönetme
Veritabanı şifreleri, API anahtarları, e-posta kimlik bilgileri gibi hassas bilgileri asla doğrudan koda yazmayın. .env dosyaları veya AWS Systems Manager Parameter Store gibi servisler kullanarak bu bilgileri güvenli bir şekilde yönetin. .env dosyasının .gitignore içinde olduğundan emin olun.
SSL/TLS Şifrelemesi (Let's Encrypt)
Veri güvenliği için HTTPS kullanımı zorunludur. Let's Encrypt, ücretsiz SSL/TLS sertifikaları sağlar. Certbot aracı ile Nginx üzerinde kolayca kurulabilir:
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx -d your_domain_or_public_ip
Bu komut, Nginx yapılandırmanızı otomatik olarak HTTPS için güncelleyecek ve sertifikaları kuracaktır.
Performans İçin En İyi Uygulamalar
-
PM2 Küme Modu: PM2, uygulamanızı birden fazla CPU çekirdeğinde çalıştırarak performansı artırabilir.
pm2 start app.js -i maxkomutu ile mevcut tüm CPU çekirdeklerini kullanabilirsiniz. - Nginx Önbellekleme: Statik dosyalarınız varsa, Nginx'i bunları önbelleğe almak için yapılandırabilirsiniz.
- Log Yönetimi: Uygulama loglarını düzenli olarak kontrol edin ve AWS CloudWatch gibi bir loglama servisine yönlendirmeyi düşünün.
- Kaynak İzleme: EC2 instance'ınızın CPU, bellek ve disk kullanımını AWS CloudWatch ile izleyin. Gerekirse instance tipini yükseltin.
Maliyet Optimizasyonu ve Sonraki Adımlar
AWS hizmetleri esneklik sunsa da, maliyetleri optimize etmek önemlidir.
EC2 Instance Tipi Seçimi ve Kapatma Stratejileri
API'nizin trafik yüküne uygun en küçük EC2 instance tipini seçin. Eğer API'niz sürekli çalışmak zorunda değilse (örneğin sadece test amaçlı), kullanılmadığında instance'ı durdurarak maliyetten tasarruf edebilirsiniz. Otomatik ölçeklendirme grupları, yük arttığında yeni instance'lar başlatıp yük azaldığında kapatarak maliyetleri optimize edebilir.
Otomatik Ölçeklendirme ve Yük Dengeleme (Gelecek İçin)
Yüksek trafik bekliyorsanız, bir Elastic Load Balancer (ELB) kullanarak gelen trafiği birden fazla EC2 instance'ına dağıtabilirsiniz. Otomatik Ölçeklendirme Grupları ile de trafik yüküne göre otomatik olarak instance ekleyip çıkarabilirsiniz. Bu, uygulamanızın her zaman erişilebilir ve performanslı olmasını sağlar.
İzleme ve Loglama (CloudWatch)
AWS CloudWatch, EC2 instance'larınızın ve uygulamanızın performans metriklerini izlemenizi, alarmlar kurmanızı ve logları toplamanızı sağlar. Bu, sorunları proaktif olarak tespit etmek ve çözmek için kritik öneme sahiptir.
Sonuç
Statik bir web sitesine dinamik bir iletişim formu eklemek, kullanıcı etkileşimini artırmak için güçlü bir adımdır. Bu makalede, Node.js tabanlı bir iletişim formu API'sini AWS EC2 üzerinde başarıyla dağıtmak için gerekli adımları detaylı bir şekilde ele aldık. Express.js ile API oluşturmaktan, Nodemailer ile e-posta göndermeye, EC2 instance'ı yapılandırmaktan, PM2 ve Nginx ile uygulamayı yönetmeye kadar tüm süreçleri kapsadık. Güvenlik ve performans iyileştirmeleri ile maliyet optimizasyonu ipuçları sayesinde, uygulamanızın üretim ortamında sağlam ve verimli çalışmasını sağlayabilirsiniz. Bu rehber, statik hosting'in ötesine geçmek ve dinamik web uygulamaları geliştirmek isteyen her geliştirici için değerli bir başlangıç noktası olacaktır.
SSS (Sık Sorulan Sorular)
EC2 yerine başka hangi AWS servislerini kullanabilirim?
Node.js API'nizi EC2 yerine AWS Lambda (sunucusuz), AWS Fargate (konteynerler için sunucusuz), AWS Elastic Beanstalk (uygulama dağıtımı ve yönetimi kolaylaştırır) gibi servislerde de dağıtabilirsiniz. Her birinin kendi avantajları ve maliyet yapıları vardır. Lambda, düşük trafikli API'ler için genellikle daha uygun maliyetli olabilir.
API'mi nasıl güvende tutarım?
Güvenlik gruplarını kısıtlayın, ortam değişkenleri kullanın, HTTPS (SSL/TLS) uygulayın, API'nize gelen istekleri doğrulayın (örneğin, reCAPTCHA ile spam koruması), bağımlılıklarınızı güncel tutun ve düzenli güvenlik denetimleri yapın.
Nodemailer yerine başka bir e-posta gönderme servisi kullanabilir miyim?
Evet, Nodemailer yerine AWS SES (Simple Email Service), SendGrid, Mailgun gibi üçüncü taraf e-posta servislerini kullanabilirsiniz. Bu servisler genellikle daha yüksek teslimat oranları, gelişmiş izleme ve ölçeklenebilirlik sunar.
Uygulamam çökünce ne yapmalıyım?
PM2 gibi bir süreç yöneticisi kullanıyorsanız, uygulamanız çöktüğünde otomatik olarak yeniden başlatılır. Ancak temel nedeni bulmak için PM2 loglarını (pm2 logs your-app-name) kontrol etmeli ve AWS CloudWatch gibi izleme araçlarından faydalanmalısınız. Hata ayıklama için Node.js uygulamanızda daha detaylı loglama yapmayı düşünebilirsiniz.