{"id":39473,"date":"2026-02-22T08:40:55","date_gmt":"2026-02-22T05:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=39473"},"modified":"2026-02-22T08:40:55","modified_gmt":"2026-02-22T05:40:55","slug":"salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/","title":{"rendered":"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma"},"content":{"rendered":"<h2>Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma<\/h2>\n<p><body><\/p>\n<h3>Giri\u015f: Salt Cloud ve Altyap\u0131 Otomasyonu<\/h3>\n<p>Modern bulut tabanl\u0131 uygulamalar\u0131n da\u011f\u0131t\u0131m\u0131 ve y\u00f6netimi, giderek karma\u015f\u0131kla\u015fan bir s\u00fcre\u00e7 haline gelmi\u015ftir. Geleneksel manuel y\u00f6ntemler, h\u0131zl\u0131 \u00f6l\u00e7eklenme ve tutarl\u0131l\u0131k gereksinimlerini kar\u015f\u0131lamakta yetersiz kalmaktad\u0131r. \u0130\u015fte bu noktada SaltStack gibi g\u00fc\u00e7l\u00fc konfig\u00fcrasyon y\u00f6netimi ve otomasyon ara\u00e7lar\u0131 devreye girer. SaltStack, sunucu konfig\u00fcrasyonunu, uygulama da\u011f\u0131t\u0131m\u0131n\u0131 ve altyap\u0131 y\u00f6netimini merkezile\u015ftirilmi\u015f ve deklaratif bir yakla\u015f\u0131mla otomatikle\u015ftirmeyi sa\u011flar.<\/p>\n<p>Salt Cloud, SaltStack ekosisteminin \u00f6nemli bir par\u00e7as\u0131d\u0131r ve bulut sa\u011flay\u0131c\u0131lar (AWS, Azure, GCP, VMware, OpenStack vb.) \u00fczerinde sanal makinelerin (VM) veya konteynerlerin programatik olarak olu\u015fturulmas\u0131n\u0131, y\u00f6netilmesini ve yok edilmesini sa\u011flar. Salt Cloud ile, altyap\u0131n\u0131z\u0131 kod olarak tan\u0131mlayabilir (Infrastructure as Code &#8211; IaC) ve bu sayede da\u011f\u0131t\u0131mlar\u0131 tekrarlanabilir, tutarl\u0131 ve hatas\u0131z hale getirebilirsiniz.<\/p>\n<p>Bu makalede, Salt Cloud&#8217;un &#8220;harita dosyalar\u0131&#8221; (map files) \u00f6zelli\u011fini kullanarak birden fazla uygulama sunucusu ve bu sunuculara gelen trafi\u011fi y\u00f6netecek bir Nginx ters proxy&#8217;nin nas\u0131l da\u011f\u0131t\u0131laca\u011f\u0131n\u0131 ayr\u0131nt\u0131l\u0131 olarak inceleyece\u011fiz. Amac\u0131m\u0131z, hem sunucular\u0131n bulutta otomatik olarak provision edilmesini hem de bu sunucular\u0131n SaltStack state&#8217;leri (durum dosyalar\u0131) arac\u0131l\u0131\u011f\u0131yla otomatik olarak yap\u0131land\u0131r\u0131lmas\u0131n\u0131 sa\u011flamakt\u0131r.<\/p>\n<h3>Salt Cloud Harita Dosyalar\u0131 Nedir ve Neden Kullan\u0131l\u0131r?<\/h3>\n<p>Salt Cloud harita dosyalar\u0131, da\u011f\u0131tmak istedi\u011finiz t\u00fcm bulut kaynaklar\u0131n\u0131 (sanal makineler) ve bunlar\u0131n \u00f6zelliklerini (profil, minion ID, Salt Grains, Pillar verileri vb.) tek bir YAML dosyas\u0131nda tan\u0131mlaman\u0131za olanak tan\u0131r. Bu dosyalar, Salt Cloud&#8217;a hangi sunucular\u0131n hangi bulut sa\u011flay\u0131c\u0131da, hangi \u00f6zelliklerle ve hangi Salt minion ID&#8217;leriyle olu\u015fturulaca\u011f\u0131n\u0131 bildirir.<\/p>\n<p>Harita dosyalar\u0131n\u0131 kullanman\u0131n ba\u015fl\u0131ca faydalar\u0131 \u015funlard\u0131r:<\/p>\n<p>*   <strong>Deklaratif Tan\u0131mlama:<\/strong> Da\u011f\u0131tmak istedi\u011finiz altyap\u0131y\u0131 &#8220;ne&#8221; istedi\u011finizi belirterek tan\u0131mlars\u0131n\u0131z, &#8220;nas\u0131l&#8221; yap\u0131laca\u011f\u0131n\u0131 de\u011fil. Salt Cloud gerisini halleder.<br \/>\n*   <strong>Tekrarlanabilirlik ve Tutarl\u0131l\u0131k:<\/strong> Bir kez tan\u0131mlad\u0131\u011f\u0131n\u0131z bir harita dosyas\u0131, ayn\u0131 altyap\u0131y\u0131 defalarca ve her seferinde ayn\u0131 \u015fekilde olu\u015fturman\u0131z\u0131 sa\u011flar. Bu, geli\u015ftirme, test ve \u00fcretim ortamlar\u0131 aras\u0131nda tutarl\u0131l\u0131\u011f\u0131 garanti eder.<br \/>\n*   <strong>S\u00fcr\u00fcm Kontrol\u00fc:<\/strong> Harita dosyalar\u0131 metin tabanl\u0131 oldu\u011fu i\u00e7in Git gibi s\u00fcr\u00fcm kontrol sistemleriyle kolayca y\u00f6netilebilir. Bu, altyap\u0131 de\u011fi\u015fikliklerini izlemeyi, geri almay\u0131 ve i\u015fbirli\u011fi yapmay\u0131 m\u00fcmk\u00fcn k\u0131lar.<br \/>\n*   <strong>Karma\u015f\u0131k Da\u011f\u0131t\u0131mlar\u0131 Basitle\u015ftirme:<\/strong> Birden fazla sunucu t\u00fcr\u00fcn\u00fc, farkl\u0131 konfig\u00fcrasyonlarla ve farkl\u0131 bulut sa\u011flay\u0131c\u0131larda tek bir komutla da\u011f\u0131tmak i\u00e7in kullan\u0131labilir.<br \/>\n*   <strong>Altyap\u0131 Kod Olarak (IaC):<\/strong> Altyap\u0131n\u0131z\u0131 kod olarak y\u00f6neterek otomasyonu, verimlili\u011fi ve hata oran\u0131n\u0131 art\u0131r\u0131rs\u0131n\u0131z.<\/p>\n<h3>\u00d6n Ko\u015fullar ve Kurulum<\/h3>\n<p>Bu makaledeki \u00f6rnekleri takip edebilmek i\u00e7in baz\u0131 \u00f6n ko\u015fullar\u0131n yerine getirilmi\u015f olmas\u0131 gerekmektedir:<\/p>\n<p>1.  <strong>Salt Master Kurulumu:<\/strong> Bir Salt Master sunucusunun kurulu ve \u00e7al\u0131\u015f\u0131r durumda olmas\u0131 gerekir. Bu sunucu, Salt minion&#8217;lar\u0131 y\u00f6netecek ve Salt Cloud komutlar\u0131n\u0131 \u00e7al\u0131\u015ft\u0131racakt\u0131r.<br \/>\n2.  <strong>Salt Cloud Kurulumu ve Yap\u0131land\u0131rmas\u0131:<\/strong> Salt Master \u00fczerinde Salt Cloud bile\u015feninin kurulu olmas\u0131 ve kullan\u0131lacak bulut sa\u011flay\u0131c\u0131s\u0131 (\u00f6rne\u011fin AWS EC2) i\u00e7in gerekli kimlik bilgilerinin ve yap\u0131land\u0131rmalar\u0131n yap\u0131lm\u0131\u015f olmas\u0131 gerekmektedir.<br \/>\n    *   <code>cloud.providers.d\/<\/code> dizini alt\u0131nda bulut sa\u011flay\u0131c\u0131s\u0131 yap\u0131land\u0131rma dosyalar\u0131 (\u00f6rne\u011fin <code>aws.conf<\/code>).<br \/>\n    *   <code>cloud.profiles.d\/<\/code> dizini alt\u0131nda sunucu profili tan\u0131mlama dosyalar\u0131 (\u00f6rne\u011fin <code>app_server.conf<\/code>, <code>nginx_proxy.conf<\/code>).<br \/>\n3.  <strong>Bulut Sa\u011flay\u0131c\u0131 Kimlik Bilgileri:<\/strong> Se\u00e7ti\u011finiz bulut sa\u011flay\u0131c\u0131s\u0131 i\u00e7in API eri\u015fim anahtarlar\u0131 ve ilgili yetkilendirmeler Salt Cloud taraf\u0131ndan eri\u015filebilir olmal\u0131d\u0131r.<br \/>\n4.  <strong>Temel Salt State (SLS) Dosyalar\u0131:<\/strong> Uygulama sunucular\u0131n\u0131 ve Nginx ters proxy&#8217;yi yap\u0131land\u0131rmak i\u00e7in Salt State dosyalar\u0131na ihtiyac\u0131m\u0131z olacak.<\/p>\n<p>Bu makalede \u00f6rnek olarak AWS EC2 kullan\u0131lacakt\u0131r, ancak kavramlar di\u011fer bulut sa\u011flay\u0131c\u0131lar\u0131 i\u00e7in de benzerdir.<\/p>\n<h3>Da\u011f\u0131t\u0131m Mimarisi Tasar\u0131m\u0131<\/h3>\n<p>Hedefimiz, a\u015fa\u011f\u0131daki bile\u015fenlere sahip bir altyap\u0131 olu\u015fturmakt\u0131r:<\/p>\n<p>*   <strong>Uygulama Sunucular\u0131 (App Servers):<\/strong> Birden fazla \u00f6rnekten olu\u015facak, uygulaman\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 sunucular. Bu sunucular genellikle ayn\u0131 konfig\u00fcrasyona sahiptir ve bir ters proxy taraf\u0131ndan eri\u015filir.<br \/>\n*   <strong>Nginx Ters Proxy (Nginx Reverse Proxy):<\/strong> Tek bir \u00f6rnekten olu\u015facak (basitlik ad\u0131na), gelen HTTP\/HTTPS isteklerini uygulama sunucular\u0131na y\u00f6nlendiren sunucu. Nginx, uygulama sunucular\u0131n\u0131n IP adreslerini bilmeli ve trafi\u011fi dengelemelidir.<\/p>\n<p>Bu mimaride, uygulama sunucular\u0131 do\u011frudan internete a\u00e7\u0131k olmayacak, sadece Nginx ters proxy&#8217;den gelen isteklere yan\u0131t verecektir. Nginx ise belirli portlardan (\u00f6rn. 80, 443) gelen istekleri dinleyecektir.<\/p>\n<h3>Salt Cloud Sa\u011flay\u0131c\u0131lar\u0131 ve Profilleri Yap\u0131land\u0131rma<\/h3>\n<p>\u0130lk ad\u0131m, Salt Cloud&#8217;un bulut sa\u011flay\u0131c\u0131n\u0131zla ileti\u015fim kurabilmesi i\u00e7in gerekli yap\u0131land\u0131rmay\u0131 yapmakt\u0131r. Ard\u0131ndan, da\u011f\u0131taca\u011f\u0131m\u0131z sunucu tipleri i\u00e7in profiller tan\u0131mlayaca\u011f\u0131z.<\/p>\n<h4>Sa\u011flay\u0131c\u0131 Yap\u0131land\u0131rmas\u0131 (\u00d6rnek: AWS EC2)<\/h4>\n<p><code>\/etc\/salt\/cloud.providers.d\/aws.conf<\/code> dosyas\u0131 \u015f\u00f6yle g\u00f6r\u00fcnebilir:<\/p>\n<pre><code class=\"language-yaml\">aws_ec2_provider:\n  driver: ec2\n  id: <AWS_ACCESS_KEY_ID>\n  key: <AWS_SECRET_ACCESS_KEY>\n  region: eu-central-1 # Frankfurt\n  securitygroup: my-security-group # \u00d6nceden olu\u015fturulmu\u015f bir g\u00fcvenlik grubu\n  ssh_username: ec2-user # SSH kullan\u0131c\u0131 ad\u0131\n  location: eu-central-1\n  sudo: True\n  minion:\n    master: <SALT_MASTER_IP_ADRESI><\/code><\/pre>\n<p><code><AWS_ACCESS_KEY_ID><\/code>, <code><AWS_SECRET_ACCESS_KEY><\/code> ve <code><SALT_MASTER_IP_ADRESI><\/code> kendi de\u011ferlerinizle de\u011fi\u015ftirilmelidir. <code>my-security-group<\/code> ise EC2 instance&#8217;lar\u0131n\u0131n hangi portlardan eri\u015filebilir olaca\u011f\u0131n\u0131 belirleyen bir AWS g\u00fcvenlik grubudur.<\/p>\n<h4>Profil Tan\u0131mlamalar\u0131<\/h4>\n<p>Profiller, belirli bir sanal makine t\u00fcr\u00fcn\u00fcn \u00f6zelliklerini (AMI, boyut, disk, g\u00fcvenlik grubu vb.) tan\u0131mlar.<\/p>\n<p><strong>Uygulama Sunucusu Profili (<code>\/etc\/salt\/cloud.profiles.d\/app_server_profile.conf<\/code>):<\/strong><\/p>\n<pre><code class=\"language-yaml\">app_server_profile:\n  provider: aws_ec2_provider\n  image: ami-0abcdef1234567890 # Ubuntu 20.04 LTS veya benzeri bir AMI ID\n  size: t2.micro\n  del_blob_on_destroy: False\n  minion:\n    grains:\n      role: app_server<\/code><\/pre>\n<p>Burada <code>ami-0abcdef1234567890<\/code> yerine kulland\u0131\u011f\u0131n\u0131z AWS b\u00f6lgesindeki uygun bir AMI kimli\u011fini girmelisiniz. <code>t2.micro<\/code> \u00f6rnek boyutunu belirtir. <code>minion<\/code> alt\u0131ndaki <code>grains<\/code> tan\u0131m\u0131, Salt minion&#8217;\u0131na <code>role: app_server<\/code> ad\u0131nda bir grain atar. Bu grain, daha sonra Salt State&#8217;lerini hedeflemek i\u00e7in kullan\u0131lacakt\u0131r.<\/p>\n<p><strong>Nginx Ters Proxy Profili (<code>\/etc\/salt\/cloud.profiles.d\/nginx_proxy_profile.conf<\/code>):<\/strong><\/p>\n<pre><code class=\"language-yaml\">nginx_proxy_profile:\n  provider: aws_ec2_provider\n  image: ami-0abcdef1234567890 # Ayn\u0131 veya farkl\u0131 bir AMI ID\n  size: t2.micro\n  del_blob_on_destroy: False\n  minion:\n    grains:\n      role: nginx_proxy<\/code><\/pre>\n<p>Nginx proxy i\u00e7in de benzer bir profil tan\u0131ml\u0131yoruz, ancak <code>role<\/code> grain&#8217;i <code>nginx_proxy<\/code> olarak ayarlanm\u0131\u015ft\u0131r.<\/p>\n<h3>Salt State (SLS) Dosyalar\u0131n\u0131 Olu\u015fturma<\/h3>\n<p>\u015eimdi, Salt Cloud taraf\u0131ndan olu\u015fturulan sunucular\u0131n nas\u0131l yap\u0131land\u0131r\u0131laca\u011f\u0131n\u0131 tan\u0131mlayan Salt State dosyalar\u0131n\u0131 haz\u0131rlayal\u0131m. Bu dosyalar, <code>\/srv\/salt\/<\/code> dizini alt\u0131nda bulunmal\u0131d\u0131r.<\/p>\n<h4>Uygulama Sunucusu State&#8217;leri (<code>\/srv\/salt\/app\/init.sls<\/code>)<\/h4>\n<p>Bu \u00f6rnekte basit bir Python uygulamas\u0131n\u0131 da\u011f\u0131tt\u0131\u011f\u0131m\u0131z\u0131 varsayal\u0131m.<\/p>\n<pre><code class=\"language-yaml\"># \/srv\/salt\/app\/init.sls\ninstall_python_deps:\n  pkg.installed:\n    - pkgs:\n      - python3\n      - python3-pip\n      - git\n\nclone_app_repo:\n  git.latest:\n    - name: https:\/\/github.com\/myuser\/my-python-app.git\n    - target: \/opt\/my-python-app\n    - rev: master\n    - require:\n      - pkg: install_python_deps\n\ninstall_app_deps:\n  pip.installed:\n    - requirements: \/opt\/my-python-app\/requirements.txt\n    - bin_env: \/usr\/bin\/pip3\n    - require:\n      - git: clone_app_repo\n\napp_service:\n  file.managed:\n    - name: \/etc\/systemd\/system\/my-app.service\n    - source: salt:\/\/app\/my-app.service\n    - template: jinja\n    - defaults:\n        app_port: 5000 # Uygulaman\u0131n dinleyece\u011fi port\n    - require:\n      - pip: install_app_deps\n  service.running:\n    - name: my-app\n    - enable: True\n    - watch:\n      - file: app_service\n\n<h2>Uygulaman\u0131n \u00f6zel IP adresini Salt Mine'a yay\u0131nla<\/h2>\npublish_private_ip:\n  mine.present:\n    - func: network.ip_addrs\n    - listen_addrs: True # Sadece dinlenen adresleri yay\u0131nla\n    - key: app_private_ip<\/code><\/pre>\n<p><code>\/srv\/salt\/app\/my-app.service<\/code> (systemd service dosyas\u0131):<\/p>\n<pre><code class=\"language-jinja\">[Unit]\nDescription=My Python Application\nAfter=network.target\n\n[Service]\nUser=root\nWorkingDirectory=\/opt\/my-python-app\nExecStart=\/usr\/bin\/python3 \/opt\/my-python-app\/app.py --port {{ app_port }}\nRestart=always\n\n[Install]\nWantedBy=multi-user.target<\/code><\/pre>\n<p>Bu state dosyas\u0131 \u015funlar\u0131 yapar: Python ve Git&#8217;i kurar, uygulama kodunu bir Git deposundan \u00e7eker, Python ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurar, uygulaman\u0131n systemd servisini yap\u0131land\u0131r\u0131r ve ba\u015flat\u0131r. En \u00f6nemlisi, minion&#8217;\u0131n \u00f6zel IP adresini Salt Mine&#8217;a <code>app_private_ip<\/code> anahtar\u0131yla yay\u0131nlar. Bu, Nginx&#8217;in uygulama sunucular\u0131n\u0131n IP&#8217;lerini dinamik olarak \u00f6\u011frenmesini sa\u011flayacakt\u0131r.<\/p>\n<h4>Nginx Ters Proxy State&#8217;leri (<code>\/srv\/salt\/nginx\/init.sls<\/code>)<\/h4>\n<pre><code class=\"language-yaml\"># \/srv\/salt\/nginx\/init.sls\ninstall_nginx:\n  pkg.installed:\n    - name: nginx\n\nnginx_config:\n  file.managed:\n    - name: \/etc\/nginx\/sites-available\/my-app.conf\n    - source: salt:\/\/nginx\/my-app.conf.jinja\n    - template: jinja\n    - defaults:\n        app_servers: {{ salt['mine.get']('role:app_server', 'app_private_ip', tgt_type='grain') | unique | join(',') }}\n    - require:\n      - pkg: install_nginx\n  file.symlink:\n    - name: \/etc\/nginx\/sites-enabled\/my-app.conf\n    - target: \/etc\/nginx\/sites-available\/my-app.conf\n    - force: True\n    - require:\n      - file: nginx_config\n\nnginx_service:\n  service.running:\n    - name: nginx\n    - enable: True\n    - watch:\n      - file: nginx_config<\/code><\/pre>\n<p><code>\/srv\/salt\/nginx\/my-app.conf.jinja<\/code> (Nginx yap\u0131land\u0131rma \u015fablonu):<\/p>\n<pre><code class=\"language-jinja\">upstream backend_app {\n    {% for server_ip in app_servers.split(',') %}\n    server {{ server_ip }}:5000;\n    {% endfor %}\n}\n\nserver {\n    listen 80;\n    server_name myapp.example.com;\n\n    location \/ {\n        proxy_pass http:\/\/backend_app;\n        proxy_set_header Host $host;\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>Nginx state dosyas\u0131 \u015funlar\u0131 yapar: Nginx paketini kurar, Nginx yap\u0131land\u0131rma dosyas\u0131n\u0131 (Jinja \u015fablonu kullanarak) olu\u015fturur ve sembolik ba\u011f\u0131n\u0131 kurar, ard\u0131ndan Nginx servisini ba\u015flat\u0131r.<\/p>\n<p>Buradaki kritik nokta, <code>nginx_config<\/code> state&#8217;indeki <code>defaults<\/code> b\u00f6l\u00fcm\u00fcd\u00fcr:<br \/>\n<code>app_servers: {{ salt['mine.get']('role:app_server', 'app_private_ip', tgt_type='grain') | unique | join(',') }}<\/code><\/p>\n<p>Bu ifade, Salt Mine&#8217;dan <code>role:app_server<\/code> grain&#8217;ine sahip t\u00fcm minion&#8217;lar\u0131n <code>app_private_ip<\/code> anahtar\u0131 alt\u0131nda yay\u0131nlad\u0131\u011f\u0131 de\u011ferleri (yani \u00f6zel IP adreslerini) \u00e7eker. <code>unique<\/code> filtresi tekrarlayan IP&#8217;leri kald\u0131r\u0131r ve <code>join(',')<\/code> bunlar\u0131 virg\u00fclle ayr\u0131lm\u0131\u015f bir dizeye d\u00f6n\u00fc\u015ft\u00fcr\u00fcr. Bu dize daha sonra Nginx yap\u0131land\u0131rma \u015fablonunda <code>backend_app<\/code> upstream blo\u011funda kullan\u0131l\u0131r, b\u00f6ylece Nginx dinamik olarak uygulama sunucular\u0131n\u0131n IP adreslerini bilir.<\/p>\n<p><strong>\u00d6nemli Not:<\/strong> Salt Mine verilerinin g\u00fcncel olmas\u0131 i\u00e7in, uygulama sunucular\u0131na <code>mine.present<\/code> state&#8217;i uyguland\u0131ktan sonra Nginx minion&#8217;\u0131nda <code>saltutil.refresh_mine<\/code> veya <code>saltutil.sync_all<\/code> gibi komutlar \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gerekebilir, ya da Nginx state&#8217;i uygulanmadan \u00f6nce yeterli zaman tan\u0131nmal\u0131d\u0131r. Daha robust bir yakla\u015f\u0131m i\u00e7in bir Salt Orchestration runner kullan\u0131labilir.<\/p>\n<h3>Salt Cloud Harita Dosyas\u0131n\u0131 Haz\u0131rlama<\/h3>\n<p>\u015eimdi, t\u00fcm bu par\u00e7alar\u0131 bir araya getiren Salt Cloud harita dosyas\u0131n\u0131 olu\u015ftural\u0131m. Bu dosya, <code>map_file.map<\/code> ad\u0131yla kaydedilebilir.<\/p>\n<pre><code class=\"language-yaml\"># map_file.map\napp_servers:\n  - app-server-01:\n      profile: app_server_profile\n  - app-server-02:\n      profile: app_server_profile\n  - app-server-03:\n      profile: app_server_profile\n\nnginx_proxy:\n  - nginx-proxy-01:\n      profile: nginx_proxy_profile<\/code><\/pre>\n<p>Bu harita dosyas\u0131 \u015funlar\u0131 tan\u0131mlar:<br \/>\n*   <code>app_servers<\/code> grubu alt\u0131nda \u00fc\u00e7 adet <code>app-server-XX<\/code> isminde minion olu\u015fturulacak ve hepsi <code>app_server_profile<\/code> profilini kullanacak.<br \/>\n*   <code>nginx_proxy<\/code> grubu alt\u0131nda bir adet <code>nginx-proxy-01<\/code> isminde minion olu\u015fturulacak ve <code>nginx_proxy_profile<\/code> profilini kullanacak.<\/p>\n<p>Salt Cloud, bu tan\u0131mlamalar\u0131 kullanarak her bir minion&#8217;\u0131 bulut sa\u011flay\u0131c\u0131n\u0131zda ba\u015flatacak, Salt minion yaz\u0131l\u0131m\u0131n\u0131 kuracak ve Salt Master&#8217;a ba\u011flayacakt\u0131r. Minion&#8217;lar Salt Master&#8217;a ba\u011fland\u0131\u011f\u0131nda, profillerinde tan\u0131mlanan <code>grains<\/code> de\u011ferleri otomatik olarak atanacakt\u0131r.<\/p>\n<h3>Harita Dosyas\u0131 ile Da\u011f\u0131t\u0131m Yapma<\/h3>\n<p>Harita dosyas\u0131n\u0131 kullanarak sunucular\u0131 da\u011f\u0131tmak i\u00e7in Salt Master \u00fczerinde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">salt-cloud -m map_file.map<\/code><\/pre>\n<p>Bu komut, harita dosyas\u0131ndaki tan\u0131mlamalara g\u00f6re t\u00fcm sanal makineleri bulutta olu\u015fturmaya ba\u015flayacakt\u0131r. \u0130\u015flem tamamland\u0131\u011f\u0131nda, Salt Master&#8217;\u0131n\u0131z\u0131n <code>salt-key -L<\/code> \u00e7\u0131kt\u0131s\u0131nda yeni minion&#8217;lar\u0131 g\u00f6receksiniz (e\u011fer otomatik kabul ayarlanm\u0131\u015fsa).<\/p>\n<h3>Da\u011f\u0131t\u0131m Sonras\u0131 Konfig\u00fcrasyon (Orchestration ile)<\/h3>\n<p>Sunucular provision edildikten ve Salt Master&#8217;a ba\u011fland\u0131ktan sonra, Salt State&#8217;lerini uygulayarak onlar\u0131 yap\u0131land\u0131rmam\u0131z gerekir. Bu ad\u0131mlar genellikle bir orkestrasyon (orchestration) state&#8217;i ile otomatikle\u015ftirilir. Ancak basitlik ad\u0131na, ayr\u0131 ayr\u0131 komutlarla g\u00f6sterebiliriz.<\/p>\n<p>1.  <strong>Uygulama Sunucular\u0131n\u0131 Yap\u0131land\u0131rma:<\/strong><br \/>\n    T\u00fcm <code>app_server<\/code> rol\u00fcne sahip minion&#8217;lara <code>app<\/code> state&#8217;ini uygulay\u0131n:<\/p>\n<pre><code class=\"language-bash\">salt -G 'role:app_server' state.apply app<\/code><\/pre>\n<p>    Bu komut, uygulama sunucular\u0131na Python, Git ve uygulaman\u0131z\u0131 kuracak, systemd servisini ayarlayacak ve en \u00f6nemlisi minion&#8217;lar\u0131n \u00f6zel IP adreslerini Salt Mine&#8217;a yay\u0131nlayacakt\u0131r.<\/p>\n<p>2.  <strong>Salt Mine&#8217;\u0131 G\u00fcncelleme (Nginx i\u00e7in):<\/strong><br \/>\n    Nginx minion&#8217;\u0131n\u0131n, uygulama sunucular\u0131n\u0131n yeni IP adreslerini Salt Mine&#8217;dan \u00e7ekebilmesi i\u00e7in Mine verilerinin g\u00fcncel olmas\u0131 gerekir. Nginx minion&#8217;\u0131nda Mine&#8217;\u0131 yenilemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">salt 'nginx-proxy-01' saltutil.refresh_mine<\/code><\/pre>\n<p>    Veya t\u00fcm minion&#8217;larda Mine&#8217;\u0131 yenilemek i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">salt '*' saltutil.refresh_mine<\/code><\/pre>\n<p>    Bu ad\u0131m, Nginx minion&#8217;\u0131n\u0131n Salt Mine&#8217;dan en g\u00fcncel uygulama sunucusu IP&#8217;lerini almas\u0131n\u0131 sa\u011flar.<\/p>\n<p>3.  <strong>Nginx Ters Proxy&#8217;yi Yap\u0131land\u0131rma:<\/strong><br \/>\n    <code>nginx_proxy<\/code> rol\u00fcne sahip minion&#8217;a <code>nginx<\/code> state&#8217;ini uygulay\u0131n:<\/p>\n<pre><code class=\"language-bash\">salt -G 'role:nginx_proxy' state.apply nginx<\/code><\/pre>\n<p>    Bu komut Nginx&#8217;i kuracak ve Salt Mine&#8217;dan ald\u0131\u011f\u0131 uygulama sunucusu IP&#8217;lerini kullanarak <code>my-app.conf<\/code> dosyas\u0131n\u0131 olu\u015fturup Nginx&#8217;i ba\u015flatacakt\u0131r.<\/p>\n<p>Bu ad\u0131mlar tamamland\u0131\u011f\u0131nda, Nginx ters proxy&#8217;niz uygulama sunucular\u0131n\u0131za gelen istekleri y\u00f6nlendirmeye haz\u0131r olacakt\u0131r.<\/p>\n<h4>Geli\u015fmi\u015f Orkestrasyon (Salt Orchestration)<\/h4>\n<p>Yukar\u0131daki ad\u0131mlar\u0131 tek bir komutla \u00e7al\u0131\u015ft\u0131rmak i\u00e7in Salt Orchestration kullanmak daha iyi bir yakla\u015f\u0131md\u0131r. <code>\/srv\/salt\/orchestrate\/deploy_app.sls<\/code> gibi bir dosya olu\u015fturabilirsiniz:<\/p>\n<pre><code class=\"language-yaml\"># \/srv\/salt\/orchestrate\/deploy_app.sls\ndeploy_app_servers:\n  salt.runner:\n    - name: cloud.map\n    - map: \/etc\/salt\/cloud.maps.d\/map_file.map # Harita dosyan\u0131z\u0131n yolu\n\nconfigure_app_servers:\n  salt.state:\n    - tgt: 'role:app_server'\n    - fun: state.apply\n    - arg:\n      - app\n    - require:\n      - salt: deploy_app_servers\n\nrefresh_all_mines:\n  salt.function:\n    - name: saltutil.refresh_mine\n    - tgt: '*' # T\u00fcm minion'larda mine'\u0131 yenile\n    - require:\n      - salt: configure_app_servers\n\nconfigure_nginx_proxy:\n  salt.state:\n    - tgt: 'role:nginx_proxy'\n    - fun: state.apply\n    - arg:\n      - nginx\n    - require:\n      - salt: refresh_all_mines<\/code><\/pre>\n<p>Bu orkestrasyon state&#8217;ini \u00e7al\u0131\u015ft\u0131rmak i\u00e7in:<\/p>\n<pre><code class=\"language-bash\">salt-run state.orchestrate orchestrate.deploy_app<\/code><\/pre>\n<p>Bu tek komut, t\u00fcm da\u011f\u0131t\u0131m ve yap\u0131land\u0131rma s\u00fcrecini s\u0131rayla ve otomatik olarak ger\u00e7ekle\u015ftirecektir.<\/p>\n<h3>Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanman\u0131n Faydalar\u0131<\/h3>\n<p>Bu s\u00fcre\u00e7, Salt Cloud harita dosyalar\u0131n\u0131n ve SaltStack&#8217;in genel yeteneklerinin sundu\u011fu bir\u00e7ok avantaj\u0131 ortaya koymaktad\u0131r:<\/p>\n<p>*   <strong>H\u0131zl\u0131 ve Otomatik Da\u011f\u0131t\u0131m:<\/strong> Altyap\u0131 ve uygulama da\u011f\u0131t\u0131m\u0131 saatler yerine dakikalar i\u00e7inde tamamlanabilir.<\/p>\n","protected":false},"excerpt":{"rendered":"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma\nGiri\u015f: Salt Cloud ve Altyap\u0131 Otomasyonu\nModern bul","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":[1504],"tags":[],"class_list":{"0":"post-39473","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-nginx","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>Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma - 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\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma\" \/>\n<meta property=\"og:description\" content=\"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma  Giri\u015f: Salt Cloud ve Altyap\u0131 Otomasyonu Modern bul\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-02-22T05:40:55+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=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma\",\"datePublished\":\"2026-02-22T05:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/\"},\"wordCount\":1752,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Nginx\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/\",\"name\":\"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-02-22T05:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma\"}]},{\"@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":"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma - 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\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/","og_locale":"tr_TR","og_type":"article","og_title":"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma","og_description":"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma  Giri\u015f: Salt Cloud ve Altyap\u0131 Otomasyonu Modern bul","og_url":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-02-22T05:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma","datePublished":"2026-02-22T05:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/"},"wordCount":1752,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Nginx"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/","url":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/","name":"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-02-22T05:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/salt-cloud-harita-dosyalarini-kullanarak-uygulama-sunuculari-ve-nginx-ters-proxy-dagitma\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Salt Cloud Harita Dosyalar\u0131n\u0131 Kullanarak Uygulama Sunucular\u0131 ve Nginx Ters Proxy Da\u011f\u0131tma"}]},{"@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\/39473","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=39473"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39473\/revisions"}],"predecessor-version":[{"id":39474,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/39473\/revisions\/39474"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=39473"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=39473"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=39473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}