<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Açıklab</title>
    <description>The latest articles on Forem by Açıklab (@aciklab).</description>
    <link>https://forem.com/aciklab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1970%2F6acc2fde-981d-4046-9b05-b0384efd5ce9.png</url>
      <title>Forem: Açıklab</title>
      <link>https://forem.com/aciklab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/aciklab"/>
    <language>en</language>
    <item>
      <title>Node Exporter ve Prometheus Kurulum Rehberi</title>
      <dc:creator>Enes Baytekin</dc:creator>
      <pubDate>Fri, 13 Mar 2026 06:02:27 +0000</pubDate>
      <link>https://forem.com/aciklab/node-exporter-ve-prometheus-kurulum-rehberi-18g6</link>
      <guid>https://forem.com/aciklab/node-exporter-ve-prometheus-kurulum-rehberi-18g6</guid>
      <description>&lt;p&gt;Node exporter bir makinedeki bazı metrikleri (cpu, ram, disk vb.) belli bir port üzerinden (default 9100) dışarıya sunar. Daha sonra burada sunulan metrikleri bu porta istek atarak  herhangi bir yazılım aracılığıyla izlemek mümkündür. Bu örnekte prometheus ile izlenecektir.&lt;/p&gt;

&lt;p&gt;Node exporter çok hafif bir uygulama olduğu için sistemi yormaz ve bu makine üzerinde izleme yapmak isteyen araçlar kendi ajanlarını kurmak zorunda kalmaz, hepsi aynı formattan okuyabilirler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Genel Mimari
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────┐          ┌─────────────────┐
│   Prometheus    │ ───────► │  Node Exporter  │
│   (Ana Sunucu)  │  scrape  │  (Hedef Makine) │
│   Port: 9090    │          │   Port: 9100    │
└─────────────────┘          └─────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Hedef Makineye Node Exporter Kurulumu
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Adım 1: Node Exporter İndir ve Kur
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Kullanıcı oluştur&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;--no-create-home&lt;/span&gt; &lt;span class="nt"&gt;--shell&lt;/span&gt; /bin/false node_exporter

&lt;span class="c"&gt;# Son sürümü indir (sürümü kontrol edin: https://github.com/prometheus/node_exporter/releases)&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz

&lt;span class="c"&gt;# Çıkart ve taşı&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-zxvf&lt;/span&gt; node_exporter-&lt;span class="k"&gt;*&lt;/span&gt;.tar.gz
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;node_exporter-&lt;span class="k"&gt;*&lt;/span&gt;/node_exporter /usr/local/bin/
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;node_exporter:node_exporter /usr/local/bin/node_exporter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adım 2: Systemd Servisi Oluştur
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo tee&lt;/span&gt; /etc/systemd/system/node_exporter.service &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter

[Install]
WantedBy=multi-user.target
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adım 3: Servisi Başlat
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;node_exporter
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start node_exporter
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status node_exporter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adım 4: Firewall Ayarı (Gerekirse)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--permanent&lt;/span&gt; &lt;span class="nt"&gt;--add-port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9100/tcp
&lt;span class="nb"&gt;sudo &lt;/span&gt;firewall-cmd &lt;span class="nt"&gt;--reload&lt;/span&gt;

&lt;span class="c"&gt;# ya da&lt;/span&gt;

&lt;span class="nb"&gt;sudo &lt;/span&gt;ufw allow 9100/tcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Doğrulama
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl http://localhost:9100/metrics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Prometheus Kurulumu
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Adım 1: Prometheus İndir ve Kur
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Kullanıcı ve dizinler oluştur&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;useradd &lt;span class="nt"&gt;--no-create-home&lt;/span&gt; &lt;span class="nt"&gt;--shell&lt;/span&gt; /bin/false prometheus
&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; /etc/prometheus /var/lib/prometheus
&lt;span class="nb"&gt;sudo chown &lt;/span&gt;prometheus:prometheus /etc/prometheus /var/lib/prometheus

&lt;span class="c"&gt;# İndir&lt;/span&gt;
&lt;span class="nb"&gt;cd&lt;/span&gt; /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz

&lt;span class="c"&gt;# Çıkart ve kopyala&lt;/span&gt;
&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-zxvf&lt;/span&gt; prometheus-&lt;span class="k"&gt;*&lt;/span&gt;.tar.gz
&lt;span class="nb"&gt;cd &lt;/span&gt;prometheus-&lt;span class="k"&gt;*&lt;/span&gt;/
&lt;span class="nb"&gt;sudo cp &lt;/span&gt;prometheus promtool /usr/local/bin/
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; consoles console_libraries /etc/prometheus/
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="nt"&gt;-R&lt;/span&gt; prometheus:prometheus /etc/prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adım 2: Prometheus Yapılandırması
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;sudo tee /etc/prometheus/prometheus.yml &amp;gt; /dev/null &amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="na"&gt;global&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;scrape_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;
  &lt;span class="na"&gt;evaluation_interval&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;15s&lt;/span&gt;

&lt;span class="na"&gt;scrape_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# Prometheus kendisini izler&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;prometheus'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;localhost:9090'&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

  &lt;span class="c1"&gt;# Hedef makineler (Node Exporter)&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;job_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;node-exporter'&lt;/span&gt;
    &lt;span class="na"&gt;static_configs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;192.168.1.10:9100'&lt;/span&gt;   &lt;span class="c1"&gt;# Hedef makine 1&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;192.168.1.11:9100'&lt;/span&gt;   &lt;span class="c1"&gt;# Hedef makine 2&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;192.168.1.12:9100'&lt;/span&gt;   &lt;span class="c1"&gt;# Hedef makine 3&lt;/span&gt;
        &lt;span class="na"&gt;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;production'&lt;/span&gt;
&lt;span class="s"&gt;EOF&lt;/span&gt;

&lt;span class="s"&gt;sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adım 3: Systemd Servisi
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="err"&gt;sudo&lt;/span&gt; &lt;span class="err"&gt;tee&lt;/span&gt; &lt;span class="err"&gt;/etc/systemd/system/prometheus.service&lt;/span&gt; &lt;span class="err"&gt;&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;/dev/null&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;&amp;lt;EOF&lt;/span&gt;
&lt;span class="nn"&gt;[Unit]&lt;/span&gt;
&lt;span class="py"&gt;Description&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;Prometheus&lt;/span&gt;
&lt;span class="py"&gt;Wants&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;
&lt;span class="py"&gt;After&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;network-online.target&lt;/span&gt;

&lt;span class="nn"&gt;[Service]&lt;/span&gt;
&lt;span class="py"&gt;User&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;prometheus&lt;/span&gt;
&lt;span class="py"&gt;Group&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;prometheus&lt;/span&gt;
&lt;span class="py"&gt;Type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;simple&lt;/span&gt;
&lt;span class="py"&gt;ExecStart&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;/usr/local/bin/prometheus &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="s"&gt;--config.file=/etc/prometheus/prometheus.yml &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="s"&gt;--storage.tsdb.path=/var/lib/prometheus/ &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="s"&gt;--web.console.templates=/etc/prometheus/consoles &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="s"&gt;--web.console.libraries=/etc/prometheus/console_libraries &lt;/span&gt;&lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="s"&gt;--web.enable-lifecycle&lt;/span&gt;

&lt;span class="nn"&gt;[Install]&lt;/span&gt;
&lt;span class="py"&gt;WantedBy&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;multi-user.target&lt;/span&gt;
&lt;span class="err"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adım 4: Başlat
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;prometheus
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start prometheus
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl status prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Erişim ve Doğrulama
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Servis         URL                                 Açıklama
-------------------------------------------------------------------
Prometheus UI  http://PROMETHEUS_IP:9090           Ana dashboard
Targets        http://PROMETHEUS_IP:9090/targets   Hedef durumları
Node Exporter  http://HEDEF_IP:9100/metrics        Ham metrikler
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Yeni Hedef Ekleme
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/etc/prometheus/prometheus.yml&lt;/code&gt; dosyasına yeni target ekleyin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;targets&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;192.168.1.10:9100'&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;192.168.1.11:9100'&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s1"&gt;'&lt;/span&gt;&lt;span class="s"&gt;yeni-sunucu.example.com:9100'&lt;/span&gt;  &lt;span class="c1"&gt;# Yeni eklenen&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sonra yapılandırmayı yeniden yükleyin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Yöntem 1: API ile (web.enable-lifecycle aktifse)&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:9090/-/reload

&lt;span class="c"&gt;# Yöntem 2: Servisi yeniden başlat&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Faydalı PromQL Sorguları
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CPU kullanımı (%)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;RAM kullanımı (%)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Disk kullanımı (%)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;100 - (node_filesystem_avail_bytes / node_filesystem_size_bytes * 100)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ağ trafiği (bytes/s)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;rate(node_network_receive_bytes_total[5m])&lt;/p&gt;

</description>
      <category>devops</category>
      <category>linux</category>
      <category>monitoring</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>SysMonitor</title>
      <dc:creator>Enes Baytekin</dc:creator>
      <pubDate>Mon, 09 Mar 2026 11:46:22 +0000</pubDate>
      <link>https://forem.com/aciklab/sysmonitor-2mmd</link>
      <guid>https://forem.com/aciklab/sysmonitor-2mmd</guid>
      <description>&lt;p&gt;SysMonitor, netex üzerinde izleme yapabilmek için geliştirilmiş bir araçtır.&lt;br&gt;
Çalışması için iki farklı pakete ihtiyaç var:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sysmonitor&lt;/li&gt;
&lt;li&gt;sysmonitor-worker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bunlar server-client mantığı ile çalışır.&lt;br&gt;
Sysmonitor bir makine'ye kurulur ve netex veritabanı ile haberleşir.&lt;br&gt;
Worker ise asıl izlemeyi yaparak sysmonitor ile haberleşir.&lt;br&gt;
Böylece izlenen veriler netex db'sinde tutulur.&lt;/p&gt;
&lt;h2&gt;
  
  
  Kurulum
&lt;/h2&gt;

&lt;p&gt;Sysmonitor kullanabilmek için öncelikle bir netex ortamının bulunması gerekir.&lt;br&gt;
Netex, sysmonitor ve sysmonitor-worker paketleri aynı makinede de olabilir veya farklı makinelerde de bulunabilir.&lt;/p&gt;
&lt;h3&gt;
  
  
  Sysmonitor Kurulumu
&lt;/h3&gt;

&lt;p&gt;Bir makineye sysmonitor paketi kurulur. Environment değişkeni olarak netex db bilgileri verilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; ./sysmonitor-24-x64.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/opt/sysmonitor/.env&lt;/code&gt; örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;DB_DRIVER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;postgres
&lt;span class="nv"&gt;DB_HOST&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;127.0.0.1
&lt;span class="nv"&gt;DB_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;netex
&lt;span class="nv"&gt;DB_PASS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;password
&lt;span class="nv"&gt;DB_PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5432
&lt;span class="nv"&gt;DB_USER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;netex
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;NOT:&lt;/strong&gt; Netex veritabanı başka bir makinedeyse, sysmon'un buna erişebilmesi için netex db'sinin dışarıdan erişime açılması gerekir. &lt;code&gt;pg_hba.conf&lt;/code&gt; ve &lt;code&gt;postgresql.conf&lt;/code&gt; dosyaları kontrol edilebilir.&lt;/p&gt;

&lt;p&gt;Kurulum sonrasında şu servislerin çalışıyor olması gerekir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sysmonitor@admin&lt;/li&gt;
&lt;li&gt;sysmonitor@client&lt;/li&gt;
&lt;li&gt;sysmonitor@admintest&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;NOT:&lt;/strong&gt; Sysmon api'sine istek atmak için &lt;code&gt;6520&lt;/code&gt; portu kullanılır, eğer bu port açılmamışsa &lt;code&gt;sysmonitor@admintest&lt;/code&gt; servisi başlatılmalıdır.&lt;/p&gt;

&lt;p&gt;Port kontrol için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ss &lt;span class="nt"&gt;-tlnp&lt;/span&gt; | &lt;span class="nb"&gt;grep &lt;/span&gt;6520
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Servisi başlatmak için:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; sysmonitor@admintest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sysmonitor Worker Kurulumu
&lt;/h3&gt;

&lt;p&gt;Sensor'ler, worker'lar üzerinde çalıştığı için en az bir tane worker kurulup sysmon'a bağlanması gerekir.&lt;br&gt;
Bir makineye sysmonitor-worker paketi kurulur. Environment değişkeni olarak sysmonitor makinesinin adresi verilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; ./sysmonitor-worker-setup-x64.deb
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kurulum sırasında server adresi istendiğinde &lt;code&gt;https://&amp;lt;sysmonitor-ip&amp;gt;:6521&lt;/code&gt; şeklinde girilir.&lt;br&gt;
Daha sonradan &lt;code&gt;.env&lt;/code&gt; dosyası düzenlenerek de değiştirilebilir.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/opt/sysmonitor-worker/.env&lt;/code&gt; örneği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;SERVER_URL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://127.0.0.1:6521
&lt;span class="nv"&gt;FETCH_INTERVAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3600
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Nasıl çalışır?
&lt;/h2&gt;

&lt;p&gt;Öncelikle bir template oluşturulur.&lt;br&gt;
Bu template içinde, izlenilmesi istenen metrikler belirtilir.&lt;br&gt;
Bir template içinde aynı türde birden fazla metrik izlenebilir.&lt;/p&gt;

&lt;p&gt;Bu template'ı kullanan bir sensor oluşturulur.&lt;br&gt;
Aynı template birden fazla sensor ile tekrar tekrar kullanılabilir.&lt;br&gt;
Her sensor aynı zamanda bir varlığa bağlıdır ve bu varlığın o template'ta belirtilen metriklerini izler.&lt;/p&gt;

&lt;p&gt;Sensor'ler worker'lar üzerinde çalışır.&lt;br&gt;
İzlenen metrik değerleri sysmon'a gönderilir ve sysmon netex db'sine kaydeder.&lt;/p&gt;

&lt;p&gt;Daha sonra bu metrikler db'den okunarak izlenebilir.&lt;/p&gt;

&lt;p&gt;Birden fazla worker kurulabilir.&lt;br&gt;
Her bir sensor için hangi worker üzerinde çalışacağı belirtilir.&lt;/p&gt;

&lt;p&gt;Yani özetle;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Metrik&lt;/strong&gt;, izlenecek değeri belirtir.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Template&lt;/strong&gt;, hangi metriklerin izleneceğini belirten kuraldır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensor&lt;/strong&gt;, asıl izlemeyi yapandır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sysmonitor Worker&lt;/strong&gt;, izlemenin nerede yapılacağıdır.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sysmonitor&lt;/strong&gt;, sensor ve netex db arasındaki bağlantıyı sağlayan backend server'dır.&lt;/li&gt;
&lt;/ul&gt;






&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                                        .---------.
.-----------.        .---------.        |         |
| Template1 |--------| Sensor1 |--------| Varlık1 |
|           |        '---------'        |         |
| -metrik1  |        .---------.        '---------'
| -metrik2  |--------| Sensor2 |----.
'-----------'        '---------'    |   .---------.
                                    '---|         |
.-----------.        .---------.        | Varlık2 |
| Template2 |--------| Sensor3 |--------|         |
|           |        '---------'        '---------'
| -metrik3  |
'-----------'
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu örnekte;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Varlık1&lt;/code&gt;'in &lt;code&gt;metrik1&lt;/code&gt; ve &lt;code&gt;metrik2&lt;/code&gt; değerleri&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Varlık2&lt;/code&gt;'nin &lt;code&gt;metrik1&lt;/code&gt;, &lt;code&gt;metrik2&lt;/code&gt; ve &lt;code&gt;metrik3&lt;/code&gt; değerleri&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;izlenir.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>linux</category>
      <category>monitoring</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Proxmox'ta io-error</title>
      <dc:creator>Enes Baytekin</dc:creator>
      <pubDate>Mon, 29 Dec 2025 08:35:23 +0000</pubDate>
      <link>https://forem.com/aciklab/proxmoxta-io-error-5fnl</link>
      <guid>https://forem.com/aciklab/proxmoxta-io-error-5fnl</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi80mdjxckchsea5uklvl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi80mdjxckchsea5uklvl.png" alt="io-error" width="189" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eğer proxmoxta bu şekilde bir hata alıyor ve makinenizle etkileşemiyorsanız bunun sebebi büyük ihtimalle bu sanal makinenin diskinin proxmox'ta kullandığı storage alanının dolmuş olmasıdır. Bu yüzden sanal makineniz daha fazla okuma yazma işlemi yapamamaktadır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disk alanını kontrol etmek
&lt;/h2&gt;

&lt;p&gt;Öncelikle, makinenizin &lt;strong&gt;Hardware&lt;/strong&gt; sekmesindeki &lt;strong&gt;Hard Disk&lt;/strong&gt; kısmından, diskin hangi storage üzerinde olduğunu kontrol edin. Örneğimizde &lt;strong&gt;local-lvm&lt;/strong&gt; adlı alanı kullanıyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhq4kecgmplfix5vctos.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqhq4kecgmplfix5vctos.png" alt="hard-disk" width="691" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Daha sonra bu storage'ın &lt;strong&gt;Summary&lt;/strong&gt; sekmesinden doluluğunu kontrol edin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faeuj2qg52w9f5typb4fp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faeuj2qg52w9f5typb4fp.png" alt="storage-usage" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eğer burdaki &lt;strong&gt;Usage&lt;/strong&gt; kısmı &lt;strong&gt;100%&lt;/strong&gt; olarak görünüyorsa hata bundan kaynaklıdır. Bunu çözmek için;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ya bu diski kullanan ve artık ihtiyaç duyulmayan makineleri veya diskleri silerek bu storage üzerinde yer açmanız&lt;/li&gt;
&lt;li&gt;ya da bu makineyi daha geniş boş alana sahip başka bir storage'a taşımanız&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;gerekir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOT:&lt;/strong&gt; Eğer makinenizi cloudinit ile oluşturduysanız burda &lt;strong&gt;Cloudinit Drive&lt;/strong&gt; şeklinde bir disk daha görürsünüz. Bu da aynı storage'da bulunur ve bunu taşıyamazsınız. Ancak zaten boyutu çok küçük olduğu için taşımamış olmanız çok da bir şeyi etkilemez. Asıl sıkıntı çıkaran kısım makinenin ana diskidir.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Makineyi farklı bir storage alanına taşımak
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;NOT:&lt;/strong&gt; Her şeyden önce makinenizin &lt;strong&gt;kapalı&lt;/strong&gt; olduğundan emin olun.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Makinenin &lt;strong&gt;Hardware&lt;/strong&gt; kısmından ilgili diski seçtikten sonra yukarıdaki &lt;strong&gt;Disk Action&lt;/strong&gt; kısmından &lt;strong&gt;Move Storage&lt;/strong&gt; seçeneğini seçin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbkeqnt24hjcczdecg5h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjbkeqnt24hjcczdecg5h.png" alt="move-storage" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Açılan pencerede &lt;strong&gt;Target Storage&lt;/strong&gt; kısmından taşımak istediğiniz hedef storage'ı seçin ve taşıma işlemini başlatın.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmy5cshcr76d3bwnq9uc0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmy5cshcr76d3bwnq9uc0.png" alt="select-storage" width="577" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Taşıma işlemi bittikten sonra artık &lt;strong&gt;Hard Disk&lt;/strong&gt; kısmında yeni storage alanının ismini göreceksiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frak77z6qhu1jcd7j10st.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frak77z6qhu1jcd7j10st.png" alt="storage-changed" width="703" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Şu an aslında makinenizi başlatarak kullanmaya devam edebilirsiniz. Bunda hiçbir engel yok.&lt;/p&gt;

&lt;p&gt;Ancak bu taşıma işlemi makinenin diskini doğrudan taşımak yerine yeni storage üzerinde bir kopyasını oluşturup ona bağlıyor. Yani eski storage alanında, kullanılmayan bir kopya o diski işgal etmeye devam ediyor.&lt;/p&gt;

&lt;p&gt;Bu kopya &lt;strong&gt;Hardware&lt;/strong&gt; kısmında en altta &lt;strong&gt;Unused Disk&lt;/strong&gt; olarak görünür. Bu kopyayı da silerek eski storage alanında da yer açmak isterseniz önce, eğer varsa makinenize ait snapshotları silmeniz lazım. Çünkü snapshotlar bu eski diski işaret etmeye devam ediyorlar ve ona bağımlılar.&lt;/p&gt;

&lt;p&gt;Makinenize ait bir snapshot bulunmuyorsa bu &lt;strong&gt;Unused Disk&lt;/strong&gt;'i seçerek yukardan &lt;strong&gt;Remove&lt;/strong&gt; seçeneği ile silebilirsiniz.&lt;/p&gt;




&lt;p&gt;Eğer dolu storage üzerinde biraz yer açtıysanız o storage'daki bu hatayı veren diğer makineleri yeniden başlatmanız onlar için yeterlidir.&lt;/p&gt;

</description>
      <category>help</category>
      <category>linux</category>
      <category>tutorial</category>
      <category>devops</category>
    </item>
    <item>
      <title>Liman MYS Eklentisi ile Elasticsearch API'sine Bağlanma Rehberi</title>
      <dc:creator>İsa Sarıoğlan</dc:creator>
      <pubDate>Thu, 04 Dec 2025 10:51:31 +0000</pubDate>
      <link>https://forem.com/aciklab/liman-mys-eklentisi-ile-elasticsearch-apisine-baglanma-rehberi-g9l</link>
      <guid>https://forem.com/aciklab/liman-mys-eklentisi-ile-elasticsearch-apisine-baglanma-rehberi-g9l</guid>
      <description>&lt;p&gt;Bu yazı, Liman MYS eklenti şablonunu kullanarak, Basic Authentication (Kullanıcı Adı/Şifre) ile korunan bir Elasticsearch API'sine bağlanmayı ve veri çekmeyi adım adım anlatır.&lt;/p&gt;

&lt;p&gt;Bu rehber, zaten çalışan bir Liman MYS geliştirme ortamınız olduğunu varsayar.&lt;/p&gt;

&lt;p&gt;Eğer henüz sunucunuza SSH ile bağlanmadıysanız, liman kullanıcısı için yetkilendirme yapmadıysanız, VS Code Remote - SSH eklentisini kurmadıysanız veya Node.js/pnpm kurulumunu tamamlamadıysanız, lütfen öncelikle aşağıdaki rehberi okuyun:&lt;/p&gt;

&lt;p&gt;➡️ Referans: &lt;a href="https://dev.to/aciklab/liman-mys-icin-eklenti-gelistirme-ortami-kurulum-rehberi-34ch"&gt;Liman MYS Eklentisi Geliştirme Ortamı Sorun Rehberi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu rehberdeki adımları tamamladıktan sonra buradan devam edebilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adım 1: Eklenti Ayarlarını Yapılandırma (&lt;strong&gt;db.json&lt;/strong&gt;)
&lt;/h2&gt;

&lt;p&gt;Amacımız Eklentimizin, bağlanacağı API'nin adresini, kullanıcı adını ve şifresini Liman arayüzünden güvenli bir şekilde almasını sağlamak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;db.json&lt;/strong&gt; dosyası, Liman'ın "Eklenti Ayarları" menüsüne hangi ayar alanlarını ekleyeceğimizi tanımlar.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Eklentinizin ana dizininde bulunan &lt;strong&gt;db.json&lt;/strong&gt; dosyasını açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;database&lt;/strong&gt; isimli JSON dizisini bulun.&lt;/li&gt;
&lt;li&gt;Bu dizinin içine, API URL'si, kullanıcı adı ve şifre için aşağıdaki üç JSON objesini ekleyin.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "elasti",
  "publisher": "...",
  "version": "...",
  "database": [
    {
      "variable": "api_url",
      "type": "text",
      "name": "API URL (ex. https://10.67.67.202:30936)",
      "required": true,
      "global": true,
      "writable": false
    },
    {
      "variable": "Username",
      "type": "text",
      "name": "Elasticsearch Username",
      "required": true,
      "global": true,
      "writable": false
    },
    {
      "variable": "Password",
      "type": "password",
      "name": "Elasticsearch Password",
      "required": true,
      "global": true,
      "writable": false
    }
  ],
  "language": "php",
  "vite": true,
  "...": "..."
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Detaylı Açıklama:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;"variable": "api_url"&lt;/code&gt;: Bu, PHP kodumuzun içinden &lt;code&gt;extensionDb('api_url')&lt;/code&gt; fonksiyonunu kullanarak bu değere erişmesini sağlayan anahtar isimdir.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"type": "password"&lt;/code&gt;: Bu ayar, Liman arayüzündeki bu metin kutusuna girilen değerin &lt;code&gt;****&lt;/code&gt; şeklinde maskelenmesini sağlar. Güvenlik için kritik bir adımdır.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;"global": true&lt;/code&gt;: Ayarın eklenti bazında global olmasını sağlar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Önemli:&lt;/strong&gt; Bu değişikliği yaptıktan sonra eklentinizi Liman arayüzünden Yeniden Yükle yapın ve &lt;strong&gt;Eklenti Ayarları&lt;/strong&gt;'na giderek API URL,Elasticsearch Username ve Elasticsearch Password olmak üzere aşşağıdaki görselde bulunan üç alanı da doldurun&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh3agpe45snbo3ez8gs3z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh3agpe45snbo3ez8gs3z.png" alt=" " width="800" height="379"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Adım 2: helpers.php Dosyasını Güncelleme (Yetkilendirme)
&lt;/h2&gt;

&lt;p&gt;Bu adımda amacımız  PHP backend'imizin, Adım 1'de kaydettiğimiz ayarları okuyup Elasticsearch'e &lt;strong&gt;Basic Authentication&lt;/strong&gt; başlığını (header) göndermesini sağlamak.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;helpers.php&lt;/strong&gt; dosyası, backend kodumuzun her yerinden çağırabileceğimiz yardımcı fonksiyonları barındırır. &lt;strong&gt;getDefaults()&lt;/strong&gt; fonksiyonu, eklentimizden dışarı giden her API isteği için varsayılan ayarları belirler.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;/views&lt;/strong&gt; klasörünün (veya ana dizinin) yanındaki &lt;strong&gt;helpers.php&lt;/strong&gt; dosyasını açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;getDefaults()&lt;/strong&gt; fonksiyonunu bulun.&lt;/li&gt;
&lt;li&gt;Bu fonksiyonun tamamını, &lt;strong&gt;db.json&lt;/strong&gt;'dan &lt;strong&gt;Username&lt;/strong&gt; ve &lt;strong&gt;Password&lt;/strong&gt; değişkenlerini okuyacak ve &lt;strong&gt;Authorization&lt;/strong&gt; başlığını oluşturacak şekilde aşağıdaki gibi güncelleyin.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if (!function_exists('getDefaults')) {
    function getDefaults()
    {
        // 1. ADIM: db.json'dan kullanıcı adı ve şifreyi al
        $username = extensionDb('Username');
        $password = extensionDb('Password');

        // 2. ADIM: Basic Auth için kullanıcı adı ve şifreyi "kullanıcı:şifre" formatında
        // base64 algoritmasıyla kodla
        $auth = base64_encode($username . ':' . $password);

        // 3. ADIM: Guzzle (PHP HTTP istemcisi) için ayar dizisini oluştur
        return [
            'headers' =&amp;gt; [
                'Content-Type' =&amp;gt; 'application/json',

                // Oluşturduğumuz kodu "Authorization" başlığına "Basic " ön ekiyle ekle
                'Authorization' =&amp;gt; 'Basic ' . $auth,
            ],

            // 4. ADIM: SSL Sertifika Doğrulamasını Kapat
            // Eğer API'niz (https://...) kendinden imzalı (self-signed)
            // bir sertifika kullanıyorsa bu gereklidir. Aksi halde bağlantı hatası alırsınız.
            'verify' =&amp;gt; false 
        ];
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Adım 3: CORS ve HMR Hatalarını Önleme (vite.config.ts)
&lt;/h2&gt;

&lt;p&gt;Amacımız &lt;strong&gt;localhost&lt;/strong&gt; sorununu çözdükten sonra ortaya çıkan &lt;strong&gt;CORS policy&lt;/strong&gt; (farklı port) ve WebSocket (HMR) bağlantı hatalarını en baştan engellemek.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sorun:&lt;/strong&gt; Liman arayüzü (örn: &lt;strong&gt;https_://10.68.68.249&lt;/strong&gt;) ile Vite sunucusu (örn: &lt;strong&gt;https_://10.68.68.249:5173&lt;/strong&gt;) farklı portlarda çalıştığı için tarayıcı bunu "güvenliksiz" bir işlem olarak görür ve &lt;strong&gt;CORS&lt;/strong&gt; hatası verir.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;frontend/vite.config.ts&lt;/code&gt; dosyasını açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;defineConfig&lt;/strong&gt; objesine, &lt;strong&gt;plugins&lt;/strong&gt; ve &lt;strong&gt;resolve&lt;/strong&gt; gibi anahtarların yanına, &lt;strong&gt;server&lt;/strong&gt; adında yeni bir yapılandırma bloğu ekleyin.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// CORS VE HMR HATALARINI ÖNLEMEK İÇİN BU BLOĞU EKLEYİN
  // ###############################################################
  server: {
    // 1. Sunucunun tüm IP'lerden gelen isteklere yanıt vermesini sağlar
    // (Sadece localhost'tan değil)
    host: '0.0.0.0', 

    // 2. CORS HATASININ ÇÖZÜMÜ:
    // Bu ayar, tarayıcıya "Access-Control-Allow-Origin: *" başlığını gönderir
    // ve farklı portlardan (örn: Liman'ın 443 portu) gelen isteklere izin verir.
    cors: true, 

    // 3. HMR (WebSocket) HATASININ ÇÖZÜMÜ:
    // Kodda değişiklik yaptığınızda sayfanın otomatik yenilenmesi (HMR)
    // için Vite bir WebSocket bağlantısı kullanır. Bu ayar,
    // WebSocket'in hangi IP'ye bağlanacağını söyler.
    hmr: {
      host: '10.68.68.249' // Buraya Vite sunucunuzun IP'sini yazın
    }
  }
  // ###############################################################
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Adım 4: Geliştirme Sunucusu Sertifika (SSL) Uyarısını Geçme
&lt;/h2&gt;

&lt;p&gt;Amacımız Tarayıcınızın, Vite geliştirme sunucusunun "kendinden imzalı" (self-signed) SSL sertifikasına güvenmesini sağlamak.&lt;/p&gt;

&lt;p&gt;Adım 3 ve 4'ü yapsanız bile, &lt;code&gt;pnpm run dev&lt;/code&gt; komutunu çalıştırdıktan sonra eklentiyi açtığınızda konsolda &lt;strong&gt;net::ERR_TIMED_OUT&lt;/strong&gt; veya &lt;strong&gt;net::ERR_CERT_AUTHORITY_INVALID&lt;/strong&gt; hatası alabilirsiniz.&lt;/p&gt;

&lt;p&gt;Vite sunucusu (&lt;strong&gt;&lt;a href="https://10.68.68.249:5173" rel="noopener noreferrer"&gt;https://10.68.68.249:5173&lt;/a&gt;&lt;/strong&gt;) &lt;strong&gt;https&lt;/strong&gt; kullanır ancak resmi olmayan bir sertifikaya sahiptir. Tarayıcınız, sizden onay almadan bu "güvenli olmayan" adresten script (&lt;strong&gt;main.ts&lt;/strong&gt;) yüklemeyi reddeder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Çözüm:&lt;/strong&gt; Tarayıcınıza bu adrese güvenmesini manuel olarak öğretmeniz gerekir.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Vite sunucunuzun adresini (örn: &lt;strong&gt;&lt;a href="https://10.68.68.249:5173" rel="noopener noreferrer"&gt;https://10.68.68.249:5173&lt;/a&gt;&lt;/strong&gt;) kopyalayın.&lt;/li&gt;
&lt;li&gt;Tarayıcınızda yeni bir sekme açın.&lt;/li&gt;
&lt;li&gt;Bu adresi yapıştırın ve Enter'a basın.&lt;/li&gt;
&lt;li&gt;Karşınıza "Bağlantınız gizli değil" (Your connection is not private) uyarısı çıkacaktır.&lt;/li&gt;
&lt;li&gt;"Gelişmiş" (&lt;strong&gt;Advanced&lt;/strong&gt;) butonuna tıklayın.&lt;/li&gt;
&lt;li&gt;"10.68.68.249 sitesine ilerle (güvenli değil)" (&lt;strong&gt;Proceed to 10.68.68.249&lt;/strong&gt; (&lt;strong&gt;unsafe&lt;/strong&gt;)) linkine tıklayın.&lt;/li&gt;
&lt;li&gt;Ekrana beyaz bir sayfa veya "Vite" logosu gelirse, işlem başarılıdır. Bu sekmeyi kapatabilirsiniz.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bu işlemi yaptığınızda, tarayıcınız bu sertifikayı geçici olarak kabul etmiş olur ve Liman arayüzü artık &lt;strong&gt;main.ts&lt;/strong&gt; dosyasını yükleyebilir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adım 5: Frontend Veri Katmanını Oluşturma (elastic.ts)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;data.ts&lt;/strong&gt; dosyasını kopyalayıp &lt;strong&gt;elastic.ts&lt;/strong&gt; adında yeni bir dosya oluşturmanızı ve içeriğini aşağıdaki gibi düzenlemenizi istiyorum.&lt;/p&gt;

&lt;p&gt;Bu dosyada, &lt;strong&gt;data.ts&lt;/strong&gt; içindeki tüm CRUD (create, update, delete) fonksiyonlarını kaldıracağız. Sadece bizim Elastic API'mizden veri çekecek &lt;strong&gt;fetchStats&lt;/strong&gt; adında tek bir fonksiyon bırakacağız. Bu fonksiyon, &lt;strong&gt;RequestController.php&lt;/strong&gt; dosyanızdaki &lt;strong&gt;apiProxy&lt;/strong&gt; fonksiyonunu tetikleyecek.&lt;/p&gt;

&lt;p&gt;Komut parametrelerini URL'den (&lt;strong&gt;GET&lt;/strong&gt;) gönderdiğimiz takdirde &lt;strong&gt;RequestController.php&lt;/strong&gt;'deki &lt;strong&gt;apiProxy&lt;/strong&gt; fonksiyonu, &lt;strong&gt;GET&lt;/strong&gt; isteğiyle gelen URL parametrelerini (örn: &lt;strong&gt;?type=...&lt;/strong&gt;) hedef API'ye (Elasticsearch) "taşıma" eğilimindedir. Elasticsearch bu &lt;strong&gt;type&lt;/strong&gt; ve &lt;strong&gt;endpoint&lt;/strong&gt; parametrelerini tanımadığı için hata verir.&lt;/p&gt;

&lt;p&gt;bu yüzden komut parametrelerini URL'den (&lt;strong&gt;GET&lt;/strong&gt;) göndermek yerine bir &lt;strong&gt;POST&lt;/strong&gt; isteğinin gövdesinde (body) göndereceğiz. &lt;strong&gt;RequestController&lt;/strong&gt; bu verileri gövdeden okuyacak ve Elasticsearch'e "temiz" bir &lt;strong&gt;GET&lt;/strong&gt; isteği atacaktır.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;src/stores/data.ts&lt;/code&gt; dosyasını kopyalayıp &lt;code&gt;src/stores/elastic.ts&lt;/code&gt; adında yeni bir dosya oluşturun.&lt;/li&gt;
&lt;li&gt;İçeriğini aşağıdaki gibi (hatayı en baştan önleyecek şekilde) düzenleyin:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import http from "@/utils/http-common"
import { i18n } from "@/utils/i18n"
import { defineStore } from "pinia"

// Store adını useElasticStore olarak değiştiriyoruz
export const useElasticStore = defineStore({
  id: "elastic",
  state: () =&amp;gt; ({
    elasticData: {} as any, // Gelen veriyi tutmak için
  }),
  getters: {
    getStats: (state) =&amp;gt; state.elasticData,
  },
  actions: {
    // Veri çekme fonksiyonumuz
    async fetchStats() {

      // Parametreleri POST gövdesinde göndermek için hazırlıyoruz
      const payload = {
        // Backend'e "get" isteği yapmasını söylüyoruz
        type: "get",
        // Backend'e hangi uca gitmesini istediğimizi söylüyoruz
        endpoint: "_nodes/stats/fs?pretty=true" 
      }

      // Hata almamak için http.get yerine http.post kullanıyoruz.
      // RequestController bu POST gövdesini okur
      // ve Elastic'e temiz bir GET isteği atar.
      // İlk parametre olan URL'e sadece "?" koymamız, 
      // apiProxy'nin kök dizine gitmesini sağlar.
      return http.post(`?`, payload).then((res) =&amp;gt; {
        if (res.status == 200) {
          if (res.data) {
            this.elasticData = res.data
            console.log("Elastic verisi başarıyla alındı:", res.data)
          }
        } else {
          window.$notification.error({
            duration: 5000,
            title: i18n.t("common.error"),
            content: "Elastic verisi alınırken bir hata oluştu.",
          })
        }
      })
    },
  },
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Adım 6: RequestController.php Debug (Hata Ayıklama)
&lt;/h2&gt;

&lt;p&gt;Lütfen &lt;strong&gt;RequestController.php&lt;/strong&gt; dosyanızı açın ve &lt;strong&gt;apiProxy&lt;/strong&gt; fonksiyonunu bulun.&lt;/p&gt;

&lt;p&gt;Bu fonksiyonun içine, &lt;strong&gt;validate([...]);&lt;/strong&gt; satırından hemen sonra, aşağıdaki &lt;strong&gt;dd()&lt;/strong&gt; satırlarını ekleyin. Bu sayede frontend'den gelen isteği yakalayıp, API'ye gitmeden önce tam olarak hangi URL'i ve hangi ayarları kullandığımızı göreceğiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// --- DEBUG BAŞLANGIÇ ---
        // Bu iki satırı ekleyin:

        // 1. Doğru URL'i oluşturup oluşturmadığımızı kontrol edelim
        dd(extensionDb('api_url') . '/' . request("endpoint"));

        // 2. helpers.php'den doğru ayarların (Auth Header) gelip gelmediğini kontrol edelim
        // (Eğer ilk dd çalışırsa, tarayıcıda sonucu gördükten sonra bu satırı açıp ilkini silebilirsiniz)
        // dd(getDefaults()); 

        // --- DEBUG BİTİŞ ---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Adım 7: Home.vue Dosyasını Düzenleme ve Debug'ı Tetikleme
&lt;/h2&gt;

&lt;p&gt;Bu adımda, &lt;strong&gt;Home.vue&lt;/strong&gt; dosyanızı, oluşturduğumuz &lt;strong&gt;elastic.ts&lt;/strong&gt; store'unu kullanacak şekilde düzenleyeceğiz.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Yeni &lt;strong&gt;useElasticStore&lt;/strong&gt;'u import edeceğiz.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;onMounted&lt;/strong&gt; (sayfa yüklendiğinde) &lt;strong&gt;store.fetchStats()&lt;/strong&gt; fonksiyonunu çağıracağız.&lt;/li&gt;
&lt;li&gt;Gelen veriyi basit bir &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt; etiketi içinde ekrana basacağız.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Lütfen &lt;code&gt;src/views/Home.vue&lt;/code&gt; dosyanızın içeriğini tamamen aşağıdaki kodla değiştirin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script lang="ts" setup&amp;gt;
import { onMounted } from "vue"
// 1. Oluşturduğumuz elastic store'u import et
import { useElasticStore } from "@/stores/elastic"

// 2. Store'u kur
const store = useElasticStore()

// 3. Sayfa yüklendiğinde fetchStats fonksiyonunu çalıştır
onMounted(() =&amp;gt; {
  store.fetchStats()
})
&amp;lt;/script&amp;gt;

&amp;lt;template&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;h2&amp;gt;Elasticsearch FS İstatistikleri&amp;lt;/h2&amp;gt;
    &amp;lt;pre&amp;gt;{{ store.elasticData }}&amp;lt;/pre&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;

&amp;lt;style scoped&amp;gt;
pre {
  background-color: #f4f4f4;
  border: 1px solid #ddd;
  padding: 10px;
  white-space: pre-wrap; /* Uzun satırların kaydırmasını sağlar */
  word-wrap: break-word;
}
&amp;lt;/style&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Şimdi Test Edelim:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Bu değişikliği kaydedin.&lt;/li&gt;
&lt;li&gt;Projenizin derlendiğinden emin olun (genellikle pnpm run dev veya pnpm run serve).&lt;/li&gt;
&lt;li&gt;Tarayıcınızı açın ve Liman arayüzünden eklentinize gidin.&lt;/li&gt;
&lt;li&gt;Tarayıcınızın &lt;strong&gt;Geliştirici Araçları&lt;/strong&gt;'nı açın (F12) ve "&lt;strong&gt;Ağ (Network)&lt;/strong&gt;" sekmesine tıklayın.&lt;/li&gt;
&lt;li&gt;Eklentinizin ana sayfasını (Home.vue) açın veya yenileyin.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Beklenen Sonuç:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sayfanız büyük ihtimalle yüklenmeyecek (veya "500 Sunucu Hatası" gibi bir hata gösterecek).&lt;/p&gt;

&lt;p&gt;Ağ (Network) sekmesinde, &lt;code&gt;apiProxy?type=get&amp;amp;endpoint=...&lt;/code&gt; ile başlayan kırmızı bir istek görmelisiniz. Bu isteğe tıklayın ve "&lt;strong&gt;Önizleme (Preview)&lt;/strong&gt;" veya "&lt;strong&gt;Yanıt (Response)&lt;/strong&gt;" sekmesine bakın.&lt;/p&gt;

&lt;p&gt;Orada, RequestController.php içine yazdığımız ilk dd() komutunun çıktısını görmeniz gerekiyor. Çıktı, bir string (metin) olarak şunu içermeli:&lt;/p&gt;

&lt;p&gt;"&lt;code&gt;https://10.67.67.202:30936/_nodes/stats/fs?pretty=true&lt;/code&gt;" (Eğer &lt;strong&gt;db.json&lt;/strong&gt;'a IP'yi &lt;strong&gt;10.67.67.202&lt;/strong&gt; olarak girdiyseniz)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjocv4u97lj70q226vlev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjocv4u97lj70q226vlev.png" alt=" " width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;ilk debug komutunda istediğimiz sonuçlara ulaştıktan sonra ikinci debug komutunu tetikleyelim.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Lütfen &lt;strong&gt;RequestController.php&lt;/strong&gt; dosyasını açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;validate([...]);&lt;/strong&gt; satırından hemen sonra, &lt;strong&gt;dd(getDefaults());&lt;/strong&gt; satırını aşşağıdaki gibi yorum satırı olmaktan çıkarıp ilk debug komutunu yorum satırına alalım.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// --- DEBUG BAŞLANGIÇ ---
        // Bu iki satırı ekleyin:

        // 1. Doğru URL'i oluşturup oluşturmadığımızı kontrol edelim
        // dd(extensionDb('api_url') . '/' . request("endpoint"));

        // 2. helpers.php'den doğru ayarların (Auth Header) gelip gelmediğini kontrol edelim
        // (Eğer ilk dd çalışırsa, tarayıcıda sonucu gördükten sonra bu satırı açıp ilkini silebilirsiniz)
         dd(getDefaults()); 

        // --- DEBUG BİTİŞ ---
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Şimdi Test Edin:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Dosyayı bu şekilde kaydedin.&lt;/li&gt;
&lt;li&gt;Tarayıcıda Geliştirici Araçları (F12) açıkken sayfayı yenileyin (F5).&lt;/li&gt;
&lt;li&gt;Network sekmesinde yine &lt;strong&gt;kırmızı&lt;/strong&gt; bir apiProxy isteği göreceksiniz.&lt;/li&gt;
&lt;li&gt;Bu isteğe tıklayın ve "&lt;strong&gt;Önizleme (Preview)&lt;/strong&gt;" sekmesine bakın.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Beklenen Sonuç:&lt;/strong&gt; Bu kez, ekranda o URL'i &lt;strong&gt;görmemelisiniz&lt;/strong&gt;. Onun yerine "Önizleme (Preview)" sekmesinde, Authorization başlığını içeren şu JSON objesini görmelisiniz:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpq5wyuaexivn0uba2hbl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpq5wyuaexivn0uba2hbl.png" alt=" " width="800" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu çıktıyı gördüğünüzde kimlik doğrulama adımını başarıyla geçtiğimiz anlamına gelecek.&lt;br&gt;
Artık tüm testlerimiz (debug) bitti. Backend'imiz (PHP) isteği göndermeye hazır.&lt;/p&gt;

&lt;p&gt;Şimdi son adıma geçiyoruz: Yola koyduğumuz tüm bu "tuzakları" (yani &lt;strong&gt;dd()&lt;/strong&gt; komutlarını) kaldıracağız ve isteğin Elastic API'sine gerçekten gitmesine izin vereceğiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adım 8: Eklentiyi Çalıştırma ve Son Test
&lt;/h2&gt;

&lt;p&gt;Tüm dosyaları doğru şekilde yapılandırdık. Artık eklentiyi çalıştırabiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Önemli: Geliştirme (Dev) ve Üretim (Build) Modu Farkı&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Geliştirme (Dev) Modu:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;pnpm run dev&lt;/strong&gt; ile çalışır. Kodunuzda yaptığınız her değişiklik anında tarayıcıya yansır (&lt;strong&gt;vite: true&lt;/strong&gt; ve &lt;strong&gt;HMR&lt;/strong&gt; sayesinde). Bu mod, eklentiyi aktif olarak geliştirirken kullanılır.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Üretim (Build) Modu:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;pnpm run build&lt;/strong&gt; ile çalışır. Tüm Vue/TS kodunuzu derleyip optimize edilmiş, tek bir statik JavaScript dosyası haline getirir. Eklentiyi bitirip son kullanıcıya sunacağınız zaman bu modu kullanırsınız ve &lt;strong&gt;db.json&lt;/strong&gt;'daki &lt;strong&gt;vite: true&lt;/strong&gt; ayarını &lt;strong&gt;vite: false&lt;/strong&gt; yaparsınız.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Terminalde &lt;strong&gt;frontend&lt;/strong&gt; klasörüne gidin (&lt;strong&gt;/liman/extensions/elasti/frontend&lt;/strong&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gerekli paketlerin yüklü olduğundan emin olun:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Vite geliştirme sunucusunu (tüm ayarlarıyla beraber) başlatın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm run dev --host 0.0.0.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Liman arayüzüne gidin (tarayıcıdan).&lt;/li&gt;
&lt;li&gt;Sol menüden eklentinizi açın.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;KRİTİK ADIM:&lt;/strong&gt; Geliştirme sunucusunu görmek için, eklentinizin normal URL'inin sonuna &lt;code&gt;/development&lt;/code&gt; eklemeniz gerekir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Yanlış Adres:&lt;/strong&gt; &lt;code&gt;https://.../l/e/elasti&lt;/code&gt; (Bu, üretim modunu (build) açar)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doğru Adres:&lt;/strong&gt; &lt;code&gt;https://.../l/e/elasti/development&lt;/code&gt; (Bu, pnpm run dev sunucusuna bağlanır)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nihai Sonuç:&lt;/strong&gt; &lt;code&gt;.../development&lt;/code&gt; adresini açtığınızda, ekrandaElasticsearch FS İstat istikleri başlığının altında, API'den gelen (içinde _nodes, cluster_name vb. bulunan) JSON verisinin tamamını hatasız bir şekilde aşşağdaki şekilde arayüzde görmelisiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpisk06o0p1b1re33lxwt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpisk06o0p1b1re33lxwt.png" alt=" " width="800" height="466"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>elasticsearch</category>
      <category>vite</category>
      <category>php</category>
    </item>
    <item>
      <title>Liman MYS için Eklenti Geliştirme Ortamı Kurulum Rehberi</title>
      <dc:creator>İsa Sarıoğlan</dc:creator>
      <pubDate>Thu, 04 Dec 2025 10:43:34 +0000</pubDate>
      <link>https://forem.com/aciklab/liman-mys-icin-eklenti-gelistirme-ortami-kurulum-rehberi-34ch</link>
      <guid>https://forem.com/aciklab/liman-mys-icin-eklenti-gelistirme-ortami-kurulum-rehberi-34ch</guid>
      <description>&lt;p&gt;Liman MYS, sunucu yönetimini kolaylaştıran güçlü bir platform olmasının yanı sıra, esnek eklenti altyapısıyla da öne çıkar. Bu rehberde, "Liman Extension Template" adını vereceğimiz hazır bir eklenti şablonunu kullanarak, kod değişikliklerimizi anında Liman arayüzünde görebileceğimiz profesyonel bir geliştirme ortamını nasıl kuracağımızı adım adım inceleyeceğiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bölüm 1: Eklenti Şablonunu Liman'a Yükleme
&lt;/h2&gt;

&lt;p&gt;Geliştirme ortamını kurmadan önce, üzerinde çalışacağımız eklentinin Liman tarafından tanınması gerekir. Bu nedenle, hazır eklenti şablonumuzu sisteme yüklüyoruz.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Liman MYS web arayüzünde oturum açın ve sağ üst köşedeki &lt;strong&gt;Ayarlar&lt;/strong&gt; simgesine tıklayın.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyuvbajh3lucsh291k532.png" alt=" " width="800" height="459"&gt;
&lt;/li&gt;
&lt;li&gt;Açılan menüden &lt;strong&gt;Sistem Ayarları&lt;/strong&gt; seçeneğine ve ardından sol menüden &lt;strong&gt;Eklentiler&lt;/strong&gt; sekmesine gidin.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg11hlgdmiu91umqfi5s.png" alt=" " width="800" height="469"&gt;
&lt;/li&gt;
&lt;li&gt;Yükle butonuna tıklayarak bilgisayarınızdaki &lt;strong&gt;.zip&lt;/strong&gt; uzantılı eklenti şablonu dosyasını seçin ve yüklemeyi tamamlayın.
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2f1cc5kvggaay8wlkjj.png" alt=" " width="523" height="386"&gt;
&lt;/li&gt;
&lt;li&gt;Yükleme başarılı olduğunda, eklentiniz listede görünecektir.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Bu adımdan sonra artık eklentimizi arayüzden silip yüklemeyeceğiz. Tüm süreci sunucu tarafında yöneteceğiz.Bu ksımla ılgili detaylı bilgi aşşağıdaki linkten erişebilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.liman.dev/kullanim-kilavuzu/liman-kurulumu/eklenti-kurulumu-ve-guencellemeler" rel="noopener noreferrer"&gt;Limana Eklenti Yükleme&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Bölüm 2: Sunucuya Bağlantı ve Yetkilendirme Hazırlıkları
&lt;/h2&gt;

&lt;p&gt;Bu bölümde, geliştirme yapacağımız sunucuya SSH üzerinden bağlanacak ve VS Code ile sorunsuz bir bağlantı kurmak için gerekli yapılandırmaları yapacağız.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 1: Sunucuya İlk Bağlantı&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Öncelikle sunucunuza standart kullanıcınız ile (genellikle &lt;strong&gt;ubuntu&lt;/strong&gt;, &lt;strong&gt;centos&lt;/strong&gt;, &lt;strong&gt;debian&lt;/strong&gt; vb.) bağlanın.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh kullanici_adiniz@&amp;lt;SUNUCU_IP_ADRESINIZ&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;lt;SUNUCU_IP_ADRESINIZ&amp;gt;&lt;/code&gt;kısmını Liman'ın kurulu olduğu sunucunun IP adresi ile değiştirin.&lt;/p&gt;

&lt;p&gt;Bu aşamada sizden sunucu şifreniz istenecektir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 2: liman Kullanıcısını Geliştirmeye Hazırlama&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Liman, sistem üzerinde kendi işlemlerini yönetmek için genellikle &lt;strong&gt;liman&lt;/strong&gt; adında bir kullanıcı oluşturur. Geliştirme yaparken yetki ve sahiplik sorunları yaşamamak adına işlemlerimizi bu kullanıcı üzerinden yürütmek en sağlıklı yöntemdir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;liman Kullanıcısına Şifre Atama:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;liman&lt;/strong&gt; kullanıcısının varsayılan olarak bir şifresi olmayabilir. SSH bağlantısı için bir şifre belirlememiz gerekiyor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo passwd liman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutu çalıştırdıktan sonra &lt;strong&gt;liman&lt;/strong&gt; kullanıcısı için yeni bir şifre belirlemeniz istenir.Şifre belirledikten sonra terminale aşağıdaki formatta bağlantı komutunu girin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh liman@&amp;lt;SUNUCU_IP_ADRESINIZ&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut,&lt;strong&gt;liman&lt;/strong&gt; adlı kullanıcıya bağlanmamızı sağlar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;liman Kullanıcısının Kabuğunu (Shell) Değiştirme:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Güvenlik nedeniyle &lt;strong&gt;liman&lt;/strong&gt; kullanıcısının kabuğu interaktif olmayan bir kabuk &lt;strong&gt;(/usr/bin/login gibi)&lt;/strong&gt; olabilir. Etkileşimli bir terminal deneyimi için bu kabuğu &lt;strong&gt;bash&lt;/strong&gt; olarak değiştirmeliyiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo usermod --shell /bin/bash liman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut, &lt;strong&gt;liman&lt;/strong&gt; kullanıcısının oturum açtığında standart bir Bash terminali kullanmasını sağlar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 3: Şifresiz ve Güvenli Bağlantı için SSH Anahtarı Oluşturma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Her seferinde şifre girmek yerine, SSH anahtar tabanlı kimlik doğrulama kullanarak süreci otomatikleştirebiliriz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSH Anahtar Çifti Oluşturma (Lokal Makinenizde):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eğer daha önce oluşturmadıysanız, kendi bilgisayarınızın terminalinde aşağıdaki komutu çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-keygen
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;"Enter file in which to save the key...":&lt;/strong&gt; Bu soruya Enter'a basarak varsayılan konumu onaylayın.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Enter passphrase...":&lt;/strong&gt; Daha fazla güvenlik için bir parola belirleyebilirsiniz, ancak geliştirme kolaylığı için bu adımı Enter'a basarak boş geçebilirsiniz. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public Anahtarı Sunucuya Kopyalama:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Oluşturduğunuz public anahtarı (&lt;strong&gt;.pub&lt;/strong&gt; uzantılı olan) &lt;strong&gt;Liman&lt;/strong&gt; sunucusundaki liman kullanıcısının yetkilendirilmiş anahtarlar listesine ekleyeceğiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh-copy-id liman@&amp;lt;SUNUCU_IP_ADRESINIZ&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut sizden son bir kez &lt;strong&gt;liman&lt;/strong&gt; kullanıcısının şifresini isteyecektir. Şifreyi girdikten sonra, artık &lt;code&gt;ssh liman@&amp;lt;SUNUCU_IP_ADRESINIZ&amp;gt;&lt;/code&gt; komutuyla şifresiz bir şekilde sunucuya bağlanabilirsiniz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bölüm 3: Visual Studio Code ile Geliştirme Ortamını Yapılandırma
&lt;/h2&gt;

&lt;p&gt;Artık sunucu tarafı hazır olduğuna göre, kodlarımızı doğrudan sunucu üzerinde düzenlemek için VS Code'u yapılandıracağız. Her seferinde IP adresi ve kullanıcı adı yazmak yerine, SSH yapılandırma dosyasına kalıcı bir kayıt ekleyerek bağlantı sürecini otomatikleştireceğiz.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 1:"Remote - SSH" Eklentisini Yükleyin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VS Code'u açın, sol taraftaki Eklentiler (Extensions) sekmesine gidin, arama çubuğuna &lt;strong&gt;Remote - SSH&lt;/strong&gt; yazın ve Microsoft tarafından geliştirilen eklentiyi yükleyin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz16g4rawa02embb0wr53.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz16g4rawa02embb0wr53.png" alt=" " width="800" height="147"&gt;&lt;/a&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 2: Kalıcı Bir SSH Bağlantısı Oluşturma (Config Dosyası)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bu adım, sunucu bağlantı bilgilerimizi &lt;strong&gt;config&lt;/strong&gt; adında özel bir dosyaya kaydederek, bu bağlantıya kolayca hatırlanabilir bir isim vermemizi sağlar.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSH Yapılandırma Dosyasını Açın:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kendi lokal bilgisayarınızda, bir terminal veya komut istemi açın. SSH yapılandırma dosyasını bir metin editörü ile açın. Bu dosya genellikle aşağıdaki konumlarda bulunur:&lt;/p&gt;

&lt;p&gt;Linux veya macOS: &lt;code&gt;~/.ssh/config&lt;/code&gt;&lt;br&gt;
Windows: &lt;code&gt;C:\Users\KULLANICI_ADINIZ\.ssh\config&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Not:&lt;br&gt;
Eğer &lt;strong&gt;.ssh&lt;/strong&gt; klasörü veya &lt;strong&gt;config&lt;/strong&gt; dosyası mevcut değilse, kendiniz oluşturabilirsiniz.&lt;/p&gt;

&lt;p&gt;Kendi lokal bilgisayarınızda bir terminal açın. &lt;strong&gt;nano&lt;/strong&gt; gibi kullanımı kolay bir terminal editörü ile yapılandırma dosyasını doğrudan açmak için aşağıdaki komutu çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
nano ~/.ssh/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not: &lt;strong&gt;nano&lt;/strong&gt; editöründe dosyayı kaydetmek için &lt;strong&gt;Ctrl+O&lt;/strong&gt; (Write Out) ve ardından &lt;strong&gt;Enter&lt;/strong&gt;'a, çıkmak için ise &lt;strong&gt;Ctrl+X&lt;/strong&gt; tuş kombinasyonunu kullanabilirsiniz.&lt;/p&gt;

&lt;p&gt;Eğer Windows kullanıyorsanız ve terminal kullanmak istemiyorsanız, dosyayı &lt;strong&gt;C:\Users\KULLANICI_ADINIZ.ssh\config&lt;/strong&gt; konumunda bulup Not Defteri (Notepad) gibi bir metin editörü ile de açabilirsiniz.&lt;/p&gt;

&lt;p&gt;(Eğer &lt;strong&gt;.ssh&lt;/strong&gt; klasörü veya &lt;strong&gt;config&lt;/strong&gt; dosyası mevcut değilse, komut dosyayı sizin için oluşturacaktır.)&lt;/p&gt;

&lt;p&gt;Yeni host bilgilerini eklemek için aşşağıdaki işlemleri gerçekleştirin.&lt;/p&gt;

&lt;p&gt;Açtığınız &lt;strong&gt;config&lt;/strong&gt; dosyasına aşağıdaki bloğu ekleyin ve kendi bilgilerinizle doldurun:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Liman MYS Geliştirme Sunucusu
Host liman-dev-sunucusu
    HostName &amp;lt;SUNUCU_IP_ADRESINIZ&amp;gt;
    User liman
    IdentityFile ~/.ssh/id_rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Host:&lt;/strong&gt; Bağlantınızın kısa adıdır. VS Code'da görünecek ve                kullanacağınız isim budur.&lt;br&gt;
   &lt;strong&gt;HostName:&lt;/strong&gt; Liman sunucusunun gerçek IP adresi.&lt;br&gt;
   &lt;strong&gt;User:&lt;/strong&gt; Bağlanacağınız kullanıcı adı, yani liman.&lt;br&gt;
   &lt;strong&gt;IdentityFile:&lt;/strong&gt; Şifresiz bağlantı için oluşturduğunuz SSH özel anahtarınızın yolu (&lt;strong&gt;~/.ssh/id_rsa&lt;/strong&gt; genellikle varsayılandır).&lt;br&gt;
Dosyayı kaydedip kapatın.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 3: VS Code ile Yapılandırılmış Host'a Bağlanma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Ctrl+Shift+P&lt;/strong&gt; (veya &lt;strong&gt;F1&lt;/strong&gt;) tuş kombinasyonu ile komut paletini açın.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1r9acmx5ipdtgmf07f6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe1r9acmx5ipdtgmf07f6.png" alt=" " width="800" height="534"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Remote-SSH: Connect to Host...&lt;/strong&gt; yazıp seçin.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvuxx4y5hmjj3pne7trsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvuxx4y5hmjj3pne7trsg.png" alt=" " width="602" height="116"&gt;&lt;/a&gt;&lt;br&gt;
Karşınıza çıkan listede, &lt;strong&gt;config&lt;/strong&gt; dosyasına eklediğiniz Host isminin (&lt;strong&gt;liman-dev-sunucusu&lt;/strong&gt; gibi) doğrudan göründüğünü göreceksiniz.Bu isme tıklayarak bağlantıyı başlatın.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtfevitbba73hm4sxrne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtfevitbba73hm4sxrne.png" alt=" " width="800" height="532"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VS Code yeni bir pencere açacaktır. Sol alt köşede &lt;strong&gt;"SSH: liman-dev-sunucusu"&lt;/strong&gt; yazdığını gördüğünüzde, bağlantı başarıyla kurulmuş demektir.   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 4:Eklenti Klasörünü Açma&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;VS Code'da &lt;strong&gt;File &amp;gt; Open Folder...&lt;/strong&gt; (veya &lt;strong&gt;Dosya &amp;gt; Klasör Aç...&lt;/strong&gt;) seçeneğine tıklayın.&lt;/p&gt;

&lt;p&gt;Açılan diyalog kutusuna eklentilerin bulunduğu yolu girin: &lt;strong&gt;/liman/extensions/&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OK&lt;/strong&gt; butonuna tıklayın.&lt;/p&gt;

&lt;p&gt;Artık sol taraftaki dosya gezgininde, sunucudaki tüm eklenti dosyalarınızı görebilirsiniz. Yaptığınız her değişiklik anında sunucuya kaydedilecektir.&lt;/p&gt;
&lt;h2&gt;
  
  
  Bölüm 4: Eklentiyi Derleme ve Geliştirme Modunu Aktif Etme
&lt;/h2&gt;

&lt;p&gt;Son aşamada, kodumuzun canlı olarak derlenmesini ve Liman arayüzünde görüntülenmesini sağlayacağız.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 1 :Node.js ve pnpm Kurulumu (Gerekliyse)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Eklenti bağımlılıklarını yönetmek ve derleme işlemlerini yapmak için &lt;strong&gt;pnpm&lt;/strong&gt; paket yöneticisine ihtiyacımız var. &lt;strong&gt;pnpm&lt;/strong&gt;'in çalışabilmesi için de öncelikle sunucunuzda &lt;strong&gt;Node.js&lt;/strong&gt;'in kurulu olması gerekmektedir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js Kurulumu:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Eğer sunucunuzda &lt;strong&gt;Node.js&lt;/strong&gt; kurulu değilse veya çok eski bir sürüm varsa, aşağıdaki komutlarla güncel bir LTS (Uzun Süreli Destek) sürümünü kurabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Terminalde aşağıdaki komutları sırasıyla çalıştırın:

# Node.js 22.x LTS sürümü için kurulum betiğini indirip çalıştırın
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -

# Node.js ve beraberinde gelen npm'i yükleyin
sudo apt-get install -y nodejs

# Kurulumun başarılı olduğunu kontrol edin
node -v
npm -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutlar sonunda &lt;strong&gt;v22.x.x&lt;/strong&gt; ve &lt;strong&gt;v10.x.x&lt;/strong&gt; gibi sürüm numaraları görmelisiniz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PNPM Kurulumu:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt; ve &lt;strong&gt;npm&lt;/strong&gt;'i kurduktan sonra, &lt;strong&gt;npm&lt;/strong&gt;'i kullanarak &lt;strong&gt;pnpm&lt;/strong&gt;'i global olarak (sistemin her yerinden erişilebilir şekilde) kurabiliriz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# npm kullanarak pnpm'i global olarak yükleyin
sudo npm install -g pnpm

# pnpm kurulumunu kontrol edin
pnpm -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut sonunda &lt;strong&gt;pnpm&lt;/strong&gt;'in sürüm numarasını (&lt;strong&gt;9.x.x&lt;/strong&gt; gibi) görüyorsanız, kurulum tamamlanmıştır.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 2: Bağımlılıkları Yükleme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Artık &lt;strong&gt;pnpm&lt;/strong&gt; kurulu olduğuna göre, eklentimizin ihtiyaç duyduğu kütüphaneleri ve paketleri yükleyebiliriz.&lt;br&gt;
VS Code içerisinde &lt;strong&gt;Terminal &amp;gt; New Terminal&lt;/strong&gt; (veya &lt;strong&gt;Terminal &amp;gt; Yeni Terminal&lt;/strong&gt;) menüsünden yeni bir terminal açın. Bu terminalin doğrudan sunucunuzda, açtığınız klasör yolunda (&lt;strong&gt;/liman/extensions/&lt;/strong&gt;) açıldığına dikkat edin.&lt;/p&gt;

&lt;p&gt;Üzerinde çalıştığınız eklentinin klasörüne girin (örneğin: &lt;strong&gt;cd eklenti-adiniz&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Proje bağımlılıklarını yüklemek için aşağıdaki komutu çalıştırın:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut, &lt;strong&gt;package.json&lt;/strong&gt; dosyasını okur ve projenin ihtiyaç duyduğu tüm kütüphaneleri &lt;strong&gt;node_modules&lt;/strong&gt; klasörü altına indirir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Geliştirme Sunucusunu Başlatma:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aynı terminalde, projenin canlı olarak derlenmesini ve dosya değişikliklerini izlemesini sağlayacak komutu çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut, genellikle arkaplanda bir geliştirme sunucusu başlatır ve dosyalarınızda yaptığınız her değişikliği otomatik olarak algılayıp yeniden derler.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adım 3 :Liman Arayüzünde Geliştirme Modunu Aktif Etme&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Öncelikle Liman arayüzünden, geliştirdiğiniz eklentiyi bir sunucu  gerekir. Bu işlem hakkında detaylı bilgi için resmi Liman dokümantasyonunu inceleyebilirsiniz: &lt;a href="https://docs.liman.dev/kullanim-kilavuzu/sunucu-yoenetimi/sunucu-ekleme-ve-kaldirma" rel="noopener noreferrer"&gt;Liman Sunucu Yönetimi&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eklentiyi sunucuya atadıktan sonra, ilgili sunucu üzerinden eklentinizi açın.&lt;/p&gt;

&lt;p&gt;Tarayıcınızın adres çubuğundaki URL'nin sonuna &lt;strong&gt;/development&lt;/strong&gt; ekleyin ve &lt;strong&gt;Enter&lt;/strong&gt;'a basın.&lt;/p&gt;

&lt;p&gt;Bu işlemi yaptığınızda, Liman artık eklentinin derlenmiş statik dosyalarını değil, pnpm run dev komutunun çalıştırdığı geliştirme sunucusundan gelen canlı verileri kullanacaktır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ek Bölüm: Geliştirme Sürecinde Sık Karşılaşılan Sorunlar ve Çözümleri
&lt;/h2&gt;

&lt;p&gt;Aşağıda, ana rehberi takip ederken veya geliştirme yaparken karşılaşabileceğiniz en yaygın dört sorun ve bu sorunları çözmek için izlemeniz gereken adımlar detaylandırılmıştır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Eklenti Panelde Görünmüyor veya "Undefined" Olarak Gözüküyor&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Eklentiyi Liman'a yükledikten sonra, panelde hiç görünmemesi veya isminin "Undefined" olarak listelenmesi.&lt;br&gt;
Bu sorunun neredeyse her zaman tek bir nedeni vardır: Eklentinin &lt;strong&gt;.zip&lt;/strong&gt; dosyasının hatalı bir klasör yapısıyla sıkıştırılması. Liman MYS, eklentiyi tanımak için hayati bir dosya olan &lt;strong&gt;extension.json&lt;/strong&gt;'ın doğrudan zip dosyasının kök dizininde olmasını bekler.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Çözüm Yolları:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Doğru Zip Yapısı:&lt;/strong&gt; Eklenti dosyalarınızın bulunduğu klasörün içine girin, tüm dosyaları (&lt;strong&gt;extension.json&lt;/strong&gt;, &lt;strong&gt;views&lt;/strong&gt;, &lt;strong&gt;public&lt;/strong&gt; vb.) seçin ve bunları doğrudan zipleyin.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;my-extension.zip&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;code&gt;-&amp;gt; extension.json&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;code&gt;-&amp;gt; views/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&amp;gt; public/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&amp;gt; ...diğer dosyalar&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yanlış Zip Yapısı (Kaçınılması Gereken):&lt;/strong&gt; Eklenti dosyalarını içeren ana klasöre sağ tıklayıp onu zip'lemek. Bu durumda extension.json kök dizinde olmaz.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;my-extension.zip&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&amp;gt; my-extension/  (Hatalı alt klasör)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&amp;gt; extension.json&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
&lt;code&gt;-&amp;gt; views/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;-&amp;gt; ...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Port Çakışması (EADDRINUSE) Hatası&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;pnpm run dev&lt;/strong&gt; komutunu çalıştırdığınızda, terminalde "EADDRINUSE" (Error: address already in use) hatası almanız.&lt;/p&gt;

&lt;p&gt;Temel Nedeni Geliştirme sunucusunun kullanmaya çalıştığı portun (genellikle &lt;strong&gt;5173&lt;/strong&gt;) başka bir uygulama veya arka planda unutulmuş eski bir geliştirme süreci tarafından zaten kullanılıyor olması.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Çözüm Yolları:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Yöntem A:&lt;/strong&gt; Alternatif Bir Port Kullanmak (En Hızlı Çözüm)&lt;br&gt;
&lt;strong&gt;pnpm run dev&lt;/strong&gt; komutunu, boş olduğundan emin olduğunuz farklı bir port numarası ile çalıştırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm run dev -- --port 5174
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Yöntem B:&lt;/strong&gt; Portu Kullanan İşlemi Sonlandırmak&lt;br&gt;
Mevcut portu meşgul eden işlemi bulup sonlandırın:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Örnek olarak 5173 portunu kullanan işlemi bulalım
sudo lsof -i :5173
# Komut çıktısındaki PID (Process ID) numarasını kullanarak işlemi sonlandıralım
# Örneğin PID 12345 ise:
sudo kill -9 12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu işlemden sonra &lt;strong&gt;pnpm run dev&lt;/strong&gt; komutunu tekrar çalıştırabilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. 404 - Not Found (/development) Hatası&lt;/strong&gt;&lt;br&gt;
 Liman arayüzünde eklentiyi açıp URL sonuna &lt;strong&gt;/development&lt;/strong&gt; eklediğinizde "404 - Not Found" hatası almanız.&lt;/p&gt;

&lt;p&gt;Temel Nedeni Tarayıcınız, geliştirme sunucusuyla iletişim kuramıyor. Bunun birkaç sebebi olabilir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Çözüm Yolları (Sırasıyla Kontrol Edin):&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Geliştirme Sunucusu Çalışıyor mu?&lt;/strong&gt;&lt;br&gt;
VS Code'daki terminalinize geri dönün. &lt;strong&gt;pnpm run dev&lt;/strong&gt; komutunun hala çalıştığından ve bir hata vermediğinden emin olun. Eğer durmuşsa, yeniden başlatın.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Doğru Portu mu Kullanıyorsunuz?&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;pnpm run dev&lt;/strong&gt; komutunun çıktısını kontrol edin. Geliştirme sunucusu hangi portta (&lt;strong&gt;5173&lt;/strong&gt;, &lt;strong&gt;5174&lt;/strong&gt; vb.) çalıştığını size söyleyecektir. Liman'ın bu porta erişebildiğinden emin olun.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Güvenlik Duvarı (Firewall) Engelliyor mu?&lt;/strong&gt;&lt;br&gt;
Sunucunuzun güvenlik duvarı, geliştirme portuna dışarıdan erişimi engelliyor olabilir. Ubuntu'da &lt;strong&gt;ufw&lt;/strong&gt; kullanılıyorsa, ilgili porta izin verin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Vite'ın varsayılan portu 5173 için izin verelim
sudo ufw allow 5173
sudo ufw reload
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>vscode</category>
      <category>opensource</category>
      <category>limanmys</category>
    </item>
    <item>
      <title>Liman Mail Ayarları</title>
      <dc:creator>Enes Baytekin</dc:creator>
      <pubDate>Mon, 17 Nov 2025 09:07:37 +0000</pubDate>
      <link>https://forem.com/aciklab/liman-mail-ayarlari-3351</link>
      <guid>https://forem.com/aciklab/liman-mail-ayarlari-3351</guid>
      <description>&lt;h2&gt;
  
  
  Mock mail sunucusu kurmak
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Mailhog
&lt;/h3&gt;

&lt;p&gt;Mailhog, gönderilen e-postaları yakalayıp kendi web arayüzünde gösteren bir servistir. Gerçek bir mail sunucusu değildir. Test ortamlarında kullanılan geçici bir mail sunucusu gibi düşünülebilir.&lt;/p&gt;

&lt;h4&gt;
  
  
  Kurulum
&lt;/h4&gt;

&lt;p&gt;Mailhog indirilir ve çalıştırma izni verilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;wget &lt;span class="nt"&gt;-O&lt;/span&gt; /usr/local/bin/mailhog https://github.com/mailhog/MailHog/releases/download/v1.0.0/MailHog_linux_amd64
&lt;span class="nb"&gt;sudo chmod&lt;/span&gt; +x /usr/local/bin/mailhog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;/etc/systemd/system/mailhog.service&lt;/code&gt; servis dosyası oluşturulur ve içi şu şekilde doldurulur.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;Unit]
&lt;span class="nv"&gt;Description&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;Mailhog
&lt;span class="nv"&gt;After&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;network.target
&lt;span class="o"&gt;[&lt;/span&gt;Service]
&lt;span class="nv"&gt;ExecStart&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;/usr/bin/env /usr/local/bin/mailhog &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; /dev/null 2&amp;gt;&amp;amp;1 &amp;amp;
&lt;span class="o"&gt;[&lt;/span&gt;Install]
&lt;span class="nv"&gt;WantedBy&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;multi-user.target
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sistemin, servisi görmesi sağlanır ve servis başlatılır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl daemon-reload
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; mailhog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mailhog iki port açar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;8025: web arayüzü için&lt;/li&gt;
&lt;li&gt;1025: mail gönderilmesi için&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tarayıcıdan &lt;code&gt;http://&amp;lt;server-ip&amp;gt;:8025&lt;/code&gt; adresi ile mailhog arayüzüne gidilebilir.&lt;/p&gt;




&lt;h3&gt;
  
  
  Liman Mail Ayarları
&lt;/h3&gt;

&lt;p&gt;Liman arayüzünden &lt;strong&gt;Ayarlar / E-Posta&lt;/strong&gt; sayfasına gelinir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sunucu Adresi&lt;/strong&gt; ve &lt;strong&gt;Sunucu Portu&lt;/strong&gt; kısmına mail sunucusunun adresi ve mail servisinin çalıştığı port yazılır. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kullanıcı Adı&lt;/strong&gt; ve &lt;strong&gt;Parola&lt;/strong&gt; kısmına test mailinin gelmesi istenilen mail adresi ve parolası yazılır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Şifreleme Türü&lt;/strong&gt; seçilir ve &lt;strong&gt;E-posta gönderimini aktifleştir&lt;/strong&gt; seçeneği işaretlenir.&lt;/p&gt;




&lt;p&gt;Bu ayarlar yapıldıktan sonra liman üzerinde yapılan işlemler (kullanıcı oluşturma / şifresini değiştirme, sunucu ekleme / silme...) ilgili kullanıcıların mail adreslerine gönderilir.&lt;/p&gt;

&lt;p&gt;Eğer mailhog kullanılıyorsa gelen bu mailler, web arayüzü üzerinden kontrol edilebilir.&lt;/p&gt;

</description>
      <category>testing</category>
      <category>linux</category>
      <category>tooling</category>
      <category>devops</category>
    </item>
    <item>
      <title>RKE2'de Liman MYS &amp; Keycloak Kurulumu: Longhorn ve Docker Hub Hata Çözümleri Dahil Tam Rehber</title>
      <dc:creator>Yunus Emre Dere</dc:creator>
      <pubDate>Fri, 24 Oct 2025 10:37:05 +0000</pubDate>
      <link>https://forem.com/aciklab/rke2de-liman-mys-keycloak-kurulumu-longhorn-ve-docker-hub-hata-cozumleri-dahil-tam-rehber-4nfe</link>
      <guid>https://forem.com/aciklab/rke2de-liman-mys-keycloak-kurulumu-longhorn-ve-docker-hub-hata-cozumleri-dahil-tam-rehber-4nfe</guid>
      <description>&lt;p&gt;&lt;strong&gt;Kubernetes (K8s)&lt;/strong&gt; dünyasında, Liman MYS gibi, envanter yönetiminden servis takibine kadar pek çok işlevi eklentilerle yürüten platformlar kullanırız. Bu farklı bileşenler ve yetkiler için merkezi bir kimlik doğrulama (Authentication) yönetimi hızla karmaşıklaşabilir. İşte bu noktada Keycloak devreye giriyor.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47l4orgyf8qw8i1bp7kh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47l4orgyf8qw8i1bp7kh.png" alt=" " width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bu rehberde, RKE2 (hafifletilmiş bir K8s dağıtımı) üzerinde Liman MYS ve Keycloak'u sıfırdan kuracak, bu iki güçlü sistemi birbirine bağlayacak (SSO) ve bu süreçte kesinlikle karşılaşacağınız en yaygın iki hatayı (Longhorn Pending ve Docker Hub TooManyRequests) adım adım çözeceğiz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faz 1: Gerekli Altyapı (Bizim "Sandbox" Ortamımız)
&lt;/h2&gt;

&lt;p&gt;Başlamadan önce, RKE2 sunucumuzun uygulamaları barındırmaya hazır olması gerekir.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;code&gt;RKE2&lt;/code&gt;: Zaten kurulu olduğunu varsayıyoruz.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Helm&lt;/code&gt;: Kubernetes için bir paket yöneticisidir.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;snap &lt;span class="nb"&gt;install &lt;/span&gt;helm &lt;span class="nt"&gt;--classic&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;StorageClass (Longhorn)&lt;/code&gt;: Liman ve Keycloak'un veritabanları gibi 'stateful' (durum bilgisi tutan) uygulamaları, verilerini kalıcı olarak saklamak zorundadır. Bunun için bir &lt;code&gt;StorageClass (Depolama Sınıfı)&lt;/code&gt; sağlayıcısına ihtiyacımız var. Biz burada popüler ve RKE2 ile uyumlu olan &lt;code&gt;Longhorn&lt;/code&gt;'u kullanacağız.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbc8qm0p33wvof3buav3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbc8qm0p33wvof3buav3.png" alt=" " width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aşağıdaki kod Longhorn'u ve onun 'longhorn' adlı StorageClass'ını kurar&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/longhorn/longhorn/v1.9.0/deploy/longhorn.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Longhorn'un longhorn-system namespace'inde kurulup pod'larının Running duruma gelmesini bekleyin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faz 2: Keycloak Kurulumu ve Erişimi
&lt;/h2&gt;

&lt;p&gt;Artık altyapımız hazır olduğuna göre, kimlik sunucumuz olan Keycloak'u kuralım.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adım 1: Keycloak'u Kurma
&lt;/h3&gt;

&lt;p&gt;Topluluk tarafından sağlanan resmi YAML dosyası, hem Keycloak'u (bir StatefulSet olarak) hem de veritabanı için bir PostgreSQL'i (bir Deployment olarak) kurar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/keycloak/keycloak-quickstarts/refs/heads/main/kubernetes/keycloak.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adım 2: Pod Kontrolü
&lt;/h3&gt;

&lt;p&gt;Kurulumun tamamlandığını görmek için pod'ları kontrol edin.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get pods
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;NAME                       READY   STATUS    RESTARTS   AGE
keycloak-0                 1/1     Running   0          39h
keycloak-1                 1/1     Running   0          39h
postgres-65cf55dbf-nv5kx   1/1     Running   0          40h
redis-58f44d957b-6gzmw     1/1     Running   0          24h
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pod'ların Running durumuna geçmesi, Docker Hub limitlerine takılmazsanız birkaç dakika sürebilir. (Eğer ErrImagePull hatası alırsanız, Faz 4'teki çözüme atlayın).&lt;/p&gt;

&lt;h3&gt;
  
  
  Adım 3: Keycloak Ingress Yapılandırması
&lt;/h3&gt;

&lt;p&gt;Keycloak'a tarayıcıdan temiz bir adresle (keycloak.test.local gibi) erişmek için bir Ingress oluşturacağız.&lt;/p&gt;

&lt;p&gt;Önce, Keycloak servisinin hangi portu kullandığını öğrenelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get svc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;NAME                 TYPE        CLUSTER-IP     EXTERNAL-IP   PORT&lt;span class="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt;    AGE
keycloak             ClusterIP   10.43.158.36   &amp;lt;none&amp;gt;        8080/TCP   40h
keycloak-discovery   ClusterIP   None           &amp;lt;none&amp;gt;        &amp;lt;none&amp;gt;     40h
kubernetes           ClusterIP   10.43.0.1      &amp;lt;none&amp;gt;        443/TCP    42h
postgres             ClusterIP   10.43.32.41    &amp;lt;none&amp;gt;        5432/TCP   40h

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gördüğümüz gibi, keycloak servisi 8080 portunu kullanıyor. Şimdi keycloak-ingress.yaml dosyamızı oluşturalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano keycloak-ingress.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dosyanın içeriği:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keycloak-ingress&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="c1"&gt;# RKE2'nin varsayılan nginx controller'ını kullan&lt;/span&gt;
  &lt;span class="na"&gt;ingressClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;  
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keycloak.test.local"&lt;/span&gt; &lt;span class="c1"&gt;# Keycloak'a bu adresle erişeceğiz&lt;/span&gt;
    &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
        &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keycloak&lt;/span&gt;   &lt;span class="c1"&gt;# Yukarıda öğrendiğimiz servis adı&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;8080&lt;/span&gt; &lt;span class="c1"&gt;# Yukarıda öğrendiğimiz port&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ingress kuralını uygulayalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; keycloak-ingress.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Adım 4: Hosts Dosyası
&lt;/h3&gt;

&lt;p&gt;keycloak.test.local adresinin RKE2 sunucumuzun IP'sine yönlenmesi için, tarayıcıyı kullandığımız kendi bilgisayarımızda (sunucuda değil!) /etc/hosts dosyasını düzenlememiz gerekiyor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/hosts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dosyanın en altına RKE2 sunucunuzun IP'sini ve host adını ekleyin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;kubernetes-kurulu-server-ip-adresi&amp;gt;   keycloak.test.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Artık tarayıcıdan &lt;a href="https://www.google.com/search?q=http://keycloak.test.local" rel="noopener noreferrer"&gt;http://keycloak.test.local&lt;/a&gt; adresine giderek Keycloak arayüzüne erişebilirsiniz.&lt;/p&gt;

&lt;p&gt;Varsayılan hızlı başlangıç bilgileri:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Kullanıcı Adı: admin&lt;/li&gt;
&lt;li&gt;Şifre: admin&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Faz 3: Keycloak'u Liman için Yapılandırma
&lt;/h2&gt;

&lt;p&gt;Liman'a "Bana güvenebilirsin" demek için Keycloak'ta bir "Client" (istemci) ve "Realm" (Bölge) oluşturmalıyız.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Realm Oluşturun:&lt;/strong&gt; admin olarak giriş yaptıktan sonra, sol üstteki "master" yazan yerden "Manage realms" &amp;gt; "Create Realm" deyin. Realm adınızı Liman-Realm gibi bir şey yapın ve "Create"e tıklayın.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client Oluşturun:&lt;/strong&gt; Sol üstten &lt;code&gt;Liman-Realm&lt;/code&gt;'i seçtiğinizden emin olun. Sol menüden "&lt;code&gt;Clients&lt;/code&gt;" sekmesine ve ardından "&lt;code&gt;Create Client&lt;/code&gt;"a tıklayın. "&lt;code&gt;Client ID&lt;/code&gt;" kısmına &lt;code&gt;liman-client&lt;/code&gt; gibi hatırlayacağınız bir isim verin. Gelen ekranda "&lt;code&gt;Client authentication&lt;/code&gt;" ve "&lt;code&gt;Authorization&lt;/code&gt;" seçeneklerini &lt;code&gt;ON (Açık)&lt;/code&gt; konuma getirin. Aşağıdaki "&lt;code&gt;Valid redirect URIs&lt;/code&gt;" alanına, Liman arayüzünde bizden istenen adresi girmeliyiz. Bu, Liman'ın Ingress host adına bağlı olacaktır. Şimdilik &lt;a href="https://www.google.com/search?q=https://liman.test.local/keycloak/callback" rel="noopener noreferrer"&gt;https://liman.test.local/keycloak/callback&lt;/a&gt; yazabilirsiniz. (Liman Ingress'ini oluştururken liman.test.local kullanacağız). Web origins kısmına da &lt;a href="https://www.google.com/search?q=https://liman.test.local" rel="noopener noreferrer"&gt;https://liman.test.local&lt;/a&gt; yazın ve kaydedin.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Client Secret'ı Alın:&lt;/strong&gt; Kaydettikten sonra açılan "Credentials" sekmesine tıklayın ve "Client Secret" değerini kopyalayın. Bu, Liman'daki forma yapıştıracağımız "şifre" olacak.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rolleri Token'a Ekleyin (Çok Önemli Adım!):&lt;/strong&gt; Liman'ın, giriş yapan kullanıcının yetkilerini anlaması için bu rollerin Keycloak tarafından oluşturulan token'a eklenmesi gerekir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sol menüden "Client Scopes"a tıklayın.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;roles&lt;/code&gt; adlı scope'u seçin.&lt;/li&gt;
&lt;li&gt;Açılan ekranda "Mappers" (Eşleyiciler) sekmesine tıklayın.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;realm-roles&lt;/code&gt;'e girin, "Add to access token" seçeneğini aktifleştirip kaydedin.&lt;/li&gt;
&lt;li&gt;Aynı işlemi &lt;code&gt;client-roles&lt;/code&gt; için de yapın.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Test Kullanıcısı Oluşturun:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sol menüden "&lt;code&gt;Users&lt;/code&gt;"a gidin ve "&lt;code&gt;Add User&lt;/code&gt;" deyin.&lt;/li&gt;
&lt;li&gt;Kullanıcı bilgilerinizi girin, "&lt;code&gt;Email verified&lt;/code&gt;" seçeneğini açın ve Create'e tıklayın.&lt;/li&gt;
&lt;li&gt;Kullanıcıyı oluşturduktan sonra, "&lt;code&gt;Credentials&lt;/code&gt;" sekmesine giderek ona kalıcı bir şifre belirleyin (Temporary'i kapatarak).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Keycloak tarafı artık Liman'ı kabul etmeye hazır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Faz 4: Liman MYS Kurulumu ve Hata Ayıklama
&lt;/h2&gt;

&lt;p&gt;Şimdi Liman MYS'yi kuralım ve bu süreçte karşılaşacağımız iki yaygın hatayı çözelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/limanmys/core.git
&lt;span class="nb"&gt;cd &lt;/span&gt;core/k8s/helm
kubectl create namespace liman
helm &lt;span class="nb"&gt;install &lt;/span&gt;limancore &lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;--namespace&lt;/span&gt; liman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;kubectl get pods -n liman&lt;/code&gt; komutunu çalıştırdığınızda, pod'ların Pending (Beklemede) veya ErrImagePull durumunda takıldığını göreceksiniz. Panik yapmayın, bu normal.&lt;/p&gt;

&lt;h3&gt;
  
  
  HATA 1 ÇÖZÜMÜ: Pending (Beklemede) Pod'lar
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;db-&lt;/code&gt; ve &lt;code&gt;limancore-&lt;/code&gt; pod'larının Pending kalmasının nedeni, Longhorn'un varsayılan olarak 3 replica (kopya) disk oluşturmaya çalışmasıdır. Bizim RKE2 kurulumumuz tek bir sunucudan (Node) oluştuğu için Longhorn "Verinin 3 kopyasını oluşturamam" diyerek diski (Volume) oluşturmayı reddeder.&lt;/p&gt;

&lt;p&gt;Bunu düzeltmek için Longhorn arayüzüne erişip replica sayısını 1'e düşüreceğiz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Longhorn Arayüzünü Erişime Açın:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl edit svc longhorn-frontend &lt;span class="nt"&gt;-n&lt;/span&gt; longhorn-system
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Açılan vi editöründe, &lt;code&gt;spec:&lt;/code&gt; altındaki &lt;code&gt;type: ClusterIP&lt;/code&gt; satırını &lt;code&gt;type: NodePort&lt;/code&gt; olarak değiştirin ve kaydedip çıkın (Esc &amp;gt; :wq &amp;gt; Enter).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Portu Öğrenin:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get svc &lt;span class="nt"&gt;-n&lt;/span&gt; longhorn-system
NAME                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT&lt;span class="o"&gt;(&lt;/span&gt;S&lt;span class="o"&gt;)&lt;/span&gt;        AGE
longhorn-admission-webhook    ClusterIP   10.43.130.170   &amp;lt;none&amp;gt;        9502/TCP       23h
longhorn-backend              ClusterIP   10.43.171.127   &amp;lt;none&amp;gt;        9500/TCP       23h
longhorn-conversion-webhook   ClusterIP   10.43.234.16    &amp;lt;none&amp;gt;        9501/TCP       23h
longhorn-frontend             NodePort    10.43.84.222    &amp;lt;none&amp;gt;        80:31248/TCP   23h
longhorn-recovery-backend     ClusterIP   10.43.60.100    &amp;lt;none&amp;gt;        9503/TCP       23h

&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;longhorn-frontend&lt;/code&gt; servisinin &lt;code&gt;NodePort&lt;/code&gt; değerini (örn: &lt;code&gt;80:31248/TCP&lt;/code&gt;) göreceksiniz. Bize &lt;code&gt;31248&lt;/code&gt; portu lazım.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Replica Sayısını Düşürün:&lt;/strong&gt; Tarayıcınızdan &lt;code&gt;http://&amp;lt;sunucu-ip-adresi&amp;gt;:&amp;lt;port-sayısı&amp;gt;&lt;/code&gt; (örn: &lt;a href="http://xx.xx.xx.xx:31248" rel="noopener noreferrer"&gt;http://xx.xx.xx.xx:31248&lt;/a&gt;) adresine gidin. "Volume" sekmesine gidin. Faulted (Hatalı) durumda olan volüm'leri (liman db ve core için) göreceksiniz. Sağ taraftaki üç noktaya tıklayın ve "Update Replicas" (Replica'ları Güncelle) deyin. Değeri 3'ten 1'e düşürün ve OK'e basın.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bunu hatalı olan tüm Liman volüm'leri için yaptığınızda, durumları "Healthy" (Sağlıklı) olacaktır ve pod'lar Pending durumundan çıkacaktır.&lt;/p&gt;

&lt;h3&gt;
  
  
  HATA 2 ÇÖZÜMÜ: ErrImagePull / TooManyRequests
&lt;/h3&gt;

&lt;p&gt;Pending sorununu çözseniz bile, pod'ların bu kez &lt;code&gt;ErrImagePull&lt;/code&gt; veya &lt;code&gt;ImagePullBackOff&lt;/code&gt; hatası verdiğini göreceksiniz. Bunun nedeni, Docker Hub'ın anonim (giriş yapmamış) kullanıcılara çok düşük bir imaj indirme limiti koymasıdır.&lt;/p&gt;

&lt;p&gt;Çözüm, RKE2 sunucumuza Docker Hub'a nasıl giriş yapacağını öğretmektir.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker Hub Access Token Oluşturun:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Docker Hub'a giriş yapın.&lt;/li&gt;
&lt;li&gt;Ayarlar &amp;gt; Security &amp;gt; Personal Access Tokens sayfasına gidin.&lt;/li&gt;
&lt;li&gt;"Generate New Token" diyerek bir token oluşturun ve bu token'ı güvenli bir yere kopyalayın.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes Secret Oluşturun:&lt;/strong&gt; Terminalde, kopyaladığınız o token'ı kullanarak bir Kubernetes "giriş kartı" (secret) oluşturun:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create secret docker-registry dockerhub-auth &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-username&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"SizinDockerHubKullanıcıAdınız"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-password&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YENİ_OLUŞTURDUĞUNUZ_TOKEN"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--docker-email&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"SizinEmailAdresiniz"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-n&lt;/span&gt; liman
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Secret'ı Pod'lara Tanıtın:&lt;/strong&gt; &lt;code&gt;liman&lt;/code&gt; namespace'indeki &lt;code&gt;default&lt;/code&gt; (varsayılan) hizmet hesabını (Service Account) yamalayarak, bu namespace'de oluşturulan her pod'un imaj çekerken bu "giriş kartını" kullanmasını sağlayacağız:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl patch serviceaccount default &lt;span class="nt"&gt;-n&lt;/span&gt; liman &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="s1"&gt;'{"imagePullSecrets": [{"name": "dockerhub-auth"}]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;&lt;strong&gt;Pod'ları Yeniden Başlatın:&lt;/strong&gt; Hatalı pod'ları silerek Kubernetes'in onları yeni ayarla (giriş yapmış olarak) yeniden başlatmasını sağlayın:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl delete pods &lt;span class="nt"&gt;--all&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; liman
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Tekrar &lt;code&gt;kubectl get pods -n liman -w&lt;/code&gt; komutuyla izlediğinizde, bu kez tüm pod'ların imajları başarıyla çektiğini ve Running durumuna geçtiğini göreceksiniz.&lt;/p&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Faz 5: Liman Ingress ve Son Ayarlar
&lt;/h2&gt;

&lt;p&gt;Artık çalışan bir Liman'ımız var. Ona da Keycloak gibi temiz bir adresle erişelim.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Liman Ingress Dosyası:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano liman-ingress.yaml
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Dosyanın içeriği:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;networking.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Ingress&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;liman&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;liman&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# Arka uç (Liman) HTTPS (443) kullandığı için Nginx'e HTTPS konuşmasını söylüyoruz&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/backend-protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HTTPS"&lt;/span&gt;
    &lt;span class="c1"&gt;# Liman'ın kendi imzaladığı sertifikayı Nginx'in dert etmemesini söylüyoruz&lt;/span&gt;
    &lt;span class="na"&gt;nginx.ingress.kubernetes.io/proxy-ssl-verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;off"&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;ingressClassName&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx&lt;/span&gt;
  &lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;liman.test.local"&lt;/span&gt; &lt;span class="c1"&gt;# Liman'a bu adresle erişeceğiz&lt;/span&gt;
    &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;paths&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;/&lt;/span&gt;
        &lt;span class="na"&gt;pathType&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Prefix&lt;/span&gt;
        &lt;span class="na"&gt;backend&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;service&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;limancore&lt;/span&gt; &lt;span class="c1"&gt;# Liman'ın ana servis adı&lt;/span&gt;
            &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
              &lt;span class="na"&gt;number&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;443&lt;/span&gt;    &lt;span class="c1"&gt;# Liman'ın servis portu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Dosyayı kaydedin ve uygulayın:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; liman-ingress.yaml &lt;span class="nt"&gt;-n&lt;/span&gt; liman
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Hosts Dosyasını Güncelleyin:&lt;/strong&gt; Tekrar kendi bilgisayarınızda &lt;code&gt;sudo nano /etc/hosts&lt;/code&gt; dosyasını açın ve &lt;code&gt;liman.test.local&lt;/code&gt; adresini de ekleyin:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;kubernetes-kurulu-server-ip-adresi&amp;gt;   keycloak.test.local
&amp;lt;kubernetes-kurulu-server-ip-adresi&amp;gt;   liman.test.local
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Liman Admin Şifresini Alın:&lt;/strong&gt; Liman'a ilk giriş için tek kullanımlık bir şifre almamız gerekiyor:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Önce limancore pod'unun tam adını bulalım:&lt;/span&gt;
&lt;span class="nv"&gt;LIMAN_POD_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;kubectl get pods &lt;span class="nt"&gt;-n&lt;/span&gt; liman &lt;span class="nt"&gt;-l&lt;/span&gt; &lt;span class="nv"&gt;service&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;limancore &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="nv"&gt;jsonpath&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{.items[0].metadata.name}'&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Liman Pod Adı: &lt;/span&gt;&lt;span class="nv"&gt;$LIMAN_POD_NAME&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# Şimdi o pod'dan şifreyi isteyelim:&lt;/span&gt;
kubectl &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nt"&gt;-it&lt;/span&gt; &lt;span class="nv"&gt;$LIMAN_POD_NAME&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; liman &lt;span class="nt"&gt;--&lt;/span&gt; limanctl administrator
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Size &lt;code&gt;administrator&lt;/code&gt; kullanıcısı için bir şifre verecektir.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Liman'ı Keycloak'a Bağlayın:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tarayıcınızdan &lt;a href="https://www.google.com/search?q=http://liman.test.local" rel="noopener noreferrer"&gt;http://liman.test.local&lt;/a&gt; adresine gidin. (Ingress, isteğinizi otomatik olarak HTTPS'e yönlendirecektir).&lt;/li&gt;
&lt;li&gt;Aldığınız &lt;code&gt;administrator&lt;/code&gt; şifresiyle giriş yapın.&lt;/li&gt;
&lt;li&gt;Ayarlar &amp;gt; Erişim &amp;gt; Keycloak sekmesine gidin.&lt;/li&gt;
&lt;li&gt;Buradaki alanları, Faz 3'te Keycloak'ta oluşturduğunuz bilgilerle doldurun:

&lt;ul&gt;
&lt;li&gt;Client ID: &lt;code&gt;liman-client&lt;/code&gt; (veya ne isim verdiyseniz)&lt;/li&gt;
&lt;li&gt;Client Secret: Keycloak'tan kopyaladığınız gizli şifre.&lt;/li&gt;
&lt;li&gt;Redirect URL: &lt;code&gt;https://liman.test.local/keycloak/callback&lt;/code&gt; (Keycloak'a girdiğiniz adresin aynısı)&lt;/li&gt;
&lt;li&gt;Base URL: &lt;code&gt;http://keycloak.default.svc.cluster.local:8080&lt;/code&gt; (Keycloak adresiniz)&lt;/li&gt;
&lt;li&gt;Realm: &lt;code&gt;Liman-Realm&lt;/code&gt; (veya ne isim verdiyseniz)&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;"Entegrasyonu aktifleştir" butonunu AÇIK hale getirin ve kaydedin.&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Son Adım: Liman'ı Yeniden Başlatın
&lt;/h3&gt;

&lt;p&gt;Liman'ın bu yeni ayarları çekmesi için &lt;code&gt;limancore&lt;/code&gt; pod'unu yeniden başlatmamız gerekiyor:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Pod'un tam adını tekrar bulup silin&lt;/span&gt;
kubectl delete pod &lt;span class="nv"&gt;$LIMAN_POD_NAME&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; liman
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pod yeniden başladığında, Liman giriş ekranına geri dönün.&lt;/p&gt;

&lt;p&gt;Artık "Giriş Yöntemi" olarak Keycloak'u seçebilir, Faz 3'te oluşturduğunuz test kullanıcısıyla giriş yapabilir ve Keycloak üzerinden Liman'a başarıyla bağlandığınızı görebilirsiniz.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tebrikler!&lt;/strong&gt; Artık RKE2 üzerinde çalışan, Longhorn ile kalıcı depolamaya sahip ve Keycloak ile SSO entegrasyonu tamamlanmış bir Liman MYS kurulumunuz var.&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>keycloak</category>
      <category>liman</category>
      <category>docker</category>
    </item>
    <item>
      <title>Liman Zabbix Bildirimleri</title>
      <dc:creator>Enes Baytekin</dc:creator>
      <pubDate>Fri, 24 Oct 2025 07:35:33 +0000</pubDate>
      <link>https://forem.com/aciklab/liman-zabbix-bildirimleri-2mba</link>
      <guid>https://forem.com/aciklab/liman-zabbix-bildirimleri-2mba</guid>
      <description>&lt;h2&gt;
  
  
  Media type oluşturmak
&lt;/h2&gt;

&lt;p&gt;Zabbix'te &lt;strong&gt;Alerts / Media types&lt;/strong&gt; kısmında gelinir ve yeni bir media type oluşturulur.&lt;/p&gt;

&lt;p&gt;Oluştururken;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Medya tipine bir isim verilir.&lt;/li&gt;
&lt;li&gt;Tip olarak webhook seçilir.&lt;/li&gt;
&lt;li&gt;Scriptte kullanılacak parametreler, değerleri zabbixten gelen değerler olacak şekilde tanımlanır.&lt;/li&gt;
&lt;li&gt;Script kısmına javascript dilinde yazılır. Burada istenilen endpointlere istenilen şekilde istek atılablir.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Şu şekilde limana istek gönderilebilir:&lt;/p&gt;


&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;token&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;limandan-alinan-token&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;title&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;mesaj-basligi&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;mesaj-basligi&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;de&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;mesaj-basligi&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;content&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tr&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;mesaj-icerigi&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;en&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;mesaj-icerigi&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;de&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;mesaj-icerigi&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;level&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;&amp;lt;trivial|low|medium|high|critical&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mail&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;send_to&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;admins&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nx"&gt;liman&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;lstesi&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;HttpRequest&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;addHeader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type: application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;liman_address&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/notifications/send&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getStatus&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;API request (443) failed: &lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Process tags seçeneği işaretlenir.&lt;/li&gt;
&lt;li&gt;Bir açıklama girilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Not: Limana bildirim gönderebilmek için gönderilecek için bir liman token alınması lazım. Yani zabbix makinesinin ip'si için liman arayüzünden &lt;strong&gt;Ayarlar / Dış Bildirimler&lt;/strong&gt; kısmından bir token oluşturmak ve burdaki script içinde istek atarken body'de bu tokeni de kullanmak gerekli. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Trigger action oluşturmak
&lt;/h2&gt;

&lt;p&gt;Zabbix'te &lt;strong&gt;Alerts / Actions / Trigger actions&lt;/strong&gt; kısmına gelinir ve yeni bir action oluşturulur.&lt;/p&gt;

&lt;p&gt;Oluştururken;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Action için bir isim verilir.&lt;/li&gt;
&lt;li&gt;Conditions kısmına bu aksiyonun ne zaman tetikleneceği ile ilgili kriterler girilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Örnek:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;(Event name contains &lt;code&gt;En az 3 dakika&lt;/code&gt;) AND ((Host Group equals &lt;code&gt;A Host Grubu&lt;/code&gt;) OR (Host Group equals &lt;code&gt;B Host Grubu&lt;/code&gt;))&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A veya B host grubuna sahip olan varlıklarda oluşan bir problemin isminde &lt;em&gt;'En az 3 dakika'&lt;/em&gt; geçiyorsa bu action tetiklenecek.&lt;/p&gt;


&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Operations sekmesinde, &lt;em&gt;Default operation step duration&lt;/em&gt; bu aksiyonun ne sıklıkla tetikleneceği belirtilir. &lt;em&gt;(1h = 1 saat, 1m = 1 dakika, ...)&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Operation eklerkenki Steps kısmında problem başladıktan sonraki hangi aralıklarda bu aksiyonun tetikleneceği belirtilir. İlk kısım kaçıncı aralıktan başlayacağı, ikinci kısım ise kaçıncı aralıkta biteceğini belirtir. Step duration da bu aralıkların süresini belirtir. (0 olarak bırakıp default action duration'ı kullanabilirsiniz.)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Örnekler:&lt;/strong&gt;&lt;/p&gt;


&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1    2    3    4    5
|....|....|....|....|...  . . .
  1h   1h   1h   1h
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;Step duraiton: 1h&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;1 - 1 --&amp;gt; Problem oluştuğu anda bir kere tetiklensin.&lt;/p&gt;

&lt;p&gt;2 - 2 --&amp;gt; Problem oluştuktan 1 saat sonra (2. intervalde) bir kere tetiklensin.&lt;/p&gt;

&lt;p&gt;4 - 0 --&amp;gt; Problem oluştuktan 3 saat sonra (4. intervalde) tetiklensin ve sonsuza kadar (problem çözülene kadar) her saat başı bir kez daha tetiklensin.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Send to users&lt;/em&gt; ya da &lt;em&gt;Send to user groups&lt;/em&gt; kısımlarında bu aksiyon tetiklendiğinde hangi zabbix kullanıcıları için geçerli olacağı seçilir. Admin seçilebilir.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Send to media type&lt;/em&gt; kısmında daha önce liman için oluşturulmuş olan medya tipi seçilir.&lt;/li&gt;
&lt;li&gt;Her bir operatör için custom mesaj eklemek de mümkün. Ancak Liman'a bildirim atarken gönderilen isteğin body'sinde mesaj içeriği de belirtildiği için mesaj içeriğini medya tipinin script kısmında javascript ile belirleyerek daha dinamik mesajlar ('şu kadar saat önce' gibi) elde edilebillir.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Recovery operations&lt;/em&gt; kısmında ise yine aynı mantık ile problem çözüldüğünde bu aksiyonun tetiklenmesi sağlanabilir.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Zabbix'te &lt;strong&gt;Users / Users&lt;/strong&gt; sayfasına actionları oluştururken seçilen zabbix user'ı seçilir ve &lt;strong&gt;Media&lt;/strong&gt; sekmesine gelinir.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Media&lt;/em&gt; alanına bir media eklenir;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Type&lt;/em&gt; kısmında, daha önce oluşturmuş olan medya tipi seçilir.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Send to&lt;/em&gt; kısmına herhangi bir şey yazılabilir.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Use if severity&lt;/em&gt; kısmında bu kullanıcı için, seçili olan severity'lere sahip problemlerin actionları tetiklenir.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Update&lt;/em&gt;'e tıklanarak kaydedilir.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tutorial</category>
      <category>devops</category>
      <category>monitoring</category>
      <category>javascript</category>
    </item>
    <item>
      <title>Netex Server ve Netex Sensör kurulumu</title>
      <dc:creator>Emine Nur Arıcı</dc:creator>
      <pubDate>Wed, 08 Oct 2025 10:23:12 +0000</pubDate>
      <link>https://forem.com/aciklab/netex-server-ve-netex-sensor-kurulumu-4010</link>
      <guid>https://forem.com/aciklab/netex-server-ve-netex-sensor-kurulumu-4010</guid>
      <description>&lt;h2&gt;
  
  
  NETEX SERVER KURMA ADIMLARI
&lt;/h2&gt;

&lt;p&gt;not: zabbixin LTS sürümünün kurulu olduğu varsayılmıştır. Zabbix kurulumu için: &lt;a href="https://www.zabbix.com/download?zabbix=7.0&amp;amp;os_distribution=ubuntu&amp;amp;os_version=24.04&amp;amp;components=server_frontend_agent&amp;amp;db=pgsql&amp;amp;ws=apache" rel="noopener noreferrer"&gt;zabbix kurulumu&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Postgresql kurulumu:&lt;/em&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo apt install postgresql postgresql-contrib

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;veritabanı sunucusuna bağlanma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo -u postgres psql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kullanıcı ve veritabanımızı oluşturalım&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CREATE USER netex WITH PASSWORD '1';
CREATE DATABASE netex WITH OWNER netex;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha sonrasında &lt;code&gt;\q&lt;/code&gt; ile çıkış yapabiliriz&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;NETEX server kurulumu:&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;kurulumu size verilen deb dosyası ile yapabilirsiniz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt install ./netex-sensor-455-x64.deb -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sonra düzenleme yapabilmek için &lt;code&gt;sudo su&lt;/code&gt;ile root kullanıcısına geçiyoruz, oradan &lt;br&gt;
&lt;code&gt;cd /opt/netex&lt;/code&gt; &lt;br&gt;
komutu ile netex klasörüne geçip &lt;code&gt;env.example&lt;/code&gt; içindeki içeriği &lt;code&gt;.env&lt;/code&gt; içerisine kopyalıyoruz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cp env.example .env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;nano .env&lt;/code&gt; ile .env dosyasını açıp içini düzenliyoruz:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;storage configuration&lt;/code&gt; kısmında farklı isimlerde DB ve USER oluşturulmadıysa değişiklik yapnmaya gerek yoktur. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Zabbix ayarlarını yaparken zabbix kurarken kullandığınız kullanıcı adı ve passwordu giriyoruz. URL kısmındaki ip adresi kısmına da zabbixin kurulu olduğu serverın ipsini giriyoruz.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;JWT KEY ‘i bulmak için  Liman'ın  kurulu olduğu makineye gidip&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; sudo su
cd /liman
cd server
cat .env 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;diyoruz ve çıkan .env dosyasının içeriğinde en altta JWT_SECRET’ı buluyoruz. Sonrasında .env dosyasında JWT kısmına  yapıştırıyoruz.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
.env dosyasının aşağıdaki kısımlarını yukarıdaki bilgilere göre düzenliyoruz.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Storage Configuration @required
DB_HOST=127.0.0.1
DB_NAME=netex
DB_PASS=netex
DB_PORT=5432
DB_USER=netex

ZABBIX_USERNAME="&amp;lt;zabbix_username&amp;gt;"
ZABBIX_PASSWORD="&amp;lt;zabbix_password&amp;gt;"
ZABBIX_URL="&amp;lt;http://zabbix_ip_adresi/zabbix/api_jsonrpc.php&amp;gt;"
ZABBIX_SYNC="ON"

# Liman JWT Secret for http admin service usage @not-required
JWT_SECRET= &amp;lt;yukarıda nasıl bulunacağı belirtildi.&amp;gt; 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Daha sonrasında bu iki komutla restart edip netex server'daki tüm   servisleri kontrol edelim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
sudo systemctl restart netex@*
sudo systemctl status netex@*

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3mbpgroo5eahyiitpge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3mbpgroo5eahyiitpge.png" alt=" " width="755" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bpzl7mhgm6qtjlj0pa1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2bpzl7mhgm6qtjlj0pa1.png" alt=" " width="755" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon5pdoqw26v7wmtpy2u8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fon5pdoqw26v7wmtpy2u8.png" alt=" " width="755" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanme5pztrw1upqumshn5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fanme5pztrw1upqumshn5.png" alt=" " width="755" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  NETEX SENSÖR KURMA ADIMLARI
&lt;/h2&gt;

&lt;p&gt;netex kurulu makinede şunları yapalım:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo su
cd /opt/netex/clients
ls 

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;burada sensör için gerekli kurulum dosyaları sıralanır. Ubuntu cihaza deb dosyası şu şekilde kurulur:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apt install ./netex-sensor-455-x64.deb -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;opt/netex-sensor/.env&lt;/code&gt; dosyasının içeriğini düzenleyelim.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SERVER_URL="https://&amp;lt;netex_server_ip&amp;gt;:7782"
SENSOR_IP="&amp;lt;netex_server_ip&amp;gt;"
DNS_SERVER_URL="&amp;lt;DNS_server_ip&amp;gt;:53"
DEBUG_MODE="OFF"
PORT_MIRRORING_INTERFACE="ens18"

SOURCE_IP_KEY=8
DEST_IP_KEY=12
SOURCE_MAC_KEY=56
DEST_MAC_KEY=57

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Not: Lisans olmadığında netex-sensör çalışmayacaktır.&lt;/p&gt;

&lt;p&gt;** NETEX’İ LİMAN ARAYÜZÜNE EKLEME**&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Limanı kurduğumuz ip adresindeki Liman arayüzüne gidelim.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Öncelikle sunucular ekranına gelelim ve sunucu ekle diyelim.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bu kısımda portu kendimiz ekliyoruz bu portu bulmak için terminalde netex'i restart ettikten sonra &lt;code&gt;journalctl -u netex@* -f&lt;/code&gt;çalıştırdığımda şöyle bir çıktı alıyoruz ve orada port numarası yazıyor. Onu resimdeki belirtilen alana giriyoruz.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsw34tjt7lpimqx86chof.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsw34tjt7lpimqx86chof.png" alt=" " width="552" height="398"&gt;&lt;/a&gt;&lt;br&gt;
bu durımda bu port 7781&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpl60ase0aabf0nsv84u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpl60ase0aabf0nsv84u.png" alt=" " width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Anahatar Türü kısmında anahtarsız giriş seçelim.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Netex kurulu sunucumuzu ekleyelim ve sol panelden sunucumuza tıklayalım . eklentiler kısmına basalım. buradan da eklenti ekle diyelim.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ekle diyerek ağ keşif seçelim ve böylelikle eklentiyi eklemiş olduk.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Arayüzde sol panelden eklentiye tıkladığımızda lisanslanmamış olsa da anasayfa açılır:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14iumjznvwf2bax0d0nl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14iumjznvwf2bax0d0nl.png" alt=" " width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>monitoring</category>
      <category>tutorial</category>
      <category>linux</category>
    </item>
    <item>
      <title>Python ile basit bir MCP Sunucu-İstemci örneği</title>
      <dc:creator>Ali Orhun Akkirman</dc:creator>
      <pubDate>Tue, 02 Sep 2025 21:04:17 +0000</pubDate>
      <link>https://forem.com/aciklab/python-ile-basit-bir-mcp-sunucu-istemci-ornegi-7a8</link>
      <guid>https://forem.com/aciklab/python-ile-basit-bir-mcp-sunucu-istemci-ornegi-7a8</guid>
      <description>&lt;p&gt;LLM'lerin araçlarla etkileşimi konusunda önemli bir adım olan MCP için python üzerinde en temelde &lt;strong&gt;FastMCP&lt;/strong&gt; aracı kullanılmakta. Tabi ki bu araçlar sürekli güncellenip gelişmekte fakat yine de bu tarih için en geniş kullanıma sahip kütüphanesi olarak düşünülebilir.&lt;/p&gt;

&lt;h1&gt;
  
  
  MCP Sunucu Kurulum
&lt;/h1&gt;

&lt;p&gt;Öncelikle mimarideki MCP sunucu kurulumu için aşağıdaki komutla fastmcp modülünün kurulması gerekmektedir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip instal fastmcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutla birlikte sistemde Python üzerinde fastmcp modülü kullanılabilir duruma gelinmekte.&lt;/p&gt;

&lt;h1&gt;
  
  
  MCP Sunucu Yapılandırma
&lt;/h1&gt;

&lt;p&gt;Bu adımdan sonra bir de basit bir sunucu uygulaması hazırlayalım. Uygulamanın test açısından son hali aşağıdaki gibi düşünebiliriz. Buradaki örnekte basit bir mcp fonksiyon aracı ile başka bir REST API'yi çağıran farklı bir fonksiyon aracının da bulunduğunu göreceğiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;starlette.applications&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Starlette&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;starlette.routing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Mount&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server.sse&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SseServerTransport&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Test MCP Sunucusu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Merhaba &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;exTool1&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Kullanıcı &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; !&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SseServerTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/messages/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;handle_sse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect_sse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;receive&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_send&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;as &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;out_stream&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_mcp_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;in_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;out_stream&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;_mcp_server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_initialization_options&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getirHavaDurumu&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sehir&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.open-meteo.com/v1/forecast?latitude=41.01&amp;amp;longitude=28.97&amp;amp;current_weather=true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sehir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sehir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sonuc&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;current_weather&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]}&lt;/span&gt;

&lt;span class="c1"&gt;#Build a small Starlette app for the two MCP endpoints
&lt;/span&gt;&lt;span class="n"&gt;sse_app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Starlette&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;routes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nc"&gt;Route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/sse&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;handle_sse&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;methods&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GET&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]),&lt;/span&gt;
        &lt;span class="c1"&gt;# Note the trailing slash to avoid 307 redirects
&lt;/span&gt;        &lt;span class="nc"&gt;Mount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;/messages/&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;handle_post_message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu uygulamadaki en önemli parça &lt;a class="mentioned-user" href="https://dev.to/mcp"&gt;@mcp&lt;/a&gt;.tool() ile başlayan kısımlar. Bu kısımlar istemci (client) üzerinde kullanılabilir araç olarak görülebilecektir. Örneğin yukarıdaki uygulamada hello, exTool1 ve getirHavaDurumu şeklinde 3 tane araç bulunmakta.&lt;/p&gt;

&lt;p&gt;Her araç için fonksiyon içerisindeki parametreler aldığını görmekteyiz. Örneğin hello'da name, exTool1'de user ve getirHavaDurumu'nda ise sehir olacak şekilde. Bu parametrelerin kullanımı fonksiyon içerisinde net bir şekilde anlaşıldığını düşünüyorum. Bir örnek açısından yukarıdaki uygulamada sehir parametresi requests modülü ile open-meteo API'sine sorgu atararak sıcaklık ve rüzgar değerlerini çekebilmekte.&lt;/p&gt;

&lt;p&gt;Diğer kısımlara şuan için girmiyorum.&lt;/p&gt;

&lt;p&gt;Bu adımdan sonra hangi isimle dosyayı kaydederseniz bu şekilde çağırmanız yeterli.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 server.py 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutun çıktısı aşağıdaki gibi olması beklenmekte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;╭────────────────────────────────────────────────────────────────────────────╮
│                                                                            │
│        _ __ ___  _____           __  __  _____________    ____    ____     │
│       _ __ ___ .'____/___ ______/ /_/  |/  / ____/ __ \  |___ \  / __ \    │
│      _ __ ___ / /_  / __ `/ ___/ __/ /|_/ / /   / /_/ /  ___/ / / / / /    │
│     _ __ ___ / __/ / /_/ (__  ) /_/ /  / / /___/ ____/  /  __/_/ /_/ /     │
│    _ __ ___ /_/    \____/____/\__/_/  /_/\____/_/      /_____(*)____/      │
│                                                                            
│                                FastMCP  2.0                                │
│               🖥️  Server name:     Test MCP Sunucusu                          │
│               📦 Transport:       Streamable-HTTP                          │
│               🔗 Server URL:      http://127.0.0.1:8000/mcp                │
│               🏎️  FastMCP version: 2.12.0                                   │
│               🤝 MCP SDK version: 1.13.1                                   │
│               📚 Docs:            https://gofastmcp.com                    │
│               🚀 Deploy:          https://fastmcp.cloud                    │
╰────────────────────────────────────────────────────────────────────────────╯


[09/02/25 23:45:24] INFO     Starting MCP server 'Test MCP Server'    server.py:1571
                             with transport 'http' on                               
                             http://127.0.0.1:8000/mcp                              
INFO:     Started server process [281559]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu çıktı ile MCP sunucumuzun 8000 portu üzerinden ayağa kalktığını söyleyebiliriz.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sıra geldi MCP İstemciye
&lt;/h1&gt;

&lt;p&gt;İstemci yapılandırılması için ise aşağıdaki uygulamayı kullanacağız.&lt;/p&gt;

&lt;p&gt;Öncelikle kurulum için aşağıdaki komutu kullanabiliriz:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"mcp[cli]"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sonrasında sunucuyu kullanacak olan örnek bir istemci uygulaması aşağıdaki gibi kurgulanabilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;asyncio&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;fastmcp.client.transports&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StreamableHttpTransport&lt;/span&gt;

&lt;span class="c1"&gt;# --- Configuration ---
&lt;/span&gt;&lt;span class="n"&gt;SERVER_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://localhost:8000/mcp&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;PrettyPrinter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indent&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;unwrap_tool_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
    Safely unwraps the content from a FastMCP tool call result object.
    &lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;content&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# The content is a list containing a single content object
&lt;/span&gt;        &lt;span class="n"&gt;content_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="c1"&gt;# It could be JSON or plain text
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;json&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;hasattr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;text&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="c1"&gt;# Use ast.literal_eval for safely evaluating a string containing a Python literal
&lt;/span&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ast&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;literal_eval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;SyntaxError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="c1"&gt;# If it's not a literal, return the raw text
&lt;/span&gt;                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;content_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;


&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StreamableHttpTransport&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;SERVER_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Connecting to FastMCP server at:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SERVER_URL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# 1. Ping to test connectivity
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;Testing server connectivity...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;ping&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✅ Server is reachable!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 2. Discover server capabilities
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;🛠️   Available tools:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_tools&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;📚 Available resources:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_resources&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;💬 Available prompts:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;list_prompts&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;

       &lt;span class="c1"&gt;# 3. Test tool
&lt;/span&gt;        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;🔍 Testing tool: havadurumu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;raw_search&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;getirHavaDurumu&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sehir&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;zonguldak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,},&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;search_results&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;unwrap_tool_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;raw_search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;search_results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;asyncio&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu uygulamadaki en önemli kısım ise yapılandırma kısmındaki SERVER_URL olarak sunucunun adres ve portunun yazılması gerekliliği olacak.&lt;/p&gt;

&lt;p&gt;Sonrasında FastMCP araç çağrısını okunabilir noktaya getirecek unwrap_tool_result fonksiyonunu görüyoruz.&lt;/p&gt;

&lt;p&gt;Ama asıl önemli kısım main fonksiyonunda yer alan kısımlar.&lt;/p&gt;

&lt;p&gt;İlk adımda sunucuya sağlıklı erişip erişmediğinin kontrolü, sonrasında da sunucuda yer alan araç, kaynak ve prompt değerlerini göstermekte. Şuan için sadece araç kullandığımız için diğerleri boş gelecektir.&lt;/p&gt;

&lt;p&gt;Araçlar içerisinde de hava durumunu sorguladığımız ve örnekte "zonguldak" ili için hava durumunu sorguladığımızı gösterecek.&lt;/p&gt;

&lt;p&gt;Dolayısıyla aşağıdaki komut ile istemci uygulaması çalıştırılabilir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python3 client.py 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komutun çıktısı da aşağıdaki gibi olacağı öngörülmekte.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connecting to FastMCP server at: http://localhost:8000/mcp

Testing server connectivity...
✅ Server is reachable!

🛠️  Available tools:
[ Tool(name='hello', title=None, description=None, inputSchema={'properties': {'name': {'title': 'Name', 'type': 'string'}}, 'required': ['name'], 'type': 'object'}, outputSchema={'properties': {'result': {'title': 'Result', 'type': 'string'}}, 'required': ['result'], 'title': '_WrappedResult', 'type': 'object', 'x-fastmcp-wrap-result': True}, annotations=None, meta={'_fastmcp': {'tags': []}}),
  Tool(name='exTool1', title=None, description=None, inputSchema={'properties': {'user': {'title': 'User', 'type': 'string'}}, 'required': ['user'], 'type': 'object'}, outputSchema={'properties': {'result': {'title': 'Result', 'type': 'string'}}, 'required': ['result'], 'title': '_WrappedResult', 'type': 'object', 'x-fastmcp-wrap-result': True}, annotations=None, meta={'_fastmcp': {'tags': []}}),
  Tool(name='getirHavaDurumu', title=None, description=None, inputSchema={'properties': {'sehir': {'title': 'Sehir', 'type': 'string'}}, 'required': ['sehir'], 'type': 'object'}, outputSchema={'additionalProperties': True, 'type': 'object'}, annotations=None, meta={'_fastmcp': {'tags': []}})]

📚 Available resources:
[]

💬 Available prompts:
[]


🔍 Testing tool: havadurumu
&amp;lt;bound method BaseModel.json of TextContent(type='text', text='{"sehir":"zonguldak","sonuc":{"time":"2025-09-02T20:45","interval":900,"temperature":22.8,"windspeed":3.0,"winddirection":14,"is_day":0,"weathercode":1}}', annotations=None, meta=None)&amp;gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tüm bu adımlarla birlikte aslında basitçe bir MCP sunucu-istemci uygulamasını ayağa kaldırıp kullanmış oluyoruz.&lt;/p&gt;

&lt;p&gt;Tabi ki bu yazıda MCP uygulamasının detaylarına, LLM'lerle ilişkisine veya farklı detaylı konulara girmeden basitçe kullanımını derli toplu hazırlamak istedim. Umarım yeni başlayanlar için faydalı bir yazı olur.&lt;/p&gt;

&lt;p&gt;Kaynak olarak kullandığım &lt;a href="https://www.datacamp.com/tutorial/building-mcp-server-client-fastmcp" rel="noopener noreferrer"&gt;adres&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;~~~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~&lt;del&gt;&lt;/del&gt;~~~~&lt;/p&gt;

&lt;p&gt;"Her yeni başlangıç, başka bir başlangıcın sonundan gelir."  Seneca&lt;/p&gt;

</description>
      <category>python</category>
      <category>mcp</category>
      <category>fastmcp</category>
      <category>llm</category>
    </item>
    <item>
      <title>Eve-ng NAT Network Yapılandırması</title>
      <dc:creator>Erenalp Tekşen</dc:creator>
      <pubDate>Fri, 04 Jul 2025 12:41:31 +0000</pubDate>
      <link>https://forem.com/aciklab/eve-ng-nat-network-yapilandirmasi-5ee6</link>
      <guid>https://forem.com/aciklab/eve-ng-nat-network-yapilandirmasi-5ee6</guid>
      <description>&lt;h2&gt;
  
  
  Başlıklara Hızlı Erişim
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;NAT Network Nedir?&lt;/li&gt;
&lt;li&gt;Eve-ng'de NAT Ağ Yapısı İşleyişi&lt;/li&gt;
&lt;li&gt;NAT Network Yapılandırması&lt;/li&gt;
&lt;li&gt;DHCP Server Kurulumu ve Yapılandırılması&lt;/li&gt;
&lt;li&gt;Eve-ng Ağ Bağlantı Testleri&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="nat-network-nedir"&gt;NAT Network Nedir&lt;/h2&gt;

&lt;p&gt;NAT (Network Address Translation), lokal ağdaki özel IP adreslerini internet üzerinde geçerli olan genel IP adreslerine dönüştürerek ağ trafiğinin yönetilmesini sağlar. Bu sayede birden fazla cihaz tek bir genel IP adresi kullanarak internete çıkabilir. NAT, hem IP adreslerini korumak hem de ekstra güvenlik katmanı sağlamak için kullanılır.&lt;/p&gt;

&lt;h2 id="eve-ng-nat-network-nasıl-çalışır"&gt;Eve-ng'de NAT Ağ Yapısı İşleyişi&lt;/h2&gt;

&lt;p&gt;Eve-ng platformunda NAT (Network Address Translation) Network, farklı sanal ağ cihazlarının birbiriyle ve internet ile etkili bir şekilde iletişim kurmasını sağlayan bir yapılandırmadır. Bu yapılandırma, belirlenen bir ağ arayüzü üzerinden diğer sanal cihazlara IP adresi tahsis etmek ve bu cihazların internete çıkışını yönetmek için kullanılır.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88o9p85vpl3pmqkqlwrx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F88o9p85vpl3pmqkqlwrx.png" alt="Image description" width="800" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Görselde görüldüğü üzere, "EVE NG VM" içerisinde birden fazla Pnet arayüzü bulunmaktadır. Özellikle "Pnet1" arayüzüne bağlı cihazlar için, internete çıkış talepleri "Pnet0" arayüzü üzerinden yönlendirilir. Burada, Pnet0 arayüzü NAT işlevi görerek, Pnet1 ve diğer arayüzlerden gelen tüm dış ağ trafiğini masquerade eder. Masquerade, iç ağdaki özel IP adreslerini tek bir halka açık IP adresi altında toplayarak dış ağlara sunar. Bu işlem, sanal cihazların internete erişimini güvenli ve kontrol edilebilir bir şekilde sağlar.&lt;/p&gt;

&lt;h2 id="nat-network-yapılandırması"&gt;NAT Network Yapılandırması&lt;/h2&gt;

&lt;h3&gt;
  
  
  Köprü Yönetimi
&lt;/h3&gt;

&lt;p&gt;Eve-ng ortamında, fiziksel ve sanal arayüzler arasındaki bağlantıları yönetmek ve izlemek için brctl show komutu kullanılır. Bu komut, ağ köprülerinin nasıl yapılandırıldığını ve hangi arayüzlerin birbirine bağlı olduğunu gösterir&lt;/p&gt;

&lt;h4&gt;
  
  
  Komutun Kullanımı
&lt;/h4&gt;

&lt;p&gt;Köprüleme durumunu görüntülemek için terminalinize brctl show yazın ve enter tuşuna basın.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fly2ew6ynxfl7ex98w7db.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fly2ew6ynxfl7ex98w7db.png" alt="Image description" width="691" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Köprü Bağlantılarının Eşleşmesi
&lt;/h3&gt;

&lt;p&gt;brctl show komutu ile elde edilen çıktıda görülen pnet0, pnet1, pnet2 gibi arayüzler, Eve-ng içerisinde network node eklerken seçilebilen cloud1, cloud2 gibi seçeneklerle doğrudan eşleşmektedir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft15g0i5hyu58j9ewsfcr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft15g0i5hyu58j9ewsfcr.png" alt="Image description" width="610" height="628"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  IP Adresi Atama ve Network Servisini Yeniden Başlatma
&lt;/h1&gt;

&lt;p&gt;NAT yapılandırmasına başlamadan önce, seçilen ağ arayüzüne statik bir IP adresi atamanız gerekmektedir. Bunun için aşağıdaki adımları izleyin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ağ konfigürasyon dosyasını açın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;nano /etc/network/interfaces
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Arayüze statik IP adresi atayın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Cloud devices&lt;/span&gt;
iface eth1 inet manual
auto pnet1
iface pnet1 inet static
    address 192.168.125.1
    netmask 255.255.255.0
    bridge_ports eth1
    bridge_stp off
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Networking servisini yeniden başlatarak ayarların devreye girmesini sağlayın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl restart networking
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Ayarların doğru uygulandığını kontrol edin:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;less | ip address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4s2474rghzqdcbiu24g3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4s2474rghzqdcbiu24g3.png" alt="Image description" width="800" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  IPV4 Forwarding Aktivasyonu
&lt;/h1&gt;

&lt;p&gt;IPV4 paketlerinin yönlendirilmesini etkinleştirmek için:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sisteminizdeki ilgili yapılandırma dosyasını açın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Yorum satırını kaldırarak IP forwarding'i aktif hale getirin ve değişiklikleri uygulayın:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsgqvifubbmixxzmkc1y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmsgqvifubbmixxzmkc1y.png" alt="Image description" width="748" height="141"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Değişiklikleri kontrol edin
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sysctl &lt;span class="nt"&gt;-p&lt;/span&gt; /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdthxphdot47q0uhxd1j0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdthxphdot47q0uhxd1j0.png" alt="Image description" width="440" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  IPTables ile MASQUERADE Ayarı
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;Ağınızdaki cihazların internete çıkışını sağlamak için MASQUERADE kurallarını IPTables üzerinden ayarlayın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;192.168.125.0 subnet'inden gelenleri pnet0 interface'ini kullanarak internete çıkar demektir.
iptables -t nat -A POSTROUTING -s 192.168.125.0/24 -o pnet0 -j MASQUERADE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;IPTables kurallarının doğru bir şekilde uygulanıp uygulanmadığını kontrol edin:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;iptables -L -nv -t nat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwa3yj48qsp4j34qtbwb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwa3yj48qsp4j34qtbwb.png" alt="Image description" width="800" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IPTables kurallarını kalıcı hale getirmek için aşağıdaki komutu kullanın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;netfilter-persistent save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2 id="dhcp-server-kurulumu-ve-yapılandırılması"&gt;DHCP Server Kurulumu ve Yapılandırılması&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;DHCP sunucusunu yükleyin:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt-get &lt;span class="nb"&gt;install &lt;/span&gt;isc-dhcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;DHCP sunucusunun hangi arayüzde çalışacağını belirleyin:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nano /etc/default/isc-dhcp-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frehrez4namanivq244yn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frehrez4namanivq244yn.png" alt="Image description" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DHCP yapılandırma dosyasını düzenleyin:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/etc/dhcp/dhcpd.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;DHCP sunucusu için aşağıdaki konfigürasyonları kendi ağ yapılandırmanıza uyacak şekilde düzenleyip, &lt;strong&gt;dhcpd.conf&lt;/strong&gt; dosyasına ekleyin:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;authoritative&lt;/span&gt;;

&lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="m"&gt;192&lt;/span&gt;.&lt;span class="m"&gt;168&lt;/span&gt;.&lt;span class="m"&gt;125&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="n"&gt;netmask&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;.&lt;span class="m"&gt;255&lt;/span&gt;.&lt;span class="m"&gt;255&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt; {
  &lt;span class="n"&gt;range&lt;/span&gt; &lt;span class="m"&gt;192&lt;/span&gt;.&lt;span class="m"&gt;168&lt;/span&gt;.&lt;span class="m"&gt;125&lt;/span&gt;.&lt;span class="m"&gt;20&lt;/span&gt; &lt;span class="m"&gt;192&lt;/span&gt;.&lt;span class="m"&gt;168&lt;/span&gt;.&lt;span class="m"&gt;125&lt;/span&gt;.&lt;span class="m"&gt;254&lt;/span&gt;;
  &lt;span class="n"&gt;interface&lt;/span&gt; &lt;span class="n"&gt;pnet1&lt;/span&gt;;
  &lt;span class="n"&gt;default&lt;/span&gt;-&lt;span class="n"&gt;lease&lt;/span&gt;-&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="m"&gt;600&lt;/span&gt;;
  &lt;span class="n"&gt;max&lt;/span&gt;-&lt;span class="n"&gt;lease&lt;/span&gt;-&lt;span class="n"&gt;time&lt;/span&gt; &lt;span class="m"&gt;7200&lt;/span&gt;;
  &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;-&lt;span class="n"&gt;name&lt;/span&gt;-&lt;span class="n"&gt;servers&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;.&lt;span class="m"&gt;8&lt;/span&gt;.&lt;span class="m"&gt;8&lt;/span&gt;.&lt;span class="m"&gt;8&lt;/span&gt;, &lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;;
  &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;broadcast&lt;/span&gt;-&lt;span class="n"&gt;address&lt;/span&gt; &lt;span class="m"&gt;192&lt;/span&gt;.&lt;span class="m"&gt;168&lt;/span&gt;.&lt;span class="m"&gt;125&lt;/span&gt;.&lt;span class="m"&gt;255&lt;/span&gt;;
  &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;subnet&lt;/span&gt;-&lt;span class="n"&gt;mask&lt;/span&gt; &lt;span class="m"&gt;255&lt;/span&gt;.&lt;span class="m"&gt;255&lt;/span&gt;.&lt;span class="m"&gt;255&lt;/span&gt;.&lt;span class="m"&gt;0&lt;/span&gt;;
  &lt;span class="n"&gt;option&lt;/span&gt; &lt;span class="n"&gt;routers&lt;/span&gt; &lt;span class="m"&gt;192&lt;/span&gt;.&lt;span class="m"&gt;168&lt;/span&gt;.&lt;span class="m"&gt;125&lt;/span&gt;.&lt;span class="m"&gt;1&lt;/span&gt;;}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;"dhcpd -t"&lt;/strong&gt; komutu ile yapılandırma dosyasında herhangi bir syntax hatası var mı kontrol edin&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DHCP sunucusunu başlatın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl start isc-dhcp-server 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;DHCP sunucusunu sistem başladığında otomatik olarak çalışacak şekilde etkinleştirin:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;isc-dhcp-server 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;DHCP sunucusunun durumunu kontrol edin:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl isc-dhcp-server status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3p1ktvrlo2wkvfrg86kc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3p1ktvrlo2wkvfrg86kc.png" alt="Image description" width="800" height="71"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="eve-ng-ağ-bağlantı-testleri"&gt;Eve-ng Ağ Bağlantı Testleri&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;EVE-ng arayüzünde sağ tıklayarak 'Network' sekmesini seçin ve yapılandırdığınız arayüzü aktif edin.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqiopewbcl8hfgygkzkb2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqiopewbcl8hfgygkzkb2.png" alt="Image description" width="161" height="231"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;EVE-ng'nin Network sekmesinde "Type" kısmından, önceden yapılandırdığınız arayüzü seçin. Bu rehberde, pnet1 üzerinde çalışıldığı için "Cloud1" seçeneği seçilmiştir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99j4sa42l6430y79ccog.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F99j4sa42l6430y79ccog.png" alt="Image description" width="598" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu sanal makinesini doğrudan Cloud yapılandırmasına bağlayarak ağ bağlantısını kurun.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sh6xcc1ziolphdxf5zz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1sh6xcc1ziolphdxf5zz.png" alt="Image description" width="325" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ubuntu sanal makinesinde terminal açın ve aşağıdaki komutu kullanarak DHCP sunucusundan IP adresi alın:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;dhclient
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep1cv644krpcfejmw72w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fep1cv644krpcfejmw72w.png" alt="Image description" width="800" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Alınan IP adresi ile internet erişimini kontrol edin&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65cdm84jo10w0gxj6pr9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65cdm84jo10w0gxj6pr9.png" alt="Image description" width="756" height="150"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NOT: &lt;em&gt;Bu rehber, temel bir NAT Network yapılandırması üzerine kurulmuştur. Eğer farklı bir topolojide çalışmayı planlıyorsanız, ağınızı daha etkin yönetmek için ek yapılandırmalar yapmanız gerekebilir. Bunlar arasında &lt;code&gt;statik ve dinamik yönlendirme&lt;/code&gt;, &lt;code&gt;IP NAT inside ve outside konfigürasyonları&lt;/code&gt; veya &lt;code&gt;ACL (Erişim Kontrol Listesi) kullanımı&lt;/code&gt; yer alabilir.&lt;/em&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Sonuç
&lt;/h1&gt;

&lt;p&gt;Bu rehber, Eve-ng platformunda NAT Network kullanarak sanal ağ cihazları arasındaki etkileşim ve internet bağlantısının nasıl yapılandırılacağını detaylı bir şekilde anlatmaktadır. NAT'ın ağ güvenliğini ve IP adres yönetimini nasıl iyileştirdiğini öğrendik. Ayrıca, DHCP server kurulumu ve yapılandırılması gibi ileri düzey ağ operasyonlarına da değindik. IP forwarding ve MASQUERADE ayarlarının önemi, ağ trafiğinin yönetilmesi ve internet erişiminin sağlanmasında kritik rol oynamaktadır.&lt;/p&gt;

</description>
      <category>nat</category>
      <category>network</category>
      <category>eveng</category>
      <category>dhcp</category>
    </item>
    <item>
      <title>Keystone Keycloak Entegrasyonu</title>
      <dc:creator>Erenalp Tekşen</dc:creator>
      <pubDate>Fri, 04 Jul 2025 12:40:03 +0000</pubDate>
      <link>https://forem.com/aciklab/keystone-keycloak-entegrasyonu-5gkg</link>
      <guid>https://forem.com/aciklab/keystone-keycloak-entegrasyonu-5gkg</guid>
      <description>&lt;h2&gt;
  
  
  Giriş
&lt;/h2&gt;

&lt;p&gt;Bu doküman, bir kimlik sağlayıcı olan &lt;strong&gt;Keycloak&lt;/strong&gt; ile bulut yönetim platformu &lt;strong&gt;OpenStack Keystone&lt;/strong&gt; arasında &lt;strong&gt;OpenID Connect (OIDC)&lt;/strong&gt; protokolü kullanılarak federated authentication (federasyon tabanlı kimlik doğrulama) entegrasyonunu anlatır.&lt;/p&gt;

&lt;h3&gt;
  
  
  Temel Kavramlar:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Keycloak&lt;/strong&gt;: Açık kaynaklı bir kimlik ve erişim yönetimi çözümüdür. Kullanıcı kimlik doğrulama, yetkilendirme, kullanıcı profili yönetimi gibi işlemleri sağlar.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenStack Keystone&lt;/strong&gt;: OpenStack’in kimlik yönetimi servisidir. Kullanıcıların, projelerin ve rollerin doğrulanmasından sorumludur.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OpenID Connect (OIDC)&lt;/strong&gt;: OAuth 2.0 protokolünün kimlik doğrulama katmanıdır. Keycloak gibi OIDC sağlayıcıları, OpenStack gibi uygulamalara kullanıcı kimlik doğrulama imkanı sunar.&lt;/li&gt;
&lt;/ul&gt;




&lt;h1&gt;
  
  
  Keycloak – OpenStack Keystone OpenID Connect Entegrasyonu Rehberi
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Genel Bilgilendirme
&lt;/h2&gt;

&lt;p&gt;Bu dökümanda geçen örnek domain adresleri:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;auth.keycloak.local&lt;/code&gt;: Keycloak sunucusunun HTTPS üzerinden erişilebilir alan adıdır. Gerçek ortamda bu adres, sizin Keycloak kurulumunuzun erişilebilir FQDN (tam nitelikli alan adı) olmalıdır.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dlp.srv.world&lt;/code&gt;: OpenStack Keystone ve Horizon servislerinin HTTPS ile sunulduğu alan adıdır. Bu da sizin ortamınıza uygun bir şekilde DNS ile çözülmelidir. Eğer DNS yoksa &lt;code&gt;/etc/hosts&lt;/code&gt; ile eşleştirme yapılabilir.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Her iki servis de HTTPS ile çalışmalı ve geçerli sertifikalarla (self-signed ya da CA imzalı) yapılandırılmış olmalıdır.&lt;/p&gt;

&lt;p&gt;Bu döküman, &lt;strong&gt;Keycloak&lt;/strong&gt; kimlik sağlayıcısını kullanarak &lt;strong&gt;OpenStack Keystone&lt;/strong&gt; ile &lt;strong&gt;OpenID Connect (OIDC)&lt;/strong&gt; tabanlı federated authentication yapılandırmasını anlatır. Bu sayede kullanıcılar, Horizon arayüzü veya CLI üzerinden Keycloak ile OpenStack'e giriş yapabilir.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ön Gereksinimler
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;HTTPS yapılandırılmış bir &lt;strong&gt;Keycloak&lt;/strong&gt; sunucusu&lt;br&gt;&lt;br&gt;
(Self-signed veya geçerli bir SSL sertifikası ile)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;HTTPS yapılandırılmış bir &lt;strong&gt;OpenStack Horizon&lt;/strong&gt; servisi&lt;br&gt;&lt;br&gt;
(Sadece CLI kullanılacaksa Horizon gerekmez)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1. Adım: Keycloak Yapılandırması
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Client Oluşturma
&lt;/h3&gt;

&lt;p&gt;Keycloak arayüzünde aşağıdaki şekilde &lt;code&gt;keystone&lt;/code&gt; adlı bir client oluşturulmalıdır:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Protocol&lt;/strong&gt;: &lt;code&gt;openid-connect&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Client Authentication&lt;/strong&gt;: Açık&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Etkin Flowlar&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Standard Flow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Implicit Flow&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Direct Access Grants&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Root URL&lt;/strong&gt;: &lt;code&gt;&lt;a href="https://dlp.srv.world:5000" rel="noopener noreferrer"&gt;https://dlp.srv.world:5000&lt;/a&gt;&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Valid Redirect URIs&lt;/strong&gt;: &lt;code&gt;&lt;a href="https://dlp.srv.world:5000/*" rel="noopener noreferrer"&gt;https://dlp.srv.world:5000/*&lt;/a&gt;&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Web Origins&lt;/strong&gt;: &lt;code&gt;+&lt;/code&gt;
&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Admin URL&lt;/strong&gt;: &lt;code&gt;&lt;a href="https://dlp.srv.world:5000" rel="noopener noreferrer"&gt;https://dlp.srv.world:5000&lt;/a&gt;&lt;/code&gt;
&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwy25633ps58yozn7fhcz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwy25633ps58yozn7fhcz.png" alt="Image description" width="800" height="373"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs02jdfuzd29hb75nwb6s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs02jdfuzd29hb75nwb6s.png" alt="Client Yapılandırması" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  PKCE Ayarı
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code Challenge Method&lt;/strong&gt;: &lt;code&gt;S256&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdmwi2x09p7yeol2nor97.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdmwi2x09p7yeol2nor97.png" alt="PKCE" width="800" height="546"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  User Attribute Tanımları
&lt;/h3&gt;

&lt;p&gt;Keycloak &amp;gt; Realm Settings &amp;gt; User Profile alanından aşağıdaki attribute'lar eklenmelidir:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openstack-user-domain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openstack-default-project&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8521ml2ax4bofs94ac32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8521ml2ax4bofs94ac32.png" alt="User Attributes" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Client Scope ve Mapper
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;keystone&lt;/code&gt; adlı bir &lt;strong&gt;Client Scope&lt;/strong&gt; oluşturun&lt;/li&gt;
&lt;li&gt;Mapper olarak aşağıdaki iki alan tanımlanmalı:

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;openstack-user-domain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;openstack-default-project&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5l15ayn0zm1z3z4bkbh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc5l15ayn0zm1z3z4bkbh.png" alt="Mapper" width="800" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Kullanıcı Attribute'leri
&lt;/h3&gt;

&lt;p&gt;Her kullanıcı için yukarıdaki attribütler manuel olarak doldurulmalıdır:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2ohjs7wlukpte7iwdmx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm2ohjs7wlukpte7iwdmx.png" alt="User Attributes" width="800" height="555"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Adım: Keystone Yapılandırması
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Identity Provider Tanımı
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openstack identity provider create &lt;span class="nt"&gt;--remote-id&lt;/span&gt; https://auth.keycloak.local/realms/master keycloak
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mapping Tanımı (mapping.json)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"local"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{0}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"email"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{1}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{2}"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{2}"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"projects"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"{3}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
                &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"member"&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"remote"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OIDC-preferred_username"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OIDC-email"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OIDC-openstack-user-domain"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"OIDC-openstack-default-project"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Mapping Oluşturma
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openstack mapping create &lt;span class="nt"&gt;--rules&lt;/span&gt; mapping.json mymapping
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Protocol Oluşturma
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openstack federation protocol create openid &lt;span class="nt"&gt;--mapping&lt;/span&gt; mymapping &lt;span class="nt"&gt;--identity-provider&lt;/span&gt; keycloak
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Adım: Apache OIDC Konfigürasyonu
&lt;/h2&gt;

&lt;p&gt;Apache sunucusundaki uygun &lt;code&gt;.conf&lt;/code&gt; dosyasına aşağıdaki satırlar eklenmelidir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;OIDCSSLValidateServer &lt;span class="ss"&gt;Off&lt;/span&gt;
OIDCOAuthSSLValidateServer &lt;span class="ss"&gt;Off&lt;/span&gt;
OIDCCookieSameSite &lt;span class="ss"&gt;Off&lt;/span&gt;
WSGIPassAuthorization &lt;span class="ss"&gt;On&lt;/span&gt;

OIDCStateTimeout 300
OIDCClaimPrefix "OIDC-"
OIDCResponseType "id_token token"
OIDCScope "openid &lt;span class="ss"&gt;email&lt;/span&gt; profile"
OIDCProviderMetadataURL "https://auth.keycloak.local/realms/master/.well-known/openid-configuration"
OIDCClientID "keystone"
OIDCClientSecret "&amp;lt;KEYCLOAK_CLIENT_SECRET&amp;gt;"

OIDCPKCEMethod "S256"
OIDCCryptoPassphrase "openstack"
OIDCRedirectURI "https://dlp.srv.world:5000/v3/auth/OS-FEDERATION/websso/openid"
OIDCOAuthVerifyJwksUri "https://auth.keycloak.local/realms/master/protocol/openid-connect/certs"

&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;Location&lt;/span&gt;&lt;span class="sr"&gt; "/v3/auth/OS-FEDERATION/websso/openid"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;AuthType&lt;/span&gt; "openid-connect"
    &lt;span class="nc"&gt;Require&lt;/span&gt; valid-user
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;Location&lt;/span&gt;&lt;span class="sr"&gt; "/v3/auth/OS-FEDERATION/identity_providers/keycloak/protocols/openid/websso"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;AuthType&lt;/span&gt; "openid-connect"
    &lt;span class="nc"&gt;Require&lt;/span&gt; claim preferred_username
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;Location&lt;/span&gt;&lt;span class="sr"&gt; "/v3/auth/OS-FEDERATION/identity_providers/keycloak/protocols/openid/auth"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;AuthType&lt;/span&gt; "openid-connect"
    &lt;span class="nc"&gt;Require&lt;/span&gt; valid-user
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;
&lt;span class="nc"&gt;LogLevel&lt;/span&gt; auth_openidc:debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Adım: Keystone Konfigürasyonu
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/etc/keystone/keystone.conf&lt;/code&gt; içerisine aşağıdakiler eklenmelidir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ini"&gt;&lt;code&gt;&lt;span class="nn"&gt;[auth]&lt;/span&gt;
&lt;span class="py"&gt;methods&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;password,token,openid&lt;/span&gt;

&lt;span class="nn"&gt;[federation]&lt;/span&gt;
&lt;span class="py"&gt;remote_id_attribute&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;HTTP_OIDC_ISS&lt;/span&gt;
&lt;span class="py"&gt;trusted_dashboard&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;https://dlp.srv.world/horizon/auth/websso/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Adım: Horizon Entegrasyonu
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;/etc/openstack-dashboard/local_settings.py&lt;/code&gt; dosyasının sonuna ekleyin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;WEBSSO_ENABLED&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;WEBSSO_INITIAL_CHOICE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OIDC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;WEBSSO_CHOICES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OIDC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Login with Keycloak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;credentials&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Keystone Credentials&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;WEBSSO_IDP_MAPPING&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OIDC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;keycloak&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;openid&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
&lt;span class="n"&gt;OPENSTACK_KEYSTONE_DEFAULT_DOMAIN&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Default&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;OPENSTACK_API_VERSIONS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;identity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;REMOTE_USER_CLAIM&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;OIDC-preferred_username&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;systemctl restart apache2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Horizon arayüzünde "&lt;strong&gt;Login with Keycloak&lt;/strong&gt;" ile giriş yapılabilir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ferllakjld6o4p6lpdo69.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ferllakjld6o4p6lpdo69.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Sonuç
&lt;/h2&gt;

&lt;p&gt;Bu yapılandırma sayesinde kullanıcılar, OpenStack Horizon arayüzünden &lt;strong&gt;Keycloak&lt;/strong&gt; hesabı ile giriş yapabilir. Aynı zamanda CLI üzerinden federated token kullanarak OpenStack kaynaklarına erişim sağlanabilir.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resource Owner Password Credentials Grant (CLI Üzerinden Erişim)
&lt;/h2&gt;

&lt;p&gt;Eğer Horizon yerine CLI ile erişim tercih edilecekse &lt;code&gt;v3oidcpassword&lt;/code&gt; yöntemi kullanılabilir. Bunun için aşağıdaki örnekteki gibi bir &lt;code&gt;clouds.yaml&lt;/code&gt; dosyası oluşturulmalıdır:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;clouds&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;federated&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;auth_type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v3oidcpassword&lt;/span&gt;
    &lt;span class="na"&gt;auth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;auth_url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://dlp.srv.world:5000&lt;/span&gt;
      &lt;span class="na"&gt;username&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
      &lt;span class="na"&gt;password&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;admin&lt;/span&gt;
      &lt;span class="na"&gt;identity_provider&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keycloak&lt;/span&gt;
      &lt;span class="na"&gt;protocol&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;openid&lt;/span&gt;
      &lt;span class="na"&gt;client_id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;keystone&lt;/span&gt;
      &lt;span class="na"&gt;client_secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cbFMos3ehMrxvOg0MYEA8gomVdCWj5wR&lt;/span&gt;
      &lt;span class="na"&gt;discovery_endpoint&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://auth.keycloak.local/realms/master/.well-known/openid-configuration&lt;/span&gt;
      &lt;span class="na"&gt;project_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;demo&lt;/span&gt;
      &lt;span class="na"&gt;project_domain_name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Default&lt;/span&gt;
    &lt;span class="na"&gt;verify&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  CLI Komutu ile Giriş:
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openstack &lt;span class="nt"&gt;--os-cloud&lt;/span&gt; federated token issue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu komut başarılı olursa Keycloak üzerinden federated kullanıcı ile kimlik doğrulama sağlanmış olacaktır.&lt;/p&gt;

</description>
      <category>keycloak</category>
      <category>keystone</category>
      <category>openstack</category>
      <category>openid</category>
    </item>
  </channel>
</rss>
