{"id":38679,"date":"2026-02-05T13:40:45","date_gmt":"2026-02-05T10:40:45","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=38679"},"modified":"2026-02-05T13:40:45","modified_gmt":"2026-02-05T10:40:45","slug":"ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/","title":{"rendered":"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi"},"content":{"rendered":"<h2>Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi<\/h2>\n<p><body><\/p>\n<h3>Giri\u015f: Node.js, Sails.js ve Neden Bir VPS?<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\u011fi\u015fen web d\u00fcnyas\u0131nda, h\u0131zl\u0131 ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmek kritik bir \u00f6neme sahiptir. Node.js, JavaScript&#8217;i sunucu taraf\u0131nda \u00e7al\u0131\u015ft\u0131rmam\u0131za olanak tan\u0131yan, olay tabanl\u0131, asenkron bir \u00e7al\u0131\u015fma zaman\u0131 ortam\u0131d\u0131r. Y\u00fcksek performansl\u0131 ve ger\u00e7ek zamanl\u0131 uygulamalar i\u00e7in ideal bir se\u00e7imdir. Ancak, Node.js ile s\u0131f\u0131rdan bir uygulama geli\u015ftirmek, \u00f6zellikle b\u00fcy\u00fck projelerde, baz\u0131 zorluklar\u0131 beraberinde getirebilir. \u0130\u015fte tam bu noktada Sails.js devreye girer.<\/p>\n<p>Sails.js, Node.js i\u00e7in pop\u00fcler bir MVC (Model-View-Controller) \u00e7er\u00e7evesidir. Ruby on Rails&#8217;ten ilham alarak geli\u015ftirilmi\u015ftir ve h\u0131zl\u0131 API&#8217;ler, tek sayfa uygulamalar\u0131 (SPA&#8217;lar) ve ger\u00e7ek zamanl\u0131 uygulamalar olu\u015fturmay\u0131 kolayla\u015ft\u0131r\u0131r. Sails.js, g\u00fc\u00e7l\u00fc bir ORM (Object-Relational Mapping) olan Waterline ile birlikte gelir, bu da farkl\u0131 veritabanlar\u0131yla sorunsuz bir \u015fekilde entegrasyonu m\u00fcmk\u00fcn k\u0131lar. Ayr\u0131ca, WebSocket deste\u011fi, otomatik RESTful API olu\u015fturma ve g\u00fc\u00e7l\u00fc bir yap\u0131land\u0131rma sistemi gibi \u00f6zellikleriyle geli\u015ftiricilere b\u00fcy\u00fck kolayl\u0131klar sunar.<\/p>\n<p>Peki, neden bir Ubuntu VPS (Virtual Private Server) \u00fczerinde bu uygulamay\u0131 bar\u0131nd\u0131rmal\u0131y\u0131z? Bir VPS, payla\u015f\u0131ml\u0131 bar\u0131nd\u0131rma hizmetlerine k\u0131yasla daha fazla kontrol, esneklik ve kaynak tahsisi sunar. Kendi i\u015fletim sisteminizi se\u00e7ebilir, istedi\u011finiz yaz\u0131l\u0131mlar\u0131 kurabilir ve sunucunuzun performans\u0131n\u0131 tamamen kendi ihtiya\u00e7lar\u0131n\u0131za g\u00f6re optimize edebilirsiniz. Ubuntu, sunucu d\u00fcnyas\u0131nda en pop\u00fcler ve g\u00fcvenilir Linux da\u011f\u0131t\u0131mlar\u0131ndan biridir; geni\u015f topluluk deste\u011fi, zengin paket y\u00f6neticisi ve g\u00fcvenlik odakl\u0131 yap\u0131s\u0131yla tercih sebebi olmaktad\u0131r. Bu makalede, Node.js ve Sails.js&#8217;in g\u00fcc\u00fcn\u00fc birle\u015ftirerek, Ubuntu VPS \u00fczerinde nas\u0131l bir web uygulamas\u0131 olu\u015fturaca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3>\u00d6n Gereksinimler<\/h3>\n<p>Bu rehbere ba\u015flamadan \u00f6nce a\u015fa\u011f\u0131daki \u00f6n gereksinimlere sahip olman\u0131z gerekmektedir:<\/p>\n<ul>\n<li><strong>Ubuntu VPS:<\/strong> Aktif bir Ubuntu 20.04 veya 22.04 LTS sunucusuna SSH eri\u015fiminiz olmal\u0131. \u00c7o\u011fu bulut sa\u011flay\u0131c\u0131s\u0131ndan (AWS, DigitalOcean, Vultr, Linode vb.) kolayca temin edilebilir.<\/li>\n<li><strong>SSH Eri\u015fimi:<\/strong> Sunucuya ba\u011flanmak i\u00e7in bir SSH istemcisi (Linux\/macOS i\u00e7in terminal, Windows i\u00e7in PuTTY veya WSL) kullanabilmelisiniz.<\/li>\n<li><strong>Temel Linux Bilgisi:<\/strong> Temel komut sat\u0131r\u0131 bilgisi (apt, cd, ls, nano\/vim) faydal\u0131 olacakt\u0131r.<\/li>\n<li><strong>Alan Ad\u0131 (\u0130ste\u011fe Ba\u011fl\u0131 ama \u00d6nerilir):<\/strong> Uygulaman\u0131za eri\u015fmek i\u00e7in bir alan ad\u0131 (domain name) kullanmak, \u00f6zellikle \u00fcretim ortam\u0131nda, profesyonellik ve SSL sertifikas\u0131 kurulumu i\u00e7in \u00f6nemlidir. Alan ad\u0131n\u0131z\u0131 VPS&#8217;inizin IP adresine y\u00f6nlendirmi\u015f olmal\u0131s\u0131n\u0131z.<\/li>\n<\/ul>\n<h3>Ubuntu VPS Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Sails.js uygulaman\u0131z\u0131 bar\u0131nd\u0131raca\u011f\u0131m\u0131z Ubuntu VPS&#8217;i haz\u0131rlayarak i\u015fe ba\u015flayal\u0131m. Bu ad\u0131mlar, sunucunuzun g\u00fcncel olmas\u0131n\u0131, gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131n kurulmas\u0131n\u0131 ve Node.js \u00e7al\u0131\u015fma ortam\u0131n\u0131n haz\u0131rlanmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h4>Sistemi G\u00fcncelleme<\/h4>\n<p>\u0130lk olarak, SSH ile VPS&#8217;inize ba\u011flan\u0131n ve sistem paket listelerini g\u00fcncelleyip mevcut paketleri y\u00fckseltin. Bu, g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 kapat\u0131r ve en yeni yaz\u0131l\u0131m s\u00fcr\u00fcmlerini alman\u0131z\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">sudo apt update\nsudo apt upgrade -y<\/code><\/pre>\n<h4>Gerekli Ara\u00e7lar\u0131 Kurma<\/h4>\n<p>Baz\u0131 temel ara\u00e7lara ihtiyac\u0131m\u0131z olacak. <code>curl<\/code> genellikle Node.js kurulum komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in, <code>git<\/code> ise projenizi bir versiyon kontrol sisteminden \u00e7ekmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-bash\">sudo apt install curl git -y<\/code><\/pre>\n<h4>Node.js ve npm Kurulumu (nvm ile)<\/h4>\n<p>Node.js&#8217;i kurman\u0131n birden fazla yolu vard\u0131r, ancak <code>nvm<\/code> (Node Version Manager) kullanmak, farkl\u0131 Node.js s\u00fcr\u00fcmleri aras\u0131nda kolayca ge\u00e7i\u015f yapman\u0131z\u0131 sa\u011flad\u0131\u011f\u0131 i\u00e7in en \u00e7ok \u00f6nerilen y\u00f6ntemdir. Bu, gelecekteki projeleriniz i\u00e7in de esneklik sa\u011flar.<\/p>\n<p>1.  <strong>nvm&#8217;i Y\u00fckleme:<\/strong><br \/>\n    A\u015fa\u011f\u0131daki komut, nvm&#8217;in en son s\u00fcr\u00fcm\u00fcn\u00fc indirip kuracakt\u0131r.<\/p>\n<pre><code class=\"language-bash\">curl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.1\/install.sh | bash<\/code><\/pre>\n<p>    Kurulum tamamland\u0131ktan sonra, kabu\u011funuzu yeniden ba\u015flatman\u0131z veya nvm&#8217;in yolunu <code>~\/.bashrc<\/code> veya <code>~\/.zshrc<\/code> dosyas\u0131ndan y\u00fcklemeniz gerekebilir.<\/p>\n<pre><code class=\"language-bash\">source ~\/.bashrc<\/code><\/pre>\n<p>    veya<\/p>\n<pre><code class=\"language-bash\">source ~\/.profile<\/code><\/pre>\n<p>2.  <strong>Node.js&#8217;i Y\u00fckleme:<\/strong><br \/>\n    nvm y\u00fcklendikten sonra, Node.js&#8217;in en son LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fcn\u00fc kurabiliriz.<\/p>\n<pre><code class=\"language-bash\">nvm install --lts\n    nvm use --lts\n    nvm alias default 'lts\/*'<\/code><\/pre>\n<p>    Bu komutlar, LTS s\u00fcr\u00fcm\u00fcn\u00fc kurar, aktif olarak kullanmaya ba\u015flar ve her yeni oturumda varsay\u0131lan olarak bu s\u00fcr\u00fcm\u00fcn kullan\u0131lmas\u0131n\u0131 sa\u011flar.<br \/>\n    Kurulumu do\u011frulamak i\u00e7in Node.js ve npm (Node Package Manager) s\u00fcr\u00fcmlerini kontrol edin:<\/p>\n<pre><code class=\"language-bash\">node -v\n    npm -v<\/code><\/pre>\n<h4>PM2 Kurulumu (Uygulama Y\u00f6netimi \u0130\u00e7in)<\/h4>\n<p>Node.js uygulamalar\u0131, sunucu \u00e7\u00f6kse veya yeniden ba\u015flat\u0131lsa bile \u00e7al\u0131\u015fmaya devam etmelidir. <code>PM2<\/code>, Node.js uygulamalar\u0131n\u0131 \u00fcretim ortam\u0131nda y\u00f6netmek, yeniden ba\u015flatmak ve izlemek i\u00e7in g\u00fc\u00e7l\u00fc bir s\u00fcre\u00e7 y\u00f6neticisidir.<\/p>\n<pre><code class=\"language-bash\">npm install -g pm2<\/code><\/pre>\n<p>PM2&#8217;yi sistem ba\u015flang\u0131c\u0131nda otomatik olarak ba\u015flamas\u0131 i\u00e7in yap\u0131land\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">pm2 startup systemd<\/code><\/pre>\n<p>Bu komut, size bir komut sat\u0131r\u0131 \u00e7\u0131kt\u0131s\u0131 verecektir. Bu \u00e7\u0131kt\u0131y\u0131 kopyalay\u0131p \u00e7al\u0131\u015ft\u0131rarak PM2&#8217;yi sistem ba\u015flatma hizmetlerine ekleyin. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-bash\">sudo env PATH=$PATH:\/home\/kullanici_adi\/.nvm\/versions\/node\/vXX.X.X\/bin \/home\/kullanici_adi\/.nvm\/versions\/node\/vXX.X.X\/lib\/node_modules\/pm2\/bin\/pm2 startup systemd -u kullanici_adi --hp \/home\/kullanici_adi<\/code><\/pre>\n<p><code>kullanici_adi<\/code> ve <code>vXX.X.X<\/code> k\u0131s\u0131mlar\u0131n\u0131 kendi kullan\u0131c\u0131 ad\u0131n\u0131z ve Node.js s\u00fcr\u00fcm\u00fcn\u00fczle de\u011fi\u015ftirmeniz gerekecektir.<\/p>\n<h4>Veritaban\u0131 Kurulumu (PostgreSQL \u00d6rne\u011fi)<\/h4>\n<p>Sails.js, Waterline ORM sayesinde bir\u00e7ok farkl\u0131 veritaban\u0131n\u0131 destekler (PostgreSQL, MySQL, MongoDB, Redis vb.). Bu rehberde, g\u00fc\u00e7l\u00fc ve pop\u00fcler bir ili\u015fkisel veritaban\u0131 olan PostgreSQL&#8217;i kullanaca\u011f\u0131z.<\/p>\n<p>1.  <strong>PostgreSQL Kurulumu:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt install postgresql postgresql-contrib -y<\/code><\/pre>\n<p>2.  <strong>PostgreSQL Kullan\u0131c\u0131s\u0131 ve Veritaban\u0131 Olu\u015fturma:<\/strong><br \/>\n    PostgreSQL varsay\u0131lan olarak <code>postgres<\/code> adl\u0131 bir kullan\u0131c\u0131 olu\u015fturur. Bu kullan\u0131c\u0131ya ge\u00e7erek yeni bir veritaban\u0131 ve kullan\u0131c\u0131 olu\u015fturabiliriz.<\/p>\n<pre><code class=\"language-bash\">sudo -i -u postgres\n    psql<\/code><\/pre>\n<p>    <code>psql<\/code> kabu\u011funda a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n (kendi g\u00fc\u00e7l\u00fc \u015fifrenizi belirleyin):<\/p>\n<pre><code class=\"language-sql\">CREATE DATABASE sails_app_db;\n    CREATE USER sails_user WITH PASSWORD 'guclu_sifreniz';\n    GRANT ALL PRIVILEGES ON DATABASE sails_app_db TO sails_user;\n    \\q<\/code><\/pre>\n<p>    PostgreSQL kabu\u011fundan \u00e7\u0131kmak i\u00e7in <code>\\q<\/code>, <code>postgres<\/code> kullan\u0131c\u0131s\u0131ndan \u00e7\u0131kmak i\u00e7in <code>exit<\/code> yaz\u0131n.<\/p>\n<h3>Sails.js Kurulumu ve Proje Olu\u015fturma<\/h3>\n<p>VPS&#8217;imiz haz\u0131r oldu\u011funa g\u00f6re, Sails.js CLI&#8217;\u0131 kurup yeni bir proje olu\u015fturabiliriz.<\/p>\n<h4>Sails.js CLI Kurulumu<\/h4>\n<p>Sails.js komut sat\u0131r\u0131 aray\u00fcz\u00fcn\u00fc (CLI) global olarak y\u00fckleyelim:<\/p>\n<pre><code class=\"language-bash\">npm install -g sails<\/code><\/pre>\n<h4>Yeni Sails.js Projesi Olu\u015fturma<\/h4>\n<p>Projenizi bar\u0131nd\u0131rmak istedi\u011finiz dizine gidin (\u00f6rne\u011fin <code>\/var\/www\/<\/code> alt\u0131na) ve yeni bir Sails.js projesi olu\u015fturun.<\/p>\n<pre><code class=\"language-bash\">sudo mkdir -p \/var\/www\ncd \/var\/www\nsudo chown -R $USER:$USER \/var\/www # Dizin izinlerini kullan\u0131c\u0131ya ver\nsails new my-sails-app --no-template # Basit bir API projesi i\u00e7in --no-template kullanabiliriz\ncd my-sails-app<\/code><\/pre>\n<p><code>--no-template<\/code> se\u00e7ene\u011fi, yaln\u0131zca API odakl\u0131 bir proje olu\u015fturmak istedi\u011finizde front-end \u015fablon motorlar\u0131n\u0131 (EJS, Pug vb.) dahil etmez. E\u011fer bir web uygulamas\u0131 (View&#8217;ler ile) olu\u015fturmak istiyorsan\u0131z bu se\u00e7ene\u011fi kullanmay\u0131n.<\/p>\n<h4>Proje Yap\u0131s\u0131n\u0131 \u0130nceleme<\/h4>\n<p>Sails.js, projenizi olu\u015fturdu\u011funda belirli bir dizin yap\u0131s\u0131 olu\u015fturur:<\/p>\n<ul>\n<li><code>api\/controllers<\/code>: Uygulaman\u0131z\u0131n i\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7eren dosyalar.<\/li>\n<li><code>api\/models<\/code>: Veritaban\u0131 tablolar\u0131n\u0131z\u0131n veya koleksiyonlar\u0131n\u0131z\u0131n tan\u0131mlar\u0131.<\/li>\n<li><code>api\/policies<\/code>: \u0130stekleri belirli eylemlere ula\u015fmadan \u00f6nce kontrol eden yetkilendirme katman\u0131.<\/li>\n<li><code>config<\/code>: Uygulaman\u0131n \u00e7e\u015fitli yap\u0131land\u0131rma ayarlar\u0131 (veritaban\u0131, g\u00fcvenlik, rota vb.).<\/li>\n<li><code>assets<\/code>: Statik dosyalar\u0131n\u0131z (CSS, JS, resimler).<\/li>\n<li><code>views<\/code>: \u015eablon dosyalar\u0131n\u0131z (e\u011fer bir front-end \u015fablon motoru kullan\u0131yorsan\u0131z).<\/li>\n<\/ul>\n<p>Bu yap\u0131y\u0131 anlamak, uygulaman\u0131z\u0131 d\u00fczenli tutman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Sails.js Uygulamas\u0131n\u0131 Yap\u0131land\u0131rma<\/h3>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015f\u0131r hale getirmek i\u00e7in veritaban\u0131 ba\u011flant\u0131s\u0131 ve ortam ayarlar\u0131 gibi temel yap\u0131land\u0131rmalar\u0131 yapmam\u0131z gerekiyor.<\/p>\n<h4>Veritaban\u0131 Ba\u011flant\u0131s\u0131 (config\/datastores.js)<\/h4>\n<p>PostgreSQL ile ba\u011flant\u0131 kurmak i\u00e7in <code>config\/datastores.js<\/code> dosyas\u0131n\u0131 d\u00fczenlememiz gerekiyor.<br \/>\nNano veya Vim gibi bir metin d\u00fczenleyici ile dosyay\u0131 a\u00e7\u0131n:<\/p>\n<pre><code class=\"language-bash\">nano config\/datastores.js<\/code><\/pre>\n<p>Dosyan\u0131n i\u00e7eri\u011fini a\u015fa\u011f\u0131daki gibi g\u00fcncelleyin (mevcut <code>default<\/code> ba\u011flant\u0131s\u0131n\u0131 yorum sat\u0131r\u0131 yap\u0131p yenisini ekleyebilirsiniz):<\/p>\n<pre><code class=\"language-javascript\">module.exports.datastores = {\n  \/<strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\n  <em>                                                                          <\/em>\n  <em> Default datastore for models; used if a model doesn't explicitly specify <\/em>\n  <em> a <code>datastore<\/code>.                                                           <\/em>\n  <em>                                                                          <\/em>\n  <strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\/\n  \/\/ default: {\n  \/\/   adapter: 'sails-disk'\n  \/\/ },\n\n  productionPostgres: {\n    adapter: 'sails-postgresql',\n    url: 'postgresql:\/\/sails_user:guclu_sifreniz@localhost:5432\/sails_app_db',\n    \/\/ E\u011fer farkl\u0131 bir sunucuda ise 'localhost' yerine IP adresini veya alan ad\u0131n\u0131 yaz\u0131n\n    ssl: false \/\/ \u00dcretim ortam\u0131nda true yap\u0131p SSL sertifikas\u0131 kullanman\u0131z \u00f6nerilir\n  },\n\n  \/<strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\n  <em>                                                                          <\/em>\n  <em> More datastores may be configured as needed.                             <\/em>\n  <em> (For example, a new datastore for your production database, or a datastore <\/em>\n  <em> for an external API.)                                                    <\/em>\n  <em>                                                                          <\/em>\n  <strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\/\n\n};<\/code><\/pre>\n<p><strong>\u00d6nemli:<\/strong> <code>guclu_sifreniz<\/code> k\u0131sm\u0131n\u0131 kendi belirledi\u011finiz \u015fifreyle de\u011fi\u015ftirin. <code>sails-postgresql<\/code> adapt\u00f6r\u00fcn\u00fc kullanabilmek i\u00e7in projenize eklemeniz gerekmektedir:<\/p>\n<pre><code class=\"language-bash\">npm install sails-postgresql --save<\/code><\/pre>\n<h4>Ortam Ayarlar\u0131 (config\/env\/production.js)<\/h4>\n<p>Sails.js, farkl\u0131 ortamlar (geli\u015ftirme, \u00fcretim) i\u00e7in farkl\u0131 yap\u0131land\u0131rmalar yapman\u0131za olanak tan\u0131r. \u00dcretim ortam\u0131 i\u00e7in <code>config\/env\/production.js<\/code> dosyas\u0131n\u0131 d\u00fczenleyebiliriz. \u00d6zellikle <code>port<\/code> ayar\u0131n\u0131 ve varsay\u0131lan veritaban\u0131n\u0131 burada belirleyebiliriz.<\/p>\n<pre><code class=\"language-bash\">nano config\/env\/production.js<\/code><\/pre>\n<p>Dosyay\u0131 a\u015fa\u011f\u0131daki gibi d\u00fczenleyin:<\/p>\n<pre><code class=\"language-javascript\">\/<em><\/em>\n * Production environment settings\n *\n * This file can include shared settings for a development team,\n * as well as for the production environment.\n *\n * For more information, check out:\n * https:\/\/sailsjs.com\/docs\/concepts\/configuration\n *\/\n\nmodule.exports = {\n\n  \/<strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\n   <em> Set the default database connection for models.                         <\/em>\n   <strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\/\n  models: {\n    datastore: 'productionPostgres', \/\/ datastores.js dosyas\u0131nda tan\u0131mlad\u0131\u011f\u0131m\u0131z isim\n    migrate: 'alter', \/\/ 'safe' veya 'drop' da kullan\u0131labilir. 'alter' mevcut veriyi korur.\n  },\n\n  \/<strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\n   <em> Set the HTTP port for your server.                                      <\/em>\n   <strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\/\n  port: 1337, \/\/ Genellikle 80 veya 443 Nginx ile y\u00f6netilir, Sails.js i\u00e7in farkl\u0131 bir port kullan\u0131n\n\n  \/<strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\n   <em> Set the log level.                                                      <\/em>\n   <strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\/\n  log: {\n    level: 'info'\n  },\n\n  \/\/ CORS ayarlar\u0131 (g\u00fcvenlik i\u00e7in \u00f6zelle\u015ftirilmesi \u00f6nemli)\n  security: {\n    cors: {\n      allRoutes: true,\n      allowOrigins: ['https:\/\/example.com', 'https:\/\/www.example.com'], \/\/ Kendi alan ad\u0131n\u0131z\u0131 buraya ekleyin\n      allowCredentials: true,\n    }\n  },\n\n  \/\/ Di\u011fer \u00fcretim ortam\u0131 ayarlar\u0131...\n\n};<\/code><\/pre>\n<p><code>port: 1337<\/code> ayar\u0131, uygulaman\u0131z\u0131n hangi portta \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirtir. Genellikle Nginx gibi bir ters proxy kullanaca\u011f\u0131m\u0131z i\u00e7in bu portu do\u011frudan internete a\u00e7mayaca\u011f\u0131z. <code>allowOrigins<\/code> k\u0131sm\u0131n\u0131 kendi alan adlar\u0131n\u0131zla g\u00fcncellemeyi unutmay\u0131n. <code>models.migrate<\/code> ayar\u0131, veritaban\u0131 \u015femas\u0131n\u0131n model de\u011fi\u015fikliklerine g\u00f6re nas\u0131l y\u00f6netilece\u011fini belirler. \u00dcretim ortam\u0131nda genellikle <code>safe<\/code> veya <code>alter<\/code> tercih edilir.<\/p>\n<h3>Basit Bir API Olu\u015fturma (\u00d6rnek Uygulama)<\/h3>\n<p>\u015eimdi Sails.js&#8217;in g\u00fcc\u00fcn\u00fc g\u00f6stermek i\u00e7in basit bir kullan\u0131c\u0131 API&#8217;si olu\u015ftural\u0131m.<\/p>\n<h4>Model Olu\u015fturma<\/h4>\n<p>Bir <code>User<\/code> modeli olu\u015ftural\u0131m. Bu model, veritaban\u0131ndaki <code>users<\/code> tablosuna kar\u015f\u0131l\u0131k gelecektir.<\/p>\n<pre><code class=\"language-bash\">sails generate model User<\/code><\/pre>\n<p><code>api\/models\/User.js<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki gibi d\u00fczenleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ api\/models\/User.js\nmodule.exports = {\n  attributes: {\n    username: {\n      type: 'string',\n      required: true,\n      unique: true\n    },\n    email: {\n      type: 'string',\n      required: true,\n      unique: true,\n      isEmail: true\n    },\n    password: {\n      type: 'string',\n      required: true\n    },\n    \/\/ Di\u011fer kullan\u0131c\u0131 \u00f6zellikleri eklenebilir\n  },\n  \/\/ \u015eifre hashleme gibi ya\u015fam d\u00f6ng\u00fcs\u00fc metotlar\u0131 eklenebilir (\u00f6rne\u011fin beforeCreate)\n};<\/code><\/pre>\n<h4>Controller Olu\u015fturma<\/h4>\n<p><code>User<\/code> modeli i\u00e7in CRUD (Create, Read, Update, Delete) operasyonlar\u0131n\u0131 y\u00f6netecek bir kontrolc\u00fc olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-bash\">sails generate controller User<\/code><\/pre>\n<p><code>api\/controllers\/UserController.js<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve basit bir kullan\u0131c\u0131 olu\u015fturma ve listeleme eylemi ekleyelim:<\/p>\n<pre><code class=\"language-javascript\">\/\/ api\/controllers\/UserController.js\nmodule.exports = {\n\n  \/<em><\/em>\n   * <code>UserController.create()<\/code>\n   *\/\n  create: async function (req, res) {\n    try {\n      const newUser = await User.create(req.body).fetch();\n      return res.status(201).json(newUser);\n    } catch (err) {\n      return res.serverError(err);\n    }\n  },\n\n  \/<em><\/em>\n   * <code>UserController.find()<\/code>\n   *\/\n  find: async function (req, res) {\n    try {\n      const users = await User.find();\n      return res.ok(users);\n    } catch (err) {\n      return res.serverError(err);\n    }\n  },\n\n  \/<em><\/em>\n   * <code>UserController.findOne()<\/code>\n   *\/\n  findOne: async function (req, res) {\n    try {\n      const user = await User.findOne({ id: req.param('id') });\n      if (!user) {\n        return res.notFound('User not found.');\n      }\n      return res.ok(user);\n    } catch (err) {\n      return res.serverError(err);\n    }\n  },\n\n  \/\/ Di\u011fer CRUD eylemleri (update, delete) eklenebilir\n};<\/code><\/pre>\n<h4>Rota Tan\u0131mlama (config\/routes.js)<\/h4>\n<p>Olu\u015fturdu\u011fumuz eylemlere d\u0131\u015far\u0131dan eri\u015filebilmesi i\u00e7in rotalar\u0131 tan\u0131mlamam\u0131z gerekiyor. Sails.js, RESTful rotalar\u0131 otomatik olarak olu\u015fturabilir, ancak \u00f6zel rotalar da tan\u0131mlayabiliriz.<\/p>\n<pre><code class=\"language-bash\">nano config\/routes.js<\/code><\/pre>\n<p>Dosyay\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki rotalar\u0131 ekleyin:<\/p>\n<pre><code class=\"language-javascript\">\/\/ config\/routes.js\nmodule.exports.routes = {\n\n  \/<strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\n  <em>                                                                          <\/em>\n  <em> Make the view located at <code>views\/homepage.ejs<\/code> (or <code>views\/homepage.jade<\/code>, <\/em>\n  <em> etc. depending on your default view engine) your home page.              <\/em>\n  <em>                                                                          <\/em>\n  <em> (Alternatively, remove this and add an <code>index.html<\/code> file to your         <\/em>\n  <em> <code>assets<\/code> folder in order to serve static HTML content.)                  <\/em>\n  <em>                                                                          <\/em>\n  <strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\/\n\n  '\/': { view: 'pages\/homepage' }, \/\/ E\u011fer view kullanm\u0131yorsan\u0131z bu sat\u0131r\u0131 kald\u0131rabilirsiniz.\n\n  \/<strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\n  <em>                                                                          <\/em>\n  <em> Custom routes here...                                                    <\/em>\n  <em>                                                                          <\/em>\n  <em> If a request to a URL doesn't match any of the routes in this file, it   <\/em>\n  <em> is checked against \"shadow routes\" (also known as \"blueprint routes\").   <\/em>\n  <em> These are routes that are automatically generated by Sails to hook up    <\/em>\n  <em> your app's controllers and models to a RESTful API. For more info,       <\/em>\n  <em> see:                                                                     <\/em>\n  <em> https:\/\/sailsjs.com\/docs\/concepts\/routes\/shadow-routes                   <\/em>\n  <em>                                                                          <\/em>\n  <strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><strong><\/strong><em><\/em>*\/\n\n  \/\/ User API rotalar\u0131\n  'POST \/user': 'UserController.create',\n  'GET \/user': 'UserController.find',\n  'GET \/user\/:id': 'UserController.findOne',\n\n};<\/code><\/pre>\n<p>Sails.js&#8217;in &#8220;blueprint routes&#8221; \u00f6zelli\u011fi sayesinde, \u00f6zel bir rota tan\u0131mlamadan da <code>\/user<\/code> veya <code>\/user\/:id<\/code> gibi URL&#8217;lere eri\u015febilirsiniz. Ancak, kontrol \u00fczerinde daha fazla esneklik i\u00e7in \u00f6zel rotalar tan\u0131mlamak genellikle daha iyidir.<\/p>\n<h3>Uygulamay\u0131 Test Etme (VPS \u00dczerinde)<\/h3>\n<p>\u015eimdi uygulamam\u0131z\u0131 VPS \u00fczerinde \u00e7al\u0131\u015ft\u0131rma zaman\u0131.<\/p>\n<h4>Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme<\/h4>\n<p>Projenin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fckleyin:<\/p>\n<pre><code class=\"language-bash\">npm install<\/code><\/pre>\n<h4>Uygulamay\u0131 \u00c7al\u0131\u015ft\u0131rma (Geli\u015ftirme Modunda)<\/h4>\n<p>Uygulaman\u0131z\u0131 geli\u015ftirme modunda \u00e7al\u0131\u015ft\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">sails lift<\/code><\/pre>\n<p>Bu komut, uygulaman\u0131z\u0131 varsay\u0131lan olarak 1337 portunda ba\u015flatacakt\u0131r. <code>sails lift --prod<\/code> komutu ile \u00fcretim modunda \u00e7al\u0131\u015ft\u0131rabilirsiniz, ancak PM2 kullanaca\u011f\u0131m\u0131z i\u00e7in bu sadece test ama\u00e7l\u0131d\u0131r.<br \/>\nTaray\u0131c\u0131n\u0131zdan <code>http:\/\/VPS_IP_ADRES\u0130N\u0130Z:1337\/user<\/code> adresine giderek bir kullan\u0131c\u0131 listesi (\u015fu an bo\u015f) g\u00f6rebilirsiniz. Bir kullan\u0131c\u0131 olu\u015fturmak i\u00e7in Postman veya curl gibi bir ara\u00e7 kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">curl -X POST -H \"Content-Type: application\/json\" -d '{\"username\": \"testuser\", \"email\": \"test@example.com\", \"password\": \"password123\"}' http:\/\/VPS_IP_ADRES\u0130N\u0130Z:1337\/user<\/code><\/pre>\n<p>Ard\u0131ndan <code>http:\/\/VPS_IP_ADRES\u0130N\u0130Z:1337\/user<\/code> adresini tekrar kontrol ederek kullan\u0131c\u0131n\u0131n eklendi\u011fini g\u00f6rebilirsiniz.<\/p>\n<h3>Uygulamay\u0131 \u00dcretime Haz\u0131rlama ve Da\u011f\u0131tma<\/h3>\n<p>Geli\u015ftirme ortam\u0131nda testlerimizi tamamlad\u0131\u011f\u0131m\u0131za g\u00f6re, uygulamam\u0131z\u0131 \u00fcretim ortam\u0131na uygun \u015fekilde da\u011f\u0131tabiliriz.<\/p>\n<h4>PM2 ile Uygulamay\u0131 Y\u00f6netme<\/h4>\n<p>Uygulamay\u0131 PM2 ile ba\u015flatmak, uygulaman\u0131n s\u00fcrekli \u00e7al\u0131\u015fmas\u0131n\u0131, \u00e7\u00f6kmesi durumunda otomatik olarak yeniden ba\u015flat\u0131lmas\u0131n\u0131 ve CPU \u00e7ekirdeklerinden tam olarak yararlanmas\u0131n\u0131 sa\u011flar.<\/p>\n<pre><code class=\"language-bash\">cd \/var\/www\/my-sails-app\npm2 start app.js --name \"my-sails-app\" -- env production<\/code><\/pre>\n<p><code>--name<\/code> ile uygulamaya bir isim verilir. <code>--env production<\/code> ile Sails.js&#8217;in \u00fcretim modunda ba\u015flamas\u0131 sa\u011flan\u0131r.<br \/>\nPM2&#8217;nin uygulaman\u0131z\u0131 ba\u015far\u0131yla ba\u015flatt\u0131\u011f\u0131n\u0131 kontrol edin:<\/p>\n<pre><code class=\"language-bash\">pm2 list<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n durumunu ve loglar\u0131n\u0131 kontrol etmek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">pm2 status my-sails-app\npm2 logs my-sails-app<\/code><\/pre>\n<p>Uygulaman\u0131z\u0131n her sunucu yeniden ba\u015flatmas\u0131nda otomatik olarak ba\u015flamas\u0131n\u0131 sa\u011flamak i\u00e7in PM2&#8217;nin kaydetme \u00f6zelli\u011fini kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">pm2 save<\/code><\/pre>\n<h4>Nginx ile Ters Proxy ve SSL Yap\u0131land\u0131rmas\u0131<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n uygulaman\u0131za g\u00fcvenli ve standart HTTP\/HTTPS portlar\u0131 (80\/443) \u00fczerinden eri\u015fmesini sa\u011flamak i\u00e7in Nginx&#8217;i ters proxy olarak kullanaca\u011f\u0131z. Ayr\u0131ca Let&#8217;s Encrypt ile \u00fccretsiz SSL sertifikas\u0131 kurarak ba\u011flant\u0131y\u0131 \u015fifreleyece\u011fiz.<\/p>\n<p>1.  <strong>Nginx Kurulumu:<\/strong><\/p>\n<pre><code class=\"language-bash\">sudo apt install nginx -y\n    sudo ufw allow 'Nginx Full'\n    sudo ufw enable # E\u011fer daha \u00f6nce etkinle\u015ftirmediyseniz<\/code><\/pre>\n<p>2.  <strong>Nginx Yap\u0131land\u0131rma Dosyas\u0131 Olu\u015fturma:<\/strong><br \/>\n    Uygulaman\u0131z i\u00e7in Nginx&#8217;de yeni bir yap\u0131land\u0131rma dosyas\u0131 olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-bash\">sudo nano \/etc\/nginx\/sites-available\/my-sails-app<\/code><\/pre>\n<p>    Dosyan\u0131n i\u00e7ine a\u015fa\u011f\u0131daki i\u00e7eri\u011fi yap\u0131\u015ft\u0131r\u0131n (alan ad\u0131n\u0131z\u0131 ve Sails.js portunu g\u00fcncellemeyi unutmay\u0131n):<\/p>\n<pre><code class=\"language-nginx\">server {\n        listen 80;\n        listen [::]:80;\n\n        server_name your_domain.com www.your_domain.com; # Alan ad\u0131n\u0131z\u0131 buraya yaz\u0131n\n\n        location \/ {\n            proxy_pass http:\/\/localhost:1337; # Sails.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    }<\/code><\/pre>\n<p>    Bu yap\u0131land\u0131rma, t\u00fcm gelen HTTP isteklerini Sails.js uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 1337 portuna y\u00f6nlendirir.<\/p>\n<p>3.  <strong>Yap\u0131land\u0131rmay\u0131 Etkinle\u015ftirme:<\/strong><br \/>\n    Yap\u0131land\u0131rma dosyas\u0131n\u0131 <code>sites-enabled<\/code> dizinine ba\u011flayarak etkinle\u015ftirin ve Nginx&#8217;i yeniden ba\u015flat\u0131n.<\/p>\n<pre><code class=\"language-bash\">sudo ln -s \/etc\/nginx\/sites-available\/my-sails-app \/etc\/nginx\/sites-enabled\/\n    sudo nginx -t # Nginx yap\u0131land\u0131rma dosyas\u0131nda hata olup olmad\u0131\u011f\u0131n\u0131 kontrol et\n    sudo systemctl restart nginx<\/code><\/pre>\n<p>    \u015eimdi taray\u0131c\u0131n\u0131zdan <code>http:\/\/your_domain.com<\/code> adresine giderek uygulaman\u0131za eri\u015febiliyor olmal\u0131s\u0131n\u0131z.<\/p>\n<p>4.  <strong>Certbot ile SSL Kurulumu (HTTPS):<\/strong><br \/>\n    Uygulaman\u0131z\u0131 g\u00fcvence alt\u0131na almak i\u00e7in Let&#8217;s Encrypt&#8217;ten \u00fccretsiz bir SSL sertifikas\u0131 alal\u0131m.<\/p>\n<pre><code class=\"language-bash\">sudo apt install certbot python3-certbot-nginx -y\n    sudo certbot --nginx -d your_domain.com -d www.your_domain.com<\/code><\/pre>\n<p>    Certbot, Nginx yap\u0131land\u0131rman\u0131z\u0131 otomatik olarak g\u00fcncelleyecek ve SSL sertifikas\u0131n\u0131 kuracakt\u0131r. Sizden e-posta adresi ve hizmet \u015fartlar\u0131n\u0131 kabul etmeniz istenecektir. Sertifika otomatik olarak yenilenecek \u015fekilde ayarlanacakt\u0131r.<br \/>\n    \u015eimdi taray\u0131c\u0131n\u0131zdan <code>https:\/\/your_domain.com<\/code> adresine giderek uygulaman\u0131za g\u00fcvenli bir \u015fekilde eri\u015febiliyor olmal\u0131s\u0131n\u0131z.<\/p>\n<h3>S\u0131k Kar\u015f\u0131la\u015f\u0131lan Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>Uygulama da\u011f\u0131t\u0131m\u0131 s\u0131ras\u0131nda kar\u015f\u0131la\u015fabilece\u011finiz baz\u0131 yayg\u0131n sorunlar ve \u00e7\u00f6z\u00fcmleri:<\/p>\n<ul>\n<li><strong>Port \u00c7ak\u0131\u015fmalar\u0131:<\/strong><br \/>\n        *   <strong>Sorun:<\/strong> Sails.js veya ba\u015fka bir servis, zaten kullan\u0131mda olan bir portu kullanmaya \u00e7al\u0131\u015f\u0131yor.<br \/>\n        *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>sudo netstat -tulnp | grep <port_numaras\u0131><\/code> komutuyla portu kullanan s\u00fcreci bulun ve ya o s\u00fcreci durdurun ya da Sails.js uygulaman\u0131z\u0131n portunu de\u011fi\u015ftirin (<code>config\/env\/production.js<\/code>).<\/li>\n<li><strong>Veritaban\u0131 Ba\u011flant\u0131 Hatalar\u0131:<\/strong><br \/>\n        *   <strong>Sorun:<\/strong> <code>Unable to connect to database<\/code> veya benzeri bir hata.<br \/>\n        *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>config\/datastores.js<\/code> dosyas\u0131ndaki veritaban\u0131 bilgilerinizi (kullan\u0131c\u0131 ad\u0131, \u015fifre, host, port, veritaban\u0131 ad\u0131) kontrol edin. PostgreSQL servisinin \u00e7al\u0131\u015f\u0131p \u00e7al\u0131\u015fmad\u0131\u011f\u0131n\u0131 kontrol edin (<code>sudo systemctl status postgresql<\/code>). Kullan\u0131c\u0131 izinlerini ve veritaban\u0131 ad\u0131n\u0131 do\u011frulay\u0131n.<\/li>\n<li><strong>PM2 Uygulamas\u0131 Ba\u015flam\u0131yor:<\/strong><br \/>\n        *   <strong>Sorun:<\/strong> <code>pm2 list<\/code> komutunda uygulaman\u0131z\u0131n durumu <code>errored<\/code> veya <code>stopped<\/code>.<br \/>\n        *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>pm2 logs my-sails-app<\/code> komutuyla loglar\u0131 kontrol edin. Hata mesajlar\u0131 size sorunun ne oldu\u011fu hakk\u0131nda bilgi verecektir. Genellikle Node.js ba\u011f\u0131ml\u0131l\u0131klar\u0131 eksik olabilir (<code>npm install --production<\/code> \u00e7al\u0131\u015ft\u0131rmay\u0131 unutmay\u0131n) veya uygulama i\u00e7inde bir kod hatas\u0131 olabilir.<\/li>\n<li><strong>Nginx 502 Bad Gateway Hatas\u0131:<\/strong><br \/>\n        *   <strong>Sorun:<\/strong> Nginx, iste\u011fi Sails.js uygulamas\u0131na iletemiyor.<br \/>\n        *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Sails.js uygulaman\u0131z\u0131n PM2 ile \u00e7al\u0131\u015f\u0131r durumda oldu\u011fundan emin olun (<code>pm2 list<\/code>). Nginx yap\u0131land\u0131rman\u0131zdaki <code>proxy_pass<\/code> adresinin (<code>http:\/\/localhost:1337<\/code>) do\u011fru oldu\u011fundan ve Sails.js&#8217;in o portta \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olun. Nginx hata loglar\u0131n\u0131 kontrol edin (<code>sudo tail -f \/var\/log\/nginx\/error.log<\/code>).<\/li>\n<li><strong>Alan Ad\u0131 Y\u00f6nlendirme Sorunlar\u0131:<\/strong><br \/>\n        *   <strong>Sorun:<\/strong> Alan ad\u0131n\u0131z taray\u0131c\u0131da \u00e7al\u0131\u015fm\u0131yor.<br \/>\n        *   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Alan ad\u0131n\u0131z\u0131n DNS kay\u0131tlar\u0131n\u0131n (A kayd\u0131) VPS&#8217;inizin IP adresine do\u011fru \u015fekilde y\u00f6nlendirildi\u011finden emin olun. DNS de\u011fi\u015fikliklerinin yay\u0131lmas\u0131 biraz zaman alabilir (24-48 saat).<\/li>\n<\/ul>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu kapsaml\u0131 rehberde, Node.js ve Sails.js kullanarak bir web uygulamas\u0131n\u0131 Ubuntu VPS \u00fczerinde nas\u0131l olu\u015fturaca\u011f\u0131n\u0131z\u0131, yap\u0131land\u0131raca\u011f\u0131n\u0131z\u0131 ve da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m \u00f6\u011frendiniz. Node.js&#8217;in performans\u0131yla Sails.js&#8217;in geli\u015ftirme kolayl\u0131\u011f\u0131n\u0131 birle\u015ftirerek, g\u00fc\u00e7l\u00fc ve \u00f6l\u00e7eklenebilir uygulamalar geli\u015ftirmek art\u0131k sizin i\u00e7in daha eri\u015filebilir hale geldi.<\/p>\n<p>VPS&#8217;inizi g\u00fcncelledik, Node.js ve PM2 gibi temel ara\u00e7lar\u0131 kurduk. PostgreSQL veritaban\u0131n\u0131 yap\u0131land\u0131rd\u0131k ve Sails.js projemizi olu\u015fturarak basit bir API geli\u015ftirdik. Son olarak, Nginx&#8217;i ters proxy olarak kullanarak uygulaman\u0131z\u0131 g\u00fcvenli bir \u015fekilde internete a\u00e7t\u0131k ve Let&#8217;s Encrypt ile SSL sertifikas\u0131 kurarak HTTPS deste\u011fi sa\u011flad\u0131k.<\/p>\n<p>Art\u0131k kendi Sails.js uygulaman\u0131z\u0131 bir \u00fcretim ortam\u0131nda \u00e7al\u0131\u015ft\u0131rma yetene\u011fine sahipsiniz. Bu bilgi birikimiyle, daha karma\u015f\u0131k projeleri hayata ge\u00e7irebilir ve web geli\u015ftirme yolculu\u011funuzda yeni ufuklara yelken a\u00e7abilirsiniz. Unutmay\u0131n, s\u00fcrekli \u00f6\u011frenme ve pratik yapma, bu alandaki ba\u015far\u0131n\u0131n anahtar\u0131d\u0131r. \u0130yi geli\u015ftirmeler!<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi\nGiri\u015f: Node.js, Sails.js ve Neden Bir VPS?\nG\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de","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":[1468],"tags":[],"class_list":{"0":"post-38679","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-ubuntu","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>Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi - 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\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi\" \/>\n<meta property=\"og:description\" content=\"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi  Giri\u015f: Node.js, Sails.js ve Neden Bir VPS? G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-05T10:40:45+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=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi\",\"datePublished\":\"2026-02-05T10:40:45+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/\"},\"wordCount\":2486,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Ubuntu\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/\",\"name\":\"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-05T10:40:45+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi\"}]},{\"@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":"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi - 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\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi","og_description":"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi  Giri\u015f: Node.js, Sails.js ve Neden Bir VPS? G\u00fcn\u00fcm\u00fcz\u00fcn h\u0131zla de","og_url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-05T10:40:45+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi","datePublished":"2026-02-05T10:40:45+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/"},"wordCount":2486,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Ubuntu"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/","name":"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-05T10:40:45+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/ubuntu-vps-uzerinde-sails-js-kullanarak-node-js-uygulamasi-olusturma-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Ubuntu VPS \u00dczerinde Sails.js Kullanarak Node.js Uygulamas\u0131 Olu\u015fturma Rehberi"}]},{"@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\/38679","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=38679"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38679\/revisions"}],"predecessor-version":[{"id":38680,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/38679\/revisions\/38680"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=38679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=38679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=38679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}