{"id":41289,"date":"2026-03-24T17:01:46","date_gmt":"2026-03-24T14:01:46","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=41289"},"modified":"2026-03-24T17:01:46","modified_gmt":"2026-03-24T14:01:46","slug":"giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/","title":{"rendered":"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f"},"content":{"rendered":"<p><body><\/p>\n<h2>Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f<\/h2>\n<p>Modern web geli\u015ftirme s\u00fcre\u00e7lerinde, uygulamalar\u0131n sunuculara h\u0131zl\u0131, tutarl\u0131 ve hatas\u0131z bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik \u00f6neme sahiptir. Manuel da\u011f\u0131t\u0131m s\u00fcre\u00e7leri zaman al\u0131c\u0131, hataya a\u00e7\u0131k ve tekrarlanabilirli\u011fi d\u00fc\u015f\u00fckt\u00fcr. \u00d6zellikle birden fazla PHP uygulamas\u0131n\u0131 tek bir sunucuya veya birden fazla sunucuya da\u011f\u0131tmak gerekti\u011finde bu sorunlar daha da belirginle\u015fir. \u0130\u015fte tam bu noktada Ansible gibi otomasyon ara\u00e7lar\u0131 devreye girer.<\/p>\n<p>Bu rehberde, Ansible kullanarak Ubuntu 14.04 i\u015fletim sistemine sahip bir sunucuya birden fazla PHP uygulamas\u0131n\u0131 nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Ubuntu 14.04 eski bir s\u00fcr\u00fcm olmas\u0131na ra\u011fmen, Ansible&#8217;\u0131n temel prensipleri ve rol tabanl\u0131 yakla\u015f\u0131m\u0131 bu platformda da sorunsuz bir \u015fekilde uygulanabilir. Odak noktam\u0131z, farkl\u0131 PHP uygulamalar\u0131n\u0131n (farkl\u0131 veritabanlar\u0131, farkl\u0131 Git depolar\u0131, farkl\u0131 alan adlar\u0131 vb.) tek bir Ansible projesi i\u00e7inde nas\u0131l y\u00f6netilece\u011fi ve da\u011f\u0131t\u0131laca\u011f\u0131 olacak.<\/p>\n<h3>Neden Ansible?<\/h3>\n<ul>\n<li><b>Idempotans (Tekrarlanabilirlik):<\/b> Ansible, bir g\u00f6revi birden fazla kez \u00e7al\u0131\u015ft\u0131rsan\u0131z bile sistemin ayn\u0131 durumda kalmas\u0131n\u0131 sa\u011flar. Bu, yap\u0131land\u0131rma hatalar\u0131n\u0131 azalt\u0131r.<\/li>\n<li><b>Agent-less (Ajan Olmayan):<\/b> Hedef sunucularda herhangi bir \u00f6zel yaz\u0131l\u0131m (ajan) kurulmas\u0131na gerek yoktur. Sadece SSH ve Python yeterlidir.<\/li>\n<li><b>Basit ve Okunabilir:<\/b> YAML tabanl\u0131 s\u00f6zdizimi sayesinde \u00f6\u011frenmesi ve kullanmas\u0131 kolayd\u0131r.<\/li>\n<li><b>Mod\u00fcler ve Geni\u015fletilebilir:<\/b> Rol ve g\u00f6rev yap\u0131s\u0131 sayesinde kod par\u00e7ac\u0131klar\u0131 yeniden kullan\u0131labilir ve kolayca geni\u015fletilebilir.<\/li>\n<li><b>\u00c7oklu Uygulama Deste\u011fi:<\/b> De\u011fi\u015fken y\u00f6netimi ve rol yap\u0131s\u0131 sayesinde farkl\u0131 uygulamalar\u0131n farkl\u0131 gereksinimleri tek bir proje i\u00e7inde y\u00f6netilebilir.<\/li>\n<\/ul>\n<h2>\u00d6n Gereksinimler ve Ortam Kurulumu<\/h2>\n<p>Ba\u015flamadan \u00f6nce, Ansible kontrol makinenizde ve hedef sunucunuzda baz\u0131 temel kurulumlar\u0131 yapman\u0131z gerekmektedir.<\/p>\n<h3>1. Ansible Kontrol Makinesi Kurulumu<\/h3>\n<p>Ansible&#8217;\u0131 \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z makine (genellikle kendi geli\u015ftirme makineniz veya bir CI\/CD sunucusu) kontrol makinesi olacakt\u0131r. Bu makinede Python ve Ansible y\u00fckl\u00fc olmal\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\"># Python 3 ve pip kurulumu (e\u011fer y\u00fckl\u00fc de\u011filse)\nsudo apt update\nsudo apt install python3 python3-pip\n\n<h2>Ansible kurulumu<\/h2>\npip3 install ansible\n\n<h2>Ansible versiyonunu kontrol edin<\/h2>\nansible --version\n<\/code><\/pre>\n<h3>2. Hedef Sunucu (Ubuntu 14.04) Haz\u0131rl\u0131\u011f\u0131<\/h3>\n<p>Hedef sunucu (Ubuntu 14.04) \u00fczerinde SSH eri\u015fimine ve sudo yetkisine sahip bir kullan\u0131c\u0131ya ihtiyac\u0131n\u0131z var. Ayr\u0131ca, Ansible&#8217;\u0131n \u00e7al\u0131\u015fmas\u0131 i\u00e7in Python&#8217;un y\u00fckl\u00fc olmas\u0131 gerekir. Ubuntu 14.04&#8217;te Python 2.7 genellikle \u00f6ntan\u0131ml\u0131 olarak gelir, bu da Ansible i\u00e7in yeterlidir. Ancak, Python 3&#8217;\u00fc de kurmak iyi bir pratiktir.<\/p>\n<pre><code class=\"language-bash\"># Hedef sunucuya SSH ile ba\u011flan\u0131n ve Python'u kontrol edin\nssh your_user@your_server_ip\npython --version # Python 2.7.x olmal\u0131\nsudo apt-get update\nsudo apt-get install -y python-apt # Ansible i\u00e7in gerekli olabilir\nexit\n<\/code><\/pre>\n<h3>3. SSH Anahtarlar\u0131 ile Parolas\u0131z Eri\u015fim<\/h3>\n<p>Ansible&#8217;\u0131n sorunsuz \u00e7al\u0131\u015fmas\u0131 i\u00e7in kontrol makinenizden hedef sunucuya parolas\u0131z SSH eri\u015fimi kurman\u0131z \u015fartt\u0131r. E\u011fer yoksa, bir SSH anahtar \u00e7ifti olu\u015fturun ve genel anahtar\u0131n\u0131z\u0131 hedef sunucuya kopyalay\u0131n.<\/p>\n<pre><code class=\"language-bash\"># Kontrol makinesinde\nssh-keygen -t rsa -b 4096 # E\u011fer anahtar\u0131n\u0131z yoksa\nssh-copy-id your_user@your_server_ip\n<\/code><\/pre>\n<h2>Ansible Proje Yap\u0131s\u0131 ve Envanter Y\u00f6netimi<\/h2>\n<p>Birden fazla uygulama da\u011f\u0131t\u0131rken, iyi organize edilmi\u015f bir Ansible proje yap\u0131s\u0131 ve de\u011fi\u015fken y\u00f6netimi hayati \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>1. Proje Dizini Olu\u015fturma<\/h3>\n<p>T\u00fcm Ansible dosyalar\u0131n\u0131z\u0131 i\u00e7eren bir ana dizin olu\u015fturun:<\/p>\n<pre><code class=\"language-bash\">mkdir ansible-php-apps\ncd ansible-php-apps\n<\/code><\/pre>\n<h3>2. Envanter Dosyas\u0131 (<code>inventory.ini<\/code>)<\/h3>\n<p>Hedef sunucular\u0131n\u0131z\u0131 ve gruplar\u0131n\u0131z\u0131 tan\u0131mlad\u0131\u011f\u0131n\u0131z dosyad\u0131r. Birden fazla sunucuya da\u011f\u0131t\u0131m yapacaksan\u0131z, her sunucuyu buraya ekleyebilirsiniz. Bu rehberde tek bir sunucuya odaklan\u0131yoruz.<\/p>\n<pre><code class=\"language-ini\"># inventory.ini\n[webservers]\nyour_server_ip ansible_user=your_user ansible_ssh_private_key_file=~\/.ssh\/id_rsa\n<\/code><\/pre>\n<p><code>your_server_ip<\/code> yerine sunucunuzun IP adresini veya alan ad\u0131n\u0131, <code>your_user<\/code> yerine SSH kullan\u0131c\u0131 ad\u0131n\u0131z\u0131 ve <code>ansible_ssh_private_key_file<\/code> yerine \u00f6zel anahtar\u0131n\u0131z\u0131n yolunu yaz\u0131n.<\/p>\n<h3>3. Ana Playbook (<code>site.yml<\/code> veya <code>playbook.yml<\/code>)<\/h3>\n<p>T\u00fcm rolleri ve g\u00f6revleri bir araya getiren ana Ansible oyun kitab\u0131n\u0131zd\u0131r.<\/p>\n<pre><code class=\"language-yaml\"># playbook.yml\n---\n- name: Multiple PHP Applications Deployment\n  hosts: webservers\n  become: yes # G\u00f6revleri sudo yetkisiyle \u00e7al\u0131\u015ft\u0131r\n  roles:\n    - common\n    - apache\n    - php\n    - mysql\n    - app_deploy # Bu rol uygulamaya \u00f6zel da\u011f\u0131t\u0131m\u0131 y\u00f6netecek\n<\/code><\/pre>\n<h3>4. De\u011fi\u015fken Y\u00f6netimi (<code>group_vars<\/code> ve <code>host_vars<\/code>)<\/h3>\n<p>Bu, birden fazla uygulama da\u011f\u0131t\u0131m\u0131n\u0131n kalbidir. Uygulamaya \u00f6zel ayarlar\u0131 (veritaban\u0131 ad\u0131, Git deposu, alan ad\u0131 vb.) bu dosyalarda tan\u0131mlayaca\u011f\u0131z.<\/p>\n<h4><code>group_vars\/all.yml<\/code><\/h4>\n<p>T\u00fcm sunucular i\u00e7in ge\u00e7erli genel de\u011fi\u015fkenler.<\/p>\n<pre><code class=\"language-yaml\"># group_vars\/all.yml\n---\n<h2>Genel sistem ayarlar\u0131<\/h2>\nsystem_packages:\n  - vim\n  - git\n  - curl\n  - unzip\n\n<h2>Apache ayarlar\u0131<\/h2>\napache_port: 80\napache_modules:\n  - rewrite\n  - php5 # Ubuntu 14.04 i\u00e7in mod_php5\n\n<h2>PHP ayarlar\u0131 (Ubuntu 14.04 i\u00e7in PHP 5.x)<\/h2>\nphp_version: \"5.5\" # Veya 5.6\nphp_packages:\n  - php5\n  - php5-mysql\n  - php5-cli\n  - libapache2-mod-php5\n\n<h2>MySQL root \u015fifresi (ilk kurulumda ayarlanacak)<\/h2>\nmysql_root_password: \"your_mysql_root_password\"\n\n<h2>Uygulama listesi - Buras\u0131 birden fazla uygulamay\u0131 tan\u0131mlad\u0131\u011f\u0131m\u0131z yer!<\/h2>\napplications:\n  - name: my_first_app\n    domain: firstapp.example.com\n    repo: \"https:\/\/github.com\/your-org\/my_first_app.git\"\n    db_name: first_app_db\n    db_user: first_app_user\n    db_password: \"secure_password_for_app1\"\n    doc_root: \/var\/www\/html\/my_first_app\/public # Uygulaman\u0131n public dizini\n\n  - name: my_second_app\n    domain: secondapp.example.com\n    repo: \"https:\/\/github.com\/your-org\/my_second_app.git\"\n    db_name: second_app_db\n    db_user: second_app_user\n    db_password: \"another_secure_password_for_app2\"\n    doc_root: \/var\/www\/html\/my_second_app\/web # Uygulaman\u0131n public dizini\n<\/code><\/pre>\n<p><code>applications<\/code> listesi, da\u011f\u0131t\u0131lacak her bir PHP uygulamas\u0131n\u0131 tan\u0131mlar. Her uygulama i\u00e7in benzersiz ad, alan ad\u0131, Git deposu, veritaban\u0131 bilgileri ve dok\u00fcman k\u00f6k dizini belirtilmi\u015ftir. Bu listeyi geni\u015fleterek istedi\u011finiz kadar uygulama ekleyebilirsiniz.<\/p>\n<h2>Ansible Rollerinin Olu\u015fturulmas\u0131 ve Uygulama Da\u011f\u0131t\u0131m\u0131<\/h2>\n<p>\u015eimdi, ana playbook&#8217;umuzda belirtilen rolleri olu\u015ftural\u0131m. Her rol, belirli bir hizmetin veya g\u00f6revin kurulumunu ve yap\u0131land\u0131rmas\u0131n\u0131 y\u00f6netecek.<\/p>\n<h3>1. <code>common<\/code> Rol\u00fc: Temel Sistem Ayarlar\u0131<\/h3>\n<p>Bu rol, sunucunun temel paketlerini kurar ve g\u00fcvenlik duvar\u0131n\u0131 yap\u0131land\u0131r\u0131r.<\/p>\n<pre><code class=\"language-bash\">mkdir -p roles\/common\/tasks\n<\/code><\/pre>\n<pre><code class=\"language-yaml\"># roles\/common\/tasks\/main.yml\n---\n- name: Update apt cache\n  apt:\n    update_cache: yes\n    cache_valid_time: 3600\n\n- name: Install common packages\n  apt:\n    name: \"{{ item }}\"\n    state: present\n  loop: \"{{ system_packages }}\"\n\n- name: Configure UFW firewall\n  community.general.ufw:\n    rule: allow\n    port: \"{{ apache_port }}\"\n    proto: tcp\n\n- name: Enable UFW firewall\n  community.general.ufw:\n    state: enabled\n    policy: deny\n<\/code><\/pre>\n<h3>2. <code>apache<\/code> Rol\u00fc: Web Sunucusu Kurulumu<\/h3>\n<p>Apache2&#8217;yi kurar, gerekli mod\u00fclleri etkinle\u015ftirir ve uygulamalar i\u00e7in sanal ana bilgisayar yap\u0131land\u0131rmas\u0131n\u0131 y\u00f6netir.<\/p>\n<pre><code class=\"language-bash\">mkdir -p roles\/apache\/{tasks,templates}\n<\/code><\/pre>\n<pre><code class=\"language-yaml\"># roles\/apache\/tasks\/main.yml\n---\n- name: Install Apache2\n  apt:\n    name: apache2\n    state: present\n\n- name: Enable Apache modules\n  apache2_module:\n    state: present\n    name: \"{{ item }}\"\n  loop: \"{{ apache_modules }}\"\n  notify: Restart apache\n\n- name: Ensure Apache is running and enabled\n  service:\n    name: apache2\n    state: started\n    enabled: yes\n\n- name: Remove default Apache virtual host\n  file:\n    path: \/etc\/apache2\/sites-enabled\/000-default.conf\n    state: absent\n  notify: Restart apache\n\n<h2>Uygulamaya \u00f6zel sanal ana bilgisayarlar app_deploy rol\u00fcnde olu\u015fturulacak<\/h2>\n<\/code><\/pre>\n<pre><code class=\"language-yaml\"># roles\/apache\/handlers\/main.yml\n---\n- name: Restart apache\n  service:\n    name: apache2\n    state: restarted\n<\/code><\/pre>\n<h3>3. <code>php<\/code> Rol\u00fc: PHP Kurulumu<\/h3>\n<p>PHP 5.x ve gerekli eklentileri y\u00fckler.<\/p>\n<pre><code class=\"language-bash\">mkdir -p roles\/php\/tasks\n<\/code><\/pre>\n<pre><code class=\"language-yaml\"># roles\/php\/tasks\/main.yml\n---\n- name: Install PHP packages for Apache (Ubuntu 14.04)\n  apt:\n    name: \"{{ item }}\"\n    state: present\n  loop: \"{{ php_packages }}\"\n  notify: Restart apache\n\n- name: Configure PHP settings (optional, example: memory_limit)\n  lineinfile:\n    path: \/etc\/php5\/apache2\/php.ini\n    regexp: '^memory_limit ='\n    line: 'memory_limit = 256M'\n    state: present\n  notify: Restart apache\n<\/code><\/pre>\n<h3>4. <code>mysql<\/code> Rol\u00fc: Veritaban\u0131 Sunucusu ve Uygulama Veritabanlar\u0131<\/h3>\n<p>MySQL sunucusunu kurar ve her uygulama i\u00e7in ayr\u0131 veritaban\u0131 ve kullan\u0131c\u0131 olu\u015fturur.<\/p>\n<pre><code class=\"language-bash\">mkdir -p roles\/mysql\/tasks\n<\/code><\/pre>\n<pre><code class=\"language-yaml\"># roles\/mysql\/tasks\/main.yml\n---\n- name: Install MySQL server\n  apt:\n    name: mysql-server\n    state: present\n\n- name: Set MySQL root password\n  mysql_user:\n    name: root\n    password: \"{{ mysql_root_password }}\"\n    host: \"{{ item }}\"\n    login_user: root\n    login_password: \"{{ mysql_root_password }}\" # E\u011fer ilk kurulum ise bu sat\u0131r olmayacak, sonraki \u00e7al\u0131\u015ft\u0131rmalar i\u00e7in gerekli.\n    check_implicit_admin: yes # Bu, ilk kurulumda root \u015fifresi ayarlan\u0131rken yard\u0131mc\u0131 olur.\n  loop:\n    - localhost\n    - 127.0.0.1\n    - ::1\n\n- name: Create MySQL databases for applications\n  mysql_db:\n    name: \"{{ item.db_name }}\"\n    state: present\n    login_user: root\n    login_password: \"{{ mysql_root_password }}\"\n  loop: \"{{ applications }}\"\n\n- name: Create MySQL users and grant privileges for applications\n  mysql_user:\n    name: \"{{ item.db_user }}\"\n    password: \"{{ item.db_password }}\"\n    host: \"localhost\"\n    priv: \"{{ item.db_name }}.*:ALL\"\n    state: present\n    login_user: root\n    login_password: \"{{ mysql_root_password }}\"\n  loop: \"{{ applications }}\"\n<\/code><\/pre>\n<h3>5. <code>app_deploy<\/code> Rol\u00fc: Uygulamaya \u00d6zel Da\u011f\u0131t\u0131m<\/h3>\n<p>Bu rol, <code>group_vars\/all.yml<\/code> dosyas\u0131ndaki <code>applications<\/code> listesini kullanarak her bir PHP uygulamas\u0131n\u0131 da\u011f\u0131t\u0131r. Bu, \u00e7oklu uygulama da\u011f\u0131t\u0131m\u0131n\u0131n anahtar noktas\u0131d\u0131r.<\/p>\n<pre><code class=\"language-bash\">mkdir -p roles\/app_deploy\/{tasks,templates}\n<\/code><\/pre>\n<pre><code class=\"language-yaml\"># roles\/app_deploy\/tasks\/main.yml\n---\n- name: Deploy each PHP application\n  loop: \"{{ applications }}\"\n  loop_control:\n    loop_var: current_app\n  block:\n    - name: Ensure application directory exists for {{ current_app.name }}\n      file:\n        path: \"\/var\/www\/html\/{{ current_app.name }}\"\n        state: directory\n        owner: www-data\n        group: www-data\n        mode: '0755'\n\n    - name: Clone or update Git repository for {{ current_app.name }}\n      git:\n        repo: \"{{ current_app.repo }}\"\n        dest: \"\/var\/www\/html\/{{ current_app.name }}\"\n        version: master # Veya belirli bir branch\/tag\n        force: yes # Gerekirse de\u011fi\u015fiklikleri \u00fczerine yazar\n      # Sadece ilk da\u011f\u0131t\u0131mda veya repo g\u00fcncellendi\u011finde \u00e7al\u0131\u015ft\u0131r\u0131labilir\n      # register: git_result\n\n    - name: Ensure correct permissions for {{ current_app.name }}\n      file:\n        path: \"\/var\/www\/html\/{{ current_app.name }}\"\n        state: directory\n        recurse: yes\n        owner: www-data\n        group: www-data\n        mode: '0755'\n\n    - name: Copy Apache virtual host config for {{ current_app.name }}\n      template:\n        src: vhost.conf.j2\n        dest: \"\/etc\/apache2\/sites-available\/{{ current_app.name }}.conf\"\n      notify: Restart apache\n\n    - name: Enable Apache virtual host for {{ current_app.name }}\n      apache2_module:\n        state: present\n        name: \"{{ current_app.name }}.conf\"\n      notify: Restart apache\n\n    - name: (Optional) Install Composer dependencies for {{ current_app.name }}\n      community.general.composer:\n        command: install\n        working_dir: \"\/var\/www\/html\/{{ current_app.name }}\"\n      args:\n        chdir: \"\/var\/www\/html\/{{ current_app.name }}\"\n      when: \"'composer.json' in (ansible_facts.fs_files | default([]) | map(attribute='path') | list)\" # Basit bir kontrol\n      # Bu kontrol Ubuntu 14.04'te <code>ansible_facts.fs_files<\/code> olmayabilir, daha basit bir <code>stat<\/code> mod\u00fcl\u00fc kullan\u0131labilir.\n      # Alternatif olarak, <code>stat<\/code> mod\u00fcl\u00fc ile <code>composer.json<\/code> dosyas\u0131n\u0131n varl\u0131\u011f\u0131n\u0131 kontrol edebilirsiniz.\n      # - name: Check if composer.json exists\n      #   stat:\n      #     path: \"\/var\/www\/html\/{{ current_app.name }}\/composer.json\"\n      #   register: composer_json_stat\n      # - name: Install Composer dependencies if composer.json exists\n      #   command: composer install\n      #   args:\n      #     chdir: \"\/var\/www\/html\/{{ current_app.name }}\"\n      #   when: composer_json_stat.stat.exists\n<\/code><\/pre>\n<p>Bu roldeki <code>loop: \"{{ applications }}\"<\/code> sat\u0131r\u0131, <code>group_vars\/all.yml<\/code> dosyas\u0131ndaki her bir uygulama tan\u0131m\u0131 i\u00e7in a\u015fa\u011f\u0131daki g\u00f6rev blo\u011funu \u00e7al\u0131\u015ft\u0131r\u0131r. <code>current_app<\/code> de\u011fi\u015fkeni, d\u00f6ng\u00fcn\u00fcn mevcut uygulamas\u0131n\u0131n bilgilerini i\u00e7erir.<\/p>\n<pre><code class=\"language-jinja\"># roles\/app_deploy\/templates\/vhost.conf.j2\n<VirtualHost *:{{ apache_port }}>\n    ServerAdmin webmaster@localhost\n    ServerName {{ current_app.domain }}\n    DocumentRoot {{ current_app.doc_root }}\n\n    <Directory {{ current_app.doc_root }}>\n        Options Indexes FollowSymLinks\n        AllowOverride All\n        Require all granted\n    <\/Directory>\n\n    ErrorLog ${APACHE_LOG_DIR}}\/{{ current_app.name }}-error.log\n    CustomLog ${APACHE_LOG_DIR}}\/{{ current_app.name }}-access.log combined\n<\/VirtualHost>\n<\/code><\/pre>\n<h2>Ansible Playbook&#8217;unu \u00c7al\u0131\u015ft\u0131rma ve Do\u011frulama<\/h2>\n<p>T\u00fcm rolleri ve yap\u0131land\u0131rmalar\u0131 olu\u015fturduktan sonra, Ansible playbook&#8217;unu \u00e7al\u0131\u015ft\u0131rmaya haz\u0131rs\u0131n\u0131z. Ana proje dizininizde oldu\u011funuzdan emin olun (<code>ansible-php-apps<\/code>).<\/p>\n<h3>1. Playbook&#8217;u \u00c7al\u0131\u015ft\u0131rma<\/h3>\n<pre><code class=\"language-bash\">ansible-playbook -i inventory.ini playbook.yml\n<\/code><\/pre>\n<p>Bu komut, <code>inventory.ini<\/code> dosyas\u0131ndaki sunucular \u00fczerinde <code>playbook.yml<\/code> dosyas\u0131nda tan\u0131mlanan t\u00fcm rolleri \u00e7al\u0131\u015ft\u0131racakt\u0131r. \u0130lk \u00e7al\u0131\u015ft\u0131rmada bir\u00e7ok de\u011fi\u015fiklik (paket kurulumu, yap\u0131land\u0131rma) g\u00f6receksiniz. Sonraki \u00e7al\u0131\u015ft\u0131rmalarda, sistem zaten istenen durumda oldu\u011fu i\u00e7in &#8220;changed&#8221; yerine &#8220;ok&#8221; veya &#8220;skipped&#8221; g\u00f6revler g\u00f6receksiniz.<\/p>\n<h3>2. Da\u011f\u0131t\u0131m\u0131 Do\u011frulama<\/h3>\n<p>Playbook ba\u015far\u0131yla tamamland\u0131ktan sonra, uygulamalar\u0131n\u0131z\u0131n d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 do\u011frulamak i\u00e7in a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izleyin:<\/p>\n<ol>\n<li><b>SSH ile Sunucuya Ba\u011flan\u0131n:<\/b> Uygulama dizinlerinin ve yap\u0131land\u0131rma dosyalar\u0131n\u0131n varl\u0131\u011f\u0131n\u0131 kontrol edin.\n<pre><code class=\"language-bash\">ssh your_user@your_server_ip\nls -l \/var\/www\/html\/my_first_app\nls -l \/etc\/apache2\/sites-available\/my_first_app.conf\n<\/code><\/pre>\n<\/li>\n<li><b>Veritabanlar\u0131n\u0131 Kontrol Edin:<\/b> MySQL&#8217;e ba\u011flanarak veritabanlar\u0131n\u0131n ve kullan\u0131c\u0131lar\u0131n olu\u015fturuldu\u011funu do\u011frulay\u0131n.\n<pre><code class=\"language-bash\">mysql -u root -p\n<h2>password: your_mysql_root_password<\/h2>\nSHOW DATABASES;\nUSE first_app_db;\nSHOW TABLES; # E\u011fer uygulaman\u0131z\u0131n veritaban\u0131nda tablolar varsa\n<\/code><\/pre>\n<\/li>\n<li><b>Taray\u0131c\u0131dan Uygulamalara Eri\u015fim:<\/b> <code>\/etc\/hosts<\/code> dosyan\u0131za veya DNS sa\u011flay\u0131c\u0131n\u0131za sunucunuzun IP adresini ve tan\u0131mlad\u0131\u011f\u0131n\u0131z alan adlar\u0131n\u0131 ekleyerek taray\u0131c\u0131n\u0131zdan uygulamalara eri\u015fmeyi deneyin.\n<pre><code class=\"language-bash\"># Kontrol makinenizde \/etc\/hosts dosyas\u0131na ekleyin (Linux\/macOS)\n<h2>veya C:\\Windows\\System32\\drivers\\etc\\hosts (Windows)<\/h2>\nyour_server_ip firstapp.example.com secondapp.example.com\n<\/code><\/pre>\n<p>        Daha sonra taray\u0131c\u0131n\u0131zda <code>http:\/\/firstapp.example.com<\/code> ve <code>http:\/\/secondapp.example.com<\/code> adreslerini ziyaret edin.<\/li>\n<\/ol>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<p>Bu rehberde, Ansible&#8217;\u0131n rol tabanl\u0131 yap\u0131s\u0131n\u0131 ve de\u011fi\u015fken y\u00f6netimini kullanarak Ubuntu 14.04 sunucusuna birden fazla PHP uygulamas\u0131n\u0131 nas\u0131l da\u011f\u0131taca\u011f\u0131n\u0131z\u0131 \u00f6\u011frendiniz. Bu yakla\u015f\u0131m, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerinizi otomatikle\u015ftirmenize, tutarl\u0131l\u0131\u011f\u0131 sa\u011flaman\u0131za ve zaman i\u00e7inde bak\u0131m\u0131 kolayla\u015ft\u0131rman\u0131za olanak tan\u0131r. Uygulama say\u0131n\u0131z artt\u0131k\u00e7a veya sunucu altyap\u0131n\u0131z geni\u015fledik\u00e7e bu otomasyonun faydalar\u0131 daha da belirginle\u015fecektir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<p><b>S1: Ubuntu 14.04 yerine daha yeni bir Ubuntu s\u00fcr\u00fcm\u00fcnde (\u00f6rn. 20.04, 22.04) bu rehberi kullanabilir miyim?<\/b><br \/>\n<b>C1:<\/b> Evet, temel Ansible prensipleri ayn\u0131 kalacakt\u0131r. Ancak, paket isimleri ve PHP versiyonlar\u0131 de\u011fi\u015fecektir. \u00d6rne\u011fin, <code>php5<\/code> yerine <code>php<\/code>, <code>php5-mysql<\/code> yerine <code>php-mysql<\/code> veya <code>php-fpm<\/code> kullanman\u0131z gerekebilir. Apache mod\u00fclleri i\u00e7in de <code>mod_php5<\/code> yerine <code>mod_php<\/code> veya PHP-FPM ile \u00e7al\u0131\u015fmak i\u00e7in farkl\u0131 yap\u0131land\u0131rmalar gerekebilir.<\/p>\n<p><b>S2: Apache yerine Nginx kullanmak istersem ne yapmal\u0131y\u0131m?<\/b><br \/>\n<b>C2:<\/b> <code>apache<\/code> rol\u00fcn\u00fc tamamen kald\u0131r\u0131p yerine bir <code>nginx<\/code> rol\u00fc olu\u015fturman\u0131z gerekir. Bu rol Nginx&#8217;i kurar, PHP-FPM&#8217;i yap\u0131land\u0131r\u0131r ve her uygulama i\u00e7in Nginx sunucu blo\u011fu (virtual host e\u015fde\u011feri) \u015fablonlar\u0131 olu\u015fturur. <code>php<\/code> rol\u00fcn\u00fcz\u00fcn de PHP-FPM&#8217;i kurdu\u011fundan emin olman\u0131z gerekir.<\/p>\n<p><b>S3: Veritaban\u0131 sunucusu ayr\u0131 bir makinede olursa ne yapmal\u0131y\u0131m?<\/b><br \/>\n<b>C3:<\/b> <code>inventory.ini<\/code> dosyan\u0131zda ayr\u0131 bir <code>[dbservers]<\/code> grubu tan\u0131mlayabilir ve <code>mysql<\/code> rol\u00fcn\u00fc sadece bu gruba uygulayabilirsiniz. Uygulamalar\u0131n veritaban\u0131 ba\u011flant\u0131 bilgilerini g\u00fcncellemeyi unutmay\u0131n (<code>localhost<\/code> yerine veritaban\u0131 sunucusunun IP adresi veya alan ad\u0131).<\/p>\n<p><b>S4: Farkl\u0131 uygulamalar i\u00e7in farkl\u0131 PHP versiyonlar\u0131 kullanabilir miyim?<\/b><br \/>\n<b>C4:<\/b> Bu daha karma\u015f\u0131k bir senaryodur. Genellikle PHP-FPM havuzlar\u0131n\u0131 kullanarak ve her uygulama i\u00e7in farkl\u0131 bir PHP-FPM havuzu yap\u0131land\u0131rarak (\u00f6rne\u011fin, PHP 7.4 i\u00e7in bir havuz, PHP 8.1 i\u00e7in ba\u015fka bir havuz) bunu ba\u015farabilirsiniz. Apache veya Nginx sanal ana bilgisayar yap\u0131land\u0131rmalar\u0131n\u0131 da buna g\u00f6re ayarlaman\u0131z gerekir. Bu rehberin kapsam\u0131n\u0131 a\u015fan ileri d\u00fczey bir konudur.<\/p>\n<p><b>S5: Da\u011f\u0131t\u0131m sonras\u0131 otomatik testler veya \u00f6nbellek temizleme gibi g\u00f6revler ekleyebilir miyim?<\/b><br \/>\n<b>C5:<\/b> Kesinlikle! <code>app_deploy<\/code> rol\u00fcn\u00fczdeki her uygulama blo\u011funun sonuna <code>post_tasks<\/code> veya ek g\u00f6revler ekleyebilirsiniz. \u00d6rne\u011fin, Laravel uygulamalar\u0131 i\u00e7in <code>php artisan migrate<\/code> veya <code>php artisan cache:clear<\/code> gibi komutlar\u0131 \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde, uygulamalar\u0131n sunuculara h\u0131zl\u0131, tutarl\u0131 ve hatas\u0131z bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik \u00f6neme sahiptir.","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":[133],"tags":[],"class_list":{"0":"post-41289","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-php","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>Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f - 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\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f\" \/>\n<meta property=\"og:description\" content=\"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde, uygulamalar\u0131n sunuculara h\u0131zl\u0131, tutarl\u0131 ve hatas\u0131z bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik \u00f6neme sahiptir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-24T14:01:46+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=\"13 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f\",\"datePublished\":\"2026-03-24T14:01:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/\"},\"wordCount\":1440,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"PHP\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/\",\"name\":\"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-03-24T14:01:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f\"}]},{\"@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":"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f - 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\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/","og_locale":"tr_TR","og_type":"article","og_title":"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f","og_description":"Modern web geli\u015ftirme s\u00fcre\u00e7lerinde, uygulamalar\u0131n sunuculara h\u0131zl\u0131, tutarl\u0131 ve hatas\u0131z bir \u015fekilde da\u011f\u0131t\u0131lmas\u0131 kritik \u00f6neme sahiptir.","og_url":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-03-24T14:01:46+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"13 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f","datePublished":"2026-03-24T14:01:46+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/"},"wordCount":1440,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["PHP"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/","url":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/","name":"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-03-24T14:01:46+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/giris-ansible-ile-coklu-php-uygulama-dagitimina-genel-bakis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Giri\u015f: Ansible ile \u00c7oklu PHP Uygulama Da\u011f\u0131t\u0131m\u0131na Genel Bak\u0131\u015f"}]},{"@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\/41289","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=41289"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41289\/revisions"}],"predecessor-version":[{"id":41290,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41289\/revisions\/41290"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41289"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41289"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41289"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}