İçeriğe geç

Teknoloji

Saha Doküman’da kullanılan her teknoloji

Aşağıda uygulamanın her katmanında kullanılan teknolojiler, gerçekte çalışan sürümleriyle ve Saha Doküman’daki görevleriyle listelenir. Hiçbirini listeyi uzatmak için eklemedik.

Sürümler projenin paket kayıtlarından alınmıştır. Bunlar kullanılan tam sürümlerdir; Docker imajları da sabit bir sürüme bağlıdır.

Arka uç

Tek bir dağıtım birimi olan API: .NET 10 üzerinde, controller’sız Minimal API’lerle yazılmıştır.

TeknolojiSürümSaha Doküman’daki işi
.NET / C#10 (SDK 10.0.300)Sunucu tarafının tamamı C# ile .NET 10 üzerinde yazılmıştır; null-güvenli ve uyarıların hata sayıldığı bir derleme kullanılır.
ASP.NET Core Minimal APIs10.0Her uç nokta, özellik klasörü başına bir dosyada tanımlanan Minimal API’dir; controller kullanılmaz.
Microsoft.AspNetCore.OpenApi10.0.13API sözleşmesini OpenAPI 3.1 belgesi olarak üretir; web ve mobil modeller bu sözleşmeye göre yazılır.
Scalar.AspNetCore2.18.0Geliştirme ortamında API’yi denemek için etkileşimli başvuru arayüzü sunar (üretimde kapalıdır).
JWT Bearer10.0.13Erişim belirteçlerini doğrular; yenileme belirteçleri her kullanımda değişir. Roller belirtece konmaz, her istekte yetki motorundan okunur.
PasswordHasher10.0Parolalar ASP.NET Core’un PasswordHasher bileşeniyle karma (hash) olarak saklanır; düz parola tutulmaz.
Rate limiting10.0Giriş ve diğer hassas yollarda IP ve kullanıcı başına istek sınırı uygulanır; kaba kuvvet denemeleri hesabı kilitler.
Entity Framework Core10.0.13Veri erişimi ve şema değişiklikleri (migration) için nesne-ilişkisel eşleme katmanı.
Npgsql EF Core provider10.0.3EF Core’un PostgreSQL sağlayıcısı; PostgreSQL’e özgü tür ve indeksleri kullanır.
Markdig1.4.1Sayfa içeriği kısıtlı Markdown olarak saklanır; Markdig ile sözdizimi ağacında doğrulanır ve arama için düz metne çevrilir.
SkiaSharp4.153.1Yüklenen her görsel çözülüp yeniden kodlanır: konum ve EXIF üstverisi atılır, boyut sınırlanır, küçük resim üretilir.
DocumentFormat.OpenXml3.5.1Word dosyalarını içe aktarır, Word, Excel ve PowerPoint dosyalarından arama metni çıkarır ve Excel kullanıcı aktarımı şablonunu okur.
PdfPig0.1.16PDF dosyalarından arama metni çıkarır; sayfa numaralarını atıf için saklar. Bozuk PDF’lere karşı ayrı bir alt süreçte çalışır.
Serilog4.3.1Yapılandırılmış günlük dosyaları yazar; belirteçler, parolalar ve sorgu dizesi değerleri günlüğe girmeden maskelenir.
MailKit4.18.1Platformun e-posta kutusunu SMTP ile gönderir: yeni şirket yöneticisinin parola belirleme bağlantısı ve abonelik yenileme hatırlatmaları.
TimeProvider.NET 10Tüm zaman okumaları TimeProvider üzerindendir; testlerde zaman sahte saatle denetlenir, veritabanındaki mikrosaniye hassasiyeti korunur.

Veri ve arama

Tüm içerik, kayıt defterleri ve arama dizini PostgreSQL’dedir; arama için ayrı bir arama sunucusu gerekmez.

TeknolojiSürümSaha Doküman’daki işi
PostgreSQL18.6Sayfalar, sürümler, kayıt defterleri, arama dizini, bilgi parçaları ve denetim kaydı için tek veri deposu; küme Türkçe (ICU tr-TR) sıralamayla kurulur.
tsvector + GINTam metin arama, GIN indeksli tsvector sütunlarıyla yapılır; vektör C# tarafında, sorguyla aynı kelime kurallarıyla üretilir.
TurkishNormalizerTürkçe ve Arapça harfleri uzunluğu koruyan açık bir tabloyla normalleştirir; arama normalleştirmesi yalnızca sunucuda yapılır.
ArabicWordsArapça kelime biçimlerini (tanımlık ekleri gibi) çözerek “ال” takısız aramanın da bulmasını sağlar.
Advisory locksEşzamanlı yayın ve dizinleme gibi işlemlerde işlem düzeyinde uygulama kilitleri kullanılır.
xmin concurrencyEşzamanlı düzenlemeler PostgreSQL’in xmin sütunuyla (iyimser eşzamanlılık) algılanır; sessizce üzerine yazılmaz.
Append-only ledgersYayın olayları ve katkı denetimi kayıtları yalnızca eklenir; çalışma rolünün veritabanı hakları güncelleme ve silmeyi içermez.

Yapay zekâ ve RAG

Anlamsal arama yerelde çalışır; yanıt üretimi isteğe bağlıdır ve yalnızca izinli alıntılarla yapılır.

TeknolojiSürümSaha Doküman’daki işi
Ollama0.35.1Gömme modelini sunucuda yerel olarak çalıştırır; yalnızca iç ağdadır ve dışarıya açık portu yoktur.
bge-m31024 dim.Çok dilli (Türkçe dahil) gömme modeli; her bilgi parçası için 1024 boyutlu bir vektör üretir.
Microsoft.Extensions.AI10.10.0Gömme üreticisi için soyutlama katmanı: üretimde Ollama, testlerde belirlenimci sahte üretici kullanılır.
OllamaSharp5.5.0Microsoft.Extensions.AI soyutlamasını yerel Ollama sunucusuna bağlayan istemci.
System.Numerics.Tensors10.0.13Bellek içi vektör dizininde SIMD hızlandırmalı nokta çarpımı ve norm hesapları yapar; yetki süzgeci puanlamadan önce uygulanır.
Hybrid retrieval + RRFVektör ve tam metin aramanın en iyi 40’ar sonucu Karşılıklı Sıra Birleştirme (RRF) ile birleştirilir; kural parçaları hafifçe öne alınır.
Anthropic C# SDK12.58.0Asistanın yanıtlarını Claude API üzerinden akışlı olarak üretmek için resmi C# SDK’sı; hata türleri ve yeniden deneme davranışı tiplidir.
claude-sonnet-5-5default modelVarsayılan model claude-sonnet-5-5’tir; model ve çaba düzeyi yapılandırmadan değiştirilir, API anahtarı yalnızca yapılandırma/gizli anahtar deposundan okunur.
Citations + prompt cachingAlıntılar atıf özelliği açık belge blokları olarak gönderilir, böylece her ifade kaynak bloğa bağlanır; sistem istemi önbelleğe alınır.
ModelContextProtocol.AspNetCore2.2.0Resmi MCP C# SDK’sı ile /mcp adresinde salt okunur bir MCP sunucusu: search_documentation, get_page ve list_rules araçları.
Retrieval APIDış sistemler için POST /api/rag/retrieve: metin, atıf adresi, blok kimliği, sürüm ve tam kaynak bilgisiyle parçalar döner.
Personal access tokensKapsamı, süresi ve iptali olan kişisel erişim anahtarları; veritabanında yalnızca özeti saklanır, her çağrı sahibinin yetkileriyle çalışır.

Web

Uygulamanın web arayüzü; API sözleşmesinden üretilen tiplerle derlenir.

TeknolojiSürümSaha Doküman’daki işi
React19.3.1Web arayüzü React 19 işlev bileşenleri ve hook’larla yazılmıştır.
TypeScript5.9.3Web projesi katı (strict) TypeScript ile yazılır; API tipleri sözleşmeden üretilir.
Vite8.3.4Web uygulamasının derleyicisi ve geliştirme sunucusu; API’yi yerelde vekil olarak bağlar.
Tailwind CSS4.3.3Arayüz stili Tailwind 4 ile yazılır; Arapça için sağdan sola uyumlu mantıksal yardımcı sınıflar kullanılır.
React Router7.18.4Web uygulamasındaki sayfa yönlendirmesi.
TanStack Query5.104.3Sunucu durumunu (listeler, sayfalar, yetkiler) önbelleğe alır ve yenileme ile iptali yönetir.
openapi-fetch0.17.0API’yi OpenAPI tipleriyle çağıran küçük, tip güvenli istemci.
openapi-typescript7.13.0docs/openapi.json sözleşmesinden TypeScript tiplerini üretir; sözleşme değişince derleme hata verir.
TipTap + @tiptap/markdown3.32.0Blok düzenleyicisinin zengin metin motoru; içeriği Markdown olarak okur ve yazar.
react-markdown + remark-gfm10.1.0 / 4.0.1İçeriği güvenli biçimde gösterir (ham HTML kabul edilmez); GFM tabloları ve görev listeleri desteklenir.
dnd-kit6.3.1 / 10.0.0Blokları sürükle-bırak ile yeniden sıralar.
lucide-react1.59.0Arayüzün simge kümesi.
sonner2.0.8Kaydedildi, gönderildi gibi geri bildirimleri bildirim balonları olarak gösterir.
diff9.0.0Sürüm geçmişinde iki sürüm arasındaki farkı hesaplar.

Mobil

Android ve iOS için tek kod tabanı; web’de de çalışır (duman testleri için).

TeknolojiSürümSaha Doküman’daki işi
Flutter / Dart3.41.9 / 3.11Android ve iOS uygulamasını tek kod tabanından üretir (Flutter 3.41, Dart 3.11).
flutter_riverpod3.3.2Durum yönetimi: Notifier, AsyncNotifier ve Provider ile; kod üretimi kullanılmaz.
go_router17.5.0Mobil uygulamanın bildirimli sayfa yönlendirmesi.
dio5.11.1Tek HTTP istemcisi; yenileme belirtecini tek seferde (single-flight) yenileyen bir yetki ara katmanı içerir.
flutter_secure_storage11.2.0Oturum belirteçlerini işletim sisteminin güvenli deposunda (Keychain / Keystore) saklar.
flutter_markdown_plus1.0.12Sayfa içeriğini, tek bir AppMarkdown bileşeni arkasında Markdown olarak gösterir.
image_picker / file_picker1.2.4 / 13.1.0Fotoğraf ve dosya seçimi; yüklemeler bayt olarak (MultipartFile.fromBytes) gönderilir.
url_launcher6.3.3Bağlantı bloklarını ve dış adresleri tarayıcıda açar.
flutter_localizations + intl0.20.2Türkçe, Arapça (sağdan sola) ve İngilizce arayüz için yerelleştirme ve tarih/sayı biçimleri.
shared_preferences2.5.6Gizli olmayan kullanıcı tercihlerini saklar.

Altyapı ve işletim

sahadoc.com tek bir Linux sunucuda Docker ile çalışır; şirketler ayrı veritabanı ve hizmet kapsayıcısı kullanır.

TeknolojiSürümSaha Doküman’daki işi
Docker + ComposeÜretim yığını Docker Compose ile tanımlıdır: PostgreSQL, Ollama ve API ayrı kapsayıcılardır; veritabanı ve Ollama yalnızca iç ağda yer alır.
nginx1.24TLS’i sonlandırır, www’yi ana alana yönlendirir; X-Forwarded başlıklarını kendisi yazar, erişim günlüğünde sorgu dizesi ve Authorization başlığı yer almaz.
Let's EncryptÜcretsiz TLS sertifikaları; şirket alt alanları için joker (wildcard) sertifika DNS doğrulamasıyla alınır.
Multi-tenant hostingSaaS’ta her şirket kendi veritabanı, dosya klasörü ve bağımlılık kapsayıcısıyla çalışır; şirket başına türetilen anahtarlar nedeniyle bir şirketin belirteci diğerinde geçmez.
Backup + restoreVeritabanı ve dosyalar birlikte yedeklenir; geri yükleme betiği aynı birlikteliği korur.
Verification jobsKayıt defteri zincirini ve dosya bütünlüğünü doğrulayan işler; SaaS’ta tüm şirket veritabanlarını dolaşır.
Structured logsYapılandırılmış, günlük dönen ve gizli değerlerden arındırılmış günlük dosyaları; kapsayıcı günlükleri boyutla sınırlıdır.

Kalite

Yetki ve gizlilik, hem testlerle hem de saldırgan bakışlı bir denetimle doğrulanır.

TeknolojiSürümSaha Doküman’daki işi
xUnit v22.9.3Arka uç testlerinin çatısı (v2).
Shouldly4.3.0Okunabilir doğrulamalar; FluentAssertions ve Moq bilinçli olarak kullanılmaz.
NSubstitute6.2.0Birim testlerinde bağımlılıkları taklit eder.
Respawn7.0.0Entegrasyon testleri arasında veritabanını hızla temizler; her test koleksiyonu kendi veritabanını kullanır.
ASP.NET Core test host10.0.13API’yi bellek içinde ve gerçek PostgreSQL ile uçtan uca sınar.
FakeTimeProvider10.11.0Zamana bağlı davranışları (hatırlatmalar, oturum süreleri) belirlenimci olarak test eder.
Persona x endpoint matrixHer uç nokta için persona × uç nokta tablosu: yetkisiz kişi 404 almalıdır; her yeni uç nokta tabloya eklenir.
OpenAPI snapshot + JSON samplesOpenAPI belgesi anlık görüntü testidir; JSON örnekleri istemci testlerinin girdisidir; sözleşme bilerek değiştirilir.
Vitest5.0.5Web testlerinin çalıştırıcısı.
Testing Library (React)16.3.3Bileşenleri kullanıcının gördüğü gibi sınar.
MSW3.0.3Web testlerinde API’yi ağ düzeyinde taklit eder.
flutter_test + mocktail1.0.5Mobil birim ve bileşen testleri; modeller docs/samples JSON örnekleriyle sınanır.
Red-team auditHer sızıntı kanalı (arama, dosya, bildirim, asistan, API, MCP) yetkisiz kişilerle saldırgan gözle denetlenir ve iptal senaryoları sınanır.

Bir isteğin yolculuğu

Bir kullanıcı arama yaptığında ya da asistana soru sorduğunda sırayla şunlar olur.

  1. İstemci

    Web veya mobil uygulama (ya da MCP ile dış bir araç) HTTPS isteği gönderir.

  2. nginx

    TLS sonlanır; istemci adresi ve şema başlıkları güvenilir biçimde yazılır.

  3. Kimlik ve sınırlar

    Belirteç doğrulanır, istek sınırı uygulanır, şirket (SaaS’ta alt alandan) belirlenir.

  4. Yetki

    Yetki motoru kullanıcının görebildiği kaynakları söyler; görünmeyen her şey 404’tür.

  5. Veri ve arama

    PostgreSQL’den tam metin ve vektör adayları çekilir, yetkiyle süzülür.

  6. Yapay zekâ (isteğe bağlı)

    Seçilen izinli parçalar yeniden denetlenir; açıksa Claude yanıtı kaynaklarla üretir.

  7. Yanıt

    Sonuç, hiçbir ara katmanda önbelleğe alınmadan, kaynak bilgisiyle istemciye döner.

  1. İstemciler

    • Web uygulaması — React 19
    • Mobil uygulama — Flutter · Android / iOS
    • Dış yapay zekâ — MCP · erişim anahtarı
  2. Tek Saha Doküman uygulaması

    • Saha Doküman API — .NET 10 · yetki motoru
    • Asistan (RAG) — hibrit arama + kontrol
    • Vektör üretimi — arka planda
  3. Veri ve yapay zekâ

    • PostgreSQL 18 — içerik · sürümler · kayıt defteri · bilgi parçaları + vektörler
    • Ollama · bge-m3 — yerel gömme vektörleri
    • Claude API — Anthropic · isteğe bağlı

Bir bilginin yolculuğu

Yazıldığı andan bulunduğu ana kadar: her adımın bir sahibi vardır ve yol üzerinde dört kontrol noktası bulunur.

  1. Ekle

    • Taslak

      Web veya mobil uygulamada yazılır, şablondan oluşturulur ya da Word’den aktarılır.

    • Katkı denetimi

      Dil denetimi ve benzer bilgi kontrolü. Bilgi zaten varsa önce onu görürsünüz.

      Kaydetmeden önce

  2. Onayla

    • Değişiklik talebi

      Katkı, notuyla birlikte departman yöneticisine gider.

    • Onay

      Yönetici inceler, gerekirse düzeltir; onaylar ya da reddeder.

      Yayından önce

  3. Yayınla

    • Tek yayın servisi

      Yeni sürüm, kimin eklediği ve kimin yayınladığı bilgisiyle birlikte yazılır.

    • Kayıt defteri

      Yalnızca eklenir ve zincirleme özetle (hash) bağlıdır; kayıt yeniden yazılamaz.

  4. Dizinle

    • Arama dizini

      Hemen güncellenir; Türkçe, Arapça ve İngilizce aramaya hazırdır.

    • Bilgi parçaları

      Bölümler, kurallar, tablolar ve dosya sayfaları kaynağını koruyan kısa alıntılara dönüşür.

    • Yerel vektörler

      Vektörler sunucuda Ollama ile hesaplanır; metin dışarı çıkmaz.

  5. Bul ve yanıtla

    • Arama

      Yalnızca görebileceğiniz sayfalar; gizli olanlar sayı olarak bile görünmez.

      Yetki filtresi

    • Asistan

      Anlamsal ve tam metin sonuçları birleştirilir; şirket açtıysa yalnızca izinli alıntılar Claude’a gider ve cevap kaynaklarını gösterir.

      Yeniden kontrol

    • Diğer yapay zekâ araçları

      Kişisel erişim anahtarıyla MCP üzerinden, aynı yetkilerle.

      Yeniden kontrol

Yol üzerindeki dört kontrol noktası

  1. Kaydetmeden önceHer ekleme ve değişiklik katkı denetiminden geçer.
  2. Yayından önceKatkıda bulunanın değişikliği ancak yönetici onaylayınca yayınlanır.
  3. Yetki filtresiHer sonuç ve her alıntı kullanıcının yetkilerine göre süzülür.
  4. Yeniden kontrolHer alıntı yapay zekâya gitmeden önce bir kez daha kontrol edilir.

Teknik soru mu var?

Mimariyi, kurulumu ve güvenlik denetimini birlikte inceleyelim.

Şirketinize gidin

Şirketinizin kodunu yazın; sizi şirketinizin Saha Doküman adresine götürelim.

Kodu bilmiyorsanız şirketinizin yöneticisine sorun.