{"id":36612,"date":"2025-12-20T16:00:43","date_gmt":"2025-12-20T13:00:43","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/"},"modified":"2025-12-20T16:00:43","modified_gmt":"2025-12-20T13:00:43","slug":"statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/","title":{"rendered":"Statik Hosting&#8217;in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API&#8217;si Da\u011f\u0131t\u0131m\u0131"},"content":{"rendered":"<h2>Statik Hosting&#8217;in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API&#8217;si Da\u011f\u0131t\u0131m\u0131<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz web sitelerinin \u00e7o\u011fu, etkile\u015fimli \u00f6zellikler sunarak kullan\u0131c\u0131 deneyimini zenginle\u015ftirmeyi hedefler. Basit bir ileti\u015fim formu bile, kullan\u0131c\u0131dan gelen veriyi i\u015fleyip bir e-posta g\u00f6nderme gibi dinamik bir arka u\u00e7 i\u015flemine ihtiya\u00e7 duyar. Statik hosting \u00e7\u00f6z\u00fcmleri, HTML, CSS ve JavaScript dosyalar\u0131n\u0131 bar\u0131nd\u0131rmak i\u00e7in harika olsa da, sunucu taraf\u0131 mant\u0131\u011f\u0131 gerektiren bu t\u00fcr i\u015flevsellikler i\u00e7in yetersiz kal\u0131r. Bu makalede, statik bir web sitesine dinamik bir ileti\u015fim formu eklemek amac\u0131yla, Node.js tabanl\u0131 bir API&#8217;yi AWS EC2 \u00fczerinde nas\u0131l da\u011f\u0131taca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu s\u00fcre\u00e7, web geli\u015ftiricilerin projelerini bir sonraki seviyeye ta\u015f\u0131mas\u0131 i\u00e7in kritik bir ad\u0131md\u0131r.<\/p>\n<h3>Neden Statik Hosting&#8217;den \u00d6teye Ge\u00e7meliyiz?<\/h3>\n<p>Statik web siteleri, h\u0131zl\u0131 y\u00fckleme s\u00fcreleri ve d\u00fc\u015f\u00fck maliyetleri nedeniyle pop\u00fclerdir. Ancak belirli senaryolarda bu basitlik bir s\u0131n\u0131rlamaya d\u00f6n\u00fc\u015febilir.<\/p>\n<h4>Statik Hosting&#8217;in S\u0131n\u0131rlar\u0131<\/h4>\n<p>Statik hosting, \u00f6nceden olu\u015fturulmu\u015f dosyalar\u0131 (HTML, CSS, JavaScript, resimler) do\u011frudan taray\u0131c\u0131ya sunar. Bu yap\u0131, bir blog veya tan\u0131t\u0131m sitesi gibi i\u00e7erik odakl\u0131 siteler i\u00e7in idealdir. Ancak kullan\u0131c\u0131 giri\u015fi alma, veritaban\u0131 i\u015flemleri yapma, e-posta g\u00f6nderme veya \u00fc\u00e7\u00fcnc\u00fc taraf API&#8217;leriyle etkile\u015fim kurma gibi sunucu taraf\u0131 mant\u0131\u011f\u0131 gerektiren hi\u00e7bir i\u015flemi do\u011frudan ger\u00e7ekle\u015ftiremez. \u0130leti\u015fim formlar\u0131, yorum b\u00f6l\u00fcmleri veya kullan\u0131c\u0131 kay\u0131t sistemleri gibi \u00f6zellikler bu kategoriye girer.<\/p>\n<h4>Dinamik \u0130\u00e7eri\u011fin Gereklili\u011fi<\/h4>\n<p>Modern web siteleri genellikle kullan\u0131c\u0131larla etkile\u015fim kurma ihtiyac\u0131 duyar. Bir ileti\u015fim formu, potansiyel m\u00fc\u015fterilerin sizinle kolayca ileti\u015fime ge\u00e7mesini sa\u011flar. Bu, statik bir sitenin temel i\u015flevselli\u011fini geni\u015fleten ve kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131ran dinamik bir \u00f6zelliktir. Dinamik i\u00e7erik, web sitenizin sadece bilgi sunan bir platform olmaktan \u00e7\u0131k\u0131p, aktif bir etkile\u015fim noktas\u0131 haline gelmesini sa\u011flar.<\/p>\n<h4>Sunucu Taraf\u0131 Mant\u0131\u011f\u0131na Duyulan \u0130htiya\u00e7<\/h4>\n<p>Bir ileti\u015fim formunun g\u00f6nderilmesi, genellikle sunucu taraf\u0131nda bir dizi i\u015flemi tetikler: form verilerini do\u011frulamak, spam kontrol\u00fc yapmak, veritaban\u0131na kaydetmek (iste\u011fe ba\u011fl\u0131) ve en \u00f6nemlisi, belirtilen bir e-posta adresine bildirim g\u00f6ndermek. Bu i\u015flemlerin tamam\u0131, bir sunucu ortam\u0131nda \u00e7al\u0131\u015fan bir arka u\u00e7 uygulamas\u0131 (API) gerektirir. Node.js, bu t\u00fcr API&#8217;leri h\u0131zl\u0131 ve verimli bir \u015fekilde geli\u015ftirmek i\u00e7in m\u00fckemmel bir se\u00e7imdir.<\/p>\n<h3>Node.js \u0130leti\u015fim Formu API&#8217;si Olu\u015fturma<\/h3>\n<p>\u0130leti\u015fim formumuz i\u00e7in bir arka u\u00e7 API&#8217;si olu\u015fturmak, Node.js ve Express.js \u00e7er\u00e7evesini kullanarak olduk\u00e7a basittir. E-posta g\u00f6nderme i\u015flemi i\u00e7in Nodemailer k\u00fct\u00fcphanesinden faydalanaca\u011f\u0131z.<\/p>\n<h4>Temel API Yap\u0131s\u0131 (Express.js)<\/h4>\n<p>Express.js, Node.js i\u00e7in minimalist ve esnek bir web uygulama \u00e7er\u00e7evesidir. Bir API olu\u015fturmak i\u00e7in temel bir Express uygulamas\u0131 kurarak ba\u015flayabiliriz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js\nconst express = require('express');\nconst bodyParser = require('body-parser');\nconst cors = require('cors'); \/\/ Gerekliyse CORS i\u00e7in\nconst app = express();\nconst port = process.env.PORT || 3000;\n\n\/\/ Middleware'ler\napp.use(bodyParser.json());\napp.use(bodyParser.urlencoded({ extended: true }));\napp.use(cors()); \/\/ G\u00fcvenlik a\u00e7\u0131klar\u0131 i\u00e7in dikkatli yap\u0131land\u0131r\u0131lmal\u0131\n\n\/\/ Basit bir test rotas\u0131\napp.get('\/', (req, res) => {\n    res.send('\u0130leti\u015fim Formu API\\'si \u00e7al\u0131\u015f\u0131yor!');\n});\n\n\/\/ Sunucuyu ba\u015flat\napp.listen(port, () => {\n    console.log(<code>API sunucusu http:\/\/localhost:${port} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});<\/pre>\n<p><\/code><\/p>\n<h4>E-posta G\u00f6nderme Mekanizmas\u0131 (Nodemailer)<\/h4>\n<p>Nodemailer, Node.js uygulamalar\u0131ndan e-posta g\u00f6ndermeyi kolayla\u015ft\u0131ran bir mod\u00fcld\u00fcr. Gmail, Outlook gibi pop\u00fcler SMTP servislerini veya \u00f6zel SMTP sunucular\u0131n\u0131 kullanabilir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js (devam\u0131)\nconst nodemailer = require('nodemailer');\n\n\/\/ Nodemailer ta\u015f\u0131y\u0131c\u0131 yap\u0131land\u0131rmas\u0131\nconst transporter = nodemailer.createTransport({\n    host: process.env.EMAIL_HOST, \/\/ \u00d6rn: 'smtp.gmail.com'\n    port: process.env.EMAIL_PORT, \/\/ \u00d6rn: 587 (TLS) veya 465 (SSL)\n    secure: process.env.EMAIL_SECURE === 'true', \/\/ true for 465, false for other ports\n    auth: {\n        user: process.env.EMAIL_USER, \/\/ E-posta adresiniz\n        pass: process.env.EMAIL_PASS  \/\/ E-posta \u015fifreniz veya uygulama \u015fifreniz\n    }\n});\n\n\/\/ \u0130leti\u015fim formu POST rotas\u0131\napp.post('\/contact', async (req, res) => {\n    const { name, email, message } = req.body;\n\n    if (!name || !email || !message) {\n        return res.status(400).json({ success: false, message: 'L\u00fctfen t\u00fcm alanlar\u0131 doldurun.' });\n    }\n\n    try {\n        const mailOptions = {\n            from: process.env.EMAIL_USER,\n            to: process.env.RECIPIENT_EMAIL, \/\/ E-postalar\u0131n g\u00f6nderilece\u011fi adres\n            subject: <code>Yeni \u0130leti\u015fim Formu Mesaj\u0131: ${name}<\/code>,\n            html: <code><p>Ad: ${name}<\/p><p>E-posta: ${email}<\/p><p>Mesaj: ${message}<\/p><\/code>\n        };\n\n        await transporter.sendMail(mailOptions);\n        res.status(200).json({ success: true, message: 'Mesaj\u0131n\u0131z ba\u015far\u0131yla g\u00f6nderildi!' });\n    } catch (error) {\n        console.error('E-posta g\u00f6nderme hatas\u0131:', error);\n        res.status(500).json({ success: false, message: 'Mesaj g\u00f6nderilirken bir hata olu\u015ftu.' });\n    }\n});<\/pre>\n<p><\/code><\/p>\n<h4>Gerekli Ba\u011f\u0131ml\u0131l\u0131klar ve Yap\u0131land\u0131rma<\/h4>\n<p>Projemiz i\u00e7in <code>package.json<\/code> dosyas\u0131nda gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 tan\u0131mlamal\u0131 ve y\u00fcklemeliyiz.<\/p>\n<pre><code class=\"language-json\">{\n  \"name\": \"contact-form-api\",\n  \"version\": \"1.0.0\",\n  \"description\": \"Node.js API for a contact form\",\n  \"main\": \"app.js\",\n  \"scripts\": {\n    \"start\": \"node app.js\"\n  },\n  \"dependencies\": {\n    \"body-parser\": \"^1.20.2\",\n    \"cors\": \"^2.8.5\",\n    \"dotenv\": \"^16.4.5\",\n    \"express\": \"^4.19.2\",\n    \"nodemailer\": \"^6.9.13\"\n  }\n}\n<\/pre>\n<p><\/code><\/p>\n<p><code>npm install<\/code> komutu ile ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyin. Hassas bilgileri (e-posta \u015fifresi vb.) do\u011frudan koda yazmak yerine <code>.env<\/code> dosyas\u0131 kullanarak y\u00f6netmek en iyi uygulamad\u0131r. Bunun i\u00e7in <code>dotenv<\/code> paketini kullan\u0131r\u0131z. <code>app.js<\/code> dosyan\u0131z\u0131n en ba\u015f\u0131na <code>require('dotenv').config();<\/code> eklemeyi unutmay\u0131n.<\/p>\n<h3>AWS EC2 Ortam\u0131n\u0131 Haz\u0131rlama<\/h3>\n<p>AWS EC2 (Elastic Compute Cloud), bulutta \u00f6l\u00e7eklenebilir sanal sunucular (instance'lar) sa\u011flamam\u0131za olanak tan\u0131r. Node.js API'mizi bar\u0131nd\u0131rmak i\u00e7in bir EC2 instance'\u0131 kuraca\u011f\u0131z.<\/p>\n<h4>EC2 Instance Olu\u015fturma (AMI, Instance Tipi, Key Pair)<\/h4>\n<ol>\n<li>AWS Y\u00f6netim Konsolu'na giri\u015f yap\u0131n ve EC2 servisine gidin.<\/li>\n<li>\"Launch Instance\" (Instance Ba\u015flat) butonuna t\u0131klay\u0131n.<\/li>\n<li>\n        <b>AMI (Amazon Machine Image) Se\u00e7imi:<\/b> Genellikle \"Ubuntu Server 20.04 LTS\" veya \"Amazon Linux 2\" gibi \u00fccretsiz bir Linux da\u011f\u0131t\u0131m\u0131 se\u00e7mek iyi bir ba\u015flang\u0131\u00e7t\u0131r.\n    <\/li>\n<li>\n        <b>Instance Tipi Se\u00e7imi:<\/b> \u00dccretsiz katman i\u00e7in \"t2.micro\" veya \"t3.micro\" (e\u011fer destekleniyorsa) yeterli olacakt\u0131r. Daha fazla kaynak gerekiyorsa daha b\u00fcy\u00fck tipler se\u00e7ilebilir.\n    <\/li>\n<li>\n        <b>Key Pair Olu\u015fturma:<\/b> SSH ile sunucunuza g\u00fcvenli bir \u015fekilde ba\u011flanmak i\u00e7in bir anahtar \u00e7ifti (Key Pair) olu\u015fturun veya mevcut birini se\u00e7in. <code>.pem<\/code> dosyas\u0131n\u0131 g\u00fcvenli bir yerde saklay\u0131n.\n    <\/li>\n<li>Di\u011fer ayarlar\u0131 (depolama, a\u011f vb.) varsay\u0131lan olarak b\u0131rakabilirsiniz.<\/li>\n<\/ol>\n<h4>G\u00fcvenlik Grubu Yap\u0131land\u0131rmas\u0131 (Portlar: SSH, HTTP\/HTTPS)<\/h4>\n<p>G\u00fcvenlik gruplar\u0131, EC2 instance'\u0131n\u0131z\u0131n a\u011f trafi\u011fini kontrol eden sanal g\u00fcvenlik duvarlar\u0131d\u0131r.<\/p>\n<ol>\n<li>Instance ba\u015flatma sihirbaz\u0131n\u0131n \"Configure Security Group\" (G\u00fcvenlik Grubunu Yap\u0131land\u0131r) ad\u0131m\u0131nda yeni bir g\u00fcvenlik grubu olu\u015fturun.<\/li>\n<li>\n        <b>SSH (Port 22):<\/b> Kendi IP adresinizden veya belirli bir IP aral\u0131\u011f\u0131ndan (\u00f6rne\u011fin, \u015firketinizin IP adresi) eri\u015fime izin verin. <code>0.0.0.0\/0<\/code> se\u00e7ene\u011fi her yerden eri\u015fime izin verir ancak g\u00fcvenlik riski ta\u015f\u0131r.\n    <\/li>\n<li>\n        <b>HTTP (Port 80):<\/b> Web sunucunuzun (Nginx) gelen HTTP isteklerini alabilmesi i\u00e7in her yerden (Anywhere - <code>0.0.0.0\/0<\/code>) eri\u015fime izin verin.\n    <\/li>\n<li>\n        <b>HTTPS (Port 443):<\/b> E\u011fer SSL\/TLS kullanacaksan\u0131z, HTTPS trafi\u011fi i\u00e7in de her yerden eri\u015fime izin verin.\n    <\/li>\n<li>\n        <b>Node.js Uygulama Portu (\u00d6rn: 3000):<\/b> E\u011fer uygulaman\u0131z\u0131 do\u011frudan bu port \u00fczerinden d\u0131\u015far\u0131ya a\u00e7mayacaksan\u0131z (ki Nginx kullanaca\u011f\u0131m\u0131z i\u00e7in a\u00e7mayaca\u011f\u0131z), bu porta d\u0131\u015far\u0131dan eri\u015fime izin vermenize gerek yoktur. Sadece Nginx'in eri\u015febilmesi yeterlidir.\n    <\/li>\n<\/ol>\n<h4>SSH ile Sunucuya Ba\u011flanma<\/h4>\n<p>Instance'\u0131n\u0131z \u00e7al\u0131\u015fmaya ba\u015flad\u0131ktan sonra, terminalinizden SSH kullanarak ba\u011flanabilirsiniz.<\/p>\n<pre><code class=\"language-bash\">ssh -i \/path\/to\/your-key-pair.pem ubuntu@ec2-your-public-ip.compute-1.amazonaws.com<\/pre>\n<p><\/code><br \/>\n*   <code>\/path\/to\/your-key-pair.pem<\/code>: <code>.pem<\/code> dosyan\u0131z\u0131n yolu.<br \/>\n*   <code>ubuntu<\/code>: Se\u00e7ti\u011finiz AMI'ye g\u00f6re kullan\u0131c\u0131 ad\u0131 de\u011fi\u015febilir (Amazon Linux i\u00e7in <code>ec2-user<\/code>).<br \/>\n*   <code>ec2-your-public-ip.compute-1.amazonaws.com<\/code>: EC2 instance'\u0131n\u0131z\u0131n genel DNS ad\u0131 veya IP adresi.<\/p>\n<h3>Node.js Uygulamas\u0131n\u0131 EC2'ye Da\u011f\u0131tma<\/h3>\n<p>Sunucumuza ba\u011fland\u0131ktan sonra, Node.js API'mizi \u00e7al\u0131\u015ft\u0131racak ortam\u0131 kurmal\u0131 ve kodumuzu da\u011f\u0131tmal\u0131y\u0131z.<\/p>\n<h4>Gerekli Yaz\u0131l\u0131mlar\u0131n Kurulumu (Node.js, npm, git)<\/h4>\n<p>Ubuntu tabanl\u0131 bir sistem i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt install -y curl git\n\n# Node.js ve npm kurulumu (NodeSource deposu \u00f6nerilir)\ncurl -fsSL https:\/\/deb.nodesource.com\/setup_20.x | sudo -E bash -\nsudo apt install -y nodejs<\/pre>\n<p><\/code><br \/>\nKurulumu kontrol edin:<\/p>\n<pre><code class=\"language-bash\">node -v\nnpm -v<\/pre>\n<p><\/code><\/p>\n<h4>Projeyi Sunucuya Kopyalama (Git Clone veya SCP)<\/h4>\n<p>Git deposundan kopyalamak en yayg\u0131n y\u00f6ntemdir:<\/p>\n<pre><code class=\"language-bash\">git clone https:\/\/github.com\/your-username\/your-contact-form-api.git\ncd your-contact-form-api<\/pre>\n<p><\/code><br \/>\nE\u011fer git kullanm\u0131yorsan\u0131z, <code>scp<\/code> komutu ile yerel makinenizden dosya kopyalayabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">scp -i \/path\/to\/your-key-pair.pem -r \/path\/to\/local\/project ubuntu@your-ec2-ip:\/home\/ubuntu\/your-contact-form-api<\/pre>\n<p><\/code><\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme ve Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma<\/h4>\n<p>Proje dizinine girdikten sonra ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">npm install<\/pre>\n<p><\/code><br \/>\n<code>.env<\/code> dosyan\u0131z\u0131 sunucuya y\u00fcklemeyi veya manuel olarak olu\u015fturmay\u0131 unutmay\u0131n. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-bash\">nano .env<\/pre>\n<p><\/code><br \/>\n\u0130\u00e7ine gerekli ortam de\u011fi\u015fkenlerini yaz\u0131n (EMAIL_HOST, EMAIL_PORT, EMAIL_USER, EMAIL_PASS, RECIPIENT_EMAIL, PORT=3000).<\/p>\n<p>Uygulamay\u0131 test etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">node app.js<\/pre>\n<p><\/code><br \/>\nBu komut uygulamay\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r, ancak terminali kapatt\u0131\u011f\u0131n\u0131zda uygulama da durur. Bu y\u00fczden bir s\u00fcre\u00e7 y\u00f6neticisi kullanaca\u011f\u0131z.<\/p>\n<h3>Uygulamay\u0131 Canl\u0131 Tutma ve Y\u00f6netme<\/h3>\n<p>Bir Node.js uygulamas\u0131n\u0131n s\u00fcrekli \u00e7al\u0131\u015f\u0131r durumda kalmas\u0131 ve gelen istekleri y\u00f6netmesi i\u00e7in baz\u0131 ara\u00e7lara ihtiyac\u0131m\u0131z var.<\/p>\n<h4>S\u00fcre\u00e7 Y\u00f6neticisi Kullan\u0131m\u0131 (PM2)<\/h4>\n<p>PM2, Node.js uygulamalar\u0131n\u0131 \u00fcretimde y\u00f6netmek i\u00e7in pop\u00fcler bir s\u00fcre\u00e7 y\u00f6neticisidir. Uygulamalar\u0131n \u00e7\u00f6kmesini \u00f6nler, yeniden ba\u015flat\u0131r ve y\u00fck dengeleme sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">sudo npm install -g pm2\npm2 start app.js --name \"contact-api\"\npm2 save # Yeniden ba\u015flatmalarda uygulamay\u0131 otomatik ba\u015flatmak i\u00e7in\npm2 startup # Sistemi yeniden ba\u015flatt\u0131\u011f\u0131n\u0131zda PM2'nin otomatik ba\u015flamas\u0131n\u0131 sa\u011flar<\/pre>\n<p><\/code><br \/>\nPM2 komutlar\u0131:<br \/>\n*   <code>pm2 list<\/code>: \u00c7al\u0131\u015fan t\u00fcm uygulamalar\u0131 listeler.<br \/>\n*   <code>pm2 logs contact-api<\/code>: Uygulaman\u0131n loglar\u0131n\u0131 g\u00f6sterir.<br \/>\n*   <code>pm2 restart contact-api<\/code>: Uygulamay\u0131 yeniden ba\u015flat\u0131r.<\/p>\n<h4>Nginx ile Ters Proxy Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Nginx, y\u00fcksek performansl\u0131 bir web sunucusu ve ters proxy'dir. Gelen HTTP\/HTTPS isteklerini al\u0131r ve Node.js uygulamam\u0131za y\u00f6nlendirir. Bu, ayn\u0131 zamanda g\u00fcvenlik ve performans avantajlar\u0131 da sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">sudo apt install -y nginx\nsudo systemctl start nginx\nsudo systemctl enable nginx<\/pre>\n<p><\/code><br \/>\nNginx yap\u0131land\u0131rma dosyas\u0131 olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/nginx\/sites-available\/contact-api<\/pre>\n<p><\/code><br \/>\n\u0130\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi d\u00fczenleyin (port 3000'de \u00e7al\u0131\u015fan Node.js uygulaman\u0131z i\u00e7in):<\/p>\n<pre><code class=\"language-nginx\">server {\n    listen 80;\n    server_name your_domain_or_public_ip; # Alan ad\u0131n\u0131z\u0131 veya EC2 IP'nizi buraya yaz\u0131n\n\n    location \/ {\n        proxy_pass http:\/\/localhost:3000; # Node.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 port\n        proxy_http_version 1.1;\n        proxy_set_header Upgrade $http_upgrade;\n        proxy_set_header Connection 'upgrade';\n        proxy_set_header Host $host;\n        proxy_cache_bypass $http_upgrade;\n        proxy_set_header X-Real-IP $remote_addr;\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n        proxy_set_header X-Forwarded-Proto $scheme;\n    }\n}<\/pre>\n<p><\/code><br \/>\nYap\u0131land\u0131rmay\u0131 etkinle\u015ftirin ve Nginx'i yeniden ba\u015flat\u0131n:<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/contact-api \/etc\/nginx\/sites-enabled\/\nsudo nginx -t # Yap\u0131land\u0131rma dosyas\u0131n\u0131 test et\nsudo systemctl restart nginx<\/pre>\n<p><\/code><br \/>\nArt\u0131k taray\u0131c\u0131n\u0131zdan <code>http:\/\/your_domain_or_public_ip<\/code> adresine giderek Node.js API'nizin Nginx \u00fczerinden \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz.<\/p>\n<h4>Otomatik Ba\u015flatma ve G\u00fcncelleme Stratejileri<\/h4>\n<p>PM2'nin <code>pm2 startup<\/code> komutu, sistem yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda Node.js uygulaman\u0131z\u0131n otomatik olarak ba\u015flamas\u0131n\u0131 sa\u011flar. Kod g\u00fcncellemeleri i\u00e7in, Git deposunu \u00e7ekip <code>npm install<\/code> ve <code>pm2 restart contact-api<\/code> komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak yeterlidir. Daha geli\u015fmi\u015f da\u011f\u0131t\u0131m s\u00fcre\u00e7leri i\u00e7in CI\/CD (Continuous Integration\/Continuous Deployment) ara\u00e7lar\u0131 (\u00f6rne\u011fin Jenkins, GitHub Actions, AWS CodeDeploy) kullan\u0131labilir.<\/p>\n<h3>G\u00fcvenlik ve Performans \u0130yile\u015ftirmeleri<\/h3>\n<p>Uygulamam\u0131z\u0131n hem g\u00fcvenli hem de verimli \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak \u00f6nemlidir.<\/p>\n<h4>G\u00fcvenlik Grubu Kurallar\u0131 ve Eri\u015fim Kontrol\u00fc<\/h4>\n<p>AWS G\u00fcvenlik Gruplar\u0131n\u0131 m\u00fcmk\u00fcn oldu\u011funca k\u0131s\u0131tl\u0131 tutun. SSH portunu (22) yaln\u0131zca kendi IP adresinizden eri\u015filebilir yap\u0131n. Node.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 portu (\u00f6rne\u011fin 3000) d\u0131\u015f d\u00fcnyaya a\u00e7may\u0131n; Nginx yaln\u0131zca <code>localhost<\/code> \u00fczerinden eri\u015fecektir.<\/p>\n<h4>Ortam De\u011fi\u015fkenleri ile Hassas Bilgileri Y\u00f6netme<\/h4>\n<p>Veritaban\u0131 \u015fifreleri, API anahtarlar\u0131, e-posta kimlik bilgileri gibi hassas bilgileri asla do\u011frudan koda yazmay\u0131n. <code>.env<\/code> dosyalar\u0131 veya AWS Systems Manager Parameter Store gibi servisler kullanarak bu bilgileri g\u00fcvenli bir \u015fekilde y\u00f6netin. <code>.env<\/code> dosyas\u0131n\u0131n <code>.gitignore<\/code> i\u00e7inde oldu\u011fundan emin olun.<\/p>\n<h4>SSL\/TLS \u015eifrelemesi (Let's Encrypt)<\/h4>\n<p>Veri g\u00fcvenli\u011fi i\u00e7in HTTPS kullan\u0131m\u0131 zorunludur. Let's Encrypt, \u00fccretsiz SSL\/TLS sertifikalar\u0131 sa\u011flar. Certbot arac\u0131 ile Nginx \u00fczerinde kolayca kurulabilir:<\/p>\n<pre><code class=\"language-bash\">sudo snap install core; sudo snap refresh core\nsudo snap install --classic certbot\nsudo ln -s \/snap\/bin\/certbot \/usr\/bin\/certbot\nsudo certbot --nginx -d your_domain_or_public_ip<\/pre>\n<p><\/code><br \/>\nBu komut, Nginx yap\u0131land\u0131rman\u0131z\u0131 otomatik olarak HTTPS i\u00e7in g\u00fcncelleyecek ve sertifikalar\u0131 kuracakt\u0131r.<\/p>\n<h4>Performans \u0130\u00e7in En \u0130yi Uygulamalar<\/h4>\n<ul>\n<li>\n        <b>PM2 K\u00fcme Modu:<\/b> PM2, uygulaman\u0131z\u0131 birden fazla CPU \u00e7ekirde\u011finde \u00e7al\u0131\u015ft\u0131rarak performans\u0131 art\u0131rabilir. <code>pm2 start app.js -i max<\/code> komutu ile mevcut t\u00fcm CPU \u00e7ekirdeklerini kullanabilirsiniz.\n    <\/li>\n<li>\n        <b>Nginx \u00d6nbellekleme:<\/b> Statik dosyalar\u0131n\u0131z varsa, Nginx'i bunlar\u0131 \u00f6nbelle\u011fe almak i\u00e7in yap\u0131land\u0131rabilirsiniz.\n    <\/li>\n<li>\n        <b>Log Y\u00f6netimi:<\/b> Uygulama loglar\u0131n\u0131 d\u00fczenli olarak kontrol edin ve AWS CloudWatch gibi bir loglama servisine y\u00f6nlendirmeyi d\u00fc\u015f\u00fcn\u00fcn.\n    <\/li>\n<li>\n        <b>Kaynak \u0130zleme:<\/b> EC2 instance'\u0131n\u0131z\u0131n CPU, bellek ve disk kullan\u0131m\u0131n\u0131 AWS CloudWatch ile izleyin. Gerekirse instance tipini y\u00fckseltin.\n    <\/li>\n<\/ul>\n<h3>Maliyet Optimizasyonu ve Sonraki Ad\u0131mlar<\/h3>\n<p>AWS hizmetleri esneklik sunsa da, maliyetleri optimize etmek \u00f6nemlidir.<\/p>\n<h4>EC2 Instance Tipi Se\u00e7imi ve Kapatma Stratejileri<\/h4>\n<p>API'nizin trafik y\u00fck\u00fcne uygun en k\u00fc\u00e7\u00fck EC2 instance tipini se\u00e7in. E\u011fer API'niz s\u00fcrekli \u00e7al\u0131\u015fmak zorunda de\u011filse (\u00f6rne\u011fin sadece test ama\u00e7l\u0131), kullan\u0131lmad\u0131\u011f\u0131nda instance'\u0131 durdurarak maliyetten tasarruf edebilirsiniz. Otomatik \u00f6l\u00e7eklendirme gruplar\u0131, y\u00fck artt\u0131\u011f\u0131nda yeni instance'lar ba\u015flat\u0131p y\u00fck azald\u0131\u011f\u0131nda kapatarak maliyetleri optimize edebilir.<\/p>\n<h4>Otomatik \u00d6l\u00e7eklendirme ve Y\u00fck Dengeleme (Gelecek \u0130\u00e7in)<\/h4>\n<p>Y\u00fcksek trafik bekliyorsan\u0131z, bir Elastic Load Balancer (ELB) kullanarak gelen trafi\u011fi birden fazla EC2 instance'\u0131na da\u011f\u0131tabilirsiniz. Otomatik \u00d6l\u00e7eklendirme Gruplar\u0131 ile de trafik y\u00fck\u00fcne g\u00f6re otomatik olarak instance ekleyip \u00e7\u0131karabilirsiniz. Bu, uygulaman\u0131z\u0131n her zaman eri\u015filebilir ve performansl\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>\u0130zleme ve Loglama (CloudWatch)<\/h4>\n<p>AWS CloudWatch, EC2 instance'lar\u0131n\u0131z\u0131n ve uygulaman\u0131z\u0131n performans metriklerini izlemenizi, alarmlar kurman\u0131z\u0131 ve loglar\u0131 toplaman\u0131z\u0131 sa\u011flar. Bu, sorunlar\u0131 proaktif olarak tespit etmek ve \u00e7\u00f6zmek i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Statik bir web sitesine dinamik bir ileti\u015fim formu eklemek, kullan\u0131c\u0131 etkile\u015fimini art\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc bir ad\u0131md\u0131r. Bu makalede, Node.js tabanl\u0131 bir ileti\u015fim formu API'sini AWS EC2 \u00fczerinde ba\u015far\u0131yla da\u011f\u0131tmak i\u00e7in gerekli ad\u0131mlar\u0131 detayl\u0131 bir \u015fekilde ele ald\u0131k. Express.js ile API olu\u015fturmaktan, Nodemailer ile e-posta g\u00f6ndermeye, EC2 instance'\u0131 yap\u0131land\u0131rmaktan, PM2 ve Nginx ile uygulamay\u0131 y\u00f6netmeye kadar t\u00fcm s\u00fcre\u00e7leri kapsad\u0131k. G\u00fcvenlik ve performans iyile\u015ftirmeleri ile maliyet optimizasyonu ipu\u00e7lar\u0131 sayesinde, uygulaman\u0131z\u0131n \u00fcretim ortam\u0131nda sa\u011flam ve verimli \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flayabilirsiniz. Bu rehber, statik hosting'in \u00f6tesine ge\u00e7mek ve dinamik web uygulamalar\u0131 geli\u015ftirmek isteyen her geli\u015ftirici i\u00e7in de\u011ferli bir ba\u015flang\u0131\u00e7 noktas\u0131 olacakt\u0131r.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>EC2 yerine ba\u015fka hangi AWS servislerini kullanabilirim?<\/h4>\n<p>Node.js API'nizi EC2 yerine AWS Lambda (sunucusuz), AWS Fargate (konteynerler i\u00e7in sunucusuz), AWS Elastic Beanstalk (uygulama da\u011f\u0131t\u0131m\u0131 ve y\u00f6netimi kolayla\u015ft\u0131r\u0131r) gibi servislerde de da\u011f\u0131tabilirsiniz. Her birinin kendi avantajlar\u0131 ve maliyet yap\u0131lar\u0131 vard\u0131r. Lambda, d\u00fc\u015f\u00fck trafikli API'ler i\u00e7in genellikle daha uygun maliyetli olabilir.<\/p>\n<h4>API'mi nas\u0131l g\u00fcvende tutar\u0131m?<\/h4>\n<p>G\u00fcvenlik gruplar\u0131n\u0131 k\u0131s\u0131tlay\u0131n, ortam de\u011fi\u015fkenleri kullan\u0131n, HTTPS (SSL\/TLS) uygulay\u0131n, API'nize gelen istekleri do\u011frulay\u0131n (\u00f6rne\u011fin, reCAPTCHA ile spam korumas\u0131), ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131z\u0131 g\u00fcncel tutun ve d\u00fczenli g\u00fcvenlik denetimleri yap\u0131n.<\/p>\n<h4>Nodemailer yerine ba\u015fka bir e-posta g\u00f6nderme servisi kullanabilir miyim?<\/h4>\n<p>Evet, Nodemailer yerine AWS SES (Simple Email Service), SendGrid, Mailgun gibi \u00fc\u00e7\u00fcnc\u00fc taraf e-posta servislerini kullanabilirsiniz. Bu servisler genellikle daha y\u00fcksek teslimat oranlar\u0131, geli\u015fmi\u015f izleme ve \u00f6l\u00e7eklenebilirlik sunar.<\/p>\n<h4>Uygulamam \u00e7\u00f6k\u00fcnce ne yapmal\u0131y\u0131m?<\/h4>\n<p>PM2 gibi bir s\u00fcre\u00e7 y\u00f6neticisi kullan\u0131yorsan\u0131z, uygulaman\u0131z \u00e7\u00f6kt\u00fc\u011f\u00fcnde otomatik olarak yeniden ba\u015flat\u0131l\u0131r. Ancak temel nedeni bulmak i\u00e7in PM2 loglar\u0131n\u0131 (<code>pm2 logs your-app-name<\/code>) kontrol etmeli ve AWS CloudWatch gibi izleme ara\u00e7lar\u0131ndan faydalanmal\u0131s\u0131n\u0131z. Hata ay\u0131klama i\u00e7in Node.js uygulaman\u0131zda daha detayl\u0131 loglama yapmay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/p>\n","protected":false},"excerpt":{"rendered":"Ad: ${name}","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1406],"tags":[],"class_list":{"0":"post-36612","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-aws","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Statik Hosting&#039;in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API&#039;si Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Statik Hosting&#039;in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API&#039;si Da\u011f\u0131t\u0131m\u0131\" \/>\n<meta property=\"og:description\" content=\"Ad: ${name}\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-20T13:00:43+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Statik Hosting&#8217;in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API&#8217;si Da\u011f\u0131t\u0131m\u0131\",\"datePublished\":\"2025-12-20T13:00:43+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/\"},\"wordCount\":2248,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"AWS\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/\",\"name\":\"Statik Hosting'in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API'si Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-20T13:00:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Statik Hosting&#8217;in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API&#8217;si Da\u011f\u0131t\u0131m\u0131\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Statik Hosting'in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API'si Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/","og_locale":"tr_TR","og_type":"article","og_title":"Statik Hosting'in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API'si Da\u011f\u0131t\u0131m\u0131","og_description":"Ad: ${name}","og_url":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-20T13:00:43+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Statik Hosting&#8217;in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API&#8217;si Da\u011f\u0131t\u0131m\u0131","datePublished":"2025-12-20T13:00:43+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/"},"wordCount":2248,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["AWS"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/","url":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/","name":"Statik Hosting'in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API'si Da\u011f\u0131t\u0131m\u0131 - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-20T13:00:43+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/statik-hostingin-otesine-gecmek-aws-ec2-uzerinde-node-js-iletisim-formu-apisi-dagitimi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Statik Hosting&#8217;in \u00d6tesine Ge\u00e7mek: AWS EC2 \u00dczerinde Node.js \u0130leti\u015fim Formu API&#8217;si Da\u011f\u0131t\u0131m\u0131"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36612","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36612"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36612\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36612"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36612"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36612"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}