Recent Posts

PHP Tools For VS Code | PHP

PHP Tools For VS Code | PHP

Merhaba, yeni bir projede PHP kullanmaya başladım. Aynı zamanda da VS Code.Diğer kullandığım araçlarda breakpoint koyma, debug etme gbi kolaylıklar vardı.Bunda yok mu diye araştırırken baktım ki adamlar yapmış. “PHP Debug Adapter for Visual Studio Code” diye bir eklenti var. Selamlar.

Logstash İle Loglama (UDP ve TCP) | PHP

Logstash İle Loglama (UDP ve TCP) | PHP

Merhaba, bir önceki yazımızda kurduğumuz ELK Stack yapısını PHP’de iki farklı şekilde kullandık.Birinciside TCP protokolü ile diğerinde UDP.Bu tür loglama işlerinde UDP protokolü daha çok tercih ediliyormuş, onu öğrendim.Veri kaybı sizin için müthiş kritik değilse, performans olarak bunun tercih edilmesi tavsiye ediliyor. Bizim senaryomuzda middleware 

ELKSTACK Kurulumu | Genel

ELKSTACK Kurulumu | Genel

Merhaba, elimizde sıfır bir Ubuntu Linux var.
Önce JDK’yı kuracağız.

  1. Paket yöneticisi güncellemek için;
    • sudo apt update
  2. JDK’yı yüklemek için;
    • sudo apt install openjdk-11-jdk
  3. Java kurulmuş mu teyit etmek için;
    • java -version
  4. Elasticsearch deposu ekleme ve elasticsearch kurulumu için;
    • curl -fsSL https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
      echo "deb https://artifacts.elastic.co/packages/7.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-7.x.list
      sudo apt update
      sudo apt install elasticsearch
  5. Elasticsearch ayakta mı kontrol etmek için;
    • sudo systemctl status elasticsearch
  6. Aktif değildi. Onu başlatmak ve açılışta çalışmasını sağlamak için;
    • sudo systemctl start elasticsearch
      sudo systemctl enable elasticsearch
  7. Elasticsearch’e erişilebiliyor mu kontrol etmek için;
    • curl -X GET "localhost:9200"
    • Elasticsearch’e dışarıdan erişime izin vermek için;
      sudo nano /etc/elasticsearch/elasticsearch.yml
    • Aşağıdaki satırlar yorumdu, açtık.
      network.host: 0.0.0.0
      http.port: 9200

      Sonra CTRL + O ile çıktık. Dosya adını aynı bıraktık ve kaydettik.
  8. Ama hata verdi. Hatanın detaylarını araştırınca şunu bulduk: Elasticsearch canlı ortama çıkıyorsan ayarlarını kontrol ediyor.
    network.host: 0.0.0.0 demek ben canlıya çıkıyorum demekmiş.
    Hatadaki problemi gidermek için tek bir düğüm kullanacaksak elasticsearch.yml dosyasına şu satırı ekledik:
    • :> discovery.type: single-node
      Sonra servisi restart ediyoruz. Bu sefer hata vermeyecek. sudo systemctl restart elasticsearch
  9. Ama bu sefer de herkes erişebiliyor. Sadece belirli IP’lerin erişmesi için; sudo ufw status
    komutu ile güvenlik duvarına baktık. Aktif değilse aktif etmeliyiz şu şekilde:
    sudo ufw enable
    Bunu yaparsak bizim bağantımız da gidecek. Onun uyarısını veriyor. O yüzden;
    sudo ufw allow 22/tcp
    Bunu yaptıktan sonra UBUNTU’yu yeniden başlattım. Bakalım dışarıdan erişimi kısıtladık teyit edelim.
    sudo ufw enable
    Açıldıktan sonra belirli IP adreslerine izin verip tekrar deniyoruz.
    sudo ufw allow from abc.abc.abc.abc to any port 9200
    sudo ufw status

    komutu ile güvenlik duvarı ayarlarını da kontrol ettik, her şey sağlam.

Elasticsearch kurulumu burada bitti.

Şimdi LOGSTASH kuracağız.

  1. Paket yöneticisini güncelleyip logstash paketini yüklemek için;
    • sudo apt update
      sudo apt install logstash
  2. LOGSTASH için bir konfigürasyon dosyasına ihtiyacımız var. Oluşturmak için;
    • sudo nano /etc/logstash/conf.d/ectaro-logstash.conf input {
      http {
      host => "0.0.0.0" # Loglari dinlemek icin kullanilan IP adresi
      port => 5044 # Gelen loglarin dinleneceği port
      }
      } filter {
      json {
      source => "message"
      }
      if [appcode] == "InApi" {
      mutate {
      add_field => { "application" => "inapi" }
      }
      } else if [appcode] == "OutApi" {
      mutate {
      add_field => { "application" => "outapp" }
      }
      } else if [appcode] == "UserApp" {
      mutate {
      add_field => { "application" => "userapp" }
      }
      } else if [appcode] == "Admin app" {
      mutate {
      add_field => { "application" => "adminapp" }
      }
      } else {
      mutate {
      add_field => { "application" => "unknownapp" }
      }
      }
      } output {
      elasticsearch {
      hosts => ["localhost:9200"]
      index => "%{[application]}-logs-%{+YYYY.MM.dd}"
      }

      } Konfigürasyonu bu kadar detaylı yapmadan doğrudan tüm logları tek bir indekse atıp appcode alanından filtrelemek de mümkün.
      O şekilde yaptım. POSTMAN’dan aşağıdaki gibi bir istek gönderdiğimizde sonuç başarılı olacaktır.
      {
      "timestamp": "2024-12-02T12:00:00Z",
      "appcode": "OutApi",
      "content": "This is a test log message",
      "level": "INFO"
      }
  3. 5044 portuna da izin vermek için;
    • sudo ufw allow from abc.abc.abc.abc to any port 5044
  4. Servis olarak başlamasını sağlamak için;
    • sudo systemctl status logstash
      komutu ile kontrol ettik aktif değil.
      sudo systemctl enable logstash
      komutu ile otomatik başlamasını ayarladık. Arkadaş, “/etc/logstash/conf.d/” klasöründeki tüm
      *.conf dosyalarını kullanacak şekilde yapılandırmış kendisini. O yüzden özel bir *.conf dosyası belirtmedik.
  5. LOGSTASH’taki hataları görmek için;
    • sudo journalctl -u logstash
      sudo nano /var/log/logstash/logstash-plain.log
      sudo systemctl restart logstash
  6. Elasticsearch ayar dosyasında da iki değişiklik yapmak için;
    • sudo nano /etc/elasticsearch/elasticsearch.yml
      action.auto_create_index: true # bu satırı ekledim. her gün yeni bir indeks oluşturacak Logstash.
      ingest.geoip.downloader.enabled: false # bu satırı ekledim. geoip indeksine ihtiyacımız yok.
  7. Her gün için bir indeks oluşturacak arkadaş. Bu indekslerin de yedeklemek için farklı node istiyor.
    Biz de tek node olduğundan her seferinde NODE sağlığı sarı olmasın diye aşağıdaki gibi bir template oluşturduk.
    Böylece her seferinde yedeksiz bir şekilde oluşturacak. Bunun için;
    • curl -X PUT "abc.abc.abc.abc:9200/_template/inapi_logs_template" -H 'Content-Type: application/json' -d '{
      "index_patterns": ["-logs-"],
      "settings": {
      "number_of_replicas": 0
      }
      }'

Logstash kurulumu burada bitti.

Şimdi KIBANA kuracağız.

  1. Elasticsearch için depolar eklediğimiz için burada bir daha eklemeye gerek yok. Kibana’yı yüklemek için;
    • sudo apt-get update
      sudo apt-get install kibana
  2. Kurulumdan sonra yapılandırma da gerekiyor. Bunun için;
    • sudo nano /etc/kibana/kibana.yml
      server.host: …. satırını açtım
      elasticsearch.hosts: … satırını açtım.
  3. Kurduktan sonra açılışta servis olarak çalışması için;
    • sudo systemctl enable kibana
      sudo systemctl start kibana Kibana'nın durumunu kontrol etmek için; sudo systemctl status kibana
  4. Yerel ağdaki bir IP bloğuna komple yetki vermek için;
    • sudo ufw allow from 10.0.0.0/24 to any port 9200
      sudo ufw allow from 10.0.0.0/24 to any port 5044
      sudo ufw allow from 10.0.0.0/24 to any port 5601
  5. Zaman zaman farklı yerlerden bağlanmam gerektiğinde şu şekilde IP’lere izin tanımlıyorum güvenlik duvarında şu şekilde;
    • sudo ufw allow from abc.abc.abc.abc to any port 9200 >>>> Elasticsearch için
      sudo ufw allow from abc.abc.abc.abc to any port 5044 >>>> Logstash için
      sudo ufw allow from abc.abc.abc.abc to any port 5601 >>>> Kibana için
  6. Sonra da bunları temizliyorum işim bitince şu şekilde;
    • sudo ufw delete allow from abc.abc.abc.abc to any port 9200
      sudo ufw delete allow from abc.abc.abc.abc to any port 5044
      sudo ufw delete allow from abc.abc.abc.abc to any port 5601

Selamlar.

Zamanında Altın Alsaydık… | C#

Zamanında Altın Alsaydık… | C#

Merhaba, zaman zaman sohbetlerimizde, geçmişte yapılan bir yatırım veya harcama mevzusu geçtiğinde; “O parayı o zaman dolara yatırsaydım acaba şimdi ne kadar olurdu?” ya da “Keşke altın alsaydık şimdi daha fazla kâr elde ederdik…” gibi iddialar ortaya atılır ve bazen de bunları doğrulamaya uğraşmayız. O 

PowerShell API İstek Gönderme | Sistem

PowerShell API İstek Gönderme | Sistem

Merhaba, bir sunucudan bir API uygulamasına zaman zaman erişim problemi yaşadığımızı düşünüyordum.Bir IP’ye ping atar gibi o servise sürekli istek gönderip izleyeyim diye düşündüm.Windows Powershell’de şu şekilde yapılabiliyormuş: Selamlar.

Dizin Dosya İzleme | C#

Dizin Dosya İzleme | C#

Merhaba, ağ üzerindeki bir yoldan WEB uygulaması ile dosyaya erişemedim bir türlü.
Uygulama havuzunda Administrator yetkisi de verdik olmadı.
Ben de mesele daha fazla çözümsüz kalmasın diyerek ufak bir uygulama yazdım ağdaki bu dizini dinleyen.
Orada bir dosya oluştuğu anda WEB sunucusunda bir dizine çekiyorum ve web uygulamasından o yoldaki dosyaya erişerek işlemi tamamlıyorum.
Bunun için FileSystemWatcher sınıfını kullandım.


string sourceDirectory1 = @"\\1.1.1.1\applicationData\Docman\GENEL"; 
string targetDirectory1 = @"c:\Users\Administrator\Documents\FTP\API\VER\"; 

using var watcher1 = new FileSystemWatcher(sourceDirectory1)
{
    NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite,
    Filter = "*.*", 
    EnableRaisingEvents = true
};
watcher1.Created += (sender, e) =>
{
    try
    {
        string sourceFilePath = e.FullPath;
        string fileName = Path.GetFileName(sourceFilePath);
        string targetFilePath = Path.Combine(targetDirectory1, fileName);
        File.Copy(sourceFilePath, targetFilePath, true);
        Console.WriteLine($"Dosya kopyalandı: {fileName}, {DateTime.Now.ToString()}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Hata: {ex.Message}");
    }
};

string sourceDirectory2 = @"\\1.1.1.1\TempPdf"; 
string targetDirectory2 = @"c:\Users\Administrator\Documents\FTP\API\SAL";  
using var watcher2 = new FileSystemWatcher(sourceDirectory2)
{
    NotifyFilter = NotifyFilters.FileName | NotifyFilters.LastWrite,
    Filter = "*.*", 
    EnableRaisingEvents = true
};
watcher2.Created += (sender, e) =>
{
    try
    {
        string sourceFilePath = e.FullPath;
        string fileName = Path.GetFileName(sourceFilePath);
        string targetFilePath = Path.Combine(targetDirectory2, fileName);
        File.Copy(sourceFilePath, targetFilePath, true);
        Console.WriteLine($"Dosya kopyalandı: {fileName}, {DateTime.Now.ToString()}");
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Hata: {ex.Message}");
    }
};

Console.WriteLine("Dizin izleniyor... Çıkmak için 'Enter' tuşuna basın.");
Console.ReadLine(); 

Selamlar.

TopShelf İle Windows Servis Uygulaması | C#

TopShelf İle Windows Servis Uygulaması | C#

Merhaba, Windows açılışında bazı uygulamaların otomatik başlaması için bir ufak konsol uygulaması yazdım.Bunu da Tolshelf kullanarak Windows Servisi’ne çevirdim.Örnek kodlar şu şekilde: Program.cs Settings.xml BaslangicService.cs Selamlar.