TD Teknik Danışman

Changelog

Platforma eklenen yeni özellikler, iyileştirmeler, düzeltmeler ve güvenlik güncellemeleri.

2026-06-22
Düzeltme

Backup script v2 + DR runbook — 2 aylık silent failure giderildi

Kritik bulgu: Eski backup script config.local.php'de tanımsız olan $DB_NAME environment'ı bekliyordu — 2 ay+ boş (388 byte) yedek üretiyordu. Latest symlink April 28'i gösteriyordu; tüm sistem yedeksizdi.

  • Yeni script (ops/teknikdanisman_backup.sh): Master DB + tüm aktif tenant DB'leri ayrı ayrı dump · application files · SHA256SUMS · atomic latest symlink · 14 gün retention · last_run.json meta dosyası
  • Eski script: /usr/local/bin/teknikdanisman_backup.sh.bak'a yedeklendi
  • İlk başarılı run: Master 27KB + 6 tenant (4.2MB+5×~150KB) + app 47MB · toplam 52MB · 14 günden eski 54 boş klasör otomatik temizlendi
  • /health.php + /status.php: "Yedekleme" component'i eklendi — <30 saat OK, 30-48 saat warn, >48 saat fail. Sentry alarm uyumlu
  • DR runbook (docs/disaster-recovery.md) yazıldı: RPO ≤ 24 saat, RTO ≤ 4 saat hedefleri · 3 senaryo (tek tenant / master / full sunucu) adım adım · quarterly drill takvimi · eksikler listesi (off-site, GPG encryption, integrity test)
  • SECURITY.md Backup & DR + Observability bölümleri eklendi

Production yedek artık doğrulanmış şekilde işliyor.

2026-06-21
İyileşti

Versiyonlu migration sistemi — Linear/Stripe pattern

Şema değişikliklerini izlenebilir, sıralı, idempotent şekilde uygulamak için yeni bir runner katmanı eklendi. Mevcut lib/Migrations.php (settings.php başında çalışan idempotent block'lar) coexist eder — sadece yeni migration'lar buraya gelir.

  • Dosya tabanlı: migrations/tenant/YYYYMMDD_NNNNNN_kebab-name.php veya migrations/master/...
  • Tracking: Her DB'de otomatik schema_migrations tablosu
  • Transactional: Her migration kendi transaction'ında; hata → rollback + Logger::critical
  • CLI: php migrate.php status / up / rollback · --master · --tenant=slug filtreleri
  • Observability bağlantısı: Hata Sentry DSN tanımlıysa anında alarm geçer

Detay ve örnek migration: migrations/README.md

2026-06-21
İyileşti

Strangler-fig refactor başlangıcı — RenewalService

Mimari yenilenmenin ilk somut adımı: services.php ve licenses.php'in yenileme handler'larında birebir kopyalanan iş mantığı lib/RenewalService.php'e taşındı.

  • 32 satır kod tekrarı silindi — page-level dosyalar 6 satıra düştü, sadece HTTP routing + flash kaldı
  • Tek konfigürasyon noktası — yeni resource eklemek için RESOURCE_CONFIG'e tek entry yeter (insurance.php ileride bunu kullanabilir)
  • Test edilebilir hale geldi — PDO mock'la unit test mümkün
  • Observability entegre — her yenileme Logger::info('Resource renewed', ...) ile JSON log üretir
  • Dokümantasyon: docs/rfcs/0002-renewal-service.md

Kullanıcı için davranış birebir aynı; bu büyük rebuild değil — strangler-fig pattern'inin canlı kanıtı. Yatırımcı diligence'ta "Refactor edebiliyor musunuz?" sorusuna somut yanıt.

2026-06-21
Yeni

Domain ve lisans listelerinde tek-tıkla "Yenilendi" aksiyonu

Domain/Hosting (services.php) ve Lisans (licenses.php) yönetim sayfalarındaki aksiyon kümesine yeşil Yenilendi butonu eklendi. Onay sonrası mevcut yenileme tarihi +1 yıl ileri alınır.

  • Services: Dolu olan end_date, domain_expiry, hosting_expiry, expiry_date alanlarının her birine +1 yıl. Hiçbiri yoksa end_date = bugün+1 yıl
  • Licenses: renewal_date +1 yıl
  • Tüm yenilemeler audit_log'a yazılır

Manuel olarak tarih düzenlemek için Form sayfası açmaya gerek yok — listeden tek tıkla yenilenebilir.

2026-06-21
Yeni

Public API dokümantasyonu — OpenAPI 3.0 + Redoc

Geliştirici dokümantasyonunu açık erişime aldık. Auth gereken eski api_docs.php içerideki referans olarak kalır; yeni public sayfa Redoc ile render edilmiş Stripe/Linear-style üç-kolon layout sunar.

  • /api.php — interaktif Redoc reference
  • /openapi.php — OpenAPI 3.0 spec (YAML, makine-okunur). Postman / Insomnia / kod üreticileri için doğrudan kullanılır.
  • RFC 0001 + 0000 template yayımlandı: docs/rfcs/

Bearer token oluşturmak için panele giriş yapıp Ağ Araçları → API Anahtarları sekmesini kullanın.

2026-06-21
Düzeltme

Mobil menü, tema butonu ve quick-capture UX iyileştirmeleri

Mobil deneyim ve sağ-üst aksiyon kümesinde bir dizi tutarlılık sorunu giderildi:

  • Mobil menü bazı tarayıcılarda off-canvas drawer'ın transform interpolasyonu nedeniyle açılmıyordu — translate3d tabanlı override ile çözüldü
  • Açık/Koyu mod butonu artık her sayfanın sağ-üst köşesinde — daha önce yalnızca dashboard'da görünüyordu
  • Hızlı Not / Görev butonu (Alt+N) sağ-alt floating circle yerine, top bar'a alındı — funnel butonunun yanına
  • Mobil menüden "Tema Değiştir" ve "Yardım İpuçları" kaldırıldı (top bar'da daha sezgisel konumda)
  • Yanıt Şablonları sidebar'dan kaldırıldı, Destek Talepleri sayfasına buton olarak eklendi
  • API Anahtarları ve Webhooks sayfaları Ağ Araçları altında sekme olarak konsolide edildi
2026-06-21
İyileşti

Personel evrak yönetimi tek ekrana toplandı

Personel düzenleme ekranı (employee_form.php) artık tüm evrak akışının tek merkezi. Daha önce ayrı bir employee_documents.php sayfasında olan yükleme/silme fonksiyonu, form içine konsolide edildi:

  • 8 kategori aynı ekranda: İşe Başlangıç · Zimmet · İzin · İhtar · İşten Çıkış · Sözleşme · Sağlık & SGK · Diğer
  • Her kategoride sistem tarafından oluşturulan formlar (yazdırma sayfaları) ve yüklenmiş ıslak imzalı evraklar yan yana listelenir
  • Her satırda Aç/İndir + Sil butonu — sistem kayıtları için de silme desteği (örn. iptal edilen ihtar kayıtları)
  • Yeni: İşten Çıkış için A4 print sayfası (employee_termination_print.php) eklendi — teslim/iade checklist'i ile

Eski employee_documents.php URL'i artık employee_form.php?edit_id=X#section-documents adresine yönlendiriyor — eski bookmark'lar kırılmaz.

2026-06-21
Güvenlik

Uyum tabanı: security.txt, gizlilik politikası, DPA

Kurumsal müşteri diligence süreçlerinde sıkça istenen üç belgeyi public olarak yayınladık:

Login sayfasının footer'ına tüm hukuki belgelere kısayollar eklendi. Güvenlik raporu için security@teknikdanisman.net aktif.

2026-06-21
Yeni

REST API: yenileme endpoint + rate-limit header dogfood

RenewalService bugün web POST handler'larından çıkarıldı; aynı servis şimdi public API'a da bağlandı. Bir karar = iki kanaldan tüketim — strangler-fig dogfood.

  • Yeni endpoint: POST /api/v1/renew.php — body {"resource": "service" | "license", "id": 42}
  • Yetki: Bearer token + write scope + idempotency key opsiyonel
  • Cevap: { object: "renewal", resource, id, updated_columns, fallback_used }
  • Rate limit header'ları tüm endpoint'lerde aktif: X-RateLimit-Limit / Remaining / Reset · 429'da Retry-After: 60
  • OpenAPI spec güncellendi/api.php sayfasında doğrudan görünür
  • Limit aşımları artık loglanır (Logger::warn 'API rate limit exceeded') → Sentry alarm uyumlu
  • Cleanup query optimize: Eski rate-hit silme her request'te değil, %5 örnekleme ile (master DB yükü -95%)