ONOXSOFT release history
What changed in each panel release — delivered to your servers via automatic updates. 169 releases in total; browse by group from the left menu.
ONOXSOFT v2026.8.77 — «Sözü Tutan Durdurma»
Sunucu rolü v2026.8.75'te gerçek bir kapıya dönüştü ama bir şeyi bilerek
yapmıyordu: servisleri durdurmuyordu. Rolü `web` yapan yönetici menüde postayı
kaybediyor, rotalar kapanıyor, ama Postfix çalışmaya devam ediyordu.
Bu sürüm o boşluğu kapatıyor — ve tek başına `systemctl stop` neden yetmez
sorusunun cevabı bu özelliğin tamamını şekillendirdi.
Neden basit bir "durdur" düğmesi işe yaramazdı
Lisans denetleyicisi her 30 saniyede bir, lisansta olan ama çalışmayan servisi
geri açıyor. Elle durdurulan Postfix yarım dakika içinde diriliyor.
Ölçüm sırasında ikinci bir gerçek çıktı: denetleyiciye "bu özelliği kapat"
demek de tek başına yetmiyor. O ayar yalnızca yeniden başlatmayı engelliyor,
çalışan servisi durdurmuyor.
Doğru davranış ikisinin birleşimi ve sırası:
1. Önce otomatik yeniden başlatma kapatılır
2. Sonra servisler durdurulur
Ters sırada, iki adım arasındaki pencerede denetleyici devreye girip servisi geri
açıyor. Kod bu sırayı zorluyor: birinci adım başarısız olursa **hiçbir servise
dokunulmuyor** — yarım kalmış bir durdurma, hiç durdurmamaktan kötüdür.
Ne yapar, ne yapmaz
- Rol değişikliği servisleri hâlâ durdurmuyor. Durdurma ayrı ve açıkça
onaylanan bir eylem: rol değiştirmek bir sınıflandırma, servis durdurmak bir
kesintidir
- Rol hâlâ posta yeteneği taşıyorsa durdurma reddedilir — menüsü açık ama servisi
ölü bir sunucu tutarsız olurdu
- Tek tuşla geri açılır; geri açma yolu her rolde erişilebilir kalır
- Altyapı servislerine (veritabanı, DNS, web sunucusu, kuyruk, SSH) dokunulmaz
Yalnız posta yığını durdurulabiliyor. Bu bir kapsam kısıtlaması değil: denetleyici
zaten diğerlerini koruma listesinde tutuyor. Tutulamayacak bir söz vermemek için
arayüz de yalnız postayı sunuyor.
Rapor iddia değil, ölçüm
Durdurma sonrası her servis yeniden ölçülüyor. Bir servis durdurma komutuna
rağmen ayakta kaldıysa rapor bunu açıkça söylüyor ve yönetici uyarılıyor.
"Durduruldu" yazıp geçmek, postanın akmaya devam ettiği bir sunucuda yanlış
güven üretirdi.
Yapılan her işlem gerekçesiyle birlikte denetim kaydına yazılıyor.
Test paketi bekçisi
Bu sürümde bir de test altyapısı kusuru kapatıldı: iki test dosyası aynı isimde
yardımcı fonksiyon tanımlarsa dosyalar tek tek yeşil koşuyor ama hepsi birlikte
koşturulduğunda paket komple düşüyor — tek bir test bile raporlanmıyor.
Bu kusur ölçüldü ve iki ayrı yerde gerçekleşti. Artık bir bekçi test, çakışan
isimleri ve bozuk dosyaları paket koşmadan önce yakalıyor.
Doğrulama
11 yeni test; hepsi önceki sürüme karşı ayrıca sınandı. Sıra garantisi ayrıca
test ediliyor: ilk adım başarısızsa tek bir servise bile dokunulmadığı ölçülüyor.
ONOXSOFT v2026.8.76 — «Sessiz İkili»
İki kusur giderildi. İkisi de yıllardır kodda duruyordu ve ikisi de hata
üretmediği için fark edilmemişti.
Arşiv geçmişi hiç budanmıyordu
E-posta arşivleme geçmişini haftalık temizleyen bakım işi, var olmayan bir metodu
çağırıyordu. Çağrı bir hata yakalayıcısının içindeydi; her koşum sessizce
başarısız oluyor, yalnızca bir uyarı satırı düşüyordu. İş "başarısız" bile
görünmüyordu.
Sonuç: arşiv çalışma geçmişi tablosu kurulduğu günden beri hiç budanmadı ve
sınırsız büyüdü.
- Eksik metot yazıldı; geçmiş artık verilen günden eski satırları siliyor
- Silme parçalı yapılıyor — tablo hiç budanmadığı için ilk koşumda yılların
birikmiş satırı gelebilir ve tek seferlik silme aynı tabloya yazan arşivleme
işini bekletirdi
- Geçersiz gün sayısı reddediliyor: kazara tüm geçmişi silmek geri alınamaz
- Arşivlenen postaya dokunulmuyor. Budanan yalnızca çalışma geçmişidir;
postanın kendisi ayrı bir saklama süresiyle yönetilir
Kümede posta haritası tek düğümde kalıyordu
Posta alan adı haritasını tazeleyen saatlik iş, "kümede yalnız bir sunucuda
çalış" işaretini taşıyordu. Ama bu iş, çalıştığı sunucunun kendi diskindeki
Postfix ve Exim haritalarını yazıyor.
Çok sunuculu kurulumda kilidi hangi sunucu alırsa yalnız onun haritası
tazeleniyor, diğer posta sunucularının haritası bayat kalıyordu. Sonuç, bu işin
önlemek için yazıldığı olayın aynısı: haritada olmayan kutuya gelen posta
"kullanıcı bulunamadı" ile reddedilir.
Tek sunuculu kurulumda hiç görünmüyordu — kusurun bu kadar uzun yaşama sebebi bu.
- İşaret kaldırıldı; artık her posta sunucusu kendi haritasını tazeliyor
- Kardeş iş zaten aynı sebeple bu işareti taşımıyordu; emsal koda bağlandı
- Merkezî kaynağa yazan işlerde (panel sertifikası gibi) tekillik korundu —
aşırı düzeltme yapılmadı
Doğrulama
11 yeni test; hepsi önceki sürüme karşı ayrıca sınandı ve orada kırmızı olduğu
kanıtlandı. Rol, posta ve küme paketlerinin tamamı yeniden koşturuldu: bu sürüm
hiçbir yeni kırık üretmiyor.
ONOXSOFT v2026.8.75 — «Rol Artık Gerçek»
Sunucu rolü v2026.8.73'te bir temel olarak girmişti: menüyü değiştiriyordu ama
adres çubuğuna yazınca sayfa yine açılıyordu. Bu sürümde rol gerçek bir kapıya
dönüştü — rota, zamanlanmış iş, API ve dört ayrı menü yüzeyi aynı kaynaktan besleniyor.
Rota erişim kapısı
`EnforceServerRole` middleware'i eklendi. Posta yığını olmayan sunucuda posta
sayfaları artık HTTP seviyesinde 403 dönüyor; yönetici için "kapattım" sanma
dönemi bitti.
- 237 posta rotasının tamamı ya kapıda ya da gerekçesi yazılı muafiyette
- Yönetici paneli, müşteri paneli, bayi paneli, mobil API ve REST v1 kapsandı
- Reddedilen istek özel bir sayfa görüyor — lisans "yükseltme" sayfası değil,
çünkü rolde satın alınacak bir şey yok
- Kilitlenmeye karşı muafiyet listesi: oturum kapatma, ayarlar, lisans, güncelleme,
kurtarma ve rolün kendi sayfası her rolde açık kalır
Zamanlanmış işler
122 işin her biri tek tek sınıflandırıldı: 49'una kapı, 72'si rol-nötr, 1'i
ertelendi.
- Yedek, lisans, bütünlük, sertifika yenileme, kota ve izleme işleri bilerek
kapısız — yanlış kapatmak müşteri hizmetini keser ve hiçbir hata üretmez
- Antivirüs derin süpürmesi rol-nötr bırakıldı: sezgisel taramayı çalıştıran tek
zamanlanmış iş odur; posta veya veritabanı rollü sunucuda kapatılsaydı tespit
tamamen kalkardı
- Kümede güvenli: rolü tutmayan düğüm tek-sunucu kilidini işgal etmiyor
Rol değiştirme ekranı
Panelden rol değiştirilebiliyor. Daraltma yönünde canlı veri sayılıyor: posta
kutusu, DNS bölgesi, veritabanı ve site sayısı gösteriliyor ve onay isteniyor.
Değişiklik denetim kaydına yazılıyor.
Müşteri ve mobil yüzeyler
Sunucunun sunmadığı hizmet müşteriye kilitli değil, hiç gösterilmiyor. Kilit
ikonu "paketini yükselt" anlamına gelir; rol için bu yanlış yönlendirme olurdu —
müşteri yükseltme arar, hiçbir şey değişmez, destek bileti açar.
Bu sürümde giderilen kusurlar
- Kurulumda menüden seçilen rol, bayraklara hiç ulaşmıyordu — seçim yapılıyor ama
hiçbir etkisi olmuyordu
- Kurulum betiği yeniden çalıştırıldığında rol sessizce `full`'e dönüyordu
- Rol önbelleği üretimde hiç temizlenmiyordu; ayrıca her sayfa isteğinde gereksiz
sorgu yapılıyordu
- Altı ekranda onay metni çevrildiği için Türkçe dışındaki dillerde tehlikeli
işlemler onaylanamıyordu
- Küme düğümü rol sözlüğünde hiçbir zaman eşleşmeyen ölü bir değer vardı
Doğrulama
- 50 PHP testi ve 33 kabuk testi; hepsi eski sürüme karşı ayrıca sınandı ve orada
kırmızı olduğu kanıtlandı
- Üç sunucuda canlı doğrulama: rol değiştirildi, kapı ölçüldü, posta ve panel
servislerinin çalışmaya devam ettiği teyit edildi
- Rol okunamadığında hiçbir şeyin kapanmadığı ayrıca sınandı — güncelleme
penceresinde hizmet kesilmemesi bunun garantisi
Bilinmesi gerekenler
Rol hiçbir servisi durdurmaz; yalnızca hangi bakım işinin koşacağını ve hangi
yüzeyin görüneceğini belirler. Servis durdurma ayrı bir sürümde ele alınacak.
Bugün yalnızca posta ekseni uygulanıyor. Veritabanı ve DNS kapıları hazır ama
kapalı: mevcut kurulumlarda MariaDB ve PowerDNS rolden bağımsız kuruluyor ve web
barındırma veritabanına ihtiyaç duyuyor. Çalışan bir hizmeti gizlemek yerine
ölçülebilir olana kadar bekletildi.
Acil durum anahtarı: `server_role_enforcement` ayarı `off` yapıldığında rol hiç
uygulanmaz.
ONOXSOFT v2026.8.74 — Mail Yönlendirme ve SPF Kök Nedeni
İki sessiz veri kusuru kapatıldı. İkisi de hata vermiyordu; bu yüzden fark edilmiyorlardı.
Mail yönlendirme modu artık gerçekten uygulanıyor
Panelde bir alan adının postası dış bir sağlayıcıya (örneğin Google Workspace) yönlendirilmek
istendiğinde, seçilen mod Postfix'e hiç ulaşmıyordu. Panel ile sistem betiği arasındaki
alan adları uyuşmadığı için betik her seferinde varsayılana düşüyor ve alan adını "bu sunucuda
işle" olarak yazıyordu.
Bu sessiz bir hataydı: "bu sunucuda işle" geçerli bir seçenek olduğu için betik başarı
dönüyor, panel de "yazıldı" diyordu. Sonuç: dış sağlayıcıya gitmesi gereken müşteri postası
yerelde teslim ediliyordu.
- Alan adları düzeltildi; artık seçilen mod (yerel / dış sunucu / yedek MX / otomatik)
Postfix'e olduğu gibi yazılıyor.
- Aynı sınıf bir kayma bir daha sessiz kalmasın diye betik eski alan adlarını **açıkça
reddediyor**.
Alan adı SPF kaydı artık çoğalmıyor
Bir alan adının SPF kaydı her güncellendiğinde yeni bir kayıt ekleniyordu; eskisi
silinmiyordu. Standart gereği bir alan adında birden çok SPF kaydı bulunması, o alan adının
SPF doğrulamasını tamamen geçersiz kılar — yani hiçbir alıcı sunucu "bu posta yetkili"
sonucuna varamaz, DMARC hizalaması kırılır ve spam puanı yükselir.
Ölçüm: bir sunucuda 78 alan adının 77'sinde 2–5 arası SPF kaydı birikmişti.
- SPF kaydı artık hedefli güncelleniyor: mevcut kayıt bulunup yalnız o değiştiriliyor.
- Alan adının yanındaki diğer doğrulama kayıtları (Google, Microsoft site doğrulaması gibi)
korunuyor — tümünü silen yol bilinçli olarak kullanılmadı.
- Mevcut kayıt okunamazsa hedefli mod uygulanmıyor; yanlış bir kaydın üzerine yazmaktansa
eski davranış korunuyor.
Not: bu sürüm kök nedeni kapatır. Halihazırda çoğalmış kayıtlar ayrı bir bakım aracıyla
birleştirilir.
Doğrulama
| Kontrol | Sonuç |
|---|---|
| `tests/Scripts/postfix-transport-write.sh` (yeni) | 16 kontrol, 0 kırık |
| `tests/Feature/Dns/ApexSpfTargetedUpdateTest.php` (yeni) | 5 test, 0 kırık |
| `tests/Scripts/server-role-install.sh` | 22, 0 |
| `tests/Scripts/server-role-self-update.sh` | 26, 0 |
| `tests/Scripts/mail-stack-ensure.sh` | 28, 0 |
| `tests/Scripts/spf-ip-ensure.sh` | 54, 0 |
| `tests/Feature/System/ServerRoleContractTest.php` | 10, 0 |
Yönlendirme testi her modun Postfix'e yazdığı satırı tek tek doğrular; ayrıca eski alan
adlarıyla çağrıldığında sessizce varsayılana düşmediğini kanıtlar. SPF testi hem hedefli
güncellemenin doğru kaydı seçtiğini hem de alt alan adlarında ve SPF olmayan kayıtlarda
devreye girmediğini ölçer.
ONOXSOFT v2026.8.73 — Sunucu Rolü Temeli
Bir sunucunun "müşteriye hangi hizmeti verdiği" bilgisi artık kayıtlı. Bu sürüm temeli
kurar: rol kurulumda seçilir, panelde görünür ve panel güncellemelerinin bu kararı geri
almasını engeller.
Sunucu rolü
- Kurulumda beş seçenekten biri sorulur: tam sunucu (varsayılan), yalnız web, yalnız mail,
yalnız veritabanı, yalnız DNS. Seçim `--server-role` bayrağıyla veya `ONOX_SERVER_ROLE`
ortam değişkeniyle de verilebilir; betikle kurulum yapan hiçbir akış değişmez.
- Rol seçilmezse veya okunamazsa tam sunucu varsayılır. Mevcut kurulumlar hiçbir
şey yapmadan aynen çalışmaya devam eder.
- Rol bu sürümde kurulumdan sonra değiştirilemez. Değiştirme akışı, veri kaybına karşı
koruma gerektirdiği için sonraki sürüme bırakıldı.
Panel güncellemeleri artık rolü ezmiyor
Panel güncellemesi, sunucu rolünden bağımsız olarak dört mail bakım adımını her seferinde
çalıştırıyordu. Yani "bu makine yalnız veritabanı sunucusu" kararı her güncellemede geri
alınıyor, mail yığını yeniden kuruluyordu. Artık rol mail hizmeti içermiyorsa bu adımlar
atlanır ve atlandığı açıkça raporlanır — sessizce geçilmez.
Mail yığını onarımı: hata türü artık ayırt ediliyor
Onarım adımı iki farklı başarısızlığı tek bir "uyarı" altında topluyordu. Artık ayrılıyor:
- Yeniden yükleme başarısız — yazılan ayarlar yapılandırmada duruyor ama yürürlükte
değil; elle müdahale gerekir.
- Doğrulama başarısız — o turda yazılan her şey geri alındı; müdahale gerekmez.
Ayrıca onarım çıktısı artık yutulmuyor, günlüğe yazılıyor.
Kurulum menüsündeki gizli hata
Kurulumun metin tabanlı seçim menüsü, soru metnini ve seçenek satırlarını dönüş değerine
karıştırıyordu. Grafik arayüz (whiptail) kurulu makinelerde bu fark edilmiyordu; kurulu
olmayan sunucularda ise seçim sonucu okunamaz hâle gelirdi. Menü düzeltildi ve geçersiz
girdi artık sessizce kabul edilmiyor.
Bu sürümde YAPILMAYANLAR
Yanlış beklenti oluşmaması için açıkça:
- Hiçbir servis durdurulmuyor. Rol yalnızca hangi bakım adımının koşacağını ve hangi
menünün görüneceğini belirler. Lisans denetleyicisi durdurulan servisleri 30 saniye
içinde geri açtığı için servis yönetimi ayrı bir mekanizma gerektiriyor; sonraki sürümde.
- Rota erişimi kısıtlanmıyor. Menü bu sürümde yalnızca arayüz ipucudur; rol dışı
sayfalar adresle hâlâ açılabilir.
- Müşteri ve bayi panelleri, mobil arayüz, kurulum sihirbazı ve küme düğümü rolleri
bu sürümün kapsamı dışında.
Acil durum anahtarı
Rol yanlış ayarlanmışsa panele girmeden devre dışı bırakılabilir:
`server_settings` tablosunda `server_role_enforcement = off`. Bu durumda rol hiç
uygulanmaz, her şey tam sunucu gibi davranır.
Doğrulama
| Kontrol | Sonuç |
|---|---|
| `tests/Scripts/server-role-install.sh` (yeni) | 22 kontrol, 0 kırık |
| `tests/Scripts/server-role-self-update.sh` (yeni) | 26 kontrol, 0 kırık |
| `tests/Scripts/mail-stack-ensure.sh` | 28 kontrol, 0 kırık |
| `tests/Scripts/outmail-guard.sh` | (yayın öncesi ölçülecek) |
| `tests/Scripts/spf-ip-ensure.sh` | 54 kontrol, 0 kırık |
| `tests/Feature/System/ServerRoleContractTest.php` (yeni) | (bu ağaçta koşmaz — ana ağaçta ölçülecek) |
En kritik senaryo ayrıca ölçüldü: rol okunamadığında dört mail bakım adımının da
koştuğu doğrulandı. Bu, mevcut kurulumların güncellendiğinde mail bakımını kaybetmemesini
garanti eder.
Kurulum menüsü düzeltmesi, düzeltmeden önce kırmızı veren bir testle kayıt altına
alındı.
ONOXSOFT v2026.8.72 — Giden Posta Kalkanı Ekranının Çevirileri
Giden Posta Kalkanı ekranının bildirim ve hata mesajları yalnız Türkçe görünüyordu;
eksik çeviriler tamamlandı.
Çeviriler
- Kalkan ekranının sunucu tarafı mesajları (kurulum sonucu, kendi kendini test çıktısı,
askı kaldırma, ayar kaydetme ve hata durumları) hiçbir dile çevrilmemişti. Türkçe
dışında bir dil seçen yönetici bu mesajları Türkçe görüyordu.
- 26 metin Arapça, Almanca, İngilizce, İspanyolca, Fransızca, İtalyanca, Portekizce,
Rusça ve Çince dillerine eklendi.
Doğrulama
- Kalkan denetleyicisi ve servisindeki çevrilebilir metinlerden dil dosyalarında eksik
kalan yok.
- Her çeviride değişken yer tutucuları anahtarla birebir eşleşiyor.
- Tüm dil dosyaları geçerli ve aynı anahtar sayısında.
- Çeviriler üç sunucuda canlı doğrulandı.
ONOXSOFT v2026.8.71 — Port 25 TLS Sertleştirmesi ve Mail Yığını Koruması
SMTP parolasının şifresiz kanalda istenmesini önleyen sertleştirme — kimseyi kırmadan,
ölçülmüş kanıta dayanarak. Ayrıca mail yığını onarım betiğinin Postfix tarafına geri
alma ve doğrulama koruması eklendi.
Port 25'te parola artık şifreli kanalda
- Port 25 SMTP kimlik doğrulamayı TLS kurulmadan önce sunuyordu; bu, parolanın düz metin
olarak taşınmasına izin verir. Artık kimlik doğrulama yalnız TLS kurulduktan sonra sunulur.
- Yeni kurulumlarda bu ayar doğrudan açık gelir; kurulum anında yapılandırılmış hiçbir
istemci olmadığı için kimsenin postası etkilenmez.
- Mevcut kurulumlarda ayar kendiliğinden AÇILMAZ. Yıllardır port 25'te düz metin kimlik
doğrulayan bir yazıcı veya iş uygulaması varsa, ayarın habersiz açılması o cihazın
dışarıya postasını keserdi.
Kanıt toplama ve öneri
- Giden Posta Kalkanı, kimlik doğrulanan her mesajda bağlantının hangi porttan geldiğini
ve şifreli olup olmadığını kaydeder. Bu ölçüm 25, 587 ve 465 portlarını birlikte kapsar.
- Mail > Giden Posta Kalkanı > Kurulum ekranında durum ve öneri gösterilir: sertleştirme
açılabilir mi, yoksa önce düzeltilmesi gereken istemciler mi var.
- Düz metin kimlik doğrulayan istemciler kullanıcı adı, IP ve port ile listelenir; önce
onlar 587/465'e taşınmalıdır.
- Yeterli gözlem birikmediyse, gözlem durmuşsa veya durum okunamıyorsa öneri üretilmez.
Veri yokluğu hiçbir zaman "güvenli" sayılmaz.
- Gözlem süresi yalnız kalkan gerçekten kanıt toplarken işler; servis durduğu sürelerde
ilerlemez.
- Sertleştirme geri alınabilir; geri alma önceki değere döner.
Mail sağlık kontrolleri
- Postfix yapılandırma sözdizimi kontrolü hiçbir ölçüm yapmadan "başarılı" dönüyordu;
artık gerçekten çalıştırılır ve ölçülemezse "temiz" değil "ölçülemedi" der.
- Yeni kontrol: port 25'te STARTTLS sunuluyor mu ve kimlik doğrulama TLS'ten önce mi
açılıyor. Bu kontrol, gelen postanın şifresiz taşındığı yapılandırmaları yakalar.
Mail yığını onarımı
- Onarım betiği Postfix ayarlarını değiştirirken önceki değerleri kaydetmiyordu ve
yeniden yükleme öncesi yapılandırmayı doğrulamıyordu.
- Artık yapılandırma doğrulanmadan yeniden yükleme yapılmaz; doğrulama başarısız olursa
o turda yazılan tüm değişiklikler geri alınır.
- Yeniden yükleme başarısız olursa işlem "tamamlandı" olarak raporlanmaz.
- Hiçbir şey değişmediğinde artık gereksiz Postfix yeniden yüklemesi yapılmaz; önceden
her panel güncellemesinde tetikleniyordu.
Doğrulama
- Sertleştirme açıkken port 25'te kimlik doğrulama TLS öncesi görünmüyor, TLS sonrası
görünüyor; kapalıyken tam tersi. Karşılaştırmalı olarak ölçüldü.
- Kimliksiz gelen posta akışı etkilenmedi.
- Onarım betiği için yeni sözleşme testi eklendi: geri alma, doğrulama başarısızlığı,
önceki değerin korunması ve yeniden yükleme hatası senaryoları.
- Kalkan motoru ve sysapi sözleşme testleri, panel testleri ve üretim derlemesi başarılı.
ONOXSOFT v2026.8.70 — Zararlı Tespit Katmanı ve MultiPHP Depo Sondası
ClamAV imzalarının kaçırdığı web shell'leri yakalayan sezgisel bir tarama katmanı ve
MultiPHP'de eski sürümleri engelleyen sabit varsayımın gerçek depo ölçümüyle
değiştirilmesi.
Zararlı tespit katmanı
- ClamAV'ın imza tabanlı taraması, gizlenmiş web shell'leri kaçırıyordu; üç sunucudan
toplanan 17 gerçek örnekte hiçbiri yakalanmamıştı.
- Yeni sezgisel motor kodlayıcı zincirlerini, hash ile korunan arka kapıları, sıfır
genişlikli karakterle gizlenmiş yükleri, sahte eklenti ağaçlarını, defacement izlerini
ve sonek kopyası klonları tanır.
- Güçlü ve bağlamsal sinyaller ayrı ağırlıklandırılır; tek bir zayıf işaret tek başına
bulgu üretmez. Karantina her zaman geri alınabilir.
- Sezgisel katman ölçüm yapamazsa tarama "temiz" sayılmaz; panel "sezgisel katman
çalışmadı" uyarısı gösterir.
ClamAV imza akışları
- SaneSecurity ve LMD imza akışları indiriliyor ama freshclam'e hiç tanıtılmadığı için
yüklenmiyordu. Akışlar artık `freshclam.conf` içine `DatabaseCustomURL` olarak yazılır.
WordPress bütünlük denetimi
- Çekirdek ve eklenti dosyaları resmî checksum'larla karşılaştırılır.
- `wp-cli` hata verirse sonuç "temiz" değil "atlandı" olarak raporlanır.
MultiPHP sürüm engeli
- Eski PHP sürümlerini engelleyen sabit "EL10'da yalnız 8.2+ vardır" varsayımı kaldırıldı;
yerini gerçek depo sorgusu aldı.
- Depo ailesi aktif web sunucusu sürücüsüne göre seçilir: OpenLiteSpeed'de `lsphp`,
Apache/Nginx'te Remi.
- Sorgu ölçüm yapamazsa hiçbir sürüm engellenmez; devre dışı bırakılmış veya erişilemeyen
bir alt depo artık tüm sorguyu iptal etmez.
- Kurulu bir sürüm hiçbir koşulda "depoda yok" diye engellenmez.
Doğrulama
- Sezgisel motor gerçek zararlı örneklerinde 6/6 yakaladı; aynı örneklerde ClamAV 0/6.
- Meşru dosyalarda yanlış pozitif üretilmedi.
- Motorun iki uygulama dalı (gawk ve grep) üretim ortamında eşdeğer doğrulandı.
- PHP sözdizimi, sysapi harness'ları ve panel testleri başarılı.
Giden Posta Kalkani — ele gecirilmis posta kutularindan cikan spam’i, hacim degil DAVRANIS (kaynak cesitliligi) ile tespit edip hesabi otomatik askiya alir. Postfix DATA asamasinda calisan policy daemon (main.cf global hook: smtp/25 + submission/587 + smtps/465), per-kutu saatlik/gunluk alici tavani, botnet coklu-IP/subnet tespiti, yerel PHP mail() sayaci ve denylist, panel ekrani (Mail > Giden Posta Kalkani), olay/bildirim/Telegram/denetim zinciri, fail2ban SASL jail kurulumu. Fail-open: daemon dursa posta akisi durmaz. Kurulum ve guncellemede idempotent otomatik kurulur.
ONOXSOFT v2026.8.68 — Topbar Laptop Taşma Düzeltmesi
Üst çubukta kademeli görünürlük
- Sistem istatistik bloğu önceden tüm öğeleriyle (kullanıcı/hostname/OS, Load
1m-5m-15m, RAM, Disk, Uptime) `xl` eşiğinde birden açılıyordu. Tipik laptop
genişliğinde (1280-1535 px) yan menü, sayfa başlığı ve sağdaki sürüm çipi /
bildirim grubuyla birlikte sığmıyor; taşan bloklar sürüm çipinin ve uptime
göstergesinin üzerine biniyordu.
- Artık laptop aralığında yalnız Load (1m) + RAM + Disk gösterilir; kimlik
bloğu (USER/HOSTNAME/OS), Load 5m/15m değerleri ve Uptime `2xl` (≥1536 px)
eşiğinde açılır.
- İstatistik konteynerine `min-w-0 shrink overflow-hidden` eklendi: alan yine
daralırsa öğeler üst üste binmek yerine kırpılır.
- Kimlik bloğu gizliyken solda yetim dikey ayraç kalmaması için ayraçlar da
aynı eşiklere hizalandı (layout ayracı `lg`→`xl`, blok ayracı `2xl`).
Doğrulama
- Vite üretim derlemesi tazelik ve manifest kapılarından geçti.
- Değişiklik yalnız Tailwind görünürlük sınıfları; veri/poll mantığına
dokunulmadı.
ONOXSOFT v2026.8.67 — Kuyruk Log Kilidi ve MariaDB Canlı Durum
Kuyruk işlerini düşüren log izin kilidi (kritik)
- Günlük log dosyasını günün ilk yazanı oluşturur; panelde iki ayrı kimlik yazar
(php-fpm/Horizon `apache`, lisans watchdog'u `onoxd` root). Gece rotasyonunda
dosyayı root oluşturursa izin umask'tan `0644` kalıyor, `apache` grubu
yazamıyor ve log atan her Horizon işi
`could not be opened in append mode` hatasıyla düşüyordu.
- 2026-08-15'te beta'da 73 başarısız iş (36 hesap yedeği, 36 yedek hedefe itme,
1 yedek zamanlayıcı) bu tek kök nedenden oluştu; yedekleme mantığı sağlamdı.
- `single` ve `daily` log kanallarına sabit `permission => 0664` eklendi. Dosyayı
kim oluşturursa oluştursun grup yazabilir; hata sınıfı kökten kapanır.
MariaDB canlı durum sysapi script'i (eksik dosya)
- `db-server-status` komutu izin listesinde kayıtlı ve probe üreticisi tarafından
çağrılıyordu; ancak gerçek script hiç yazılmamıştı. Canlı panelde her probe
tazelemesi `Sysapi script bulunamadı` hatası üretiyor (beta'da günde ~780
kayıt) ve arayüz canlı-DB fallback'ine düşüyordu.
- `onx-db-server-status` eklendi: servis durumu, sürüm, uptime, bağlantı ve
thread sayıları, QPS, yavaş sorgu sayısı, InnoDB buffer pool ve veri/indeks
boyutları tek MariaDB çağrısında toplanır (5 sn probe zaman bütçesine uygun).
Doğrulama
- Beta'da 73 başarısız iş yeniden kuyruklandı; tamamı hatasız işlendi, yeni
log-izin hatası oluşmadı.
- `onx-db-server-status` üç üretim sunucusunda gerçek veriyle doğrulandı;
`MysqlServerStatus` probe üreticisi uçtan uca `ok=true` döndürdü.
- PHP sözdizimi (`php -l`) ve bash sözdizimi (`bash -n`) kontrolleri geçti.
ONOXSOFT v2026.8.66 — Stable Baseline Kurtarma
Durum: Acil düzeltme — 14 Ağustos 2026
Neden
v2026.8.65 paketi temiz Git `HEAD` arşivinden üretildi. Önceki stable sürümlerde
yayınlanmış fakat Git geçmişine tam bağlanmamış kaynak düzeltmeleri bu arşive
girmedi. Updater dosyaları silmedi; ancak aday pakette bulunan 91 kaynak dosyası
v64'teki sürümünden daha eski içerikle üzerine yazıldı.
Düzeltme
- v2026.8.64 resmi paketi son bilinen sağlam kaynak tabanı olarak geri alındı.
- v2026.8.65 WordPress katalog uzlaştırması ve 48 saatlik başarısız bildirim
saklama değişiklikleri bu tabanın üzerine yeniden uygulandı.
- `dns_health` ve `scheduler_overdue` ölçümleri ayrıntı ekranlarında çalışmaya
devam ederken admin ana panosundaki Dikkat Gerektirenler listesinden çıkarıldı.
- SSL bildirim tekilleştirme, DKIM temizliği, PureDB parola self-heal, yedek
saklama/temizlik, DirectAdmin/Plesk göç, mobil uçlar, varsayılan dil ve migration
arayüzü dahil v54–v64 stable davranışları geri getirildi.
- Veritabanı ve müşteri verilerinde kayıp yoktur; onarım yalnız uygulama kaynak
tabanını ve derlenmiş frontend varlıklarını değiştirir.
Kalıcı yayın kapısı
`onx-release-build` artık önceki stable paketi ve sürüme ait açık delta listesini
zorunlu tutar. Aday pakette delta dışında değiştirilmiş, eksilmiş veya eski tabana
dönmüş tek bir birinci taraf kaynak dosyası varsa tarball silinir ve yayın durur.
Doğrulama
- v64 → v65 paket farkı ve Matrix canlı kaynakları checksum düzeyinde karşılaştırıldı.
- 107 yazılan dosyanın 16'sı amaçlanan v65 deltası, 91'i regresyon olarak ayrıldı.
- v64'e özgü 57 dosyanın updater tarafından korunmuş olduğu doğrulandı.
- Kurtarma paketi v64 stable tabanı + deklarasyonlu v65/v66 delta kapısından geçirilir.
ONOXSOFT v2026.8.65 — WordPress Kataloğu ve Bildirim Saklama
WordPress katalog bütünlüğü
- Panel kurulumundaki göreli `/` ve `/blog` yolları ile disk keşfindeki mutlak
`public_html` yolları aynı fiziksel WordPress kurulumu olarak eşleştirilir.
- WordPress ve WooCommerce aynı çekirdek ailesinde değerlendirilir; aynı site için
ikinci katalog kaydı oluşmaz.
- Geçmiş mükerrer kayıtlar güvenli uzlaştırma komutuyla tek kayda indirilir. İşlem
geçmişi, güvenlik taramaları, snapshot'lar, staging ve Update Guardian ilişkileri
korunan kayda taşınır.
- Aktif Update Guardian çalışması bulunan kayıtlar işlem bitene kadar atlanır.
- Uzlaştırma her gece keşiften önce çalışır; Fleet ve Guardian ekranları ayrıca
veri temizliği beklemeden mükerrerleri tek satır gösterir.
Gerçek WordPress sürümü
- `latest`, `unknown`, `stable` ve `auto` artık sürüm numarası kabul edilmez.
- Yeni WordPress/WooCommerce kurulumundan sonra diskteki gerçek çekirdek sürümü
okunup katalogdaki `version` ve `wp_version` alanlarına yazılır.
- Keşif sırasında geçici etiketler bilinen gerçek sürümü ezemez; çözülemeyen sürüm
arayüzde hatalı `vlatest`/`vunknown` yerine `—` görünür.
Başarısız iş bildirimlerinin saklanması
- Başarısız site transferi bildirimleri varsayılan olarak 48 saat görünür kalır.
- Süresi dolan kayıtlar saatlik bakım göreviyle fiziksel olarak temizlenir; panel
bildirim tablosu sürekli büyümez.
- v2026.8.65 öncesinden kalan süresiz transfer hata bildirimleri de 48 saat
kuralına göre temizlenir.
- Hesap sonlandırma gibi kalıcı `error` bildirimleri ile güvenlik, audit ve
`failed_jobs` kayıtları bu temizlikten etkilenmez.
- Saklama süresi `ONOX_FAILED_NOTIFICATION_RETENTION_HOURS` ile değiştirilebilir.
Doğrulama
- PHP ve sysapi sözdizimi kontrolleri başarılı.
- Bellek içi uçtan uca senaryoda mükerrer kayıt tek kayda indi, gerçek `7.0.4`
sürümü ve ilişkiler korundu.
- 48 saatlik geçici bildirim temizliği ile kalıcı hata bildirimi ayrımı doğrulandı.
- JavaScript testleri ve Vite production build başarılı.
ONOXSOFT v2026.8.64 — Guardian Menüsü ve Form Performansı
Görünür yönetim merkezleri
- Update Guardian Merkezi gerçek yönetici sol menüsünde `Güvenlik` grubuna eklendi.
- Felaket Kurtarma Merkezi gerçek yönetici sol menüsünde `Yedek & Kurtarma` grubuna eklendi.
- Araç kataloğunda bulunan fakat sol menüde eksik kalan iki route artık doğrudan erişilebilir.
- `Backup & Migration` grup başlığı Türkçe arayüzle uyumlu olarak `Yedek & Kurtarma` yapıldı.
Form tepkisi
- `/panel/apps/wordpress` uygulama kurulum formunda büyük alan adı seçenek ağacı metin girişlerinin render döngüsünden ayrıldı.
- Canlı hesaplama gerektirmeyen metin alanları tarayıcının doğal giriş akışını kullanıyor; değerler alan değişiminde güvenle forma aktarılıyor.
- WordPress Kontrol Merkezi kurulum modalına aynı seçenek-listesi izolasyonu uygulandı.
- Statik uygulama ve otomasyon kartları her tuş vuruşunda yeniden render edilmiyor.
Genel ön yüz yükü
- On dilin büyük çeviri katalogları ana JavaScript paketinden ayrıldı.
- Başlangıçta yalnız aktif dil ile İngilizce/Türkçe fallback katalogları paralel yükleniyor.
- Ana uygulama asset'i production ölçümünde 8.753.524 bayttan 717.558 bayta düştü (%91,8 daha küçük).
- Tüm diller korunur; dil değişiminde ilgili katalog kendi cache'lenebilir asset'i üzerinden yüklenir.
Doğrulama
- Vite production build: başarılı (`2547 modules transformed`).
- Ana bundle küçülme kapısı: başarılı (`717.558 B`, 10 ayrı locale chunk).
- Guardian/DR sidebar ve WordPress form performans sözleşmeleri: başarılı.
ONOXSOFT v2026.8.63 — v62 Paket Regresyonu Onarımı
Durum: Stable yayın — 14 Ağustos 2026
Acil düzeltme
- v2026.8.62 paketinin eski Git tabanından gelen dosyalarla bazı v54–v61 stable düzeltmelerini geri alması engellendi.
- Paket yeniden v2026.8.61 resmi arşivi taban alınarak ve yalnız v62 değişiklikleri bindirilerek üretildi.
- Admin ana panosunda `dns_health` ve `scheduler_overdue` sinyallerinin Dikkat Gerektirenler listesine taşınmaması yeniden korundu.
- v61 paketindeki SSL bildirim, DKIM/Gmail teslimat, DirectAdmin göç, yedek tazelik, mobil/Chrome ve diğer stable düzeltmeler eksiksiz geri getirildi.
- Veritabanı ve müşteri verilerinde kayıp oluşmadı; sorun yalnız release paketindeki kaynak dosya regresyonuydu.
v62 özellikleri korunur
- Güvenlik → Update Guardian Merkezi kullanılabilir durumdadır.
- Yedek & Kurtarma → Felaket Kurtarma Merkezi kullanılabilir durumdadır.
- Eski/import hesaplarda eksik PureDB satırını kendiliğinden oluşturan parola sıfırlama düzeltmesi korunur.
Doğrulama
- Paket, v61 resmi arşivi ile v62 delta listesinden yeniden ve izole olarak üretildi.
- Guardian/DR route ve migration kayıtları, DR scheduler, parola self-heal betiği ve dashboard uyarı filtresi paket içinde doğrulandı.
- Matrix güncelleme öncesi snapshot ile v61 resmi arşivinin ilgili düzeltmeleri checksum düzeyinde eşleştirildi.
ONOXSOFT v2026.8.61 — WordPress OLS 404 Onarımı
Durum: Stable yayın — 14 Ağustos 2026
Doğrulama ortamı: `matrix.onox.com.tr`, 14 Ağustos 2026
Uygulanan düzeltmeler
- WordPress ve diğer front-controller CMS'lerde `.htaccess` yönlendirme koşulları artık atomik bir zincir olarak çevrilir.
- OpenLiteSpeed'e güvenle taşınamayan `HTTP:CF-Visitor` gibi bir `RewriteCond` bulunduğunda, yalnız koşul değil ona bağlı dış yönlendirme kuralı da elenir.
- Böylece aynı HTTPS URL'sine koşulsuz yönlendirme üretilmesi, OpenLiteSpeed'in harici yönlendirme döngüsü algılayıp WordPress iç sayfalarını kendi yerel `404 Not Found` sayfasına düşürmesi engellenir.
- Güvenli alan adı kanonik yönlendirmeleri korunur; dosya/dizin bulunmadığında WordPress isteği yine `/index.php` front controller'ına aktarılır.
- PHP `.htaccess` çeviricisi ile toplu OpenLiteSpeed vhost üreticisinin Python uygulaması aynı güvenli davranışta eşitlendi.
Canlı doğrulama
- `otosanzuman.com.tr` ana sayfası ve iç sayfaları hem doğrudan origin hem herkese açık HTTPS üzerinden doğrulandı.
- `/iletisim`, `/haberler-blog`, `/hizmet-bolgelerimiz` ve `/wp-json/` uçları önbellek baypas edilerek `HTTP 200` döndürdü.
- Matrix'teki gerçek `.htaccess` çeviricisi yalnız güvenli WordPress front-controller kurallarını üretti.
- PHP davranış kontrolü, gömülü Python sözdizimi/davranış kontrolü ve shell sözdizimi kontrolü başarıyla geçti.
ONOXSOFT v2026.8.60 — Geçiş
Durum: Stable yayın — 13 Ağustos 2026
Doğrulama ortamı: `beta.onox.com.tr`, 13 Ağustos 2026
Uygulanan düzeltmeler
- DirectAdmin admin API yedeği, File Manager'ın resmî `CMD_API_FILE_MANAGER` boyut sorgusu ve `CMD_FILE_MANAGER?path=...` indirme sözleşmesiyle alınır.
- Uzun paketleme sırasında heartbeat üretilir; arayüz sabit `%5` yerine canlı paketleme durumunu, indirmede gerçek byte/yüzde ilerlemesini gösterir.
- Paketleme henüz boyut üretmediyse arayüz sahte yüzde göstermez; canlı heartbeat, geçen süre ve son kaynak sinyaliyle işin çalıştığı ya da gerçekten bayatladığı ayırt edilir.
- DirectAdmin'in `%2A...` biçiminde URL-kodladığı `mysql_native_password` hashleri güvenli biçimde normalize edilir.
- MySQL kullanıcıları ve DB grant ilişkileri hem MariaDB'ye hem panel envanterine taşınır.
- Transfer sonu grant denetimi mantıksal kısa ad yerine gerçek MariaDB adını kullanır; sağlıklı siteye yanlış “yetkili kullanıcı yok” alarmı yazılmaz.
- Başarılı `.tar.zst` göç arşivi güvenli uzantı whitelist'i üzerinden silinir; başarısız arşiv yeniden deneme için korunur.
- Onoxsoft'tan Onoxsoft'a göç, kaynak paneli yalnız `/opt/onoxsoft` altında varsaymaz; doğrulanmış kurulum yolunu bilinen dizinlerden ve systemd çalışma dizininden otomatik keşfeder.
- Uzak SSH hataları artık çalıştırılan komut gövdesini kullanıcı ekranına dökmez; kısa, güvenli özet gösterilir ve teknik ayrıntı kontrollü biçimde açılabilir.
- Yönetim menüsü ve göç ekranları tek ad altında Sunucu Transfer Merkezi olarak birleştirilmiştir.
- Plesk hazırlığında kaynak DB/mail/DNS/SSL/cron envanteri, düz parola taşımayan ve abonelik domainine kriptografik kimlik yerine şema+bağlam doğrulamasıyla bağlanan korumalı sidecar hattına alınır; gerçek Plesk kabul testi tamamlanana kadar execute kapısı açılmaz.
DKIM ve Gmail teslimat onarımı
- Silinen sitelere ait `dkim_keys` satırları, `/etc/onox/dkim` dosyaları ve Rspamd anahtar kopyaları domain silme olayıyla birlikte temizlenir.
- Dosya sistemi silmesi geçici olarak başarısız olursa anahtar önce pasife alınır, DB satırı yeniden deneme kaydı olarak korunur ve gece zamanlayıcısı temizliği tekrarlar.
- DKIM yönetim sayfası yalnız canlı domainleri ve panelin korunan gönderici domainlerini listeler; geçmişten kalan yetim kayıtlar kullanıcıya gösterilmez.
- Aynı selector altında birikmiş birden çok DKIM TXT değeri PowerDNS ve panel DB'de tek kanonik RRset'e indirilir; v60 güncellemesi bunu ilk çalışmada, zamanlayıcı ise her gece uzlaştırır.
- DB'de DKIM kaydı bulunduğu hâlde imzalayıcıdaki private-key dosyası kayıpsa sistem artık eski public key'i yeniden yayınlamaz; gerçek anahtar çiftini üretir ve DNS/DB'yi signer ile eşitler.
- Yerel PHP `mail()` gönderimlerinde Unix zarf göndericisi ile MIME `From` alanı farklı olsa bile yalnız yerel postaya izin veren dar Rspamd kuralı exact `From` domainiyle DKIM imzası üretir.
- Eski kurulumlarda `myorigin=$myhostname` olarak kalan Postfix sapması `myorigin=$mydomain` değerine çekilir; internetten gelen veya kimliği doğrulanmamış postaya genel From-mismatch izni verilmez.
- Bu düzeltmeler Gmail'in canlı günlüklerde görülen `550 5.7.26 sender is unauthenticated`, `DKIM did not pass` ve `SPF did not pass` reddini hedefler.
60A güvenlik önizlemeleri
- Update Guardian, exact WordPress çekirdek/eklenti/tema hedefini full-account snapshot ve bağımsız SHA-256/boyut doğrulaması sonrasında DNS/vhost oluşturmayan geçici adayda dener.
- Aday ortamda e-posta, cron ve genel dış HTTP yan etkileri kapatılır; güncellemeden sonra aday DB kullanıcısı yalnız `SELECT` yetkisine indirilir ve manifest/core/DB/PHP guard kontrolleri çalıştırılır.
- Guardian gözlem zinciri ortak site yazma kilidini kullanır, geçici alanı exact UUID kapsamında temizler ve canlı siteye güncelleme uygulamaz.
- Felaket Kurtarma Observer, tek ping yerine en az üç bağımsız sinyal, ardışık hata penceresi, iki gözlemci ve çapraz fault-domain/çoğunluk quorum'u ister; yalnız secret-free incident/audit kaydı üretir.
- DR 60A'dan restore, fencing, standby rezervasyonu veya DNS yazımına ulaşılmaz.
Beta kabul kanıtı
- DirectAdmin işi `#40`: `completed`, `%100`, süre 62 saniye.
- Hedef hesap: `onx_aciloxnf`; ana domain: `acilotoservis.com`.
- HTTP `301`, HTTPS `200`; WordPress bootstrap ve webserver E2E kontrolü başarılı.
- `aciloxnf_wp` veritabanı, iki MySQL kullanıcısı ve iki grant ilişkisi doğrulandı.
- Horizon ve panel uçları güncellemeden sonra aktif; yerel göç arşivi ve yaklaşık 2,5 GB geçici çalışma verisi temizlendi.
- V60'ta değişen Feature/Unit paketinde 441 test ve 3.086 assertion geçti; dört platform testi yerel Windows ortamında atlandı. Son mail/DNS/domain/account kapısında 330 test ve 1.021 assertion geçti; PHP ve sysapi betikleri sözdizimi kapısından geçti.
- JavaScript sözleşme testleri ve 2.545 modüllük production Vite derlemesi başarıyla tamamlandı.
Bilinçli olarak bu nota dahil olmayanlar
- Plesk kartı gerçek Linux Obsidian export fixture'ı tamamlanana kadar Yakında ve fail-closed kalır.
- Guardian Chromium/Playwright ekran farkı ile canlı uygulama/rollback 60B kapısına kadar kapalıdır.
- DR restore, fencing ve DNS cutover 60B–60D kapılarına kadar kapalıdır.
ONOXSOFT 2026.8.59 — DirectAdmin göç ve yedek alarmı
DirectAdmin göçü
- DirectAdmin `admin` API ile başlatılan yedekler asenkron üretilirken uygulanan
20 dakikalık sabit bekleme kaldırıldı.
- Büyük posta, veritabanı veya web verisi bulunan hesaplarda paketleme için
varsayılan olarak 6 saate kadar kontrollü beklenir.
- Bekleme döngüsü sabit tur sayısı yerine gerçek zaman tavanıyla sınırlıdır;
yedek kararlı boyuta ulaştığında indirme hemen başlar.
Yedek tazelik alarmı
- `Yedek eskidi` alarmının varsayılan eşiği 24 saatten 168 saate
(7 gün) çıkarıldı.
- Günlük adını taşısa da haftanın belirli günlerinde çalışan planların
bir gün sonra yanlış alarm üretmesi engellendi.
- Güncelleme, yalnız eski varsayılan değer olan `24` saati `168` saate
taşır; yöneticinin özel belirlediği eşiklere dokunmaz.
Doğrulama
- DirectAdmin sysapi betiği `bash -n` sözdizimi kontrolünden geçti.
- Değişen PHP dosyaları sözdizimi kontrolünden geçti.
- Beta sunucuda 168 saat eşiği etkinleştirildi ve yanlış yedek alarmının
kalktığı canlı olarak doğrulandı.
ONOXSOFT 2026.8.58 — Mobil operasyon ve SSL bildirimleri
Mobil / Chrome
- Mobil API’ye Turbo Cache durumu ve purge, küme sağlık/ping/sync-preview ve
allowlist’li teşhis terminali uçları eklendi.
- WordPress mobil yüzeyine kısa ömürlü, host doğrulamalı yönetici SSO akışı eklendi.
- Cache, cluster ve terminal ability’leri ayrı yetki kapılarıyla korunur; terminal
yalnızca gerçek cihaz oturumu taşıyan yetkili token’larla kullanılabilir.
- Chrome eklentisi, PWA ve mağaza yönlendirmeleri v57’deki mevcut sözleşmeyi korur.
SSL spam düzeltmesi
- AutoSSL sweep, sertifika hâlâ geçerliyken `SslIssued` / `SslRenewed` olayını tekrar
yayınlamaz; `issued_at` yalnızca gerçek sertifika yaşam döngüsü değişiminde güncellenir.
- Aktif SSL bildirimi expiry tarihindeki küçük oynamalara göre yeni mail sayılmaz.
- SSL issued/expiring/expired şablonlarında domain artık HTML etiketi olarak değil,
güvenli metin olarak render edilir; Outlook için kritik kutular ve butonlar inline
stilli tablo yapısına taşınır.
Doğrulama
- Mobil capability testi: 15 test, 629 assertion geçti.
- Değişen mobil route/WordPress/ability kapsamı: 99 test, 1.177 assertion geçti.
- Mobil tam paket testi yerel Windows ortamında 10 dakikalık timeout’a ulaştı; release
öncesi hedefli kapsam ayrı çalıştırılarak doğrulandı.
- SSL dedupe, lifecycle ve e-posta render regresyonları: 23 test, 48 assertion geçti.
Resmi Chrome Web Store ve Google Play bağlantıları; DirectAdmin SSH/API ayrımı, açık HTTP tanısı ve hesap keşfi veri düzeltmeleri.
Büyük yedeklerde 6 saatlik kontrollü süre, hard-timeout watchdog, failed SHA arşiv kurtarma ve 169 disk artığı düzeltmesi.
Istikrar-bildirim-yedek-cron-mobil-DirectAdmin-bant-genisligi
ONOXSOFT 2026.8.54 — Uygulamalar ve Göç
Bu sürüm, zamanlayıcı/göç akışındaki canlı hataları düzeltir ve panelin uygulama
kurulum deneyimini tek merkezde toplar.
Düzeltmeler
- Laravel zamanlayıcısının arka plan çocuklarına geçen `flock` tanıtıcısı artık
`flock -n -o` ile kapatılır. Böylece sonraki dakika tikleri sessizce düşmez;
mevcut kurulumlar self-update sırasında da otomatik onarılır.
- DirectAdmin aktarımında root SSH kapalı veya `admin` kullanıcısı
`/usr/local/directadmin/data/users` dizinini okuyamıyorsa, bağlantı testi ve
hesap keşfi DirectAdmin'in 2222 admin API yoluna güvenli biçimde düşer. Boş
hesap listesinin başarı sayılması kaldırıldı.
- Pkgacct arşivleri 16 MB parçalarla, toplam 5 GB sınırı korunarak yüklenir.
300 MB ve üzerindeki dosyalar artık reverse proxy'nin tek-istek gövde sınırına
takılıp HTTP 413 üretmez. Yarım/iptal edilmiş yüklemeler temizlenir.
- Bant genişliği cron'u korumalı access loglarını artık yetkili sysapi parser ile
okur. `0750/0640` kiracı gizliliği korunurken günlük trafik satırları ve
grafikler tekrar dolar; tekrar hesaplama günlük değeri şişirmeden günceller.
- Admin API token formunun mobil API için varsayılan süresi 180 güne çıkarıldı.
- Admin'deki `Panel Güncellemeleri > Otomatik uygula` ayarı gerçek kurulum
akışına bağlandı. Manifest kontrol aralığı ve bakım penceresi artık uygulanır;
pencerenin ilk turunda taze kontrol yapılır, aynı sürüm aynı pencerede bir kez
denenir ve kurulum sonucu Güncelleme Geçmişi'ne yazılır. Başarısız veya geri
alınan paket kurulu sayılmaz.
- Yedek profili zamanlaması cron sözdizimi yerine günlük/haftalık/aylık, saat,
haftanın günleri ve ay seçimleriyle düzenlenebilir. Mevcut gelişmiş cron
ifadeleri geriye uyumlu olarak korunur.
- Uzak hedefe aktarım hatası sürerken yerel yedeklerin sınırsız birikmesi
önlendi: GFS saklama kümesindeki son güvenli yerel kurtarma noktası korunur,
politika dışındaki fazla kopyalar budanır. Başarısız işlere ait yarım arşivler
ve SIGKILL sonrası ölü `/tmp` çalışma dizinleri saatlik temizlenir; SHA-256
sidecar'lı tamamlanmış arşivlere dokunulmaz.
Panel sağlığı
- `Domain DNS sorunu` ve `Zamanlanmış iş gecikti` sinyalleri ana panodaki
Dikkat Gerektirenler listesinden çıkarıldı. Ayrıntılı DNS ve zamanlanmış iş
ekranları veri göstermeye devam eder; yalnız genel sağlık puanını sürekli
bozan alarm yüzeyi kaldırılmıştır.
Onoxsoft Apps
- “Onoxsoft'u uygulamaya çevir” popup'ı üç seçenekli uygulama merkezine dönüştü:
PWA/web uygulaması, Chrome eklentisi ve Android/iOS akıllı mobil QR.
- Manifest V3 Chrome eklentisi sürümle birlikte indirilebilir. Chrome Web Store
adresi yapılandırıldığında popup otomatik olarak mağaza bağlantısını gösterir.
- `/mobil` akıllı indirme sayfası cihazı algılar; imzalı Android APK mevcutsa
doğrudan indirir, iOS için App Store/TestFlight adresine yönlendirir.
- QR, paket sürümü, minimum işletim sistemi ve isteğe bağlı SHA-256 bilgileri
yapılandırılabilir.
- 2026.8.53'te yayına alınan tam mobil yönetim API'si 54 kaynak hattına
birleştirildi. `/api/mobile/v1` altındaki 120 rota; cihaz oturumu, ability,
lisans muafiyeti ve yıkıcı işlem korumalarıyla birlikte pakette yer alır.
Güncellemenin `routes/api.php` dosyasını eski tabanla ezip mobil rotaları
düşürmesi engellendi.
Doğrulama kapsamı
- PHP ve Bash sözdizimi kontrolleri
- Vue/Vite production build
- Parçalı yükleme sıra/bütünlük ve temizlik testleri
- DirectAdmin SSH → admin API fallback sözleşmesi
- Bant genişliği root-sysapi ve idempotent günlük upsert testleri
- Mobil QR, Android indirme ve Chrome ZIP indirme testleri
- Dashboard alarm ve zamanlayıcı regresyon testleri
- Gün/hafta/ay zamanlama çözümleme, başarısız yedek artığı ve son-kopya koruma testleri
- Otomatik panel güncellemesi ayar/pencere/gece-aşımı/çakışma/rollback testleri
- Mobil API 120 rota, middleware, ability ve lisans-yüzeyi sözleşme testleri
ONOXSOFT 2026.8.53 — Köprü
Bu sürüm panel, ONOXSOFT Lisans Sunucusu ve Flutter uygulaması arasındaki gerçek
mobil bağlantıyı tamamlar. Ana hedef; QR eşleştirmeyi yalnız bir görsel olarak değil,
tek kullanımlık koddan cihaza bağlı ve iptal edilebilir oturuma uzanan uçtan uca bir
kimlik zinciri olarak yayınlamaktır.
1. Panel mobil API
- Sürümlü yüzey: `https://<panel>/api/mobile/v1/*`.
- Admin, bayi ve müşteri rolleri ayrı ability kümeleri alır; hiçbir mobil oturum
joker `*` yetkisiyle basılmaz.
- Token, `mobile_device_sessions` satırına bağlanır. Askıya alınmış kullanıcı,
iptal edilmiş cihaz veya cihaz kaydı bulunmayan eski PAT yazma uçlarına geçemez.
- Dashboard, uyarılar, domain/DNS/SSL, e-posta, yedek/snapshot, WordPress, göç,
dosya, log, güncelleme, bant genişliği, güvenlik duvarı ve MySQL yüzeyleri ortak
mobil zarf ve denetim sözleşmesini kullanır.
- Mobil lisans kapıları sunucuda uygulanır; uygulamanın navigasyonu yalnız ikinci
savunma katmanıdır.
2. QR ile panel eşleştirme
Admin ve müşteri API Token sayfaları artık aynı sunucu tarafı üreticiyi kullanır:
1. Panel beş dakikalık, tek kullanımlık eşleştirme kodu üretir.
2. Kanonik QR içeriği `{"code":"…","panel_url":"https://…"}` biçimindedir.
3. SVG karekod panel içinde üretilir; kod veya panel adresi üçüncü taraf QR
servisine gönderilmez.
4. Mobil uygulama QR'ı okur, `POST /api/mobile/v1/auth/pair` ile tüketir ve cihaza
bağlı Sanctum oturumu alır.
5. Kod atomik tüketilir; tekrar kullanılamaz. Hız sınırı hem IP hem cihaz/kimlik
kovasında uygulanır.
Elle token girişi geriye uyumludur, fakat cihaz defteri ve kimlik çözme gibi
mobil-oturum özelliklerini açmaz.
3. ONOXSOFT Lisans Sunucusu bağlantısı
LCS tarafı mobil giriş, 2FA adımı, access/refresh token yenileme, cihaz iptali,
müşterinin lisanslı sunucu dizini ve tek kullanımlık panel assertion üretimini sunar.
- Tokenların düz değeri veritabanında tutulmaz; SHA-256 özeti saklanır.
- `device_id` karşılaştırmaları MariaDB/MySQL'de ikili harmanlamayla büyük/küçük
harfe duyarlıdır.
- Panel URL'si yalnız güvenli ve doğrulanmış lisans binding hostname'inden üretilir;
kullanıcı bilgisi, yol veya açık yönlendirme girdisi kabul edilmez.
- Mobil assertion 60 saniyelik ve tek kullanımlıktır. Panel bunu kendi Sanctum
oturumuna çevirir; LCS access token'ı panele taşınmaz.
4. Yayın sertleştirmeleri
- WHMCS hesap açma isteğinde geçerli FQDN zorunlu; eksik domain kuyruğa bozuk iş
bırakamaz.
- E-posta forwarder sorguları MySQL'e özgü `CONCAT` yerine taşınabilir kolon
koşulları kullanır.
- Kaynak trend saat gruplaması MySQL, PostgreSQL ve SQLite için sürücüye uygun SQL
üretir.
- Webroot'ta `index.php` dışındaki PHP-benzeri kurulum/debug artıkları Git ignore
kapısına alınır.
- Testler gerçek `VERSION`, lisans zarfı ve bütünlük manifestini değiştirmez; paralel
test süreçleri birbirinden izole çalışır.
5. Üretim dağıtım sırası
1. Panel ve LCS veritabanlarının yedeğini, mevcut v52 kod/paket SHA256 değerini ve
çalışan cron listesini kaydet.
2. Önce LCS'yi dağıt. Mevcut kurulumda `sso-tokens`, ardından
`mobile-identity`, sonra `device-id-collate-bin` migration'larını koş. LCS
`bin/preflight.php` sıfır hata vermeden devam etme.
3. LCS mobil token temizleme cron'unu kur ve bir kez elle çalıştır.
4. LCS smoke: `/api/mobile/v1` bilinmeyen uçta sözleşmeli 404; geçerli test hesabıyla
login → `/me` → `/servers` → assertion zinciri.
5. Sonra panel v53 paketini dağıt. `php artisan migrate --force`, cache temizliği,
`onox:integrity:rebuild --force` ve queue/Horizon yeniden başlatma adımlarını uygula.
6. Panel smoke: `/api/mobile/v1/capabilities` kimliksiz 401; API Token ekranında QR
üret; Android/Web uygulamasıyla tara; dashboard'u aç; cihaz listesinden oturumu
iptal et ve eski token'ın 401 aldığını doğrula.
7. En son LCS Sürüm Yayını'nda v53'ü `stable/published` yap. Böylece
`get.onox.com.tr/onoxsoft.tar.gz` alias'ı v53'e döner.
6. Geri alma
- Canlı duman testi geçmezse v53'ü `published` yapma; alias v52'de kalır.
- Panel kodunu v52 paketine döndür. Mobil rotalar additive olduğundan eski panel
yeni LCS ile çalışmaya devam eder.
- Mobil tabloları hemen düşürmek zorunlu değildir. Düşürülecekse önce mobil PAT'ları
iptal et; sonra `mobile_lcs_identities`, `mobile_device_sessions` sırasıyla geri al.
- LCS şeması additive'dir; önceki LCS koduna dönüşte yeni mobil tablolar zararsız
kalır. Şema geri dönüşü gerekirse yalnız dağıtım öncesi DB yedeği kullanılır.
- Her geri dönüşten sonra panel lisans heartbeat, web giriş, WHMCS create/suspend ve
mevcut v52 müşteri akışları yeniden smoke edilmelidir.
Doğrulama özeti
- Panel Feature: 2.831 geçti, 11 platform testi atlandı, 12.032 assertion.
- Panel Unit: 791 geçti, 4 platform testi atlandı, 4.393 assertion.
- Panel JavaScript: 8/8 geçti; Vite üretim derlemesi başarılı.
- LCS: tam paket 4.916 assertion, hata yok.
- Flutter: analiz temiz; QR/pair odaklı 39 test geçti; web derlemesi başarılı.
Canlı `onox.com.tr` ve `license.onox.com.tr` uçlarının v53 olarak kabul edilmesi için
bu yerel kapılara ek olarak yukarıdaki üretim smoke zincirinin de geçmesi zorunludur.
ONOXSOFT 2026.8.52 — Görünürlük
Bu sürümün ortak teması şu: **sistem çalışıyordu, ama çalışıp çalışmadığını
kimse söyleyemiyordu.** Dört maddenin üçü doğrudan bu sınıftan; dördüncüsü
taşımada kaybolan bayi yapısı.
---
1. "Cron mu çalışmıyor?" — zamanlanmış iş görünürlüğü
Kullanıcı "DNS durumları 2 gündür taranmamış" dedi. Ölçüm şunu gösterdi:
- `audit_log` saat bazında kesintisiz ~220 kayıt/saat (7–9 Ağustos) → **zamanlayıcı
hiç durmamış**.
- Ama `/var/log/onoxsoft/scheduler.log`'da 30 saatlik delik var: günde ~10.000
satır yazılırken 8 Ağustos'ta yalnız 118. Cron koştu, log yazılmadı.
- `domains.dns_checked_at` yalnız SON koşumu tutuyor → geçmişte koşup koşmadığı
bilinemiyor.
- Cron satırındaki `flock -n`: bir koşum 60 sn'yi aşarsa sonraki tik **hiçbir iz
bırakmadan** düşer. Dakika 00'da tetiklenen `0 */6` işler böyle sessizce atlanabilir.
Yani asıl kusur bir cron arızası değil, **bir arızayı görebilme yeteneğinin
olmaması**. Operatör tahmin etmek zorunda kalıyordu.
Artık her zamanlanmış işin son koşumu, süresi ve sonucu veritabanına yazılıyor:
- Olay dinleyicisiyle merkezî yakalama (`ScheduledTaskStarting|Finished|Failed|
Skipped` + `ScheduledBackgroundTaskFinished`), iş başına kanca DEĞİL — 130 işin
birine kanca eklemeyi unutmak, tam da bu deponun "kod var, çağıran yok" kusurunu
doğuran şey.
- Arka plan işleri için `dispatched` ara durumu: `runInBackground` kullanan 49 iş
için `ScheduledTaskFinished` süreç doğduktan hemen sonra tetiklenir. "ok"
yazsaydık arka planda çöken iş panelde başarılı görünürdü.
- Beklenen aralık cron ifadesinden türetiliyor, elle liste yok. Çözümlenemeyen
ifade için gecikme iddia edilmiyor (ölçemediğimiz şeyi bilmiyoruz).
- Düşen tikler bir sonraki tikte geriye dönük sayılıyor; tikin kendi süresi de
kaydediliyor — 60 sn'yi aşan tik, ardından gelen düşüşün nedenidir.
- Alarm TEK anahtar üzerinden (`scheduler:overdue`): zamanlayıcı tamamen dursa
130 işin hepsi gecikir; iş başına alarm üretmek tek arızayı 130 bildirime
çevirirdi — 8 müşteriye 43'er bildirim giden olayın büyüğü.
Yol boyunca iki gerçek tuzak yakalandı: Laravel'in `app/Listeners` altındaki
`handle*` metotlarını otomatik keşfetmesi yüzünden her koşum iki kez
kaydediliyordu; ve MariaDB'de ilk NOT NULL `TIMESTAMP` sütununun otomatik
`ON UPDATE CURRENT_TIMESTAMP` alması başlangıç damgasını sessizce bitiş anına
kaydırıyordu — SQLite'ta testler bunu asla göremezdi, sütunlar `DATETIME` yapıldı.
---
2. "Neden hiç spam gelmiyor, Junk klasörü hep boş?"
Ölçüm (matrix, 2026-08-09):
- rspamd sağlam çalışıyor: GTUBE testi → `Action: reject, Score: 15.00/15.00`,
gerçek gelen postaları da tarıyor.
- Yüksek skorlu spam SMTP kapısında reddediliyor (`milter-reject`) — bu doğru
çalışıyor ve "hiç spam gelmiyor" hissinin sebebi büyük ölçüde bu.
- Ama `/etc/rspamd/local.d/milter_headers.conf` HİÇ YOKTU. rspamd `X-Spam: Yes`
başlığını yazmıyordu.
- Dovecot'un `sieve_before` kuralı tam olarak o başlığı arıyor
(`if header :contains "X-Spam" "Yes"`).
- Sonuç: tüm Junk klasörlerinde 0 mesaj — yapısal olarak asla dolamazdı. Orta
skorlu spam gelen kutusuna, hiçbir işaret olmadan düşüyordu.
Yine "kural var, onu besleyen veri hiç üretilmiyor" durumu. Sieve yarısı 7.45'te
doğru yazılmış, rspamd yarısı hiç kurulmamıştı.
İki yarı ayrı ayrı anlamsız olduğu için ikisi de aynı ensure betiğinde
garanti ediliyor (`onx-mail-sieve-ensure`); biri kurulup diğeri unutulursa spam
ayrıştırma yine sessizce çalışmaz.
- `remove = 1` güvenlik şartı: dışarıdan gelen sahte `X-Spam` başlığı önce
siliniyor — aksi hâlde gönderen temiz postayı Junk'a düşürebilirdi.
- `extended_spam_headers` ile `X-Spamd-Result` de ekleniyor: bir postanın neden
spam sayıldığı sonradan teşhis edilebilsin.
- `rspamadm configtest` ön-doğrulaması: bozuk yapılandırmayla rspamd'yi reload
etmek tüm posta akışını riske atar. Geçmezse dosya geri alınıyor, exit 3.
---
3. Taşımada bayi yapısı korunuyor
`CpanelPkgactParser` cPanel'in `OWNER` alanını ayrıştırıyor, `CpanelRestoreEngine`
özete taşıyor ve `Plan.vue` ekranda basıyordu — ama `RunCpanelMigrationJob`
`owner_user_id => initiated_by` yazıyordu. Bayiye ait 40 hesap taşındığında 40'ı da
göçü başlatan admin'in altına düşüyor, bayi panelde hiç oluşmuyordu.
Yeni `MigrationResellerResolver`: platform sayılan OWNER'lar
(`root`/`cpanel`/`admin`/`system`… — DA ve Plesk'te platform yöneticisinin adı
literal `admin`), iki bağımsız adoption mekanizması, `Role::findOrCreate`
(rol seed edilmemişse `assignRole` göçü öldürüyordu), ve kaynakta e-posta yoksa
bayi pasif kuruluyor — teslim edilemeyecek parola üretmek hesabı kilitlemektir.
Kaynak e-postası başka birine (özellikle admin'e) aitse o kullanıcı **asla ele
geçirilmiyor**. Bayi kurulamazsa hesap yine taşınıyor, ama sessiz kalınmıyor.
---
4. Sayfa içi hata bildirimi (böcek widget'ı)
Admin ve bayi ekranlarında yüzen buton → ekran görüntüsü + açıklama → onox.com.tr'ye
imzalı iletim. Müşteri panelinde yok, uç müşteriye 403.
- Gizlilik kapatılamaz: parola/token alanları maskeleniyor, terminal (`.xterm`)
tamamen gizleniyor (canvas'ta DOM maskesi işe yaramaz), sunucuda ikinci temizleme
katmanı. Bu görüntüler müşteri paneli ekranlarını içeriyor ve üçüncü tarafa gidiyor.
- Depolama `storage/app/private` — `public` altında olsaydı `/storage/...`
üzerinden kimlik doğrulamasız okunurdu.
- Spam koruması üç katman: 5/saat + 20/gün (yalnız saatlik olsaydı günde 120,
yalnız günlük olsaydı 20 rapor tek dakikada gelebilirdi), boyut kapısı, ve parmak
izi ile tekrar bastırma.
- "Gönderildi" demeden göndermiyor: yanıt "kaydedildi" der; LCS iletimi ayrı
alan. LCS erişilemezse rapor kaybolmuyor, `pending` kalıyor ve görünüyor.
- Ekran görüntüsünün yanında JS hataları ve başarısız istekler de toplanıyor —
tek başına görüntü genelde teşhise yetmez. Çerez/localStorage/tuş vuruşu
toplanmıyor, bu bir testle mühürlü.
LCS (onox.com.tr) tarafı bu sürümde yok; API sözleşmesi
`docs/api/lcs-bug-reports.md`'de. O gelene kadar raporlar `pending` kalır.
---
Doğrulama
- Tam süit A/B: yeni kırılan 0, geçen 1564 → 1614.
- Yeni testler: zamanlayıcı 51, hata bildirimi 68, bayi göçü 12, spam başlığı 16.
- Her düzeltme tek tek geri alınıp testin gerçekten kırıldığı görülerek
doğrulandı (bu sürümde toplam 26 mutasyon).
- `php -l` / `bash -n` / `npm run build`: temiz.
- i18n 10 dilde eşit.
Bu turda yakalanan sahte-yeşiller
1. Throttle testi 5 mesajı yalnız sayıyla farklılaştırıyordu; normalleştirme
sayıları `#` yaptığı için beşi de aynı parmak izine düşüp dedupe'u ölçüyordu.
2. Boyut testi yükünü ölçtüğü sabitten türetiyordu — sabiti büyütünce yük de
büyüyor, test yine geçiyordu.
3. Admin testleri `setup.guard` yüzünden `/admin/setup`'a 302 dönüyordu;
`assertRedirect()` yalan yere yeşil yanıyordu.
4. Bayi göçünde iki adoption mekanizması izole edilmemişti; birini kaldırınca
hiçbir test kırılmıyordu.
Bilinen, kapsam dışı
- LCS tarafı (onox.com.tr hata bölümü) — ayrı tur.
- Premium-B `disk_mb` veri düzeltmesi — operatör kararı.
- `->onOneServer()` kör noktası: çok sunuculu kurulumda mutex'i kaybeden düğüm
hiçbir olay fırlatmaz; o düğümde iş "hiç görülmemiş" kalır. Tek sunuculu bugünkü
üretimde oluşmaz.
- DirectAdmin/Plesk arşivlerinde `OWNER` verisi yok (parser cPanel'e özgü).
ONOXSOFT 2026.8.51 — Kararlı sürüm
2026.8.50 dört maddeyi getirdi ama **yayın öncesi denetimin beş boyutundan dördü
haftalık limit yüzünden hiç koşamadı**. Bu sürüm o boşluğu kapatıyor: eksik kalan
denetimler koşturuldu, buldukları düzeltildi, ve canlıda her gün sessizce düşen
iki zamanlanmış iş kök nedenine kadar götürüldü.
Bir cümlelik özet: **8.50 doğru şeyleri düzeltti, 8.51 onların gerçekten çalıştığını
ve yanlarında ne kırdıklarını ölçtü.**
---
1. Canlıda her gün düşen iki zamanlanmış iş
Bu ikisi 8.50'den önce de düşüyordu ve scheduler log'unda ERROR olarak duruyordu —
kimse bakmadığı için "çalışıyor" sanılıyordu.
`onox:backup:local-reconcile` — `jq: Argument list too long`
```
onx-backup-file-state: line 47: /bin/jq: Argument list too long (exit 126)
```
Betik 5000 yolun durumunu bir shell değişkeninde toplayıp `jq --argjson` ile geri
veriyordu. O dizge ~600 KB'lık tek argv elemanı olduğu için çekirdek E2BIG
veriyordu. Sınır ARG_MAX değil `MAX_ARG_STRLEN` (32×4096 = 131 072 bayt).
Çözüm argümanı büyütmek değil, argümanı hiç kullanmamak: sonuç bir NDJSON
tampon dosyasına yazılıp `jq -s` ile sarılıyor.
Canlı kanıt (matrix, aynı 5000 yolluk yük): kurulu betik `exit=126`,
düzeltilmiş kopya `exit=0` ve 5000 durum döndü.
PHP tarafına 500'lük parçalama eklendi — betik yol başına bir `jq` süreci açıyor,
5000 süreç 120 sn'lik sysapi bütçesine sığmaz. Parçaların cevapları
birleştiriliyor; parçalayıp birleştirmemek komutu "yeşil" koşturur ama yalnız
son parçayı gördürür (mutasyon testi bunu `200 ≠ 1200` olarak yakalıyor).
Etkisi: uzlaştırma hiç koşmadığı için `local_deleted_at` diskteki gerçeklikten
sapıyordu — yani bu komutun var olma sebebi olan kusur (panelin silinmiş yedekleri
hâlâ "diskte" sayması) geri gelmişti.
`reconcile-package-quotas` — `setquota: Numerical result out of range`
Kök neden veri: "Premium-B" paketinin `limits.disk_mb` değeri `10737418240` —
MB alanına bayt yazılmış (10 GiB, bayt cinsinden). MB olarak yorumlanınca
10 PiB ediyor ve `setquota` blok sayısı 64-bit taşıyor.
Sonuç yine bu ailenin klasiği: `quota -u onx_pensagen` → `none`. Hesapta hiç
dosya sistemi kotası uygulanmıyor, `accounts.quota_bytes` NULL, ama panel paket
limitini gösteriyor.
Kod artık dosya sistemine dokunmadan önce kesiyor. Tavan 64 TiB (ext4'ün 4K
blokla pratik sınırı). 1 PiB kasten seçilmedi: 1 PiB tam olarak "bir GB'ı bayt
yazma" hatasının değeridir, o tavan hatayı kaçırırdı.
Ayrıca `PackageQuotaSynchronizer`'ın hata listesi **şimdiye kadar hiç
basılmıyordu**. Komut artık her hatayı satır satır yazıyor ve özetinde
"bu hesaplar şu an KOTASIZ olabilir (panel kota gösterse bile)" uyarısı veriyor.
> Veri düzeltmesi kapsam dışı: paketin `disk_mb` değeri operatör kararıdır;
> kod yalnız çökmeyi ve sessizliği kaldırdı.
---
2. Denetimin bulduğu iki kısmi-dağıtım kusuru (brick riski)
YENİ vhost betiği + ESKİ `common.sh` = hiçbir vhost yazılamıyor
Dört sürücü de `HSTS_VALUE=$(onx_hsts_value "${INPUT}")` çağırıyor; fonksiyon
`_lib/common.sh`'te yaşıyor. `set -euo pipefail` altında fonksiyon yoksa:
```
onx_hsts_value: command not found → EXIT=127
```
Betik daha ilk satırlarda ölür — hiçbir vhost yazılmaz. 8.50 aynı riski
`archive.sh` için görüp savunma eklemiş, bunun için eklememişti; asimetri.
Bu depoda "yalnız `onx-*` kopyalayıp `_lib`'i unutma" vakası yaşandı ve
`SCRIPT_DIR` tuzağı skew'i gerçek kılıyor.
Artık fonksiyon yoksa tarihsel sabite düşülüyor (yeni bir değer uydurulmuyor —
8.50 öncesi şablonlarda sabit kodlu olanın aynısı), `onx_log`'a uyarı düşüyor ve
`hsts_effective` geri-okuması sayesinde panel `applied:false` yazıyor. Kapsam
`onx-{nginx,caddy}-vhosts-rewrite`'a da genişletildi — onlar `onx_hsts_extract`
çağırıyor, aynı tuzak, switch sonrası TÜM vhost'ları öldürürdü.
`|| true` kısmi-dağıtım korumasını deliyordu → boş home ile "başarılı" restore
```bash
HOME_ARCHIVE="$(onx_home_archive_find "${WORK_DIR}" || true)"
```
`_lib/archive.sh` eksikse stub rc=2 + "sysapi kurulumu yarım" diyor, ama `|| true`
sinyali yutuyordu: betik devam edip `restored: true`, `items.home: 0` döndürüyordu.
PHP tarafı `home_archive`'ı kontrol etmiyor.
Yani yarım bir dağıtımda panel "Geri yükleme başarılı" diyor, veritabanları
geri geliyor, müşterinin `home` dizini boş kalıyor. Yedek geri yükleme son
savunma hattıdır; oradaki yanlış "yeşil" en pahalı hatadır.
Artık `rc=2` (ölçemedim) ile `rc=1` (yok) ayrılıyor: rc=2 → preflight (2) ile durur,
`included.home=true` iken arşiv yoksa → exec fail (3).
---
3. "Uygulandı" yalanının kapatılması — HSTS geri-okuma
Kısmi dağıtımda (yeni PHP + eski bash) eski `onx-vhost-add` `hsts` anahtarını yok
sayıp sabiti basıyor; yeni PHP `vhost-add` başarılı döndüğü için `applied:true`
yazıp müşteriye "Sunucu artık max-age=0 gönderiyor" diyordu.
Doğru yapılmış karşıt örnek aynı depoda vardı: yedek yolu
`data['compression']['effective']` ile sysapi'nin ne ürettiğini geri okuyor.
Artık dört sürücü de yazılan vhost dosyasından okuduğu değeri
`hsts_effective` ile döndürüyor; `HstsPolicy::applyDrift()` istenenle
karşılaştırıyor. Alanın hiç olmaması kasıtlı olarak "doğrulanamadı" sayılıyor —
çünkü tam olarak eski betiğin imzası odur. Boşluk/harf farkı yanlış pozitif
üretmiyor: yanlış "uygulanamadı" da bir yalandır.
---
4. Bayi/admin yetki ve teslim kusurları
İmza kaçağı — bayi kendi vanity NS'ine delege alan adını EKLEYEMİYORDU
8.50 `DnsNameserverChecker::verify()`'a kabul kümesi ekledi ve **6 çağıranın
5'ini** güncelledi. `Reseller/AccountDomainController.php:84` eski imzayla kaldı.
Sonuç: servis katmanı bayi NS'ini kabul ederken uç reddediyordu — ve hata metni
beyaz-etiketli bayi panelinde platform NS'lerini açıkça yazdırıyordu, yani bu
özelliğin var olma sebebi olan marka sızıntısının aynısı.
*(Bu, 8.50'nin kendi notlarında "kalıcı durum yolu atlanmıştı" diye anlatılan
desenin üçüncü tekrarı. Artık uç düzeyinde regresyon testi var.)*
Admin toplu parola sıfırlama hesabı geri dönüşsüz kilitliyordu
8.50 bunu bayi tarafında düzeltti; admin tarafı atlanmıştı ve hâlâ
`PasswordChangedMail`'e `password:` geçmiyordu — üstelik e-posta gönderimi
kapatılabilir bir onay kutusuydu. Üretilen parola log'a, yanıta, DB'ye yazılmaz;
tek teslim kanalı e-postadır.
Yani admin 50 hesabı toplu sıfırlarsa 50 müşterinin panel + FTP + posta parolası
değişir ve o parolayı artık kimse bilmez. Bayi ucundaki disiplin aynen taşındı:
parola geçiliyor, e-postası olmayan hesap işlenmiyor, kuyruğa alma patlarsa
"başarılı" sayılmıyor, onay kutusu kaldırıldı.
Toplu uçlarda hız sınırı
8.50, tek vhost yeniden yazımı yapan HSTS ucuna `throttle:6,1` koydu ama istek
başına 200 senkron sysapi çağrısı yapan toplu uçlara koymadı. Üçüne de
`throttle:5,1` eklendi. (Doğru çözüm asenkron batch + ilerleme; bu sürümün kapsamı
değil, kodda not düşüldü.)
---
5. Sessiz başarısızlıkların kapatılması
- Şablon teslimatı `cp` hatasını yutup `_tp_n=0` iken bile `ok` diyordu →
YENİ betik + ESKİ şablon kalırsa per-domain HSTS sessizce yok sayılırdı.
Artık kopyalanan sayı kaynak sayısıyla karşılaştırılıyor.
- `onx-backup-file-state`: `/var/backups` dışındaki tek yol 500'lük partinin
tamamını öldürüyordu. Artık `type:"out_of_scope"` olarak yayılıyor — `exists`
alanı bilerek konmuyor, çünkü `exists:false` "dosya yok" demektir ve kayıt
yanlışlıkla silinmiş işaretlenirdi. Ölçülemedi ≠ yok.
- Argv sınırı aynı desende duran `onx-backup-list` (~404 yedekte patlar) ve
`onx-backup-prune` için de kapatıldı.
- `du`/`df` zaman aşımı: askıda bir `/tmp` mount'u veya milyonlarca inode'lu
home, 3600 sn'lik yedek bütçesini yiyip o gece hiç yedek olmamasına yol
açabiliyordu. (Dürüst sınır: `timeout`, D-state'e girmiş bir mount'u öldüremez.)
- `onx-marker-verify.sh` artık `_lib/archive.sh`, şablonlar ve `hsts_effective`
imzalarını da kontrol ediyor — "pakete girdi ≠ uygulandı" dersinin gereği.
---
Doğrulama
- Tam süit A/B (taban = 2026.8.50, anahtar = ANSI'siz `FAILED <sınıf> > <ad>`):
yeni kırılan 0. Geçen test 868 → 895.
- Her düzeltme tek tek geri alınıp testin gerçekten kırıldığı görülerek
doğrulandı; raporlarda kırık hâlin gerçek çıktısı var.
- `tests/Scripts/backup-codec-roundtrip.sh` 26/0, `vhost-template-placeholder.sh`
22/0, yeni kabuk sözleşme testleri 48+12+26/0.
- `php -l` / `bash -n`: dokunulan tüm dosyalar temiz.
Ölçüm dürüstlüğüne dair iki not
1. Flaky test sahte regresyon üretti. `PackageFactory` `limits.disk_mb`'yi
`[1024, 5120, 10240, null]` arasından rastgele seçiyor;
`diskUsagePercent() sınırsız` testi bu yüzden %25 geçiyordu ve A/B'de "yeni
kırılan" göründü. Deterministik yapıldı. **Tek koşuluk A/B rastgele
factory'lerle yanıltır.**
2. **Doğrulama betiğinde `set -e` + `cmd && ok` kalıbı 4 kontrolü sessizce
atlattı** (bash, AND-listesinin sol tarafı patlarsa errexit uygulamaz).
Doğrusu `if ! cmd; then …; fi` + hata sayacı.
Bilinen, bu sürümde kapsam dışı
- Premium-B `disk_mb` veri düzeltmesi — operatör kararı.
- `AutoSslManager.php:302` kabul kümesini geçmiyor; etkisi dar (yalnız
`dns_status` bilinmezken koşan pencere), uçtan uca doğrulanmadı.
- zstd gidiş-dönüş sözleşmesi yerelde `atlandi` — CI/test makinesinde zstd yok.
- Tam süitte ~218 kırık konum taban değerdir; çoğu yerel ortam (SQLite'ta
MySQL'e özgü `SET FOREIGN_KEY_CHECKS`, Vite manifest, rol/permission seed'i).
- Bir test dosyası (`SsoAbilityTest`) başka bir test dosyasında tanımlı global
yardımcıya bağımlı — süit bölünerek koşulduğunda kırılıyor. Test hijyeni kalemi.
ONOXSOFT 2026.8.50 — Gösterilen ayar artık yürürlükte
Dört madde. Üçü aynı kusur sınıfı: **panelde kaydedilen, gösterilen, ama hiçbir
yerde okunmayan ayar.** Dördüncüsü bayi panelinde eksik olan bir yetenek.
Bu sürümde her madde önce izole bir çalışma ağacında uygulandı, sonra **onu
çürütmeye çalışan ayrı bir denetim koştu. Dört denetimin dördü de gerçek
kusur buldu** — hepsi bu sürümde düzeltildi. Aşağıda hem asıl madde hem de
denetimin bulduğu kusur birlikte yazılıdır; çünkü ikincisi olmadan bu sürüm
düzelttiğini iddia ettiği şeyin yerine yeni bir yalan koyuyor olacaktı.
---
1. Yedek sıkıştırma kodeği
Ayrıntılı anlatım: [2026.8.50-yedek-sikistirma-kodegi.md](2026.8.50-yedek-sikistirma-kodegi.md)
Panel `none / gzip / zstd / xz` sunuyordu; `onx-backup-run` bu alanı **hiç
okumuyordu. Bağlama sırası bilerek tersten kuruldu: önce geri yükleme**
kodek-duyarlı yapıldı, sonra yazma tarafı açıldı. Aksi hâlde farklı kodekle
alınmış ilk arşiv geri yüklenemez olurdu — yedek geri yükleme son savunma
hattıdır.
Dış konteyner `.tar.gz` olarak kaldı: o ad `backups.file_path` sütununda,
uzak hedef dosya adlarında, push/pull/prune ve restore yol doğrulamalarında
yaşıyor. Kodek yalnız iç `home` arşivine uygulanıyor — bir hesabın yedek
boyutunun ~%95'i zaten orada.
Denetimin bulduğu üç kusur:
- `xz` tek çekirdekliydi. Ölçüm: gzip'in ~6,7 katı. Bu dosyanın kendi olay
kaydı 46 GB'lık bir hesabın gzip'inin 1 saati aştığını söylüyor; sysapi sınırı
3600 sn ve zaman aşımında sinyal temizliği çıktıyı siliyor. Yani tek-thread
`xz`, o hesapta "yavaş yedek" değil hiç yedek yok demekti. Artık
`xz -T0 --memlimit-compress=40%` kullanılıyor — ama hem `tar`ın argümanlı
`--use-compress-program` desteği hem de sıkıştırıcının bayrakları kabul edip
etmediği gerçekten çalıştırılarak sınanıyor, varsayılmıyor. Biri bile yoksa
tek-thread bayrağa dönülüyor: yavaş ama çalışır. Desteklenmeyen bir bayrakla
`tar`ı patlatmak yedeğin tamamını kaybettirir. `memlimit` şart — `-T0` çekirdek
başına sözlük ayırır, küçük RAM'li sunucuda OOM olur.
- `'none'` etiketi yanlıştı. "En hızlı, en büyük" yazıyordu. Ölçüm:
`none` → nihai 2.107.647 B / 1029 ms, `gzip` → 2.108.215 B / 909 ms. Dış
konteyner zaten gzip'li olduğu için `none` nihai arşivi küçültmez ve biraz
daha yavaştır. Tek gerçek etkisi `/tmp` tepe kullanımının home'un ham
boyutuna çıkması — 46 GB'lık hesapta `/tmp`'ye 46 GB. Bu dosyanın olay kaydı:
"/tmp'de 30 GB yarım arşiv, disk %90". Artık `'none'` seçilince `du`+`df` ile
ön-kontrol yapılıyor; yer yetmiyorsa gzip'e düşülüyor ve bu manifest'e, JSON
çıktısına ve uyarılara yazılıyor. Ölçüm yapılamazsa "yer var" varsayılmıyor,
ölçülemediği söyleniyor.
- Artımlı yedekte sıkıştırma sessizce yok sayılıyordu. Artımlı yedek bir rsync
anlık görüntüsüdür; hiçbir kodek devreye girmez. Profilde "xz" seçili olabilir —
onu sessizce yutmak tam da bu sürümün düzelttiği hata sınıfıdır.
`onx-backup-run-incremental` artık `compression.requested` ve
`fallback_reason` döndürüyor, uyarı listesine ekliyor.
Yan bulgu (aynı satırlarda çıktı, düzeltildi):
`HOME_TAR_SHA=$(sha256sum … | awk …)` satırı `include_home=false` iken `pipefail`
yüzünden 1 dönüyor ve `set -e` tüm yedeği ERR trap'ine düşürüyordu. Yani
2026.8.48'de bağlanan "Sadece Veritabanı" ve "Sadece Yapılandırma" profilleri
hiç yedek üretemiyordu.
Ayrıca: `common.sh`'i DNS, mail, webserver dahil her sysapi betiği yükler.
`archive.sh`'in çıplak `source`'u, dosya kısmi bir dağıtımda eksik kalırsa `set -e`
ile yalnız yedeği değil her sysapi komutunu öldürürdü. Artık eksikse sadece
arşiv yolu, anlaşılır bir mesaj ve preflight (2) koduyla kilitleniyor.
---
2. HSTS — iki yönlü bir yalandı
Kusur tek bir ölü ayar değildi:
1. `SslController::toggleHsts()` ayarı `autossl_settings` içine
`domain.<id>.hsts` anahtarıyla yazıyordu ve **bu anahtarı hiçbir yer
okumuyordu**.
2. Daha kötüsü: `Strict-Transport-Security: max-age=31536000; includeSubDomains`
dört sürücünün vhost şablonuna da sabit kodlanmıştı. Yani gerçek durum
şuydu — HSTS zaten herkeste 1 yıl + `includeSubDomains` ile açıktı,
panelden "kapatmak" sunucuda hiçbir şey değiştirmiyordu ve bu ekranı çağıran
bir arayüz de yoktu.
Politika artık `HstsPolicy` sınıfında tek kaynaktan yaşıyor ve vhost üreticilerine
payload olarak akıyor (`hsts.header`), böylece Apache/nginx/OLS/Caddy dördünde de
aynı değer uygulanıyor. Kaydı olmayan alan adı için varsayılan **eski sabitin
aynısı** — bu değişiklik hiçbir mevcut siteyi sessizce değiştirmiyor.
Kapatma başlığı susturmuyor, sıfırlıyor (`max-age=0`): HSTS geri alınamaz bir
taahhüttür, başlığı hiç göndermemek tarayıcının önceden aldığı pin'i eski
`max-age` süresi boyunca canlı bırakır. Tarayıcıya "unut" demenin RFC 6797'deki
tek yolu `max-age=0`'dır.
Denetimin bulduğu iki kusur:
- SSL'i kapalı alan adında panel yeşil "HSTS açık" rozeti basıyordu ve altına
gönderilen başlığı yazıyordu — oysa SSL bloğu olmayan vhost hiçbir HSTS başlığı
göndermez. Durumu açıklayan tek not `v-if="row.stored && !row.ssl_enabled"` ile
kapalıydı, yani tam da bu durumda (kayıt yok) görünmüyordu. Üstüne müşteri
"HSTS Kapat"a bastığında flash "Sunucu artık max-age=0 gönderiyor" diyordu —
sunucu hiçbir şey göndermiyordu. Artık `serving` ile `header_effective`
ayrı alanlar; istenen ile yürürlükteki karıştırılmıyor, kapatma mesajı SSL
kapalıyken doğruyu söylüyor.
- "Ölçülemedi" ile "yok" karıştırılmıştı. Kapı yalnızca `ssl_certificates`
tablosuna bakıyordu. Panelin sertifika otoritesi `CertificatePathResolver`'dır
ve adaylarının çoğu `/root/.acme.sh`, `/etc/letsencrypt/live` gibi panel
kullanıcısının stat edemediği yollardır; göç/manuel kurulum/DNS-01 ile gelen
alan adlarında `SslCertificate` satırı sıkça yoktur. Sonuç: HTTPS'i sorunsuz
çalışan bir siteye panel kesin bir dille "sertifika bulunamadı" diyor ve
`can_enable=false` olduğu için hem "HSTS Aç" hem "Ayarları Değiştir" düğmesini
gizliyordu — yani müşteri sitesinde zaten açık olan 1 yıllık HSTS'i
kısaltamıyor, yalnızca tümden kapatabiliyordu. Kapı, düzeltmeye çalıştığı zararı
üretiyordu. Artık kanıtın gücü raporlanıyor: `certificate` (kesin) /
`ssl_flag` (zayıf) / `none` (kesin yokluk). Zayıf kanıtla izin veriliyor ama bu
söyleniyor; geri alınamaz olan `preload` için kesin satır şart.
Ayrıca sertifika sorgusu istek-içi önbelleğe alındı — `hstsState()` her alan adı
için `blockReason()` çağırıyordu, yani N alan adı = 2N sorgu + N kez tam sertifika
hidrasyonu, SSL sayfasının her açılışında. `PATCH customer.ssl.hsts` her
istekte vhost yeniden yazımı + paylaşılan webserver reload tetiklediği için
`throttle:6,1` eklendi.
---
3. Bayi vanity nameserver
`ns1`/`ns2` alanları 2026-05-30'dan beri bayi ayarlarına kaydediliyordu ve
hiçbir yerden okunmuyordu: müşteri ekranlarında platform NS'i gösteriliyor,
alias ekranında ise NS adları ayrıca sabit yazılıydı (üstelik yanlış aileden).
Artık `ResellerNameserverResolver` tek cevap kaynağı ve fail-closed: bayi NS'i
yalnızca `status=verified` ve taze (≤72 s) ve ölçülen çift kayıtlı çiftle
aynıysa gösteriliyor. Diğer her durumda (pending / failed / ölçülemedi / bayat /
çift değişmiş / pasif bayi) platform NS'ine dönülüyor. Sebep basit: doğrulanmamış
bir NS'i müşteriye vermek, müşteri onu kaydediciye girdiğinde alan adını **komple
erişilemez** yapar.
Doğrulama kuyrukta koşuyor. Kaydetme isteği içinde senkron `dig` atmak,
FPM zaman aşımında bayinin hiçbir ayarını kaydedememesi demekti; bu kırmızı
çizgi, kaydetme sırasında çağrılınca patlayan sahte bir checker ile test edilerek
mühürlendi.
Denetimin bulduğu kusur — gösterim düzeldi, sürekli durum yolu atlanmıştı.
`DnsNameserverChecker::verify()` isteğe bağlı bir kabul kümesi aldı ama **kalıcı
durumu yazan iki çağıran** eski imzayla çağırmaya devam ediyordu. Zincir şöyle
kırılıyordu: bayi NS'ine delege edilmiş müşteri `dns_status = external`
işaretleniyor → `DnsZoneReconciler` o zone'a bir daha yazmıyor (rapor-only) →
`MailDnsAutoFixer` SPF/DKIM/DMARC/MX otomatik yazımını sessizce atlıyor →
`RepairWildcardDnsCommand` o alan adlarını geçiyor → panel "Harici DNS" rozetiyle
yalan söylüyor. Oysa PowerDNS zaten otoriter; panel kendi kurduğu doğru
yapılandırmayı bozukmuş gibi gösteriyordu. `DomainDnsStatusChecker` ve
`MailDnsAutoFixer` artık kabul kümesini bayinin doğrulanmış NS'iyle genişletiyor.
Küme platform NS'lerinin üstkümesidir — bayisi olmayan hiçbir hesapta davranış
değişmiyor.
Ayrıca: platform NS'lerinin adresleri her bayi için baştan ölçülüyordu
(200 bayi × 4 NS = 800 gereksiz `dig`, her biri 2 resolver × 3 sn). Cron/cgroup
zaman aşımı turu ortada keserse kalan bayiler tazelenmez ve `MAX_AGE_HOURS` sonra
sessizce platform NS'ine düşerlerdi — "cgroup-cron-timeout < iş" olayının
aynısı. Ölçüm artık tur başına bir kez yapılıyor ve A+AAAA birlikte
değerlendiriliyor (yalnız A sorgusu IPv6-only bir NS'i yanlış biçimde "başarısız"
işaretliyordu).
---
4. Bayi paneli — toplu işlem
Bayi panelindeki "Müşteri Hesapları" listesinde admin paritesinde toplu işlem
yoktu. Eklendi: seçim sütunu + tümünü-seç, yapışkan araç çubuğu, aksiyona göre
form penceresi ve üç sunucu ucu (toplu askıya al / askıdan çıkar / parola sıfırla).
Kritik tasarım farkı: admin'in toplu uçları sahiplik filtresi yapmaz — admin
serbesttir. O kodu bayiye kopyalamak, bayinin gövdeye rakibinin hesap kimliğini
yazıp onun hesabını askıya almasına izin verirdi. Bayi tarafında sahiplik filtresi
`ResellerAccountSelection` içinde tek kapıda çözülüyor ve yabancı kimlik
gelirse hiçbir hesaba işlem yapılmıyor — sessizce atlamak, bayinin "10 hesabı
askıya aldım" sanıp 7'sini işlemesi demekti.
Denetimin bulduğu iki kusur:
- Parola değişiyor ama hiçbir yere yazılmıyordu. Üretilen parola log'a,
yanıta, DB'ye yazılmaz; tek teslim kanalı e-postadır. Ama `PasswordChangedMail`
çağrısına `password:` alanı geçilmiyordu — şablon o alan boşken yalnız
"parolanız değişti" der, yeni parolayı yazmaz. Üstüne e-posta gönderimi
kapatılabilir bir onay kutusuydu. Yani "başarılı" sayılan bir işlem hesabı
panel + FTP + posta erişimiyle birlikte geri dönüşsüz kilitliyordu. Artık:
`password:` geçiliyor, e-posta adresi olmayan hesap işlenmiyor (teslim
edilemeyecek parola üretmek hesabı kilitlemektir), kuyruğa alma başarısız olursa
bu "başarılı" sayılmıyor ve etkilenen kullanıcı adları bayiye açıkça
bildiriliyor. Onay kutusu kaldırıldı.
- Reddetmeler hiçbir yerde görünmüyordu. Sunucu bütün reddetmeleri
`ValidationException` ile yapıyordu; `ResellerLayout` yalnız `flash.success` ve
`flash.error` basıyor, `ToastNotifications` da yalnız flash izliyor. Sonuç: bayi
"Uygula"ya basıyor, pencere kapanıyor, **hiçbir şey olmuyor ve hiçbir mesaj
çıkmıyor**. Bayat seçim, çapraz-kiracı denemesi ve 200'den fazla hesap seçimi —
üçü de sessiz no-op'tu. Sunucu "güvenlik gereği hiçbir hesaba işlem yapılmadı"
diyordu ama bunu kimse görmüyordu; yine "başarısız ≠ sessizlik" ihlali.
---
Doğrulama
- PHP lint / `bash -n` / Vue SFC ön-derleme: değişen 76 dosya temiz.
- `tests/Scripts/backup-codec-roundtrip.sh`: 26 geçti / 0 kırıldı. Gerçek tar
üretip gerçekten açıyor; üretilen `--use-compress-program=xz -T0 …` bayrağının
`tar` tarafından kabul edildiği de ölçülüyor — o bayrak tek argv elemanıdır,
diziye yanlış konursa bunu ancak üretimde, gece 03:00'te öğrenirdik.
- Tam süit A/B (anahtar = `dosya:satır`; Pest'in kısaltılmış test adları
yanıltıyor): taban 162 kırık konum → sonra 162, kümeler birebir aynı. Yeni
kırılan 0. Geçen test 1378 → 1442.
- Yeni testlerin sahte-yeşil olmadığı, eski kod geri konup kırdırılarak
kanıtlandı: bayi parola testleri 2/2 kırıldı, `certificateEvidence` testi
kırıldı, vanity "external değil active" testi kırıldı.
- i18n: bu sürümde eklenen her anahtar 10 dilde tam (`flat.*` 10317,
`lang/*` 2646 — hepsi eşit). `lang/tr.json` legacy, dokunulmadı.
Bilinen kalemler (bu sürümde kapsam dışı)
- GFS saklama (`keep_*`) — ürün kararı bekliyor.
- Tam süitte 162 kırık konum taban değerdir; bu sürümden önce de kırıktı
(çoğu yerel ortam: Vite manifest, DnsProvisioner). Ayrı bir iş kalemi.
- A/B koşusu sırasında bir testin `VERSION` dosyasını `1.1.0` yaptığı gözlendi.
Bu sürümün değişikliği değil, mevcut bir test yan etkisi. Yayın paketlemesi
`VERSION`'ı build sırasında yazdığı için etki etmiyor; yine de ayrı kalem.
---
Ek: dağıtım öncesi denetimin bulduğu İKİ BLOKLAYICI
Yayından önce koşan düşmanca ön-uçuş denetimi haftalık limit yüzünden yarıda
kaldı; koşabilen tek boyut iki bloklayıcı raporladı ve akış bunları
doğrulayamadan "çürütüldü"ye yazdı (`neden_curutuldu: null`). İkisi de ayrı ayrı
reprodüksiyonla doğrulandı ve gerçek çıktı. Ders kayda geçsin:
doğrulaması koşmamış bir bulgu çürütülmüş sayılmaz.
1. nginx sürücüsünde hiçbir müşteri vhost'u yazılamıyordu
Dört nginx stub'ının yorumunda literal `${VAR}` vardı. `onx-vhost-add-nginx`
iki geçişli envsubst'ten sonra artık-placeholder kapısını koşuyor
(`grep -qE '\$\{[A-Z_][A-Z0-9_]*\}'` → `onx_die 3`), install satırı bundan
sonra geliyor. `${VAR}` `ENVSUBST_VARS` listesinde olmadığı için literal kalıyor,
kapı tetikleniyor ve vhost dosyası hiç yazılmıyordu.
Etkisi yeni alan adı ekleme, SSL etkinleştirme, HSTS toggle ve en önemlisi
Apache/OLS → nginx switch'iydi. Sistem alt alan adları (webmail/panel/autodiscover)
heredoc ile kapıdan önce install edildiği için kusur görünmez kalmıştı.
HEAD'de de vardı. Kuralı ihlal eden satır, ironik biçimde "bu yorumda asla
`$` + `{` yazma" diyen uyarının kendisiydi.
Yeni smoke test 19 (stub, betik) çiftini ölçüyor ve değişken listesini betikten
gerçekten grep'liyor; caddy/ols/apache/fpm-pool/default-pages temiz çıktı.
2. HSTS uygularken vhost'un SSL bloğu sessizce düşüyordu
`applyHstsToVhost()` → `VhostProvisioner::create()`: sertifika yolu
çözülemediğinde `ssl_enabled` sessizce false yapılıp yalnız `Log::warning`
yazılıyor, çağrı başarılı dönüyordu. Aday yolların bir kısmını
(`/root/.acme.sh`, `/etc/letsencrypt/live`) panel PHP'si stat edemez — yani bu
sürümün 2. maddesinin `certificateEvidence` gerekçesi burada tam tersine işliyordu.
Sonuç: müşteri HSTS'i açtığı veya kapattığı anda vhost SSL'siz yeniden
yazılıyor, aynı istekte tarayıcıya HSTS pin'i veriliyordu → ne HTTPS ne HTTP,
alan adı komple erişilemez. Panel bunu "HSTS açıldı" + `applied:true` olarak
kaydediyordu.
`create()` artık `allowSslDowngrade` alıyor, varsayılan güvenli: ilk provizyon
akışları (cert henüz basılmamış) eski davranışta; yeniden yazımlarda caddy'de
cert yolu root tarafına devrediliyor, diğerlerinde istisna atılıp vhost dosyasına
hiç dokunulmuyor. Eski test dosyası bu boyutu ölçemiyordu: diskte cert
olmadığı için tüm vhost testleri zaten düşüş dalından geçiyordu — sahte-yeşilin
kaynağı buydu.
Ek: canlı olay — kota alarm çığı (matrix, 2026-08-08)
Sürüm hazırlanırken canlıda ölçüldü: 8 müşteriye 7 saatte **43'er panel bildirimi
+ aynı sayıda e-posta**. Sunucu diski %35 dolu, `effectiveQuotaBytes` ile hiçbir
hesap ≥%90 değil, son 7 günde 522 yedek tamamlandı — alarmların tamamı yalandı.
- `CheckQuotaExceededCommand` `max(quota_bytes, 1)` yazıyordu → **kota 0 =
SINIRSIZ**'ı "1 baytlık kota" sanıp %42 milyar aşım üretiyordu. Aynı hesap
`isDiskQuotaFull()` tarafında "sınırsız" sayılıyordu — **iki dosyada iki
semantik**. Kural artık tek yerde: `QuotaCheckerService::isUnlimitedDiskQuota()`.
- Alarm sonrası watermark yazımı patlıyordu: `SQLSTATE[22003] Out of range value
for 'last_quota_pct'` (kolon `decimal(5,2)`, yazılmak istenen `420386239700`).
try/catch yutuyor, watermark NULL kalıyor, `*/5` cron her koşuda aynı
alarmı yeniden üretiyordu. Artık 999.99'a kısıtlı + yazma yine patlarsa 24 saat
emniyet damgası.
- CPU alarm susturması 1,5 aydır fiilen uygulanmıyordu: kapı
`faultType === 'cpu'` diyordu, olayı üreten komut ENUM'a uymak için
`'cpu_limit'` gönderiyor. Tür bilgisi artık olayın kendisinde
(`AccountResourceLimitHit::isCpuFault()`). CPU dışı türler bildirim üretmeye,
CPU da `account_resource_faults` + `audit_log` kaydına devam ediyor.
Testler komutları baştan sona koşturuyor ve her düzeltme tek tek geri alınıp
kırıldığı görülerek doğrulandı.
Bilinen, düzeltilmedi: paket "Premium-B" `disk_mb: 10737418240` — MB alanına
bayt yazılmış (10 PB eder), 1 hesap. Ürün kararı bekliyor.
ONOXSOFT 2026.8.49 — 8.48 regresyon düzeltmesi
Tek maddelik acil düzeltme.
Tanımsız `$faultEvents` — kaynak snapshot komutu sonunda patlıyordu
2026.8.48'de kaynak-hatası kaydı bağlanırken `$faultEvents` → `$faults` yeniden
adlandırması özet satırında atlandı. Üç sunucuda da 5 dakikada bir
`Undefined variable $faultEvents` logu düştü.
Etki sınırlı: hata döngüden ve DB yazımından sonraki özet satırındaydı —
`resource_history` kayıtları ve fault kayıtları yazılıyordu. Komut yalnız sonunda
patlayıp hata logluyordu.
Neden testler yakalamadı
Sözleşme testleri kaynak desenini kontrol ediyor, komutu çalıştırmıyordu.
`php -l` de tanımsız değişkeni yakalamaz — bu bir çalışma-zamanı hatası, sözdizimi
hatası değil. Yani "kod orada mı"yı ölçüyorduk, "çalışıyor mu"yu değil.
Komutu baştan sona koşan bir test eklendi. Testi yazarken iki tuzak sahte-yeşil
verdi ve ikisi de ancak hata bilerek geri konup kırılmadığı görülerek bulundu:
1. `--dry-run` özet satırından önce erken dönüyor → hatalı yola hiç girilmiyor.
2. Aktif hesap yoksa komut daha da erken dönüyor; factory varsayılanı `active`
değil, yani hesap yaratmak tek başına yetmiyor.
> Testin gerçekten kırıldığını görmeden "kapsıyor" demek, kapsamamaktan daha
> tehlikelidir — yeşil bir test yanlış güven verir.
Ayrıca: özet satırı artık doğru sayıyor
`count($faults)` toplam eşik aşımını verir; saatlik tekrar-bastırma yüzünden
gerçekten yazılan sayıdan farklıdır. Artık `N/M fault kaydedildi` biçiminde ikisi
de raporlanıyor — yazılmayanı "yazıldı" göstermek yeni bir küçük yalan olurdu.
Doğrulama
Tam süit: 173 kırık konum sabit, geçen 1387 → 1389. Sıfır regresyon.
ONOXSOFT 2026.8.48 — Panelde ayarladığınız şeyler artık gerçekten uygulanıyor
Bu sürümün tamamı tek bir kusur sınıfını kapatıyor: **panel bir şey gösteriyor,
sistem başka şey yapıyor.** Kullanıcı bir ayarı değiştiriyor, "kaydedildi"
mesajını alıyor, değer ekranda kalıcı görünüyor — ve hiçbir şey değişmiyor.
Bu sınıf hata üretmez, logda görünmez, kimse "bozuk" diye bildirmez. Sadece
olmaz. En sinsi tarafı da bu.
---
1. Güvenlik ayarları hiçbir şey yapmıyordu (SAHTE UYUM)
"Genel Sistem Ayarları → Güvenlik" grubundaki dört eşik `server_settings`'e
yazılıyor ve ekranda kalıcı görünüyordu — ama hiçbir kod onları okumuyordu.
Gerçek değerler üç ayrı yerde sabitti:
| Katman | Eskiden | Şimdi |
|---|---|---|
| `throttle:login` limiteri | 5 deneme / 15 dk sabit | ayardan |
| `LoginRequest` | 5 sabit | ayardan |
| `AccountLockout` | 10 deneme / 60 dk sabit | ayardan |
| Parola tabanı | `Password::min(8)` sabit | ayardan |
Admin "Maks. giriş = 3, Parola min = 14" kaydedip ekranda görüyor, sistem 5 ve
8'de kalıyordu. Bir denetimde "panelden sertleştirdik" savunması bu yüzden
sahteydi.
Clamp'ler tesadüf değil — bu sayfa admin'in kendi giriş kapısını ayarlıyor.
Kilit alt sınırı 5 dakika, çünkü altı korumayı bugünkünden zayıflatır
(5 deneme/1 dk = günde 7200 deneme; bugün 480). Oturum alt sınırı 5 dakika, çünkü
altı admin "Kaydet"e basana kadar oturumu düşürüp 419 döngüsü üretir.
Pencere neden `lockout_minutes` değil: `ThrottleRequests` her istekte koşulsuz
sayaç artırır — başarılı giriş de sayılır. O katman bir "başarısız deneme" sayacı
değil, istek sayacıdır. Pencereyi 24 saate açsaydık "Kilitleme = 24 sa" diyen
admin kendi kullanıcılarını günde 5 başarılı girişle sınırlardı. Kilit süresi
yalnız `AccountLockout`'ta yaşar; orası sadece başarısızlığı sayar ve başarıda
sayacı siler.
> Davranış değişimi: `AccountLockout` varsayılanı 10 deneme / 60 dk idi;
> yeni varsayılan 5 deneme / 15 dk. Kilit daha erken devreye girer, daha erken
> açılır.
---
2. Mail kuyruğu alarmı matematiksel olarak tetiklenemiyordu
Pano alarm servisine sabit `0` besliyordu; `mailQueue()` ise
`if ($count <= $warn) return []` yapıyor. `0 <= eşik` daima doğru olduğu için
eşiği 50'den 1'e çekmek bile hiçbir şey değiştirmiyordu. Postfix/Exim kuyruğu
tıkandığında panoda ve Telegram'da hiçbir uyarı çıkmıyordu.
Buradaki asıl incelik ayrımdı:
| Durum | Değer | Anlamı |
|---|---|---|
| Kuyruk tutmayan sürücü (none/relay) | `0` | gerçek ölçüm — kuyruk kavramı yok |
| Sürücü postfix/exim, binary yok | `null` | ölçülemedi |
| sysapi hatası | `null` | ölçülemedi |
`null`'da alarm kurulmaz ama "temiz" de denmez. Sıfır dönmek, kuyruk tıkalıyken
uyarıyı bastırırdı — yani düzeltmenin sebebi olan hatanın aynısını üretirdi.
Telegram yolu ayrıca bağlandı; bildirimi gönderen tek yer orası.
---
3. Kaynak hatası kayıtları hiç yazılmıyordu
`account_resource_faults` tablosunun tek yazıcısı `CgroupManager::recordFault()` ve
sıfır çağrılıydı. Eşiği gerçekten ölçen komut olayı doğrudan üretiyordu:
limit-aşımı e-postası gidiyor ama panelde karşılığı yok. Müşteri
"Kaynaklarım"da, admin hesap detayında ve "Hata Geçmişi"nde hep boş tablo
görüyordu; Prometheus metriği kalıcı 0'dı.
İki tuzak vardı: tablo ENUM'u `cpu_limit`/`pmem_limit`/`ep_limit` bekliyor, komut
`cpu`/`memory`/`processes` üretiyordu — ham yazsaydık düzeltme ekranı bu kez
hatayla boş bırakırdı. Ve komut 5 dakikada bir koştuğu için tekrar bastırma
olmadan günde ~288 satır ve 288 e-posta üretirdi. Aynı hesap+tür için saatte
tek kayıt.
---
4. Docker motor kartı geri geldi + firewall sahte alarmı susturuldu
`7beb6a8a` prod-senkron ailesinin son üyesi. `docker.install` /
`daemon.start` / `daemon.stop` / `status` rotaları ve controller `311a5da7`'de
eklenmişti; prod-senkron kartı ezdi ve o günden beri bu rotaları çağıran **tek
satır JS yoktu.** Container Hosting satılıyor ama Docker kurulu olmayan sunucuda
panelden kurulamıyordu — tek yol SSH'tı.
Karta üç emniyet kondu: canlı daemon bayat kurulum durumunu ezer (operatör SSH'tan
düzeltirse kart kilitlenmesin); kurulum takılırsa çıkış yolu verilir (kuyruk işçisi
çalışmıyorsa durum kendiliğinden çözülmez); ve **"hazır" artık kurulu değil
çalışıyor demek** — eskiden Docker kurulu ama servis durmuşken butonlar aktif
görünüyor, tıklayınca reddediliyordu.
Firewall: `onox:firewall-apply` normal durumda 6 saatte bir FAILURE basıyordu
(firewall özellikleri hiç kullanılmamışsa `inet onox` tablosu yoktur → dökülecek
state de yoktur). Bu gürültü, gerçek bir arıza çıktığında kimsenin bakmadığı bir
alarma dönüşüyordu.
Susturma koşullu: daha önce dump dökülmüşse ya da panelde nft'ye yansıması
gereken kayıt varsa, tablonun yokluğu koruma kaybıdır — panelde kural görünür,
sunucuda uygulanmaz. Koşulsuz `SUCCESS`'e çevirmek bu kaybı sonsuza dek gizlerdi.
---
5. Posta taşıma: Gmail / Outlook / Yandex
Gmail'den taşımaya çalışan kullanıcı şu ham metni görüyordu:
```
Bağlantı kurulamadı: Can not authenticate to IMAP server: [ALERT]
Application-specific password required: https://support.google.com/accou…
```
İlginç olan şu: `humanError()` tablosunda **"uygulama parolası ister" dalı zaten
vardı** ama Gmail'de hiç tetiklenmiyordu. Tablo `authentication fail` arıyordu,
Gmail ise `authenticate to IMAP server` diyor. Panel durumu "anlıyor"
görünüyordu; ayırt edici imza yanlış seçilmişti.
Üç katman:
- Sağlayıcıya özel yönergeler. Sıra önemli: IMAP'in kendisi kapalıysa parola
değiştirmek işe yaramaz, o dal en başta. Gmail, Microsoft 365 (temel kimlik
doğrulama kapatıldı), Yandex (IMAP varsayılan kapalı; **kurumsal 360'ta kullanıcı
adı tam e-posta adresi**).
- MX tabanlı tespit — kurumsal kutular için asıl düzeltme. `mail.firma.com`
kaydının çözülmesi hiçbir şey kanıtlamıyor; eski hosting'in A kaydı yıllarca
ayakta kalır. MX, postanın bugün nereye gittiğini söyler. Bu adım olmadan
Google Workspace / Yandex 360 kullanan müşteri yeni sağlayıcının parolasını
eski sunucuya gönderiyor ve hatayı "parola yanlış" sanıyordu.
- Ölü host düzeltildi — `imap.yandex.com.tr` artık yayımlanmıyor. Bu liste
DNS'te çözülüp çözülmediğine bakmadan dönüyordu; yanlış bir ad "uydurma host
önermeyiz" ilkesinin sessiz ihlaliydi.
Tanınmayan MX için öneri üretilmiyor — `mx1.eskihosting.com` gördük diye onu
IMAP hostu saymak, çözülmeyen host önermekle aynı hata olurdu.
---
6. Yedek profili ayarları uygulanmıyordu
Zincir üç yerde kopuyordu:
```
BackupController → BackupSchedule → RunBackupScheduleJob → RunAccountBackupJob → BackupService
↑ kapsam + hariç-tut düşüyor ↑ sıkıştırma düşüyor
```
`BackupService` `include_dbs`/`include_mail`/… seçeneklerini **zaten
destekliyordu** — zincirde onları dolduran kimse yoktu, hepsi `full` varsayılanına
düşüyordu. "Sadece Veritabanı" profili kuran admin rozeti görüyor, gerçekte her
gece her hesabın tam home'u + posta + DNS + SSL + FTP + cron tar'lanıyordu.
Bu, 2026.8.47'de düzeltilen 169 yedek çığının kök nedeniydi: kapsam
daraltılabilseydi 46 GB'lık hesap saatlerce gzip'lenmeyecekti.
Bilinmeyen kapsam değeri her şeyi yedekler: fazla yedek disk maliyetidir,
eksik yedek veri kaybıdır.
Hariç tutulan yollar çip olarak gösteriliyor ama `tar`'a hiç iletilmiyordu —
20 GB'lık `node_modules` her gece yeniden tar'lanıyordu.
Sıkıştırma bilerek yapılmadı — ve UI artık yalan söylemiyor
`onx-backup-restore` `home.tar.gz` adını ve `tar -xzf`i sabit kullanıyor.
Kodeği değiştirmek, farklı kodekle alınmış bir arşivin geri yüklenememesi
demek. Yedek geri yükleme son savunma hattıdır; kozmetik bir ayar için riske
atılmaz.
Seçenek devre dışı bırakıldı ve durum açıkça yazıldı. Betiğe eklenmiş atıl
`COMPRESSION` ayrıştırması da kaldırıldı — kullanılmayan kod bırakmak, bu sürümün
düzelttiği günahın aynısı olurdu.
---
7. E-posta şablonu override'ları kullanılmıyordu
Admin 21 şablonu TR/EN düzenleyip kaydediyordu; kayıt `email_templates` tablosuna
gidiyordu. Ama giden e-posta her zaman varsayılan Blade'di:
`TemplateRenderer` üretimde sıfır çağrılıydı.
Teşhisi neredeyse imkânsızdı: önizleme de Blade render ediyordu, yani ekranda
"değişikliğim uygulandı" görünüyordu. Şikâyet "e-posta gitmiyor" olarak da gelmez —
gider, yanlış içerikle.
Anahtar view adından türetiliyor (`emails.account.suspended` →
`account.suspended`), böylece view ile anahtar yapısal olarak ayrışamaz.
25 Mailable'ın tamamı bağlandı; test `new Content(view:)` doğrudan çağrısını
yasaklıyor.
Mevcut davranış birebir korunur: override yoksa aynı Blade view ile aynı
`Content` kurulur.
---
8. Marka footer HTML'i basılıyor (sanitize'li)
Alan 2026-05'ten beri kaydediliyor, `brand` prop'una konuyor ve formda geri
görünüyordu — ama hiçbir layout basmıyordu. (Kıyas: aynı formdaki `custom_css`
basılıyordu, yani taşıma zinciri sağlamdı.)
Basmaya başlamak güvenlik yüzeyi açar: alan `v-html` ile admin ve müşteri
panelinde, aynı origin'de render ediliyor. Formda `custom_css` ile yan yana
duruyor ama aynı risk değil — CSS kod çalıştırmaz, HTML çalıştırır.
Beyaz-liste temizleyici eklendi:
- Fail-closed — `BrandResolver::platform()` her istekte çalışıyor; kaçan tek
istisna admin + müşteri + giriş dahil tüm panelde 500 demek. Temizleyemezse ham
basmak yerine düz metne iner.
- Raw-text öğeleri içeriğiyle silinir, unwrap edilmez — libxml2'nin HTML4
ayrıştırıcısı ile tarayıcının HTML5'i tam da orada ayrışır (mXSS yüzeyi).
- Hem yazarken hem okurken çalışır: alan aylardır doğrulanmadan kaydediliyordu,
yazma kapısı geçmiş kayıtları güvenli yapmaz.
Yazma yolu yalnız admin'e açık (bayi bu alana erişemiyor).
---
9. WordPress filosunda pasif siteler ayrı grupta
Askıdaki hesabın ya da DNS'i düşmüş alan adının WP sitesi zaten erişilemez. Onu
ana risk listesinde "güncelleme bekliyor / savunmasız" diye göstermek iki zarar
veriyordu: admin düzeltemeyeceği satırlarla uğraşıyor, ve gerçekten çalışan
savunmasız siteler bu gürültünün altında kayboluyordu.
Pasif siteler listeden atılmıyor — silinmiş gibi görünmeleri de yanlış olurdu.
Ayrı grupta, altta ve sebebiyle duruyorlar.
`dns_health_status` yalnız `down` iken pasif sayılır; **ölçülmemiş durum siteyi
pasif grubuna atmaz.**
---
10. MX senkron vaadi kaldırıldı
Panel iki yerde "DNS MX kayıtları senkronize edilir" diyordu ama DNS'e hiç
dokunmuyor: `applyAllForDomain()` 2026-05-28'den beri **hiçbir yerden
çağrılmıyor.** Müşteri "uzak" moda geçip postasını taşıdığında MX hâlâ
`mail.<alan>` kalıyor ve posta bu sunucuya düşmeye devam ediyordu.
Otomatik yazım bilerek yapılmadı: mevcut kod bağlansaydı kullanıcının girdiği
`primary_mx`/`backup_mx` alanlarını hiç okumuyor ve `remote` dalında alan adını
sıfır MX ile bırakabiliyordu — posta kaybı. Panel şimdilik doğruyu söylüyor.
---
Doğrulama
Tam süit A/B, kararlı `dosya:satır` anahtarlarıyla:
| | Kırık konum | Geçen |
|---|---|---|
| 2026.8.47 | 173 | 1343 |
| 2026.8.48 | 173 | 1387 |
Sıfır regresyon. Birim testleri 537 → 581. Değiştirilen her Vue dosyası
`@vue/compiler-sfc` ile gönderilmeden önce derlendi (bir dengesiz etiket bu
sayede yakalandı).
---
Bu sürüme GİRMEYENLER (ve nedeni)
| Madde | Neden ertelendi |
|---|---|
| Yedek sıkıştırma (zstd/xz) | `onx-backup-restore` gzip'e sabit; önce restore kodek-duyarlı yapılıp gerçek geri yükleme testi koşulmalı |
| HSTS anahtarı | Arka uç da ölü: `toggleHsts` ayarı `autossl_settings`'e yazıyor, onu da kimse okumuyor. UI eklemek hiçbir şey yapmayan bir düğme daha koymak olurdu |
| Vanity nameserver | Risk analizi 8 kırılma buldu, 3'ü canlı etkili — en ağırı kaydetme isteği içinde senkron DNS sorgusu (bayi hiçbir ayarını kaydedemez hâle gelirdi). Kuyruk işi + doğrulama + zamanlama gerektiriyor |
| GFS saklama (keep_*) | Profil-bazlı retention ayrı bir ürün kararı |
| Bayi toplu işlem | Her toplu uç sahiplik filtresinden geçmeli; admin kodunu kopyalamak çapraz-kiracı açığı olurdu |
ONOXSOFT 2026.8.47 — Canlı kullanımda bildirilen hatalar
Bu sürüm gerçek kullanım sırasında bildirilen yedi kusuru kapatıyor. Üçü **aktif
zarar** veriyordu: her gece onaylanmamış WordPress güncellemesi koşuyor, bir
sunucuda yedek sistemi diski dolduruyor, yüklenen her marka görseli 404 dönüyordu.
Ortak desen yine aynı: panel bir şey gösteriyor, sistem başka şey yapıyor.
---
1. Postfix "Mail Kuyruğu" sekmesi beyaz ekran veriyordu
`e11b9b8c` ("uydurma veriyi durdur") kontrolcüdeki 10 satırlık sahte kuyruk
dizisini gerçek sysapi çağrısıyla değiştirdi — ama sahte dizinin Vue ile
paylaştığı veri sözleşmesini taşımadı:
| | Sahte veri (eski) | `onx-postqueue-status` (gerçek) |
|---|---|---|
| boyut | `size_kb` | `size` (bayt) |
| zaman | `arrival_time` | `arrival` |
| alıcı | `recipients` (dizi) | `recipient` (tekil string) |
Vue hâlâ `entry.recipients[0]` diyordu → `undefined` dereference → render
`TypeError` → tüm ağaç devriliyor → beyaz ekran. Sekme `v-if` içinde olduğu
için sayfa ilk açılışta sorunsuz geliyor, yalnız "Mail Kuyruğu"na tıklayınca
patlıyordu. Kuyruk boşken `v-for` hiç satır üretmediğinden hata aralıklı
görünüyordu.
Kontrolcüde normalizasyon eklendi (aynı dönüşüm `MailQueueService::fetchPostfix`'te
zaten vardı — `/admin/mail/queue` bu yüzden çalışıyordu) ve Vue savunmacı
yapıldı: tek bir eksik anahtar bir admin sayfasını komple devirmemeli.
Yan bulgu: `deferred`/`hold` değerleri payload'ın kökünden okunuyordu,
oysa `totals` altındalar → Genel Bakış kutuları her zaman boştu. Veri zaten
mevcuttu, yalnız yanlış yoldan okunuyordu.
---
2. WordPress "Otomatik Güncelleme" anahtarı hiçbir şey yapmıyordu (AKTİF ZARAR)
Toggle değeri `config_overrides['auto_update']` JSON anahtarına yazıyordu; gece
04:00'te koşan motor (`onox:wp-auto-update` → `WpAutoUpdateService::flaggedQuery`)
ise yalnız `auto_update_core` / `_plugins` / `_themes` kolonlarını sorguluyor.
Kolonlara yazan tek bir kod yolu hiç olmadı → tüm satırlar migration
varsayılanında (`'minor'`) kaldı ve süzgeç tüm aktif WP sitelerini eşledi.
Zarar iki yönlüydü:
- Toggle'ı kapatan müşterinin sitesinde her gece `wp core update --minor`
koşmaya devam etti. Servisin kendi notu: ROLLBACK YOK — bozulan siteye
yalnız uyarı gidiyor, elle yedekten dönülüyor.
- Toggle'ı açan müşterinin eklenti/temaları hiç güncellenmedi → beklenen
güvenlik yamaları uygulanmadı.
Her iki toggle da (admin + müşteri) artık kolonlara yazıyor; rozet ve motor
aynı koşuldan türüyor (`InstalledApp::autoUpdateEnabled()`).
Veri geçişi: tek sözleşme, panelin bugüne kadar gösterdiği durumdur.
Dokunulmamış `'minor'` bir müşteri tercihi değil, migration artığıdır → `'off'`.
Bilinmeyen durum yıkıcı olmayan tarafa düşer: onay verilmemiş bir güncelleme
artık sessizce koşmaz. `down()` satırlara dokunmaz — fix sonrası verilen
kararı silmek ve rollback'te tüm sitelerde gece güncellemesini yeniden açmak
olurdu.
---
3. Yedek çığı: bir hesap diski dolduruyordu (CANLI OLAY)
169 sunucusunda 46 GB'lık bir hesabın gzip'i 1 saati aşıyordu. PHP tarafı 3600
saniyede vazgeçiyor, ama `tar` çalışmaya devam ediyordu. Bir sonraki saatlik
tetik yeni bir tar başlatıyordu.
Olay anındaki tablo: aynı anda 3 yetim tar (5s21d / 4s21d / 3s20d),
`/tmp`'de 30 GB yarım arşiv, disk %90. Hiçbiri "hata" vermiyordu — her tur
yalnızca timeout'a düşüyor ve sessizce birikiyordu.
Üç katman eklendi:
| Katman | Neden |
|---|---|
| Hesap başına `flock` | Aynı hesap için ikinci yedek başlamaz. "Atlandı" açıkça raporlanır — atlamak bir başarı değildir |
| `TERM/INT/HUP` tuzağı | `trap ... ERR` yalnız komut hatasında çalışır; PHP timeout'ta SIGTERM gönderdiğinde tetiklenmezdi. Süreç grubu öldürülür, çünkü gzip tar'ın çocuğudur |
| Bayat artık süpürme | Ölü PID'li eski iş dizinleri temizlenir (her biri GB'larca yer kaplıyordu) |
Canlıdaki artıklar ayrıca elle temizlendi: disk %90 → %75. Tamamlanmış
yedeklere (`/var/backups`, 15 GB) dokunulmadı.
---
4. Marka görselleri yüklendikten sonra 404 dönüyordu
Yükleme dosyayı `public` diskine (`storage/app/public`) yazıp DB'ye
`/storage/branding/xxx.png` URL'i kaydediyor. Bu URL yalnız doküman kökünde
`public/storage` bağlantısı varsa servis edilir.
Bağlantıyı kuran tek yerler ansible role'ü ve docker entrypoint'iydi. Üç canlı
sunucunun kullandığı bare-metal `install.sh` ve `onx-panel-self-update`
`storage:link`'i hiç çalıştırmıyordu; `/public/storage` `.gitignore`'da
olduğu için sürüm tarball'ı da taşımıyor.
`storage:link` tek başına yetmezdi: üç sunucuda da `public/storage` bir
symlink değil, Ocak 2025'ten kalma boş gerçek dizin. Laravel'in komutu
hedef varken "zaten mevcut" deyip çıkar. 169'da `storage/app/public/branding`
altında 5 görsel duruyordu (biri o gün yüklenmiş) — hiçbiri servis
edilmiyordu.
Düzeltme boş dizini kaldırıp bağlantıyı kurar; dolu ise dokunmaz (içeriğini
bilmediğimiz bir dizini silmek veri kaybı riskidir). Ayrıca yükleme uçları
`PublicStorageLink::ensure()` kapısından geçer: bağlantı kurulamıyorsa yükleme
başarılı sayılmaz — 404 servis edecek bir URL'i DB'ye mühürlemek, kullanıcıya
olmayan bir şeyi olmuş gibi göstermektir.
---
5. Antivirüs imza beslemesi "pasif" görünüyordu
Durum betiği iki ayrı yalan söylüyordu:
- `sigs` alanı dosya sayıyordu, imza değil. Canlıda 8 SaneSecurity dosyası
"8 imza" diye görünüyordu — gerçek sayı 40.804 (LMD için 2 → 47.759).
- `updated_at` sabit `null` idi, hiç ölçülmüyordu. Panel null'ı "hiç
güncellenmedi" diye basıyor ve besleme pasif görünüyordu; oysa dosyaların
mtime'ı zaten oradaydı.
Artık `.cvd/.cld` için `sigtool`, düz metin imza dosyaları için satır sayımı
kullanılıyor; `updated_at` gerçek mtime. Dosya sayısı ayrıca raporlanıyor ki
panel "imza okunamadı" ile "besleme yok"u ayırt edebilsin.
> Resmî ClamAV veritabanının kendisi sağlıklıydı (`daily.cld` günlük güncelleniyor
> — freshclam panelden bağımsız çalışır). Beslemelerin bayat kalmasının sebebi
> panelin antivirüs ana anahtarının kapalı olmasıydı; bu bir ayar, kusur değil.
---
6. Bayi listesinde "Son giriş" hep boştu
Ekran `$u->last_login_at`'ı okuyup biçimlendiriyordu ve boşsa "Hiç giriş yapmadı"
basıyordu. Ama `users.last_login_at` kolonu hiç var olmadı → okuma her zaman
`null`. Bayi her gün giriş yapsa bile ekran aynı şeyi diyordu.
Kolon (+ `last_login_ip`) ve `RecordUserLogin` dinleyicisi eklendi. Controller'a
kod koymak yetmezdi: bu panelde giriş tek yoldan olmuyor — parola, passkey
(WebAuthn), WHMCS/WiseCP SSO redeem, impersonation ve "remember me". Hepsi
`Illuminate\Auth\Events\Login` tetikler; tek dinleyici hepsini kapsar. Dinleyici
giriş akışını asla kırmaz (kolon yoksa veya DB yazamazsa sessizce geçer).
---
7. Aynı WordPress sitesi listede iki kez görünüyordu ("vlatest" ve "7.0.2")
İki ayrı kök neden:
- `'latest'` bir sürüm değil, bir istektir. `AppVersionResolver` katalog
değerini çözemeyince ham `'latest'` dizesi kolona kalıcı yazılıyordu.
Ekranda "v" önekiyle birleşip "vlatest" görünüyordu.
- Keşif dedup'ı `install_path`'i ham eşitlikle eşliyordu. Panel kurulumu ve
disk keşfi aynı dizini farklı yazabiliyor (sondaki `/`) → farklı sanıp aynı
site için ikinci kayıt üretiyordu.
Artık `'latest'` yerine `'unknown'` yazılır (gerçek sürüm WP-CLI/keşif ile
okunur), yol normalize edilerek eşlenir, ve ekran "v" önekini yalnız gerçek sürüm
numarasına ekler.
---
Doğrulama
Tam süit A/B, kararlı `dosya:satır` anahtarlarıyla:
| | Kırık konum | Geçen |
|---|---|---|
| 2026.8.46 | 173 | 1334 |
| 2026.8.47 | 173 | 1343 |
Sıfır regresyon. Birim testleri 528 → 537.
> Kalan 173 kırık konum bu sürümden önce de kırıktı ve ayrı bir iş kalemidir.
---
Bu sürüme GİRMEYENLER (8.48'e)
Teşhisleri tamamlandı, uygulaması sürüyor: posta taşıma sağlayıcı ön ayarları
(Gmail/Outlook/Yandex), bayi panelinde toplu işlem, WP filo ekranında DNS-pasif
grubu, admin güvenlik ayarlarının gerçekten uygulanması, mail kuyruğu alarmı,
kaynak hatası kayıtları, Docker motor kartı, yedek profili ayarları
(kapsam/saklama/hariç-tut/sıkıştırma), e-posta şablonu override'ları, MX senkronu.
ONOXSOFT 2026.8.46 — Ölü bağlantılar: zamanlanmamış işler, budanmayan tablo, ulaşılamayan sayfalar
2026.8.45'in devamı. Aynı kusur sınıfı — kod var, çağıran yok — ama bu sefer
kaynağı iki farklı yer: (a) hiç yazılmamış zamanlamalar, (b) `7beb6a8a`
prod-senkronunun sildiği bağlantılar.
Bu sürümün en önemli dersi şu: **düzeltmelerin üçü "tek satır ekle" gibi
görünüyordu, ikisi değildi.** Tek satırı eklemek olmayan bir özelliği açar ve
yerine gerçek bir açık koyardı.
---
1. `7beb6a8a` bir AİLE regresyon bırakmış (2026.8.45 sadece bir üyesini düzeltti)
`/opt` bir git deposu değil; "prod tam senkronu" commit'i üretim ağacını depoya
geri yazdı ve yerelde çalışan bağlantıları sessizce geri aldı. Silinen kodun
kendisi değil, koda giden tek satırdı.
| Üye | Durum |
|---|---|
| Operasyon AI motoru HTTP yüzeyi | 2026.8.45'te geri geldi |
| `Event::listen(DomainAdded, IssueSslOnDomainAdded)` | bu sürümde |
| `Schedule::command('onox:operations:sweep')` | bu sürümde |
En sinsi tarafı: açıklama yorumları yerinde kaldı. Kodu okuyan biri
```
// v89 — Basit, listener-driven SSL kur (acme.sh primary / certbot fallback).
// AutoSslOnDomainAdded ile PARALEL çalışır ...
// Suspended hesaplarda bile çalışır (user report: "hesap askıdada olsa ssl'ini kurmadı").
```
yorumunu görüp bağlı sanıyordu. Altındaki `Event::listen` satırı yoktu. Ne hata,
ne log, ne test kırılması.
İki SSL dinleyicisi kopya değil tamamlayıcı: kayıtlı olan
(`AutoSslOnDomainAdded`) `autossl_settings.enabled != 1` ise tamamen atlıyor;
eksik olan tam da o durumda ve askıdaki hesaplarda devreye giriyordu. Yani
"AutoSSL zaten kayıtlı" demek yetmiyor.
`tests/Unit/System/ProdSyncRegressionGuardTest.php` üçünü birden mühürler, ayrıca
"yorum var, kaydı yok" desenini ayrıca test eder.
---
2. Telegram butonları — düzeltmenin kendisi bir güvenlik kapısı gerektirdi
`onoxsoft:telegram-poll` hiç zamanlanmamıştı. Uyarı kartlarındaki butonları
tüketen tek mekanizma bu (webhook yolu yok — `setWebhook` depoda hiç
geçmiyor). Sonuç: admin butona basıyor, Telegram spinner'ı dönüyor,
`answerCallbackQuery` hiç çağrılmıyordu.
Ama zamanlamayı tek başına eklemek güvenli değildi. Poller açıldığı andan
itibaren orası canlı bir komuta kanalıdır:
| Açık | Neden |
|---|---|
| Yetkisiz yıkıcı aksiyon | `authorized()`, `telegram_admin_user_ids` boşsa sohbet kimliğine düşüyor (`chatId === $tg->chatId()`). Hedef bir grup ise gruba eklenen herkes `service_restart` tetikleyebilirdi. |
| Yanlış sunucuda kesinti | Aynı bot token'ı birden fazla panelde tanımlıysa `getUpdates` akışını node'lar paylaşır, callback rastgele birine düşer. `callback_data` sunucu kimliği taşımaz, uyarı anahtarları geneldir (`service:MariaDB`) → anahtar eşleşmesi kanıt değil. "httpd yeniden başlat" başka sunucuda çalışabilirdi. |
İki kapı eklendi: yıkıcı aksiyon için beyaz liste zorunluluğu, ve `ownsCard()` —
kartı gönderen node'un kendi `dashboard_alert_states` satırına yazdığı
`telegram_message_id` ile sahiplik doğrulaması. `ack`/`iptal` kasıtlı olarak kapı
dışında: yalnız yerel state'e dokunurlar.
Zamanlama biçimi de mühürlendi: `runInBackground` (tur ~55 sn, ön planda tick'i
bloklardı), `withoutOverlapping(3)` (parametresiz hâli 1440 dk — tek bir OOM
butonları 24 saat öldürürdü), `onOneServer`, `when(isConfigured)`.
---
3. `whmcs_webhook_log` hiç budanmıyordu — ve budama kendisi risk taşıyordu
`retention.whmcs_webhook_log_days => 180` config'te **tanımlıydı ama okuyanı
yoktu. Tablo her billing webhook'unda (sipariş/askı/iptal + başarısız HMAC
denemeleri**) büyüyor, hiç silinmiyordu. `request_body`/`response_body` müşteri
adı, e-posta ve alan adı taşır — yani "180 gün" diye yapılandırılmış ama fiilen
sonsuz saklanan kişisel veri.
Kritik incelik: bu tablo aynı zamanda idempotency deposudur
(`idempotency_key` UNIQUE; `claimIdempotency()` tamamlanmış claim'i buradan
okur). Budama penceresi idempotency TTL'inden kısa olursa tamamlanmış bir claim
silinir, WHMCS aynı anahtarla retry ettiğinde kayıt bulunamaz ve sipariş
yeniden provizyonlanır → çift hesap. Pencere, ayarı kim düşürürse düşürsün
`TTL + 1 gün`e kelepçelendi.
Silme partili: `created_at` üzerinde indeks yok (migration yalnız
`endpoint` / `outcome` / `[hmac_verified,outcome]` / `processed_at` indeksliyor).
Aylardır budanmamış bir tabloda tek `DELETE` uzun kilit tutar ve tam o sırada
gelen billing webhook'ları 500 yer — yani "temizlik" işi sipariş kaybettirir.
---
4. Ulaşılamayan iki admin sayfası
Rota + controller + Vue hazır, menü girdisi yoktu — pratikte sayfa yoktur.
- Container Şablonları: admin'in katalogu yönetebildiği tek ekran. Girdi
olmadan yeni şablon eklenemiyor, riskli bir imaj pasife alınamıyordu; katalog
seed'lendiği gibi donuyordu.
- Mobil & Web Push: VAPID anahtarının panelden üretilebildiği tek yer. O
üretilmeden `.env` boş kalıyor ve hiç kimseye push gitmiyordu — abonelik,
job, cihaz modeli dahil tüm altyapı çalışır durumda ama beslenmiyordu.
Bilerek yapılmayan: Snapshot İçe Aktarma butonu
Denetim bunu da "eksik link" olarak işaretledi; eklenmedi. `87df13b9`'daki
kaldırma doğruydu. Geri eklemek üç somut zarar üretirdi:
1. `admin.snapshots.import.` kapısız, `admin.migration.` ise
`feature:cpanel_migration` ile kapılı → ödenmemiş özelliğe arka kapı.
2. `admin.migration.upload` `throttle:uploads` taşıyor, snapshot import
taşımıyor → rate-limit'siz 5 GB yükleme yüzeyi.
3. `importSnapshot()` istek-içi `sysapi(timeoutSeconds: 1800)` çağırıyor; gerçek
bir 5 GB arşivde FPM timeout'u bunu öldürür → DB'de kalıcı `importing` satırı
+ diskte temizlenmeyen 5 GB dosya.
Aynı offline arşiv yükleme akışı Migration sayfasında **kuyruk tabanlı ve
throttle'lı** olarak zaten çalışıyor.
---
Doğrulama
Tam süit A/B — kararlı `dosya:satır` anahtarlarıyla:
| | Kırık konum | Geçen |
|---|---|---|
| 2026.8.44 | 183 | 1289 |
| 2026.8.45 | 173 | 1319 |
| 2026.8.46 | 173 | 1334 |
Sıfır regresyon. Birim testleri 520 → 528.
> Not: Pest'in kısalttığı test adlarıyla (`FAILED … > helpe…`) karşılaştırma
> sahte alarm verir — kısaltma noktası koşumlar arasında kayar. Karşılaştırma
> `dosya:satır` anahtarı üzerinden yapılmalı.
---
Ayrıca: self-update extract dizin sahipliği (2026.8.45 kurulumunda yakalandı)
`tar --exclude='bootstrap/cache/*'` dizinin içeriğini eler, **dizin
girdisinin kendisini elemez.** Tarball o girdiyi `root/root` taşıdığı için tar,
canlı dizinin sahipliğini `apache:apache` → `root:root` yapıyordu; grup artık
root olduğundan Laravel her boot'ta *"bootstrap/cache must be present and
writable"* ile ölüyordu.
Pencere ~10 saniye ve her güncellemede tekrarlıyordu. 2026.8.45 kurulumunda
169 sunucusunda o pencerede tetiklenen beş zamanlanmış turbo işi sessizce düştü.
Desenler `storage`, `bootstrap/cache`, `public/build` olarak düzeltildi
(yıldızsız; GNU tar'da bir dizini elemek altındaki her şeyi de eler). Gerçek
tarball üzerinde ölçüldü: yeni desen tam olarak üç fazla üye eliyor — o üç
dizin girdisi, başka hiçbir şey.
> Bu düzeltme ancak bir sonraki güncellemeden itibaren etkilidir: extract'i
> çalıştıran, o an kurulu olan eski betiktir.
ONOXSOFT 2026.8.45 — Ölü özellikler: yazılan ama hiç okunmayan kod
Bu sürümün dört maddesi de aynı sınıftan: kod var, çağıran yok. Hiçbiri
hata üretmiyordu — hata üretecek bir şey çalışmıyordu ki. Bu yüzden hiçbiri
loglarda görünmüyordu ve hiçbiri "bozuk" diye bildirilmemişti; sadece
olmuyorlardı.
---
1. Bayi alt-paket limitleri hiç okunmuyordu (KOTA / GELİR)
`reseller_sub_packages.limits` 2026-05'ten beri yazılıyordu. Bayi kendi
ürününü tanımlıyor, `SubPackageManager::validateLimits()` her boyutu üst pakete
karşı titizlikle doğruluyor (üst paketi aşamaz, bayi havuzunu aşamaz, liste
tabanlı limitlerde alt küme olmalı), kayıt JSON olarak diske gidiyordu.
O limitleri okuyan tek bir satır kod yoktu. `ResellerSubPackage::limit()`
metodunun çağrıldığı yer sayısı sıfırdı.
Hesap açılırken alt-paketten yalnızca `parent_package_id` türetiliyordu; hesap
üst paketi alıyordu:
| Bayi ne satıyor | Müşteri ne alıyor | Bayi havuzundan ne düşüyor |
|---|---|---|
| Ekonomi — 5 GB | 100 GB (üst paket) | 100 GB |
| Ekonomi — 1 alan adı | 25 alan adı | 25 |
| Ekonomi — 2 veritabanı | 50 veritabanı | 50 |
Yani alt-paket bir isim ve fiyat etiketinden ibaretti. Zararı iki yönlüydü:
müşteri ödemediği kaynağı alıyor, bayi ise satmadığı kaynağı havuzundan
kaybediyordu — havuzu gerçekte dolmadan "doluyor" ve satış yapamaz hale
geliyordu.
Ne yapıldı
- `accounts.reseller_sub_package_id` sütunu (FK, `nullOnDelete` — alt-paket
silinirse hesap paketin limitlerine döner, silinmez ve limitsiz kalmaz).
- `ResellerSubPackage::effectiveLimit()` — limiti okuma anında üst pakete
kırpar. Doğrulama yazma anındadır; admin alt-paket oluşturulduktan sonra üst
paketi daraltabilir ve kayıt sessizce üst paketi aşan bir değer taşımaya
başlar. Okuma yolunda da kırpmak bu kaymayı zararsız kılar. Üst paket sınırlı
+ alt-paket sınırsız ise üst paket kazanır (bayi kendisine verilmemiş bir
sınırsızlığı dağıtamaz).
- Limit çözüm sırası tek: hesap override → alt-paket → paket → sınırsız.
`Account::effective*()` ailesinin tamamı ve alan adı sayısının tek
choke-point'i (`DomainProvisioner::assertCanAddDomain`) bu sıradan geçiyor.
- Havuz muhasebesinin iki ucu da alt-paketi görüyor: tahsis kontrolü
(`assertCanAllocate`) ve mevcut toplam (`currentAllocation`). Birini düzeltip
diğerini bırakmak iki sayının birbirini tutmaması demekti.
- Bayi hesap-açma ve paket-değiştirme formlarına alt-paket seçici; disk kotası
ekranda da alt-paketten türetiliyor (sunucudaki sıranın aynısı).
- Yetki kapısı: `exists:reseller_sub_packages,id` yalnız satırın var
olduğunu söyler — sahibi başka bir bayi olabilir. Sahiplik + üst paket
eşleşmesi + aktiflik zorunlu. API yolunda sahiplik hesabın sahibiyle
eşlenir, jetonu taşıyanla değil (admin başka bir bayi adına hesap açabiliyor).
Yan bulgu — aynı ezme kusurunun görüntü tarafı: `availablePackages()` hâlâ
`if (alt-paket parent'ları) … elseif (allowed_package_ids)` yapısındaydı. Kapı
(`assertPackageInPool`) 2026.7.16'da kesişime çevrildiği için bu artık güvenlik
değil tutarsızlık üretiyordu: bayi havuzunda olmayan paketi açılır listede
görüyor, seçiyor ve 403 yiyordu. Liste de kesişime çevrildi.
---
2. `POST /api/v1/accounts` hesabı hiç provision etmiyordu
Uç, `Account` satırını kaydedip 201 Created dönüyordu. `ProvisionAccountJob`
dispatch edilmiyordu.
Sonuç hayalet kayıt: Linux kullanıcısı yok, home dizini yok, vhost yok, site
404 — ama `LicenseSeatGuard` koltuğu sayıyor ve `ResellerAllocation` havuzdan
kotayı düşüyordu. Hiçbir hata da loglanmıyordu, çünkü hata yoktu: iş hiç
başlamamıştı.
Hesap oluşturmanın diğer iki yolu (WHMCS webhook, bayi paneli) bu işi zaten
kuyruğa atıyordu; bu uç sessizce paritesizdi. Yanıt artık
`"provisioning": "queued"` da taşıyor.
---
3. Operasyon Merkezi AI Motoru panelden erişilemiyordu
`7beb6a8a` commit'i Container/Observability sayfalarını eklerken AI motorunun
HTTP yüzeyini de sildi: `AdminOperationsController`, `routes/web.php`
bloğu, sidebar girdisi.
Arka uç olduğu gibi kaldı — dört ajan (Analist / Optimizer / RiskCritic /
Judge), eylem kataloğu ve dört handler, `ApplyPipeline` (snapshot → uygula →
doğrula → gerekirse otomatik geri al), iki iş, üç konsol komutu, üç
migration, iki Vue sayfası.
Sinsi olan şu: özellik pakete giriyor, migration'ları koşuyor, tablolar
oluşuyor, konsol komutları çalışıyordu. Panelden erişilecek tek bir yol yoktu ve
hiçbir hata üretmiyordu.
Rotalar, kontrolcü ve menü girdisi geri getirildi (`feature:ops_ai_engine`).
Ayrıca `OperationsServiceProvider` `bootstrap/providers.php`'de **kayıtlı
değildi** → dört ajan her biri ayrı bir `AiManager` çözüyordu (testte
`register('fake')` ikinci ajana ulaşmıyor, üretimde sağlayıcı dört kez
kuruluyordu). Kaydedildi.
Depodaki üç Operasyon test sınıfı bu yüzden kırmızıydı; bu sürümle yeşile döndü.
---
4. `CHAR_LENGTH` — güvenlik kapısı MySQL dışında duvara dönüyordu
2026.8.45 hazırlığında eklenen `DomainNamespaceGuard` (bir kiracının başka
kiracının adının altına yerleşmesini engelleyen kapı) en yakın üst alan adını
`orderByRaw('CHAR_LENGTH(name) DESC')` ile seçiyordu. `CHAR_LENGTH`
MySQL/MariaDB'ye özgüdür; SQLite'ta `no such function` ile patlıyor, yani kapı
sqlite kullanan her kurulumda alan adı eklemeyi tamamen kırıyordu.
Aday sayısı alan adının etiket sayısı kadardır (tipik 2–4), bu yüzden sıralama
sürücüden bağımsız olsun diye PHP tarafına alındı.
---
Doğrulama
Tam süit A/B koşuldu (aynı harness, yalnız bu sürümün dosyaları değişti):
| | Kırık | Geçen |
|---|---|---|
| Öncesi (2026.8.44) | 248 | 1289 |
| Sonrası (2026.8.45) | 218 | 1319 |
Sıfır regresyon. Onarılan üç sınıf (`AdminOperationsControllerTest`,
`OperationsEngineTest`, `OperationsDiagnoseCommandTest`) ve
`AccountModelTest` — hepsi depoda zaten vardı ve eksik bağlantı yüzünden
kırmızıydı.
Yeni sözleşme testleri: `tests/Unit/Reseller/SubPackageLimitContractTest.php`,
`tests/Unit/Operations/OperationsAiEngineWiringTest.php`,
`tests/Unit/Api/V1ApiContractTest.php`.
> Kalan 218 kırık test bu sürümden önce de kırıktı ve ayrı bir iş kalemidir;
> bu sürüm onlara dokunmadı.
ONOXSOFT 2026.8.44 — Log dizini sıkılaştırması güncellemenin SON işi
2026.8.43 üçüncü yazıcıyı kapattı ama dizin her güncellemede yine `0755`e
dönüyordu. Kök neden sıra: iyileştirme adımı güncellemenin başında koşuyor,
vhost yeniden yazımı ise sonra — ve o yol dizini tekrar açıyordu.
Canlı ölçüm: 8.43 kurulumundan sonra mod `755` (ctime tam güncellemenin bitiş
anı). Ardından 4 dakika izlendi, mod değişmedi → periyodik bir yazıcı yok;
açan şey güncellemenin kendi adımlarıydı ve sonrasında kimse kapatmıyordu.
Sıkılaştırma artık güncellemenin son işi (ilerleme %100 bildiriminden hemen
önce). Hangi adım açmış olursa olsun kapı en sonda kapanır. Sözleşme testi
sırayı da doğruluyor.
ONOXSOFT 2026.8.43 — Paylaşımlı log dizinini yeniden açan üçüncü yazıcı
2026.8.42'de `onx-vhost-add-ols` ve `onx-vhost-add-nginx` `0755` → `0750`
çevrilmişti. Ama üçüncü bir yazıcı kaçtı: `onx-ols-vhosts-unified-rewrite`
yolu bir değişken üzerinden yazıyor (`chmod 755 "${LOG_DIR}"`), bu yüzden
literal yol araması onu bulamadı.
Canlı sonuç: bu betiğin düzenli koştuğu sunucuda (son 45 dakikada 21 vhost
yeniden yazılmış) dizin her seferinde tekrar 0755'e açılıyordu. Diğer iki
sunucuda kapalı kalmıştı — orada bu yol o sıklıkta çalışmıyor. Yani düzeltme
iki sunucuda tuttu, birinde sessizce geri alındı.
Dizin tüm müşterilerin erişim loglarını bir arada tutuyor: ziyaretçi IP'si,
istenen URL, referrer — KVKK kapsamında kişisel veri.
Sözleşme testi de güçlendirildi
Eski test sabit bir dosya listesine bakıyordu; üçüncü yazıcıyı tam da bu
yüzden kaçırdı. Artık dizinden bahseden her sysapi betiğini tarıyor ve yol
bir değişkene alınmışsa değişken üzerinden verilen modu da yakalıyor.
Ders: aynı kaynağı yazan tüm yolları ararken değişken kullananları da tara;
literal arama tek başına yeterli değil.
ONOXSOFT 2026.8.42 — Firewall boot koruması, BoxTrapper karantinası, kaynak grafiği tarihleri
Üç alan izole çalışma ağaçlarında paralel geliştirildi ve her biri ayrı bir
inceleyici tarafından karşı-denetimden geçirildi.
1. Firewall boot-restore unit'ini hiçbir şey oluşturmuyordu
`onox-firewall-restore.service` boot'ta `nft -f` ile kuralları geri yükler —
ama bu unit'i üreten tek satır yoktu; adı yalnız yorumlarda geçiyordu. Bir
sunucuda elle oluşturulmuş (o yüzden çalışıyor), `install.sh` ile kurulanda
yok ve `nftables.service` devre dışı:
```
systemctl cat onox-firewall-restore.service → No files found
/etc/nftables/onox-restore.nft → VAR (cron yazıyor)
nft list tables → table inet onox (kurulu)
```
Yani dökümü üretiyoruz ama boot'ta yükleyecek hiçbir şey yok → **reboot'ta tüm
engel kuralları sessizce kalkar** (IP, ülke, bağlantı limiti, tehdit listesi).
Üstüne: onox tablosu yokken script `ok:true` dönüyordu ve panel "✓ döküm
güncellendi" basıyordu — koruma sıfırken yeşil rapor.
Artık unit idempotent kuruluyor (aynıysa hiçbir şey yazılmaz, `--now` yok →
canlı kurallara dokunulmaz), çağrı "tablo yok" erken çıkışının üstünde, ve
komut unit kurulamadıysa ya da döküm yazılmadıysa başarısız dönüyor.
Mevcut sunucular için güncellemeye iyileştirme adımı eklendi.
2. BoxTrapper karantina kuyruğu hiç dolmuyordu
Müşteri BoxTrapper'ı açınca sieve kuralı gerçekten çalışıyor ve beklenmeyen
posta karantinaya düşüyor — ama panelde kuyruk ve bekleyen sayacı **sonsuza
kadar 0**. Müşteri tutulan postalarını göremiyor, serbest bırakamıyordu.
Aynı zincirde ikinci kusur: özellik bayrağı var olmayan bir sütundan
okunuyordu, yani her zaman "kapalı" dönüyordu. Sonucu: her filtre veya otomatik
yanıt kaydında sieve yeniden üretilirken BoxTrapper kuralı siliniyordu.
Bayrak artık arayüzün gerçekten yazdığı yerden okunuyor, sieve üretimi tek
yazıcıda birleşti (kurallar birbirini ezmiyor) ve karantina kuyruğu doğrudan
posta kutusundan canlı okunuyor.
3. Kaynak kullanımı grafiğinde tarihler hatalıydı
Veri katmanı sağlamdı (saat dilimleri tutarlı, ölçüm cron'u düzenli). Kusur
tamamen sunum katmanındaydı ve üç seviyedeydi:
- X ekseni insan etiketinden kuruluyordu. `new Date('06.08 10:00')` tarayıcıda
"8 Haziran 2001" veriyor — ay ve gün yer değiştiriyor. Değer geçerli bir
tarih olduğu için koddaki savunma da hiç devreye girmiyordu. Ayın 13'ünden
sonra ise geçersiz tarih → eksenin yarısı 2001, yarısı sıra numarası.
- Alan adları uyuşmuyordu: grafik `cpu_pct`, arka uç `cpu_avg` gönderiyordu →
24 saatlik grafik tüm metriklerde düz sıfır çiziyordu.
- Pencere kova sınırına hizalı değildi: "24 saat" 25 kova, "30 gün" 31 gün
döndürüyordu; eksenin iki ucunda aynı saat etiketi vardı ve uçtaki kovalar
eksik örnekle ortalanıyordu (son gün 127 örnek, tam gün 288).
Artık her noktada makine-okunur zaman damgası var, kovalar hizalı, ölçüm
olmayan aralık `0` değil boşluk olarak çiziliyor, ve çözülemeyen zaman
uydurulmuyor.
İnceleyicinin bulduğu üç ek kusur da düzeltildi: boşluk eşiği artık sunucudan
gelen gerçek kova boyundan türetiliyor (medyandan türetmek, tam da boşluklu
seride çalışmıyordu), "henüz veri yok" açıklaması yeniden görünür oldu, ve
hiç ölçülmeyen MySQL sorgu hızı artık "0" yerine boş dönüyor.
Test tabanı
229 kırık / 1272 geçen. Kırık sınıf kümesi 2026.8.32 tabanıyla birebir aynı
(79 sınıf) — bu sürüm hiçbir testi bozmadı, +28 test ekledi.
ONOXSOFT 2026.8.41 — Posta Taşıma gerçekten çalışıyor + yer kontrolü + yalan kota uyarısı
1. "Hesap askıda olduğu için posta taşıma başlatılamaz" — hesap askıda değilken
`Account::$casts` hesap durumunu bir enum'a çeviriyor. Kapı ise enum
nesnesini metinle karşılaştırıyordu:
```php
if ($account->status !== 'active') // enum !== string → HER ZAMAN doğru
```
Yani hesap aktif olsa bile taşıma başlatılamıyordu: özellik 2026.8.32'den beri
arayüzden hiç çalışmamış.
Uçtan uca test bunu yakalayamamıştı çünkü çekirdeği doğrudan çağırıp
denetleyiciyi atlıyordu; sözleşme testi ise kusuru mühürlemişti — eski kodun
varlığını doğruluyordu. İkisi de düzeltildi.
Ayrıca kapı panelin kendi tanımından daha katıydı: yalnız `suspended` ve
`terminated` engellenmeli; `pending` meşru bir durum. Mesajlar da artık ayrı.
2. Yer kontrolü hiç yoktu
12 GB'lık bir kutu 1 GB kotalı hedefe taşınmaya başlıyor, saatler sonra kota
dolunca yarıda kalıyordu.
- Bağlantı testi artık gerçek boyut ölçüyor. Çok büyük klasörlerde ölçüm
pahalı olduğu için sınır var; ölçülemeyen klasör `0` değil "—" gösteriyor
ve toplam `+` ile işaretleniyor.
- Taşıma başlatılırken seçili klasörlerin toplamı hedef kutu kotasıyla
karşılaştırılıyor; yetmiyorsa başlatılmıyor ve mesaj somut: ne kadar veri,
ne kadar boş yer, hangi kota.
- Sınırsız kota engellenmiyor. Ölçemediğimizde kapı hiç uygulanmıyor.
Canlı doğrulama (gerçek hesap): 6643 mesaj / 8864 MB ölçüldü — INBOX 4917 MB,
Çöp 2090 MB, Gönderilenler 1685 MB.
3. "Kota dolan hesaplar" uyarısı var olmayan sorunu bildiriyordu
Pano "1 hesap %90+ disk kotasında" diyordu. Tetikleyen tek kayıt:
| Ölçüm | Değer |
|---|---|
| `last_quota_pct` (uyarının okuduğu) | %97,67 |
| Aynı satırın `disk_usage_bytes`/`quota_bytes` değeri | %65,25 |
| Diskteki gerçek kullanım | ~%32 (6,5 GB / 20 GB) |
| Hesabın durumu | askıda (9 gündür) |
Yani panel, askıya alınmış bir hesabın donmuş ve kendi satırıyla bile çelişen
bir sayısına bakıyordu.
Yüzde artık sorgu anında hesaplanıyor, yalnız `active`/`pending` hesaplar
sayılıyor, sınırsız kota hesaba girmiyor. Canlı: eski mantık 1 hesap, yeni
mantık 0 — en yüksek aktif hesap %9,9.
Test tabanı
228 kırık / 1244 geçen. Kırık sınıf kümesi 2026.8.32 tabanıyla birebir aynı
(79 sınıf) — bu sürüm hiçbir testi bozmadı.
ONOXSOFT 2026.8.40 — Çapraz-kiracı log sızıntısı, "Kaydet" posta kesintisi, sahte sıfır ölçümler
1. GÜVENLİK: bir müşteri diğerinin ziyaretçi loglarını okuyabiliyordu
`/var/log/onoxsoft-system` tüm müşterilerin erişim loglarını bir arada tutuyor —
ziyaretçi IP'si, istenen URL, referrer, user-agent. KVKK kapsamında kişisel veri.
Dizin `0755` ile oluşturuluyordu. Canlı kanıt:
```
sudo -u onx_<musteriA> head /var/log/onoxsoft-system/<musteriB>-access.log
→ ÇALIŞIYORDU (matrix'te 86, beta'da 122 müşteri sitesi)
```
Paylaşımlı dizin bilinçli bir karardı: OpenLiteSpeed worker'ı `nobody` olarak
koşuyor ve müşterinin `0750` log dizinine yazamıyordu — o yüzden İstatistikler boş,
Bant Genişliği donuk kalıyordu. Ama `0755` gereksizdi: yazan taraf dizinin
sahibi, okuyan panel parser'ı sysapi üzerinden zaten root koşuyor.
Artık `0750` + dosyalar `0640`. Hem vhost yazıcılarında hem güncellemenin
iyileştirme adımında — kod düzeltmesi tek başına bugün açık olan 208 logu
kapatmazdı.
2. Postfix ekranında "Kaydet" posta kesintisi üretebiliyordu
`postfix_config` tablosu kurulum tohumunda donmuş ve gerçekle uyuşmuyor:
| | Panelin DB'si | Sunucudaki gerçek |
|---|---|---|
| virtual_mailbox_domains | `mysql:/etc/postfix/mysql_virtual_domains.cf` | `postconf -m` çıktısında mysql yok |
| virtual_transport | `dovecot` | master.cf'te dovecot transport'u yok |
| smtpd_tls_cert_file | `/etc/letsencrypt/live/mail.onox.com.tr/…` | o yol diskte yok |
Kontrolcü değişen değil tüm tabloyu yolluyor ve `postfix check` bunları
yakalamıyor (sözdizimi bakar, tamamlık değil) → rollback tetiklenmiyor → sanal
alan adlarına gelen tüm posta düşerdi. Yani ilgisiz tek bir alanı değiştirip
Kaydet'e basmak yeterliydi.
Yazıcı artık iki geçişli: önce hepsini doğrula (harita tipi bu derlemede var
mı, transport master.cf'te tanımlı mı, sertifika yolu diskte var mı), tek ret
varsa `main.cf`'e dokunma. Eskiden reddetme döngünün içindeydi ve reddedilen
çağrı bile `main.cf`'i yarım değiştirilmiş bırakıyordu.
Canlı test (gerçek donmuş DB değeriyle): reddedildi, `main.cf` md5 değişmedi.
3. Kaynak kullanımı ekranları sahte sıfır gösteriyordu
`onx-cgroup-read` cgroup yolunu sabit yazıyordu; müşteri süreçleri orada değil.
Dizin yoksa sabit sıfır JSON basıyordu — "hesap boş" ile "hiç ölçemedik"
ayırt edilemiyordu. Artık yol keşfediliyor ve bulunamazsa `measured:false` +
`null` dönüyor. Ölçülemedi, sıfır demek değildir.
4. Beyaz etiket: müşterinin kendi alan adında "ONOXSOFT" yazıyordu
Varsayılan sayfaların gövde metninde marka düz yazılıydı; `${BRAND_NAME}`
yalnız altbilgide kullanılıyordu. Token'a çevrildi, deploy betiğine boş-marka
koruması eklendi.
Test tabanı
229 kırık / 1239 geçen. Kırık sınıf kümesi 2026.8.32 tabanıyla birebir aynı
(79 sınıf) — bu sürüm hiçbir testi bozmadı.
ONOXSOFT 2026.8.39 — DB dökümü sızıntısı kapatıldı, Passkey arayüzü geri geldi
1. GÜVENLİK: panel veritabanının tam dökümü müşteriye okunabiliyordu
Güncelleme anlık görüntüsü `/var/lib/onox/updates/<sürüm>/db.sql` panel
veritabanının tam dökümüdür — tüm admin/bayi/müşteri parola hash'leri, 2FA
sırları, lisans anahtarları, her kiracının verisi.
`mkdir -p` (umask 022 → 0755) + dump 0644 idi; korumayı sağlayan tek şey üst
dizinin moduydu ve iki sunucu arasında sapmıştı. Canlı ölçüm:
```
sudo -u onx_<musteri> head -c 120 /var/lib/onox/updates/*/db.sql → ÇALIŞIYORDU
```
Düzeltme:
- Dizinler 0700, dökümler 0600. Dosya dump'tan önce 0600 ile oluşturuluyor —
yönlendirme dosyayı umask ile açıyordu ve dump saniyeler sürüyordu.
- Mevcut eski dökümler de geriye dönük sıkılaştırılıyor; bu adım olmadan
düzeltme yalnız yeni dökümleri korurdu.
- Budama eklendi. Kod anlık görüntüleri 3'te tutulurken DB dökümleri hiç
budanmıyordu: beta 73 sürüm / 58 GB, matrix 47 sürüm / 55 GB. Artık aynı
politika — en yeni 3 sürüm kalır (geri dönüş penceresi korunur).
2. Passkey (WebAuthn) arayüzü geri geldi
Arka uç zaten çalışıyordu (7 rota, `authorizeLoginUsing` kancası, `User`
sözleşmesi, profil prop'ları) ama arayüz hiç merge edilmemişti: dosyalar
birleşmemiş bir dalda kalmış, yalnız tek bir sunucunun diskinde izsiz duruyordu.
Sonuç: kayıtlı geçiş anahtarıyla giriş çalışıyor, ama kullanıcı anahtar
ekleyemiyor/silemiyordu.
Geri gelenler: `config/passkeys.php` (RP ID + user-handle gizli anahtarı), rol
kapısı middleware'i (yönetim rotaları yalnız admin+bayi), profil sekmesi, giriş
sayfası butonu, `.env.example` anahtarı. Farklar tamamen eklemeydi.
i18n: 26 anahtar × 10 dil birleştirildi, parite korundu (10 × 10248).
Test tabanı
229 kırık / 1236 geçen. Kırık sınıf kümesi 2026.8.32 tabanıyla birebir aynı
(79 sınıf) — bu sürüm hiçbir testi bozmadı.
ONOXSOFT 2026.8.38 — Posta Taşıma: sertifika doğrulaması artık gerçekten çalışıyor
Belirti
Posta Taşıma'da gerçek bir hesap denendiğinde:
"Sunucunun SSL sertifikası doğrulanamadı."
Kök neden
PHP'nin IMAP eklentisi (c-client) TLS el sıkışmasında SNI göndermiyor.
Paylaşımlı barındırmada sunucu, SNI'siz gelen bağlantıya kendi varsayılan
sertifikasını veriyor. Canlı ölçüm (`mail.vavamedya.com:993`):
| Bağlantı | Sunucunun verdiği sertifika |
|---|---|
| SNI'siz (c-client böyle bağlanır) | `CN=sunucu.nitrosistem.com.tr` — barındırıcının kendi adı |
| SNI ile | `CN=*.vavamedya.com` — geçerli Let's Encrypt sertifikası |
Yani sertifika geçerliydi, panel onu göremiyordu. Bu, göç kaynaklarının
neredeyse tamamını etkiliyordu ve kullanıcının tek çıkışı doğrulamayı **tamamen
kapatmaktı** — yani gerçek bir güvenlik kaybı.
Düzeltme
Doğrulamayı artık kendimiz yapıyoruz: PHP akışları SNI gönderir, sertifika
zincirini ve host adını denetler.
- Doğrulama geçmezse hiç bağlanılmıyor.
- Geçerse c-client novalidate ile bağlanıyor (onun kontrolü zaten çalışmıyor).
- STARTTLS (143) yolu da destekleniyor.
- Kullanıcı doğrulamayı bilerek kapattıysa kendi kontrolümüz de çalışmıyor.
Sertifika hatası artık sunucunun hangi ada düzenlenmiş sertifika sunduğunu
söylüyor; yanlış adres anında anlaşılıyor.
Taviz (belgelendi): doğrulama ile asıl bağlantı iki ayrı TCP oturumu olduğu
için teorik bir TOCTOU penceresi var. Alternatifler daha kötüydü: c-client
doğrulaması paylaşımlı barındırmada hiç çalışmıyor.
Canlı doğrulama
Gerçek bir hesapla, doğrulama açıkken: bağlandı, 6639 mesaj / 14 klasör
keşfedildi ve klasör eşlemeleri doğru önerildi.
ONOXSOFT 2026.8.37 — Üretimde hata sayfası sızıntısı, takılan güncelleme, taze kurulum
Bu sürüm bir depo denetiminden çıktı: bugünkü iki canlı kusurun sınıfı
sistem genelinde arandı ve üç ayrı yerde daha aynı desen bulundu.
1. Üretimde hata sayfası ham istisna mesajını sızdırıyordu (GÜVENLİK)
`bootstrap/app.php` içindeki hata yanıtı, `APP_DEBUG=false` olan üretim
sunucularında da `$exception->getMessage()`'ı doğrudan hata sayfasına yazıyordu.
500 üreten herhangi bir sayfa, anonim ziyaretçiye şunları gösteriyordu:
```
SQLSTATE[42S02]: … (Connection: mariadb, Host: 127.0.0.1, Port: 3306,
Database: onoxsoft_panel, SQL: select * from …)
```
Yani tam sorgu, veritabanı adı, host:port, mutlak dosya yolları ve iç sınıf
adları. Saldırgan için bedava keşif. Beta ve matrix'te `APP_DEBUG=false`
doğrulandı — ikisi de bu davranıştaydı.
Kök neden ilginç: düzeltme 7.71 güvenlik sertleştirmesinde **zaten
yazılmıştı** (`SafeExceptionMessage`, 338 satır) ama o daldaki 10 commit main'e
hiç merge edilmemiş. Sınıf beta'nın diskinde duruyordu; main'de onu çağıran kod
olmadığı için ölüydü.
Politika üç kademeli:
| Durum | Davranış |
|---|---|
| 401/403/404/419/422/429/503 | `abort()` metni aynen geçer; yalnız sert sızıntı imzaları (SQL, stack, yol, sınıf adı, servis adresi) taranır |
| 5xx | Ham mesaj asla dışarı çıkmaz; kısa bir hata referansı üretilir, aynı id ham detayla log'a yazılır |
| `APP_DEBUG=true` | Sınıf hiç çağrılmaz — geliştirici deneyimi aynen korunur |
JSON/API yolunda da yalnız 5xx maskelenir; 402 (lisans), 422 (doğrulama) ve 503
(bakım modu) sözleşmeleri dokunulmadan geçer.
Kanıt: düzeltme olmadan `ErrorPageLeakTest` 5 kırık, düzeltmeyle 10/10.
2. Detach modlu güncelleme her seferinde %12'de donuyordu
Yeniden başlatma betiği doğrudan çalıştırmayı deniyordu, ama paket sysapi
betiklerini `0644` ile kuruyor (canlı ölçüm: beta'da 544, matrix'te 540 dosya
`+x` değil):
```
/bin/bash: …/onx-panel-self-update: Permission denied
```
Detached süreç anında ölüyor, transient servis "Deactivated successfully" diyor,
ilerleme %12'de donuyor ve `.log` dosyası dahi boş kalıyordu — başarısızlık
hiçbir yerde görünmüyordu.
Artık yorumlayıcı açıkça veriliyor, `$0` mutlaklaştırılıyor, okunamazsa bilinen
kurulum yollarına düşülüyor ve hiçbiri okunamazsa "başladı" demek yerine
açıkça başarısız olup ilerleme dosyasına yazılıyor.
Canlı doğrulama (beta, betik bilinçli olarak `0644`): düzeltmeden önce log
boştu; şimdi yeniden başlatılan süreç gerçekten koşup girdi doğrulamasına
ulaştı ve hatayı yazdı.
3. Taze kurulumda durum sayfası baştan yalan söylüyordu
2026.8.34–8.36 sürücü sapmasını düzeltti, ama yalnız mevcut sunucularda.
Zincirin taze-kurulum ucu ayrıca kırıktı:
- `StatusComponentsSeeder` bileşenleri `http`/`tcp` olarak kuruyor,
- onları `service` kontrollerine çeviren migration **yalnız üretim
sunucularında** vardı, depoda yoktu (beta'da batch 44 olarak kayıtlı).
Depoda olmayan şey pakete giremez → matrix/169 ve her taze kurulum ondan
mahrumdu. Yeni bir sunucu, `web-server` bileşeni gerçek servisi değil
`http://localhost/up` yoklamasını ölçen bir durum sayfasıyla başlıyordu — ve
yeni `StatusComponentReconciler` de yardım edemiyordu, o yalnız
`check_type='service'` satırlarına bakıyor.
Migration depoya alındı. `self_http` ENUM değerini de o ekliyor —
`StatusChecker` o dalı çalıştırıyor ama izlenen hiçbir migration değeri
tanımlamıyordu.
Ayrıca seeder'da: `env()` → `config()` (config önbelleklenmişse `env()` NULL
döner, `api` ve `panel-ui` endpoint'leri bozulurdu) ve FTP bileşeninin adı
kurulu olmayan yazılımı söylüyordu.
4. Test edilmeyen güvenlik korumaları mühürlendi
Aynı birleşmemiş dalın testleri de geride kalmıştı. Beşi main'e karşı
çalıştırıldı: 37 geçti, 0 kırık — yani korumalar (WHMCS HMAC replay/nonce,
PluginSandbox, health kapsamı, webroot hijyeni, OpenAPI rota paritesi) main'de
var; eksik olan yalnız regresyon kalkanıydı.
`public/.well-known/acme-challenge/manualtest` (12 bayt, elle yapılmış bir ACME
denemesinden kalma) her pakette müşterinin webroot'una gidiyordu; silindi.
Test tabanı
Temiz harness, tam paket: 228 kırık / 1234 geçen. Kırık **sınıf kümesi
2026.8.32 tabanıyla birebir aynı** (79 sınıf) — bu sürüm hiçbir testi bozmadı,
+66 test ekledi.
ONOXSOFT 2026.8.36 — Uptime kartı: ad hizalaması artık hedeften bağımsız
8.34 durum bileşeninin hedefini (systemd unit) düzeltti, 8.35 adını da
düzeltmeye başladı — ama adı yalnızca hedef AYNI ANDA değişiyorsa. Hedefi bir kez
düzeltilmiş bir sunucuda (elle komut, önceki sürüm, başka bir yol) ad artık hiç
güncellenmiyordu.
matrix'te tam olarak bu görüldü: unit `lsws`'e döndü, kontrol başarılı oldu,
ama kart hâlâ "Web Server (Apache) · Çalışıyor" yazıyordu. Yani düzeltmenin
kendisinin kör noktası vardı.
`alignNames()` artık ayrı bir adım: hedefi zaten doğru olan bileşenleri de
tarar ve adda aynı aileden başka bir marka geçiyorsa yalnız o kelimeyi değiştirir
("Web Server (Apache)" → "Web Server (OpenLiteSpeed)"). Marka geçmiyorsa ada
hiç dokunulmaz — "Ana web sunucusu" gibi kullanıcının yazdığı ad korunur.
Açıklama, kategori ve görünürlük hiçbir zaman ellenmiyor.
Test tabanı
Temiz harness, tam paket: 229 kırık / 1178 geçen. Kırık **sınıf kümesi
2026.8.32 tabanıyla birebir aynı** (79 sınıf) — bu sürüm hiçbir testi bozmadı.
Sözleşme testi sayısı 30.
ONOXSOFT 2026.8.34 — Uptime kartı sürücü değişiminde yalan söylüyordu
Belirti
Operasyon Merkezi → Observability → Uptime (24s) kartındaki `web-server`
satırı sabit görünüyordu.
Canlı ölçüm (matrix)
```
web-server endpoint=httpd 24 saatte 886 kontrol BAŞARILI: 0
gerçek adaptör: OpenLiteSpeedAdapter (unit=lsws)
systemctl: httpd=inactive lsws=active
```
Panel, sapasağlam çalışan bir web sunucusunu kalıcı kesinti olarak
gösteriyordu. Kart hardcoded değildi — veri gerçekti, ama yanlış servisi
ölçüyordu.
Kök neden
`SystemServiceImporter` durum bileşenlerini yalnız bir kez oluşturur ("slug
varsa atla"). Bu, kullanıcının düzenlediği ad/açıklamayı ezmemek için doğru bir
karardır. Ama web sunucusu veya MTA sonradan değiştirilirse bileşenin `endpoint`
alanı eski systemd unit'inde donar ve bir daha güncellenmez.
Ters yön daha tehlikeli: eski unit ayakta bırakılırsa (ör. lsws'e geçilmiş ama
httpd durdurulmamış) bileşen "çalışıyor" der ve gerçek web sunucusunun
çöktüğü hiç fark edilmez.
Düzeltme
`StatusComponentReconciler`:
- Unit adına göre uzlaştırır, slug'a göre değil. Sunucular arasında slug
farklı (`web-server`, `mail-postfix`, `ftp-proftpd`, `database-mariadb`); ortak
olan unit kümesidir.
- Yalnız `endpoint` alanını düzeltir. Ad, açıklama, kategori, görünürlük
korunur — kullanıcı emeği silinmez.
- Aktif sürücü okunamazsa hiçbir şeye dokunmaz. Ölçemediğimizde tahmin
yürütmek, yanlış unit'e yazıp izlemeyi büsbütün bozmak demektir.
Üç kancadan çağrılır:
| Kanca | Ne zaman | Neden |
|---|---|---|
| `WebServerManager::switchTo()` başarı yolu | web sunucusu değişince | anında düzeltme |
| `MailServerManager::switchTo()` başarı yolu | MTA değişince | anında düzeltme |
| `onx-panel-self-update` iyileştirme adımı | her panel güncellemesinde | mevcut bozuk durumu onarır |
Üçüncüsü şart: geçiş kodunu düzeltmek, geçişi zaten yapmış sunuculardaki
yanlış hedefi düzeltmez. Bu panelde defalarca yaşanan "kurulumda var,
güncellemede yok" sınıfı tam olarak budur.
Her iki geçiş kancası da `try/catch (\Throwable)` içinde: uzlaştırma hatası
geçişi asla başarısız göstermez — operatörün çalışan bir geçişi geri almaya
kalkması, geçişin kendisinden daha pahalıdır.
Elle onarım
```
php artisan onox:status:reconcile-services
```
Test tabanı
Tam paket, temiz harness (`git archive HEAD` + vendor + derlenmiş varlıklar):
| | kırık | geçen | kırık sınıf |
|---|---|---|---|
| 2026.8.32 (taban) | 229 | 1168 | 79 |
| 2026.8.33 | 229 | 1172 | 79 |
| 2026.8.34 | 229 | 1176 | 79 |
Kırık sınıf kümesi üçünde de birebir aynı — bu iki sürüm hiçbir testi
bozmadı, +8 yeni sözleşme testi ekledi. 229'luk kırık taban bu sürümlerden
öncedir ve ayrıca ele alınacaktır.
2026.8.35 eki — ad da düzeliyor
8.34 hedefi (systemd unit) düzeltti ama adı bıraktı: matrix'te unit `lsws`'e
döndükten sonra Uptime kartı hâlâ "Web Server (Apache) · Çalışıyor" gösteriyordu.
Kart bu kez adıyla yanıltıyordu.
Artık adda eski marka geçiyorsa yalnızca o kelime değiştiriliyor
("Web Server (Apache)" → "Web Server (OpenLiteSpeed)"). Eski marka geçmiyorsa
ada hiç dokunulmuyor — "Ana web sunucusu" gibi kullanıcının yazdığı ad korunur.
Açıklama, kategori ve görünürlük zaten ellenmiyordu.
ONOXSOFT 2026.8.34 — Uptime kartı sürücü değişiminde yalan söylüyordu
Belirti
Operasyon Merkezi → Observability → Uptime (24s) kartındaki `web-server`
satırı sabit görünüyordu.
Canlı ölçüm (matrix)
```
web-server endpoint=httpd 24 saatte 886 kontrol BAŞARILI: 0
gerçek adaptör: OpenLiteSpeedAdapter (unit=lsws)
systemctl: httpd=inactive lsws=active
```
Panel, sapasağlam çalışan bir web sunucusunu kalıcı kesinti olarak
gösteriyordu. Kart hardcoded değildi — veri gerçekti, ama yanlış servisi
ölçüyordu.
Kök neden
`SystemServiceImporter` durum bileşenlerini yalnız bir kez oluşturur ("slug
varsa atla"). Bu, kullanıcının düzenlediği ad/açıklamayı ezmemek için doğru bir
karardır. Ama web sunucusu veya MTA sonradan değiştirilirse bileşenin `endpoint`
alanı eski systemd unit'inde donar ve bir daha güncellenmez.
Ters yön daha tehlikeli: eski unit ayakta bırakılırsa (ör. lsws'e geçilmiş ama
httpd durdurulmamış) bileşen "çalışıyor" der ve gerçek web sunucusunun
çöktüğü hiç fark edilmez.
Düzeltme
`StatusComponentReconciler`:
- Unit adına göre uzlaştırır, slug'a göre değil. Sunucular arasında slug
farklı (`web-server`, `mail-postfix`, `ftp-proftpd`, `database-mariadb`); ortak
olan unit kümesidir.
- Yalnız `endpoint` alanını düzeltir. Ad, açıklama, kategori, görünürlük
korunur — kullanıcı emeği silinmez.
- Aktif sürücü okunamazsa hiçbir şeye dokunmaz. Ölçemediğimizde tahmin
yürütmek, yanlış unit'e yazıp izlemeyi büsbütün bozmak demektir.
Üç kancadan çağrılır:
| Kanca | Ne zaman | Neden |
|---|---|---|
| `WebServerManager::switchTo()` başarı yolu | web sunucusu değişince | anında düzeltme |
| `MailServerManager::switchTo()` başarı yolu | MTA değişince | anında düzeltme |
| `onx-panel-self-update` iyileştirme adımı | her panel güncellemesinde | mevcut bozuk durumu onarır |
Üçüncüsü şart: geçiş kodunu düzeltmek, geçişi zaten yapmış sunuculardaki
yanlış hedefi düzeltmez. Bu panelde defalarca yaşanan "kurulumda var,
güncellemede yok" sınıfı tam olarak budur.
Her iki geçiş kancası da `try/catch (\Throwable)` içinde: uzlaştırma hatası
geçişi asla başarısız göstermez — operatörün çalışan bir geçişi geri almaya
kalkması, geçişin kendisinden daha pahalıdır.
Elle onarım
```
php artisan onox:status:reconcile-services
```
Test tabanı
Tam paket, temiz harness (`git archive HEAD` + vendor + derlenmiş varlıklar):
| | kırık | geçen | kırık sınıf |
|---|---|---|---|
| 2026.8.32 (taban) | 229 | 1168 | 79 |
| 2026.8.33 | 229 | 1172 | 79 |
| 2026.8.34 | 229 | 1176 | 79 |
Kırık sınıf kümesi üçünde de birebir aynı — bu iki sürüm hiçbir testi
bozmadı, +8 yeni sözleşme testi ekledi. 229'luk kırık taban bu sürümlerden
öncedir ve ayrıca ele alınacaktır.
ONOXSOFT 2026.8.33 — Posta Taşıma: canlı testin ortaya çıkardığı üç kusur
2026.8.32 ile gelen Posta Taşıma özelliği beta'da uçtan uca çalıştırıldı:
izole bir test alan adında iki geçici kutu açıldı, kaynağa sentetik mesajlar
yazıldı, göç gerçekten koşturuldu ve sonrasında her şey silindi. Müşteri
kutularına dokunulmadı.
16 kontrolün 3'ü ilk turda kusur ortaya çıkardı. Üçü de **küçük kutuda görünmez,
ilk gerçek müşteri kutusunda pahalı** sınıfındandır — yani kalıp testleriyle
yakalanamazdı, ancak çalıştırarak görülebilirdi.
1. Kaynak kutu değiştiriliyordu (`FT_PEEK` yok)
`imap_body()` `FT_PEEK` olmadan çağrıldığında c-client okuduğu her mesaja
`\Seen` basar. İki sonucu vardı:
- Müşterinin ESKİ kutusundaki tüm mesajlar "okundu" oluyordu. Göçün salt
okunur olduğunu söyleyip karşı tarafın kutusunu değiştirmek kabul edilemez;
eski sağlayıcıdaki kutu müşterinin elindeki tek kopya olabilir.
- Bayrağı bizim okumamız yazdığı için hedefe her mesaj "okundu" düşerdi.
20 bin maili elle okunmamışa çevirmek mümkün değildir.
Bayrak artık gövde çekilmeden önce okunuyor, gövde `FT_PEEK` ile çekiliyor.
Canlı doğrulama: taşımadan önce ve sonra kaynak kutuda okunmuş mesaj sayısı aynı.
2. Göç 200. mesajda sessizce duruyordu
Runner uzun işi turlara böler (`BATCH = 200`) ve klasörü `pending` durumuna geri
yazar. Buna rağmen tur bitiminde göç koşulsuz `completed` işaretleniyordu:
1. Kuyruk işi devam turunu yalnız `running` durumunda tetiklediği için **kendini
yeniden kuyruğa atmıyordu** → göç 200. mesajda duruyor, panel "tamamlandı"
diyordu.
2. Uzak parola hemen silindiği için sonraki tur zaten çalışamazdı.
Yani 205 mesajlık bir kutuda 5 mesaj kayboluyordu ve kullanıcı bunu ancak eski
sağlayıcısını kapattıktan sonra fark ederdi. Artık yarım kalan klasör varsa durum
`running` kalıyor ve parola korunuyor; bitişte silinmeye devam ediyor.
Canlı doğrulama: 205 mesajlık klasörde 1. tur `kopyalanan=200 durum=running`,
2. tur `kopyalanan=205 durum=completed`.
3. Biten iş sahte "başarısız"a düşüyordu
PHP IMAP eklentisi, c-client'ın bıraktığı ve okunmayan her hata/uyarı kaydını
istek sonunda `E_NOTICE` olarak yayar (`PHP Request Shutdown: … (errflg=1)`).
Laravel'in hata yakalayıcısı bunu `ErrorException`'a çevirir.
Yerel kutuya loopback üzerinden `/notls` ile bağlandığımız için c-client **her
göçte** `SECURITY PROBLEM: insecure server advertised AUTH=PLAIN` uyarısı
bırakıyordu. Sonuç: mesajların tamamı başarıyla taşındıktan sonra iş ölümcül
hatayla düşer, "başarısız" işaretlenir ve müşteriye yanlış bildirim giderdi.
Canlı testte tam olarak bu görüldü: 14/14 kontrol geçti, ardından fatal.
`ImapConnector::drainNotices()` eklendi (hem hata hem uyarı yığını — ikisi ayrı).
Her bağlantı kurulumunda, her yazımdan sonra ve `run()` çıkışında (`finally`)
boşaltılıyor. Doğrulama gerçek kuyruk işiyle, ayrı süreçte yapıldı: çıktıda
ölümcül hata yok, göç `completed`.
Sözleşme testleri
Üç kusur da `tests/Unit/Mail/MailMigrationContractTest.php` içinde mühürlendi
(16 → 19 test). Her testin başında neden bulunuyor; bir refactor bu
davranışları sessizce düşüremesin.
Test tabanı — 2026.8.32 notundaki düzeltme
8.32 notunda "507 → 523 test, sıfır hata" yazıyor. Bu ölçüm dar kapsamlıydı.
Repo'dan (`git archive HEAD`) kurulan temiz bir harness'ta tam paket 1405 test
içeriyor ve 228'i kırık — ve bu sayı bu sürümden önce de aynı. Yani:
- Bu sürüm hiçbir testi bozmuyor (229 → 228 kırık, 1168 → 1172 geçen).
- Ama "taban tertemiz" ifadesi tam paket için doğru değildi.
Kırıkların büyük kısmı ortam kaynaklı görünüyor (77'si `ViewException`; derlenmiş
varlıklar eklendiğinde 290'dan 228'e düştü). Ayrıştırma sürüyor; sonuç ayrı
raporlanacak.
ONOXSOFT 2026.8.32 — Posta Taşıma + Operasyon Merkezi Geri Dönüşü
1. Posta Taşıma (IMAP göç) — YENİ
DirectAdmin'in IMAPSync'inin muadili. Panelde şimdiye kadar yalnız e-posta ADRESİ
içe aktarma vardı (CSV); posta İÇERİĞİNİ taşıyan hiçbir şey yoktu — müşteri başka
bir hosting'den geldiğinde binlerce maili elle çekmek zorundaydı.
E-Posta hesapları → Posta Taşıma sekmesinde, tamamı Türkçe bir sihirbaz.
Neden `imapsync` değil
`imapsync` bir Perl betiğidir ve onlarca Perl bağımlılığı ister; AlmaLinux
depolarında (EPEL etkinken bile) paketi YOK — canlıda doğrulandı. Kendi kurulum
adımımızı yazmak, 2026.8.27–8.29'da üç kez düzeltilen *"kurulumda var, güncellemede
yok"* tuzağını dördüncü kez kurardı. PHP IMAP eklentisi üç sunucuda da ZATEN kurulu.
Tam otomatik
- Ayar tespiti: e-posta adresinden. Bilinen sağlayıcılar (Gmail, Outlook,
Yandex, Yahoo, Zoho) tablodan; diğerleri için `imap.` / `mail.` / `webmail.`
DNS'te denenir. Hiçbiri çözülmezse uydurma host önerilmez — elle giriş istenir.
- Klasör eşleme: `[Gmail]/Sent Mail`, `Sent Items`, `Gönderilmiş` → hepsi `Sent`.
Müşterinin özel klasör ağacı korunur.
- Bağlantı testi zorunlu: klasör listesi ve mesaj sayıları taşımadan önce
gösterilir; yanlış bilgiyle kuyruğa iş atılmaz.
- Kuru çalıştırma: hedefe hiçbir şey yazılmadan rapor üretilir.
Dayanıklılık
- İlerleme Cache'te DEĞİL DB'de — eviction/restart bir göçü kaybetmemeli.
- Klasör bazında `last_uid` → worker ölürse baştan başlamaz, en fazla 1 mesaj
tekrarlanır.
- İş kendini parçalayarak yeniden kuyruğa atar; tek job worker'ı saatlerce kilitlemez.
- `tries` + backoff + tur üst sınırı.
Güvenlik
- Uzak parola at-rest şifreli (`encrypted` cast) ve başarı/başarısızlık/iptal
yollarının HEPSİNDE silinir. "Şifreli" etiketi takıp düz metin yazmıyoruz.
- Sahiplik doğrulaması: başka hesabın kutusuna göç engellenir.
- Askıya alınmış hesapta taşıma başlatılmaz; aynı kutuda ikinci göç engellenir.
- Parola JSON/array çıktısından gizli (`$hidden`).
Dovecot'a yazım
Maildir'e doğrudan dosya yazmak yerine localhost IMAP + `imap_append`: Dovecot
dosya adlandırma, index ve kotayı kendi kurallarıyla halleder. Kimlik için webmail
SSO'nun zaten üretimde kullandığı master-user — müşteri parolası saklanmaz.
Spam yok
Taşıma bitince TEK özet; klasör veya tur başına bildirim YOK (2026-07/08'deki iki
spam olayının dersi).
2. Operasyon Merkezi geri geldi
`7beb6a8a` ("prod /opt tam senkronu") 61 dosya silmişti; 41'i
`app/Domain/Operations` altındaki Operasyon Merkezi uygulamasıydı — ayrıca
`config/operations.php`, üç migration, üç konsol komutu, iki Vue sayfası ve altı
sysapi betiği (`php-config-read`, `redis-config-read`, `redis-tune`,
`mysql-config-read`, `mysql-set-global`, `php-system-ini-write`).
Bu bir "prod'dan repo'yu senkronla" işlemiydi: prod'da olmayan bir özellik repo'dan
kaldırıldı. Testleri geride kaldığı için 13 test kırık kaldı ve **kırmızı tabanın
içinde 8 hafta fark edilmedi**.
DERS: prod→repo senkronu tek yönlü uygulanırsa repo'da olup prod'da olmayan her
şeyi siler. Böyle bir senkrondan sonra silinen dosya listesi gözden geçirilmelidir.
3. Test tabanı ilk kez tertemiz
507 → 523 test, sıfır hata. Düzeltilen kırık testlerin hiçbirinde beklenti
gevşetilmedi; üçünde tam tersine kodun bilinçli davranışı korunacak şekilde test
güncellendi (ölçülemedi ≠ hata; sync admin adını ezmez; tek birleşik SSL uyarısı).
`DiskScorerTest` KARARSIZDI: `PackageFactory` `disk_mb`'yi rastgele seçiyordu ve
hesap kotası null iken kod haklı olarak paket kotasına düşüyor — kura null gelirse
geçiyordu. Artık deterministik.
⚠️ Ölçülen ilk taban güvenilmezdi: `/root/onox-pest` harness'ı VERSION 1.2.0'daydı
ve `DnsHealthStatus`, `queue.failed` route'u, `templates/` orada yoktu. Harness
repo'ya senkronlandı.
Kümülatif kapsam
2026.8.24–2026.8.31 eksiksiz dahildir.
ONOXSOFT 2026.8.31 — Sahte Veri, Spam Kaynakları ve Sıfır Kurulum
Çok-ajanlı denetim (5 boyut: spam, fallback, mock/stub, ilk kurulum, hardcoded).
20 bulgu, 14'ü düşmanca doğrulamadan geçti. Hepsi bu sürümde kapatıldı.
1. Panel uydurma veri gösteriyordu
Admin → Mail → Postfix sayfası tamamen sahte veri döndürüyordu: `service: 'active'`,
`pid: 12345`, kuyruk `42` ve 10 satır uydurma mail (sahte gönderen/sebeplerle).
Postfix gerçekten çökmüş olsa bile sayfa "aktif" diyordu — panelin tek görevi olan
şeyi yapmıyor, üstelik gerçek arızayı aktif olarak gizliyordu.
Artık `postqueue-status` / `service-status`'tan okunuyor. Okunamazsa uydurma
YAPILMIYOR: `unknown` dönüyor ve UI'da ayrı bir "Ölçülemedi" durumu var —
"ölçülemedi" ile "durdu" karıştırılmıyor (bu ayrım panelde daha önce yanlış alarm
üretmişti).
Antivirüs: motor kurulu değilken `NoneAntivirusAdapter::scan()` `'clean' => true`
dönüyor ve tarama "Tamamlandı, temiz" kaydediliyordu — sahte güvenlik güvencesi.
Artık motor yoksa tarama `Failed` işaretleniyor.
Mail NoneAdapter: `isInstalled()`/`isRunning()` `true` dönüyordu; sınıfın kendi
docblock'u "production'da kullanılmaz, UI'da kırmızı uyarı" derken kod tersini
yapıyordu. Dürüst `false` oldu.
Yedek şifreleme: panelde açılabiliyor ama hiçbir kod okumuyor —
`RunBackupScheduleJob` zaten "sifreleme uygulanmadi — yedek DUZ-METIN uretiliyor"
uyarısı logluyordu. Yani kod gerçeği biliyor, log doğruyu söylüyor, UI yalan
söylüyordu. Açıklamalar gerçeği söylüyor ve açık bırakılmış ayar kapatılıyor.
2. Müşteriye zarar veren sabit değer
SPF önerisinde RFC 5737 belge IP'si (`198.51.100.42`) gösteriliyordu.
`MAIL_SERVER_IP`'yi yazan hiçbir yer yok — yani her kurulumda. Müşteri bunu
uygularsa SPF gerçek sunucuyu yetkilendirmez ve kendi meşru postaları spam'e düşer;
sessiz ve teşhisi zor bir hasar. Artık panelin gerçek IP tespitine düşüyor;
belirlenemezse `ip4:` bileşeni hiç önerilmiyor (`v=spf1 a mx ~all`).
Let's Encrypt hesap e-postası her kuruluma `admin@onox.com.tr` olarak
tohumlanıyordu: white-label alıcısının sertifika süre-bitim uyarıları satıcıya
gidiyordu. Boş bırakıldı.
Panel SSL portu: `WebServerManager` `PANEL_SSL_PORT` okuyordu ama `install.sh`
`ONOXSOFT_PANEL_SSL_PORT` yazıyor — özel port ayarlansa bile bu yol her zaman 666
kullanıyordu. Tek kaynak `config('onoxsoft.panel.ssl_port')`.
3. Spam kaynakları
- WP-cron `cron.d` dosyasında `MAILTO=""` yoktu ve `>/dev/null 2>&1` yalnız
ikinci komuta bağlıydı; site silinince/taşınınca `cd <docroot>` hatası stderr'e
düşüp postalanıyordu. 5 dk aralıkla yetim başına 288 mail/gün.
- Hesap sonlandırmada `/etc/cron.d/onoxsoft-<user>` ve `onoxsoft-wpcron-*`
temizlenmiyordu. Bu dosyalar root sahipli `/etc` altında olduğu için `userdel -r`
onlara dokunmaz → crond her dakika "ORPHAN (no passwd entry)" basıyor, kullanıcı
adı yeniden kullanılırsa eski komutlar YENİ hesabın kimliğiyle çalışıyordu.
- sysapi log'u (`/var/log/onox/sysapi.log`) logrotate kapsamı dışındaydı; kural
yalnız `/var/log/onoxsoft/*.log` kapsıyordu → her sysapi çağrısı bir satır,
sınırsız büyüme.
4. Sıfır kurulum
- WebDAV adımı Debian/Ubuntu kurulumunu öldürüyordu: `chown apache:apache`
(Debian'da `www-data`) ve `/etc/httpd/conf.d/` (Debian'da yok). `run` die ettiği
için kurulum tam orada bitiyordu. Dağıtım değişkenlerinden türetiliyor +
`a2enmod dav dav_fs` / `a2enconf`.
- Debian'da phpredis hiç kurulmuyordu ama `.env` `REDIS_CLIENT=phpredis` diyor
ve session/cache/queue redis sürücüsünü kullanıyor → panel ilk istekte
"Class Redis not found" ile ölürdü.
- el10'da OWASP CRS kurulmuyordu. Paket yok ve yorumdaki "ayrı kaynaktan gelir
(follow-up)" hiç yapılmamıştı: ModSecurity motoru kuralsız çalışıyor, panel
"CRS aktif" diyordu — sıfır koruma, tam güvence. Kurulum artık
`onx-modsec-crs-update` ile upstream'den kuruyor.
5. Ölü + bozuk kod
`removeAccountCronJobs()` hiçbir yerden çağrılmıyordu ve çağırdığı `cron-remove`
sysapi eyleminin arkasında betik yoktu (`onx-cron-remove` hiç yazılmamış) — biri
bağlasaydı üretimde patlardı. Kaldırıldı; beyaz listeden de çıkarıldı. Gerçek
temizlik `onx-user-terminate` Step 7b'de.
Ayrıca
8.30'daki fail2ban onarım migration'ı yanlış tabloyu (`fail2ban_jails` yerine
`fail2ban_jails_meta`) hedeflemişti; `hasTable` koruması yüzünden **sessizce hiçbir
şey yapmadan** "çalıştı" kaydedilmişti. Düzeltildi + bu hata sınıfını yakalayan test
eklendi (onarım migration'larının dokunduğu tablo şemada tanımlı olmalı).
Kümülatif kapsam
2026.8.24–2026.8.30 eksiksiz dahildir.
ONOXSOFT 2026.8.30 — Denetimin Artık Maddeleri
8.29'da "sonraya bırakılabilir" kovasına konan dört madde kapatıldı.
1. Marka/panel adresi için tek kaynak
Panel adresi her yazıcıda ayrı ayrı, çoğu zaman sabit ONOXSOFT değeriyle
fallback'leniyordu:
```
onx-vhost-add-nginx ${REDIRECT_TO:-https://panel.onoxsoft.com.tr:666/...}
onx-vhost-add-caddy ${REDIRECT_TO:-https://panel.onoxsoft.com.tr:666/...}
onx-vhost-add-ols ${PANEL_URL:-https://panel.onoxsoft.com.tr:666}
```
Çağıran değişkeni göndermediğinde müşteri başka bir firmanın paneline
yönlendiriliyordu. Aynı sızıntı 8.26–8.29 arasında üç ayrı yazıcıda ayrı ayrı
bulundu — çünkü ortak kaynak yoktu.
`scripts/sysapi/_lib/brand.sh` eklendi: `onx_panel_url()` /
`onx_panel_url_or_die()`. Öncelik `PANEL_URL` env → `/etc/onoxsoft/panel-url` →
`.env APP_URL` → `hostname:666`. Değer `http(s)://host[:port][/path]` desenine
uymuyorsa boş döner (bozuk dosya açık yönlendirme yüzeyi açmasın); `user@host`
içeren adres reddedilir. Zorunlu yerlerde `_or_die` yanlış panele yönlendirmek
yerine işlemi durdurur. Üç yazıcı da bu kaynağa çevrildi — yeni bir yazıcı
eklendiğinde doğru davranış artık varsayılan.
2. Çıkış kodu sözleşmesi
Panel `SysapiResult::errorCategory()` ile exit code'u kategoriye çeviriyor
(`5 = critical_rollback_fail`). Ama bazı betikler 5/6/7'yi alakasız anlamlarla
kullanıyordu; sonuç olarak bir kullanıcı hatası panelde "kritik rollback
hatası" olarak görünüyordu:
| Betik | Eskiden | Gerçek anlamı | Şimdi |
|---|---|---|---|
| `onx-account-migrate` | 5 | "confirm:true gerekli" = geçersiz girdi | 1 |
| `onx-account-migrate` | 6 | "bu node kaynak değil" = önkoşul | 2 |
| `onx-account-migrate` | 7 | "snapshot-create başarısız" = çalıştırma | 3 |
| `onx-modsec-install-driver` | 5 | "nginx.conf yok" = önkoşul | 2 |
| `onx-cluster-token-rotate` | 5 | TMP'de doğrulama (commit yok) = çalıştırma | 3 |
`onx-modsec-rule-write:146` 5'te bırakıldı — orada gerçekten rollback başarısız
oluyor, yani doğru kullanım.
Sözleşme `_lib/common.sh`'ta tek kaynakta belgelendi ve `onx_die` artık sözleşme
dışı bir kod verilirse logluyor ve 3'e düşürüyor (panel "unknown" görmesin).
6 ve 7 tanımlı değil.
3. fail2ban `panel-login` şablonu disk gerçeğiyle hizalandı
Şablon (`fail2banTemplates.js`) ve seeder-migration şunu kaydediyordu:
```
filter = panel-login → böyle bir filtre dosyası YOK
logpath = /var/log/onox/panel.log → dizin adı bile farklı (onox/ ≠ onoxsoft/)
```
Diskteki gerçek: `onoxsoft-panel-login` + `/var/log/onoxsoft/panel-auth.log`.
Bu şablondan jail kuran admin sessizce çalışmayan bir jail elde ediyordu. Yeni
kurulumlar düzeltilmiş migration ile doğru geliyor; mevcut kurulumlardaki bayat
satır için onarım migration'ı eklendi (yalnız bilinen-yanlış değerleri düzeltir,
admin özelleştirmesine dokunmaz).
4. Dil dosyası paritesi
`flat.en.json` ve `flat.tr.json` diğer sekiz dilden 8 anahtar fazlaydı —
yani o sekiz dilde WebAdmin giriş alanları, DNS kaydı silme onayı ve parola
alanları çevrilmemişti; kullanıcı ham Türkçe anahtarı görüyordu. Sekiz anahtar
sekiz dile de çevrildi: 10/10 dilde tam parite (10.150 anahtar).
Kümülatif kapsam
2026.8.24–2026.8.29 eksiksiz dahildir.
ONOXSOFT 2026.8.29 — Denetim Düzeltmeleri + Turbo Pasif Ayrıştırma
Çok-ajanlı denetim (5 boyut, düşmanca doğrulama) 20 bulgu üretti, 17'si onaylandı,
3'ü çürütüldü. Bu sürüm onaylananların kritik olanlarını ve açıkça istenen Turbo
pasif ayrıştırmasını kapsar.
1. Panel yönlendirmesi — ikinci yazıcı
`scripts/sysapi/onx-ols-vhosts-unified-rewrite:657` müşterinin `panel.<alan>`
docroot'una index.php üretirken hedefi hiçbir değişkenden okumuyordu:
```
header('Location: https://panel.onoxsoft.com.tr:666/customer/dashboard', ...)
```
2026.8.26'daki çalışma-anı çözümü yalnız `scripts/autodiscover/*` dosyalarına
uygulanmıştı; bu ikinci üretici düzeltmeden kaçmıştı. Bu betik OLS'e geçişte
zorunlu adım olduğundan, white-label bir kurulumda web sunucusu değiştirildiğinde
müşteriler başka bir firmanın paneline yönlendirilmeye geri dönüyordu.
Adres artık `/etc/onoxsoft/panel-url`'den okunuyor; okunamazsa index.php **hiç
yazılmıyor** (yanlış hosta atmaktansa hiç atmamak doğrudur — PHP tarafındaki
`SystemSubdomainProvisioner::panelRedirectUrl()` aynı kararı veriyor).
2. WAF olayları panele hiç yazılmıyordu
`modsecurity_audit_events.uri` `VARCHAR(500)`, yazan kod ise kırpmıyordu. WAF'ın
yakaladığı saldırı URI'leri uzun olduğu için `SQLSTATE[22001]` atıyor ve insert
korumasız olduğundan tüm parti düşüyordu. Canlıda ölçüldü (matrix, 2 günde 22
kez — `onox:modsec:audit-parse` her koşuda başarısız): WAF çalışırken panelin
"Engellenen Kurallar" ekranı boş kalıyordu.
Saldırganın belirlediği tüm kolonlar (`uri` 500, `domain_name` 253, `method` 10,
`rule_tag` 100) kolon genişliğine kırpılıyor; insert satır-bazlı `try/catch` içine
alındı — tek bozuk olay artık partiyi düşürmüyor.
3. Sıfır kurulumu öldüren üç hata
- `-x` kapıları hep FALSE. Kurulum sonu bootstrap adımları
`[[ -x "${ONOX_HOME}/scripts/sysapi/..." ]]` ile kapılıydı; depodaki sysapi
dosyalarının modu `100644` ve boru hattında kaynak ağacına `chmod +x` yok. Kapı
hiçbir zaman açılmıyor, `else` dalı da olmadığı için log'a tek satır düşmüyordu.
Belirti: `pureftpd.passwd` hiç oluşmuyor → her hesapta
`onx-ftp-pure-user-add` exit 2. Çağrılar zaten `bash "..."` ile yapıldığı için
exec bitine gerek yok — 6 kapı `-f` yapıldı.
- `pkg_install X || warn` ölü kod. `pkg_install` içindeki `run`, başarısızlıkta
`die` (yani `exit`) çağırıyor; `||` yalnız errexit'i bastırır, açık exit'i değil.
Opsiyonel sanılan tek bir paket (EPEL10'da phpMyAdmin, grepcidr, restic/rclone/
sshpass) bulunamadığında tüm kurulum ölüyordu. `pkg_install_optional`
(try_run tabanlı) eklendi; yalnız gerçekten opsiyonel 5 çağrı ona çevrildi.
Aynı sebeple `onox:install:service-enforcement` çağrısı da `try_run`'a alındı —
eskiden bu adım patlarsa kurulum admin kullanıcısı oluşmadan ölüyor ve
`ADMIN_TEMP_PASS` hiç basılmadığı için panele giriş imkânsız kalıyordu.
- `_install_web_server_debian` tanımsızdı. `install.sh:1887`'den çağrılıyor ama
hiçbir yerde tanımlı değildi; `set -euo pipefail` altında exit 127. Usage'da
resmen desteklenen Debian 11/12 + Ubuntu 22.04/24.04 kurulumları step 4'te
ölüyordu. Fonksiyon yazıldı (apache2 + gerekli modüller / nginx; OLS için açık
uyarı + apache2'ye düşüş).
4. Roundcube markası — ikinci yazıcı
`scripts/sysapi/onx-webmail-ensure` aynı `config.inc.php`'yi yazan ikinci üretici
olmasına rağmen 8.27'deki marka düzeltmesinden kaçmıştı ve her self-update'te
çağrılıyor. Üstelik sıfır kurulumda config'i çoğu zaman bu betik yazıyor
(`_install_roundcube_rhel`, MariaDB henüz ayakta olmadığı için markalı yazımdan
önce `return 0` ile çıkıyor) — yani sabit ONOXSOFT değerleri istisna değil,
varsayılan yoldu. Değer müşteriye görünür: onox skin'inin giriş ekranı
`support_url`'i link olarak basıyor.
Artık `BRAND_SUPPORT_URL` / `BRAND_NAME` / `/etc/onoxsoft/panel-url`'den türetiliyor
ve mevcut config'teki özel değerler korunuyor.
5. Turbo Önbellek — pasif ayrıştırma
Turbo işlem uçlarının 10'u yalnız "domains satırı var mı" bakıyordu; `domains.status`,
`accounts.status`, `domains.dns_status` hiç okunmuyordu. Askıya alınmış hesabın veya
DNS'i pasif alanın docroot'una drop-in yazılıyor, warm/webp/browser-cache job'ları
kuyruğa giriyordu. Sağlık kontrolü `curl --resolve 127.0.0.1` kullandığı için panel
"açıldı" diyordu — müşteriye hiç ulaşmayan iş üretiliyordu.
Doğru yüklem depoda zaten vardı ama yalnız `TurboAutopilotCommand` içinde
gömülüydü; bu ayrışma hatanın ta kendisiydi.
- `app/Domain/TurboCache/Support/TurboEligibility.php` (yeni) — tek uygunluk
kaynağı. Hosting Hesapları ekranıyla aynı semantik: Askıda = hesap aktif değil,
DNS Pasif = `dns_status = inactive`.
- Kapı yalnız mutasyon uçlarında. Açma/optimizasyon (toggle-on, phase, webp,
defer, htmlopt, rum) pasif sitede `409` döner. Okuma ve purge/kapatma serbest
kalır — askıya alınan sitede yöneticinin drop-in'i temizleyebilmesi gerekir,
aksi halde kalıntı sonsuza kadar kalır.
- `enableAll` artık ortak yüklemi kullanıyor (eskiden yalnız `domains.status`'a
bakıyordu; hesap askıya alınınca `domains.status` değişmediği için askıdaki
hesapların alanları da toplu açılıyordu).
- `BulkTurboEnableJob` iş anında yeniden doğruluyor (kuyruk gecikmesinde hesap
askıya alınmış olabilir) ve `skipped_passive` olayı yazıyor.
- `onox:turbo-heal` pasif sitelerde onarım denemiyor.
- `TurboOverview` her siteye `passive` + `passive_reason`, dönüşe `passive_count` +
`operable_total` ekliyor. Kapsam yüzdesi artık pasifler hariç hesaplanıyor —
eskiden askıdaki siteler paydayı şişirip kapsamı yapay olarak düşürüyordu.
- UI: aktifler üstte, pasifler altta gruplanır; Askıda (turuncu) / DNS pasif
(kehribar) rozeti; pasifte açma butonu kilitli, kapatma/purge açık. 10 dilde tam
çeviri.
6. Hosting hoş geldin maili müşteriye ulaşmıyordu
`SendWelcomeMailOnAccountCreated` alıcıyı `$owner?->email ?: $account->email`
sırasıyla seçiyordu. `owner_user_id` her hesapta dolu olduğundan **sahip her zaman
kazanıyor**, hesabın kendi (müşteri) e-postası hiç kullanılmıyordu. Canlıda ölçüldü
(beta, hesap `onx_safakcekic`): hesap e-postası `onoxyazilim@gmail.com` iken mail
sahibin adresine (`info@onoxsoft.com.tr`) gitti, o kutu var olmadığı için
`550 5.1.1 User unknown` ile bounce etti — müşteri hiçbir şey almadı.
Bu mail geçici parola + FTP bilgisi taşır, yani müşteriye aittir; sahibin/bayinin
kendi bildirimi zaten ayrı kanaldan gidiyor (`notifyResellerOnAccountEvent`). Sıra
ters çevrildi; sahip yalnızca hesapta e-posta yoksa yedek alıcı.
Ayrıca "hosting bilgilerini e-posta ile gönder" tercihi hiçbir şey yapmıyordu:
controller yalnız `admin_notes`'a not düşüyor, listener bayrağı hiç görmüyordu →
kutu işaretlenmese bile parola ve FTP bilgileri e-postayla gidiyordu. Tercih artık
`password_plain` ile aynı transient + cache kalıbıyla provision sonrası ikinci
dispatch'e taşınıyor ve uygulanıyor. Bayrağı taşımayan yollarda varsayılan `true` —
sessizce welcome mail kaybı olmaz.
7. `/etc` artefaktları güncellemede tazelenmiyordu
`onx-panel-self-update` kök `install.sh`'ı çağırmıyor ve `/etc` altına yalnız tek bir
artefaktı tazeliyordu. Dört idempotent adım eklendi:
- `logrotate_ensure` — 7.42'de `su ${WEB_USER} ${WEB_GROUP}` → `su root root`
düzeltilmişti ama güncellenen sunucular bozuk satırla kaldı: root sahipli loglar
(acme-renew, ssl-retry, panel-db-backup) dönmüyor ve `logrotate.service` FAILED
oluyordu. Yalnız dosya yokluğuna değil, bozuk `su` satırına da bakıyor.
- `panel_db_backup_cron_ensure` — eski sunucularda panel DB günlük felaket yedeği
hiç alınmıyordu (2026-06 prod-wipe dersi tam olarak buydu).
- `webdisk_ensure` — kurucu yalnız `install.sh`'tan çağrılıyordu; mevcut
sunucularda WebDisk provizyonu `rclone backend start failed` (exit 3) ile düşüyordu.
- `fail2ban_panel_login_ensure` — aşağıya bakınız.
8. fail2ban `panel-login` jail'i sonsuza kadar 0 ban üretiyordu
Jail `enabled = true` görünüyordu ama iki yönden birden kırıktı:
1. Filtrenin aradığı `[ONOX-AUTH] failed login ... ip=<HOST>` satırını yazan **hiçbir
kod yoktu** — `ONOX-AUTH` dizesi tüm depoda yalnız filtre dosyasında geçiyordu.
2. `logpath` `storage/logs/laravel.log`'a bakıyordu; `LOG_CHANNEL=daily` olduğu için
gerçek dosya `laravel-YYYY-MM-DD.log` ve izlenen dosya aylardır yazılmıyordu.
Sonuç: hesap değiştirerek yapılan tek-IP parola denemelerinde IP-ban katmanı hiç
devreye girmiyordu (mevcut rate limiter e-posta+IP anahtarlı olduğu için saldırgan
her denemede farklı kullanıcı adı vererek onu da baypas edebiliyordu).
`Auth\Events\Failed` dinleyicisi (`LogFailedPanelLogin`) eklendi; satır ayrı ve
sabit adlı bir dosyaya yazılıyor (`/var/log/onoxsoft/panel-auth.log`, yeni
`onox_auth` log kanalı). Parola asla loglanmaz. Filtre `[[ ! -f ]]` kapısından
kurtarıldı (artık her koşuda tazelenir) ve jail bu dosyaya yönlendirildi.
9. `onx-vhost-add` panel sistem yollarını reddediyordu
Birinci doc_root kapısı 7.84'te panel yollarını izinli yapmıştı ama "doc_root yoksa
oluştur" dalı eski dar listede kaldı; `SystemSubdomainProvisioner` tam bu yolları
gönderdiği için `webmail.` / `mail.` / `autodiscover.` / `autoconfig.` vhost'ları
oluşmuyordu. Artık açık bir preflight hatası dönüyor — `mkdir`/`chown` YAPILMIYOR:
`/usr/share/roundcubemail` paylaşılan bir panel yoludur, müşteri hesabına chown
edilirse o müşteri tüm kiracıların webmail kurulumuna yazabilir hâle gelirdi.
10. License heartbeat, KillSwitch'ten önce kurtarma denemiyordu
`onox:license-recover` hiçbir yerden zamanlanmıyordu; tek çağıran self-update'ti.
JWT kaybolduğunda gözetimsiz sunucuda kendiliğinden iyileşme yoktu: 7 fail / 42 saat
sonra lisansı geçerli sunucuda KillSwitch açılıp postfix+dovecot durduruluyordu
(canlı: matrix, 16 kez). İnsan panele girerse `BuyController::tryRecoverLicense`
zaten kurtarıyordu — boşluk tam olarak otomatik/cron yolundaydı.
KillSwitch'ten önce saatte en fazla bir kurtarma denemesi yapılıyor; LCS'ye yük
bindirmemek ve gerçek lisans bitişini maskelememek için tavan konuldu, deneme ve
sonucu açıkça loglanıyor.
11. Release paketleyici bayat vendor/build'i sessizce paketliyordu
Kapılar yalnız "dizin var mı" bakıyordu; composer/npm yoksa betik uyarıp devam
ediyordu. Bayat vendor sunucuda kalıcı olur (self-update composer'ı yalnız
`composer.lock` sha'sı değişince koşturur). İki parite kapısı eklendi:
`vendor/composer/installed.json` ↔ `composer.lock` (laravel/framework sürümü) ve her
`resources/js/Pages/**/*.vue` ↔ `public/build/manifest.json`. İkisi de
`ONOX_ALLOW_STALE_VENDOR=1` / `ONOX_ALLOW_STALE_BUILD=1` ile bilinçli geçilebilir.
Bu sürümde ele alınmayan (denetimde onaylandı, sırada)
- Marka değerleri için ortak `scripts/sysapi/_lib/brand.sh` kaynağı ve tüm
yazıcıların ona çevrilmesi (nginx/caddy fallback sabitleri dahil).
- fail2ban jail adı/logpath uyumsuzluğu: migration `2026_05_16_130000` ve
`resources/js/data/fail2banTemplates.js` ↔ disk gerçeği.
- sysapi exit kodu semantiğinin genelleştirilmesi (1 = geçersiz girdi, 2 = preflight).
- `flat.en.json` / `flat.tr.json` diğer sekiz dilden 8 anahtar fazla (bu sürümden
ÖNCE de vardı).
Kümülatif kapsam
2026.8.24–2026.8.28 eksiksiz dahildir.
ONOXSOFT 2026.8.28 — Vhost Render Kapısı + Kalan Marka Sızıntıları
1. Yeni açılan site 403 veriyordu
Canlı (beta, 2026-08-04): iki yeni site, docroot'ta `index.php` olmasına rağmen
403 döndü. Sebep, `vhconf.conf`'ta yerine KONMAMIŞ bir placeholder'dı:
```
allowBrowse ${OLS_ALLOW_BROWSE}
```
Template bu adı taşıyordu; yazıcı betik ise ismi `OLS_AUTO_INDEX`'e çevirmişti.
Doğru düzeltme buydu — OLS'te `allowBrowse 0` dizin-listelemeyi kapatmaz, **tüm
context'i 403'ler**; listeleme yalnız `autoIndex` ile kapatılır. Ama eski adla
yazılmış placeholder hiç yerine konmadı ve OLS tanımsız değeri 0 okudu.
Siteler 21:04–21:05'te açıldı, betik 21:15'te düzeltildi: aradaki 10 dakikada
yazılan iki vhost bozuk kaldı ve onları hiçbir şey onarmıyordu. Sunucudaki diğer
2185 vhost'ta `allowBrowse 1` literal ve sağlıklıydı.
Düzeltme — iki katman
Önleme (asıl olan). `onx-vhost-add-ols`, `onx-vhost-add-caddy` ve
`onx-vhost-add-nginx` artık render sonucunu kurulumdan ÖNCE denetliyor: geriye tek
bir `${...}` kalmışsa vhost yazılmıyor, hata dönülüyor. Bozuk (403'leyen) bir
vhost yazmaktansa mevcut durumu korumak her zaman doğrudur. Yerine-koyma listesine
güvenmek yetmez — hata zaten template ile betiğin placeholder isimlerinin
ayrışmasından çıktı; bu yüzden çıktının kendisi denetleniyor.
Onarım. `onx-vhost-placeholder-heal` mevcut bozuk vhost'ları tarar, güvenli
varsayılana çevirir (`allowBrowse 1` + `autoIndex 0`) ve OLS'i reload eder.
Tanımadığı bir placeholder görürse dosyayı bozmak yerine yedeği geri alıp raporlar.
`verify` modu hiçbir şey yazmaz. Self-update'e `vhost_placeholder_heal` adımı
olarak bağlandı.
2. Kalan white-label marka sızıntıları
2026.8.27'de üç sızıntı kapatılmıştı; genişletilmiş tarama dördünü daha buldu.
- Panel footer'ı — `PanelFooter.vue` içinde `https://onox.com.tr/security`
SABİT gömülüydü; her white-label müşterisi panelin altında başka bir firmanın
adresini görüyordu. Artık `BRAND_SECURITY_URL` marka ayarından geliyor ve
tanımsızsa link hiç render edilmiyor.
⚠️ Onoxsoft'un kendi kurulumlarında linkin görünmesi için `.env`'e
`BRAND_SECURITY_URL=https://onox.com.tr/security` eklenmelidir.
- "onox.com.tr üzerinden upgrade yap" mesajı — 10 dilde duran, kodda hiçbir
yerden çağrılmayan (orphan) bir i18n anahtarıydı; kaldırıldı.
- i18n örnek metinleri — `mail.onoxsoft.com.tr` ve `hostmaster.onox.com.tr`
placeholder örnekleri `example.com`'a çevrildi (10 dil + kaynak bileşenler).
- `scripts/telegram-token-fix/install.sh` — `PANEL_HOST` sabit
`panel.onoxsoft.com.tr:666` idi; white-label sunucuda çalıştırıldığında başka bir
kurulumun paneline bakıyordu. Artık `/etc/onoxsoft/panel-url` → `.env APP_URL` →
`hostname:666` sırasıyla türetiliyor.
Sabit IP taraması temiz (yalnız test ve yorum satırlarında).
Bilinen, bu sürümde ele alınmayan
`flat.en.json` ve `flat.tr.json` diğer sekiz dilden 8 anahtar fazla taşıyor. Bu
sapma bu sürümden ÖNCE de vardı ve ayrı bir iş olarak duruyor.
Kümülatif kapsam
2026.8.24–2026.8.27 eksiksiz dahildir.
ONOXSOFT 2026.8.27 — Güncellemenin Gerçekten Uygulanması + White-Label Sızıntıları
Bu bakım sürümü iki sınıf sorunu giderir: (1) 8.25/8.26'da paketlenen düzeltmelerin
mevcut sunuculara hiç ulaşmaması, (2) white-label kurulumlara sızan sabit
onoxsoft değerleri.
1. "Pakete girdi" ≠ "uygulandı"
8.25 ve 8.26'nın düzeltmeleri pakete girdi, sürüm numarası yükseldi, self-update
35 adımın hepsine `ok` dedi — ve belirtiler aynen devam etti.
1a. Paylaşılan autodiscover endpoint'i tazelenmiyordu
`scripts/autodiscover/install.sh` YALNIZ `install.sh`'tan (sıfırdan kurulum)
çağrılıyordu; self-update yolunda hiç çalışmıyordu. Sonuç:
`/usr/local/onoxsoft/autodiscover/index.php` ilk kurulumda yazıldığı hâlde kalıyor
ve 8.26'nın çalışma-anı çözümlemesi mevcut kurulumlara ulaşmıyordu.
Canlı doğrulama (169, 2026-08-04): 8.26'ya güncellendikten sonra bile dosya
29 Temmuz tarihliydi ve müşterileri başka bir kurulumun paneline yönlendiriyordu.
Düzeltme: self-update'e `autodiscover_ensure` adımı eklendi. Kurucu idempotent —
mevcut `/etc/onoxsoft/panel-url` dosyasına dokunmaz.
1b. Bozuk cron sarmaları geri alınmıyordu
8.24'ün yetenek kapısı yalnız yeni sarmayı engelliyor. Kapı eklenmeden önce
sarılmış crontab'ları hiçbir şey geri almıyordu: sarılan komut çalışmıyor
(`Failed to start transient service unit: Interactive authentication required`),
cron her turda hatayı postalıyordu.
Canlı doğrulama (matrix, 2026-08-04): 8.26 sonrası da saatte 60 hata maili;
`onx_onoxcom` Maildir 68 MB / 17.018 mesaj, müşterinin Flarum scheduler'ı aylardır ölü.
Düzeltme: `onx-cron-slice-wrap` betiğine `heal` modu eklendi ve self-update'e
`cron_wrap_heal` adımı olarak bağlandı. `heal` yalnız sarılı olup sarması
çalışmayan kullanıcıyı unwrap eder; sarma gerçekten çalışıyorsa dokunmaz, böylece
cgroup izolasyonu bozulmaz.
Genel kural
Mevcut sunucu durumunu değiştiren bir düzeltme, self-update'e idempotent bir
heal adımı eklenmedikçe hiçbir kuruluma ulaşmaz. Doğrulama, adım listesinin `ok`
demesiyle değil, belirtinin canlıda ölçülmesiyle yapılır (kurulu dosyayı grep'le,
maillog'u say).
2. White-label sızıntıları
Panel white-label satılıyor. Kurulum betiğinde ve seeder'da kalan sabit onoxsoft
adresleri o kurulumun müşterilerine görünüyor veya altyapılarını başka bir
firmaya bağlıyordu.
- DNS NS varsayılanı — `PANEL_HOSTNAME` üç segmentli desene uymadığında
`ns3/ns4.onoxsoft.com.tr` yazılıyordu; o sunucudaki her müşteri zone'u başka bir
firmanın nameserver'larına delege oluyor, o firma zone'u barındırmadığı için
çözümleme ölüyordu. Artık kurulumun kendi hostname'inden türetilir.
- Roundcube webmail — `/etc/roundcubemail/config.inc.php` sunucudaki tüm
müşterilerin webmail'i tarafından paylaşılır; `support_url` ve `product_name`
sabit onoxsoft değerleriydi. Artık `BRAND_SUPPORT_URL` / `BRAND_NAME` /
`PANEL_HOSTNAME` üzerinden türetilir.
- Durum sayfası seeder'ı — DNS bileşeni sabit `ns1.onox.com.tr` adresini
izliyordu; her kurulumun herkese açık durum sayfası başka bir firmanın
nameserver'ının sağlığını gösteriyordu. Artık `server_settings.dns_ns1` okunur.
Sabit IP taraması temiz: yalnız test ve yorum satırlarında. `config/branding.php`
ve `.env.example` default'ları bilinçli olarak onoxsoft'tur (env ile geçilebilir).
Kümülatif kapsam
2026.8.24 (posta kuyruğu / kota / sertifika seçimi), 2026.8.25 (cron sarma) ve
2026.8.26 (panel yönlendirme endpoint'i) eksiksiz dahildir.
ONOXSOFT 2026.8.26 — Panel Yönlendirme Endpoint'i
Bu bakım sürümü, `panel.<alanadi>` adreslerinin yanlış kuruluma yönlendirilmesini
kalıcı olarak giderir.
Sorun
`/usr/local/onoxsoft/autodiscover/index.php`, tüm müşterilerin `panel.<alanadi>`
vhost'u tarafından PAYLAŞILAN tek bir dosyadır ve içinde tek bir kurulumun panel
adresi SABİT olarak gömülüydü. Dosyanın depoda karşılığı olmadığı için hiçbir
kurulum/güncelleme adımı onu tazelemiyordu: ilk yazıldığı andaki adres sonsuza
kadar kalıyordu.
Sonuç: müşteri `panel.<kendi-alanı>` adresine girdiğinde kendi paneline değil,
başka bir kurulumun paneline yönlendiriliyordu. Canlı doğrulama (matrix):
`panel.<müşteri-alanı>` → `302` → başka kurulumun `:666/customer/dashboard`
adresi.
Düzeltme
- `scripts/autodiscover/index.php` artık depoda tutulur ve kurulum tarafından
dağıtılır; böylece her güncellemede tazelenir.
- Yönlendirme adresi çalışma anında `/etc/onoxsoft/panel-url` dosyasından okunur.
Panel hostname'i değişse bile yönlendirme kendiliğinden doğru kalır.
- Adres `parse_url` ile doğrulanır (yalnız http/https + host, kullanıcı bilgisi
içeremez) — dosya bozulsa bile açık yönlendirme yüzeyi oluşmaz.
- Adres okunamazsa YANLIŞ bir hosta yönlendirmek yerine 503 ve açıklayıcı mesaj
döner.
- `scripts/autodiscover/install.sh` dosyayı kurar, `.htaccess` izin listesine
ekler ve `/etc/onoxsoft/panel-url` yoksa `PANEL_URL` → `APP_URL` →
`PANEL_HOSTNAME:666` sırasıyla üretir (mevcut dosyaya dokunmaz).
Kümülatif kapsam
2026.8.24 posta kuyruğu/kota/sertifika seçimi ve 2026.8.25 cron sarma düzeltmeleri
eksiksiz dahildir.
ONOXSOFT 2026.8.25 — Cron Sarma ve Panel Adresi
Bu bakım sürümü, müşteri cron işlerini tamamen durduran cgroup sarma hatasını ve
`panel.<alanadi>` yönlendirmesindeki sabit panel adresini giderir.
Müşteri cron işleri yeniden çalışıyor
- `onx-cron-slice-wrap`, kullanıcının KENDİ crontab'ına
`systemd-run --uid=<user> --slice=...` öneki yazıyordu. Ayrıcalıksız bir kullanıcı
system manager'da transient unit başlatamaz; polkit
`org.freedesktop.systemd1.manage-units` için interaktif kimlik doğrulama ister ve
cron ortamında bu imkânsızdır.
- Sonuç: sarılan komut HİÇ çalışmıyor, cron her turda
"Failed to start transient service unit: Interactive authentication required."
çıktısını kullanıcıya postalıyordu. Canlıda ölçülen: bir hesapta 16.705 mesaj /
67 MB, dakikada bir yeni mail; müşterinin gerçek işi (ör. `flarum schedule:run`)
aylardır çalışmıyordu. Bu mailler ayrıca Mail Teslimat Raporları sayfasını
`<user>@localdomain` gönderici ile dolduruyordu.
- Sarma öncesi artık YETENEK KAPISI var: kullanıcının gerçekten transient unit
başlatabildiği kanıtlanmadan crontab'a dokunulmaz; atlanma sebebi
`capability_reason` ile raporlanır. Polkit kuralı eklenirse probe kendiliğinden
geçer ve sarma yeniden etkinleşir.
- `--setenv=HOME` artık `/home/<user>` varsayımı yerine gerçek ev dizininden
(`/home/users/<user>`) türetilir.
Geri alma (unwrap) ilk kez çalışıyor
- Unwrap yolunda iç komut `BASH_REMATCH[1]` ile okunuyordu ancak bu okuma,
zamanlama alanını yakalayan İKİNCİ regex eşleşmesinden SONRA yapılıyordu;
`BASH_REMATCH` ezildiği için komut yerine zamanlama alanı yazılıyor ve crontab
`bad command` ile reddediliyordu. Yani bozuk sarma geri alınamıyordu.
- İç komut artık eşleşme anında yakalanır.
- Yazılan crontab içeriği tam olarak bir satır sonu ile bitirilir; `crontab -u`
sonlandırıcı newline olmayan girdiyi `premature EOF` ile reddediyordu.
- `crontab -u` başarıda stdout'a yazdığı "Backup of ... saved to ..." satırı
aksiyonun JSON çıktısına karışıp çağıranda `jq: parse error` üretiyordu; stdout
yutulur, stderr hata mesajı için yakalanır.
panel.<alanadi> gerçek panele yönlendiriyor
- `subdomainTemplates()` yönlendirme adresini
`config('app.panel_url', 'https://panel.onox.com.tr')` ile üretiyordu.
`app.panel_url` hiçbir kurulumda tanımlı değil (canlı: NULL) → her kurulumda
sabit yedek adres yazılıyor ve müşteri `panel.<kendi-alanı>` adresine girince
kendi paneline değil, başka bir kurulumun adresine yönlendiriliyordu.
- Adres artık sırasıyla açıkça ayarlanmış `app.panel_url` (white-label) ve
`APP_URL` (port dahil) üzerinden türetilir. İkisi de yoksa yanlış bir hostname
yazmaktansa yönlendirme hiç yazılmaz.
ONOXSOFT 2026.8.24 — Posta Akışı ve Sertifika Seçimi
Bu sürüm dört gerçek kesintiyi kapatır: panel bildirim e-postalarının hiç
gönderilmemesi, e-posta kotasının yanlış limitten reddetmesi, sistem alt alan
adlarına yanlış sertifika sunulması ve ModSecurity durumunun panelde yanlış
raporlanması.
Bildirim e-postaları artık gönderiliyor
- `supervisor-mail` Horizon `defaults` içinde tanımlıydı ancak `environments`
listesine hiç eklenmemişti. Horizon yalnızca aktif environment'ta listelenen
süpervizörleri başlatır; bu yüzden `mail` kuyruğunun tüketicisi yoktu.
- 24 Mailable'ın 24'ü de `onQueue('mail')` kullandığından panelin TÜM bildirim
e-postaları (kutu kurulum bilgisi, hoş geldiniz, SSL, yedek, kota, parola,
fatura, askı/sonlandırma, bayi, kötü amaçlı yazılım, sistem uyarısı) Redis'te
birikip hiç gönderilmiyordu.
- Süpervizör production ve local ortamlarına eklendi (production: 2 worker, yavaş
bir SMTP el sıkışması posta akışını bloklamasın).
- Yeni sözleşme testi, `defaults` içindeki her süpervizörün her environment'ta da
tanımlı olmasını ve `onQueue()` ile sabitlenen her kuyruğun bir tüketicisi
bulunmasını zorunlu kılar.
E-posta kotası: ekran ile karar aynı kaynaktan
- `packages.mail_quota_mb` kolonu `default(1024)` ile eklenmişti ve NOT NULL
olduğu için mevcut paket satırlarına da yazılmıştı. Paketin disk kotası ne
olursa olsun (10 GB, 20 GB, hatta "sınırsız") posta toplamı 1 GB'a kilitliydi.
- Ayrıca ekran ile karar FARKLI alanı okuyordu: "Mail Disk Kullanımı" sayfası
`limits.mailbox_total_mb` (hiçbir pakette tanımlı değil → 5120 MB fallback),
enforcement ise `mail_quota_mb` kolonu. Müşteri "5 GB'ın 3,6 GB'ı dolu, yerim
var" görüp 1 GB'dan reddediliyordu.
- Kolon varsayılanı 0 (sınırsız — disk kotasıyla sınırlı) yapıldı ve dokunulmamış
varsayılanda kalmış satırlar veri düzeltmesiyle 0'a çekildi.
- Ekran artık `effectiveMailQuotaMb()` değerini gösterir; 0 ise "Sınırsız" yazar.
- Kapısız ikinci kota rotası (`email.disk-usage.quota.update`) kapatıldı; her iki
rota da aynı `canSetMailQuota` kapısından geçer. Disk tavanı ham `quota_bytes`
yerine `effectiveQuotaBytes()` okur (kolon canlıda neredeyse hep NULL'dı ve
tavan fiilen ölüydü).
Sistem alt alan adlarına doğru sertifika
- `CertificatePathResolver` sabit öncelik listesindeki İLK var olan dosyayı
döndürüyordu; sertifikanın süresine de hostname'i kapsayıp kapsamadığına da
bakmıyordu. cPanel göçünden gelen dar sertifikalar `/etc/onoxsoft/ssl/manual/`
altına düşüyor ve bu yol `/etc/letsencrypt/live/` ÜSTÜNDE olduğu için taze,
doğru multi-SAN AutoSSL sertifikasını kalıcı olarak gölgeliyordu.
- Sonuç: kapsanmayan sistem adı için `vhssl` bloğu yazılmıyor, OLS :443
listener'ın kendi (panelin) sertifikasını sunuyordu — tarayıcıda
"sertifika bu site için geçerli değil".
- Seçim artık en iyi KULLANILABİLİR adayı bulur: süresi geçmiş/henüz başlamamış
adaylar elenir, kalanlar sistem alt alan adlarını kapsama sayısı, SAN genişliği
ve geçerlilik süresine göre puanlanır. Joker sertifikalar RFC 6125'e uygun
şekilde yalnız tek seviye eşleşir. Hiçbir aday çözümlenemezse eski davranışa
güvenli biçimde düşer.
- AutoSSL yenileme sweep'ine üçüncü aday kümesi eklendi: sertifikası taze ve
Active olduğu hâlde sistem alt alan adlarını kapsamayan domain'ler. Bu küme
mevcut kapılardan (A/AAAA + `dns_status` + backoff + rate-limit) geçer, yani
DNS'i olmayan domain için Let's Encrypt kotası yakılmaz. Sweep başına inceleme
sınırı vardır ve sınıra ulaşılırsa sessiz kalmaz, loglanır.
ModSecurity durumu artık doğru raporlanıyor
- OpenLiteSpeed'de otoriter `SecRuleEngine` değeri `httpd_config.conf` içindeki
inline `modsecurity_rules` bloğudur. `onx-modsec-status` bu değeri hiç okumuyor,
yalnız `00-engine.conf`'a bakıyor ve boşsa körlemesine "On" varsayıyordu.
- Durum betiği artık önce otoriter inline değeri okur, `00-engine.conf` yalnız
fallback'tir ve ikisi ayrıştığında çıktıya `engine_drift` bayrağı ile açıklayıcı
bir neden eklenir. Değer bulunamazsa "On" uydurulmaz, `unknown` döner.
- Web sunucusu geçişi ve sürücü yeniden kurulumu artık çalışan motor modunu
kurulumdan önce okuyup `modsec-install-driver`'a geçirir. Önceden mod
gönderilmediği için kurucu varsayılanı (`DetectionOnly`) otoriter bloğa
yazılıyor ve her geçiş WAF'ı sessizce engellemeden düşürüyordu.
Kümülatif kapsam
2026.8.16–2026.8.23 arasındaki AutoSSL DNS kapısı, OLS default-page idempotence,
catch-all listener TLS mirası, Fail2ban büyük filo çıktı sınırı, updater kilit
mirası, PHP modül algılama ve cgroup okuma düzeltmeleri eksiksiz dahildir.
ONOXSOFT 2026.8.23 — Cgroup Okuma Kararlılığı
Bu bakım sürümü, kısa ömürlü kullanıcı cgroup slice'ları okunurken oluşabilen
`sysapi:cgroup-read` aritmetik hatasını giderir.
Kaynak kullanımı denetimi
- `cpu.stat` yalnız tek süreçle okunur ve yalnız tam `usage_usec` anahtarı kabul edilir.
- Okuma sırasında slice kapanırsa kısmi değer ile fallback değeri artık aynı çıktıda
birleşemez; CPU değeri her durumda tek ve doğrulanmış bir tamsayıdır.
- Bellek ve süreç sayaçları aritmetik işlemden önce sayısal olarak doğrulanır.
- Sınırsız veya geçersiz limit değerleri güvenli biçimde `null` döner.
- IO sayaçları harici `grep` zinciri yerine Bash eşleştirmesiyle ayrıştırılır; geçici
dosya değişimleri denetim kaydında sahte hata üretmez.
Kümülatif kapsam
2026.8.21 güncelleme kilidi mirası ve 2026.8.22 ionCube/IMAP modül algılama
düzeltmeleri eksiksiz dahildir. AutoSSL DNS kapısı, sistem alt alanı TLS provision,
posta kotası, lisans özellikleri, Fail2ban/ModSecurity/Turbo/WP-CLI denetim
iyileştirmeleri ve güvenli varsayılan sayfalar bu sürümde korunur.
Canlı doğrulama üç sunucuda sürüm, lisans, servis, OLS idempotence, TLS, kota ve
denetim kayıtları üzerinden yapılmıştır.
ONOXSOFT 2026.8.22 — PHP Modül Algılama Güvencesi
Bu bakım sürümü, güncelleme ön kontrolünde yüklü ionCube veya IMAP modülünün bazı
PHP sürümlerinde yanlışlıkla “eksik” algılanabilmesine yol açan pipe/SIGPIPE
etkileşimini giderir.
PHP ve ionCube algılama
- Panel PHP modül listesi önce eksiksiz okunur, ardından ionCube doğrulaması yapılır.
- `pipefail` açıkken `grep -q` erken çıkışının PHP sürecine SIGPIPE göndererek
sahte hata üretmesi engellenir.
- Panel PHP ve OpenLiteSpeed `lsphp` IMAP denetimleri de aynı güvenli, tam-okuma
davranışını kullanır.
- Gerçek modül okuma hatası ile gerçekten eksik ionCube durumu ayrı mesajlarla
raporlanır.
Birlikte gelen güvenceler
- 2026.8.21 güncelleme kilidi koruyucusu eksiksiz dahildir; OLS/FPM süreçleri
güncelleme kilidini miras alamaz.
- DNS'i sunucuya yönelmeyen alanlar AutoSSL/Let's Encrypt denemesine sokulmaz.
- Sistem alt alanı ve catch-all TLS seçimi sertifikanın gerçek hostname kapsamına
göre yapılır.
- Posta kotası gerçek disk kullanımına göre hesaplanır; lisans özellikleri
güncelleme sonrasında yeniden yüklenir.
- Fail2ban/ModSecurity/Turbo/WP-CLI denetim iyileştirmeleri ve güvenli varsayılan
hosting sayfaları bu pakette korunur.
Sürüm, ionCube 15.5 kullanan PHP 8.2 dahil farklı canlı PHP çıktılarıyla; ayrıca
kilit mirası, OLS idempotence ve fail2ban sözleşme testleriyle doğrulanmıştır.
ONOXSOFT 2026.8.21 — Güncelleme Kilidi Güvencesi
Bu bakım sürümü, panel güncellemesi bittikten sonra OpenLiteSpeed'in güncelleme
kilidini yanlışlıkla taşımaya devam etmesine yol açan dosya tanıtıcısı mirasını
kalıcı olarak giderir.
Güncelleme güvenliği
- Tek-örnek güncelleme kilidi artık ayrı bir `flock` koruyucusu tarafından tutulur.
- Kilit dosya tanıtıcısı updater, OpenLiteSpeed, PHP-FPM veya başka bir çocuk
servise aktarılamaz.
- Gerçek bir güncelleme çalışırken eşzamanlı ikinci güncelleme yine güvenle reddedilir.
- Güncelleme tamamlandığında kilit, yeniden başlatılan servisler çalışmaya devam
etse bile otomatik bırakılır; manuel kilit temizleme gerekmez.
- Kilit girdisi `/run` altında yalnız root tarafından okunabilen geçici dosyada
taşınır ve işlem sonunda temizlenir.
Birlikte gelen düzeltmeler
- DNS'i bu sunucuya yönelmeyen alan adları AutoSSL/Let's Encrypt denemesine alınmaz;
gereksiz başarısız doğrulama ve oran sınırı tüketimi engellenir.
- Sistem alt alanları sertifika SAN/wildcard kapsamına göre provision edilir.
- OpenLiteSpeed catch-all vhost'u tüm güvenli listener'lar arasından hostname'i
gerçekten kapsayan sertifikayı seçer.
- Posta kotası ayrılmış sanal toplam yerine gerçek disk kullanımıyla hesaplanır.
- Lisans özellikleri güncelleme sonrası yeniden yüklenir; Enterprise yetkileri
eski önbellek nedeniyle kilitli görünmez.
- Fail2ban, ModSecurity, WP-CLI ve Turbo denetimleri sınırlandırılmış ve güvenli
çıktı üretir; tekrarlayan gereksiz denetim hataları azaltılır.
- Varsayılan hosting sayfalarından FTP ve benzeri özel hesap bilgileri kaldırılmıştır.
Doğrulama
- Kilit mirası sözleşme testleri ve yaşayan çocuk süreç canary'siyle doğrulandı.
- OLS yapılandırma self-heal işlemi değişiklik yoksa yeniden yükleme yapmaz.
- Paket, kaynak testleri/geliştirme bağımlılıkları, `.env` ve yedek dosyalar için
yayın güvenlik kapılarından geçirilir.
2026.8.17–2026.8.20 arasındaki lisans, fail2ban, OLS idempotence, varsayılan
sayfa ve çoklu listener TLS düzeltmeleri bu sürümde eksiksiz olarak yer alır.
ONOXSOFT 2026.8.20 — Çoklu Listener Hostname Sertifikası
Bu bakım sürümü, eski OpenLiteSpeed kurulumlarında geçerli sunucu hostname
sertifikasının 443 yerine panel 666 listener'ında bulunabildiği düzeni destekler.
Sertifika kapsamına göre seçim
- Catch-all kurulumu tüm güvenli OLS listener'larını tarar.
- Sertifika dosyası `hostname -f` değerini gerçekten kapsıyorsa seçilir; yalnız
dosya adına veya listener portuna güvenilmez.
- Seçilen sertifika doğrudan 443 listener'a aitse miras alınır. Başka bir güvenli
listener'dan geliyorsa catch-all vhost'a açıkça ve zinciriyle bağlanır.
- Hiçbir hostname sertifikası bulunamazsa 443 listener çifti, o da yoksa mevcut
self-signed fallback kullanılır.
Canlı doğrulama
- Matrix ve Beta'da 443 listener mirası değişikliksiz kaldı.
- 169 sunucusunda panel listener sertifikasıyla
`https://server.hazirtasarimlar.net/` HTTP 200 ve geçerli TLS verdi.
- Ardışık OLS self-heal çağrıları `changed=false`, `reloaded=false` döndürdü.
Önceki 2026.8.17–2026.8.19 lisans, fail2ban, OLS idempotence, varsayılan sayfa
ve sistem-domain SSL güvenceleri bu sürümde aynen yer alır.
ONOXSOFT 2026.8.19 — OLS Hostname TLS ve Varsayılan Sayfa
Bu bakım sürümü, OpenLiteSpeed catch-all vhost'unun sunucu hostname
sertifikasını ezmesini ve varsayılan sayfanın 403 dönmesini giderir.
Sunucu hostname için doğru sertifika
- Güvenli 443 listener üzerinde geçerli panel/hostname sertifikası varsa
catch-all vhost bu sertifikayı miras alır.
- Catch-all artık `CN=onoxsoft-default` self-signed sertifikasıyla listener
sertifikasını ezmez.
- Güvenli listener sertifikası bulunmayan eski kurulumlarda self-signed fallback
korunur; HTTPS listener kurulumu kırılmaz.
Varsayılan sayfada HTTP 200
- OLS'nin `nobody` static worker'ı varsayılan sayfanın üst dizimlerine güvenli
biçimde erişebilir; private-key dizini kapalı kalır.
- Eşleşmeyen hostname artık LiteSpeed 403 sayfası yerine markalı ONOXSOFT
varsayılan sayfasını HTTP 200 ile sunar.
Canlı doğrulama
- `https://matrix.onox.com.tr/` geçerli Let's Encrypt hostname sertifikası ve
HTTP 200 ile doğrulandı.
- Ardışık self-heal kontrollerinde `changed=false`, `reloaded=false` ve OLS PID
sabit kaldı.
2026.8.17 ve 2026.8.18'deki lisans, OLS idempotence ve büyük fail2ban filosu
güvenceleri bu sürümde aynen yer alır.
ONOXSOFT 2026.8.18 — Fail2ban Büyük Filo Kalkanı
Bu bakım sürümü, çok sayıda site barındıran sunucularda fail2ban durum
kartının Linux süreç argümanı sınırına takılmasını tamamen giderir.
Sınırlı ve güvenli denetim çıktısı
- Jail başına gösterilen yasaklı IP listesi gibi izlenen dosya listesi de ilk
200 kayıtla sınırlandırılır. Tam sayı ve kesilme bilgisi ayrıca korunur.
- Binlerce vhost erişim günlüğünü izleyen jail'ler artık 128 KB tek-argüman
sınırını aşarak `jq: Argument list too long` hatası üretmez.
- IPv6 adresleri ilk iki nokta karakterinde kesilmeden ayrıştırılır; ekrandaki
IP sayısı fail2ban'ın `currently_banned` değeriyle doğru eşleşir.
Canlı doğrulama
- 2.353 ayrı günlük dosyasını izleyen Matrix jail'iyle gerçek canary yapıldı.
- Sekiz jail'in tamamı hatasız okundu; 36 yasaklı IP'nin 36'sı da doğru
ayrıştırıldı.
- Sözleşme testi hem IP hem dosya listesi sınırını ve IPv6 güvenli
ayrıştırmayı korur.
2026.8.17'deki OLS kesintisiz self-heal ve güncelleme sonrası lisans kurtarma
güvenceleri bu sürümde aynen yer alır.
ONOXSOFT 2026.8.17 — Canlı Canary Güvencesi
Bu bakım sürümü, 2026.8.16 canlı canary denetiminde bulunan iki geçiş
kenar durumunu kapatır.
Kesintisiz OpenLiteSpeed self-heal
- Catch-all listener yapılandırmasının dosya sonu artık deterministik biçimde
normalleştirilir. Her kontrolde bir boş satır birikmesi ve bunun gerçek bir
değişiklik sanılarak OpenLiteSpeed'in yeniden başlatılması önlenir.
- Aynı yapılandırmada art arda yapılan kontroller `changed=false` ve
`reloaded=false` döndürür; çalışan OLS PID'si değişmez.
Güncelleme sonrası lisans sürekliliği
- Panel cache ve bütünlük bakımı tamamlandıktan sonra lisans ayrıca doğrulanır.
- Geçerli JWT geçici olarak okunamıyorsa panel, makine kimliği, bağlı IP ve
kalıcı imza anahtarıyla LCS'den otomatik olarak yeni JWT alır.
- Böylece Enterprise lisanslı sunucularda Container Hosting gibi menüler
güncelleme sonrasında geçici olarak kilitli görünmez.
- Aktif lisansı bulunmayan temiz kurulumlar normal aktivasyon akışında kalır;
kurtarma kontrolü güncellemeyi gereksiz yere geri almaz.
Doğrulama
- OLS listener dosyası iki ardışık canlı çalıştırmada byte-byte karşılaştırılır.
- Lisans kurtarma adımının cache temizliğinden sonra çalıştığı sözleşme testiyle
korunur.
- Dağıtım öncesi PHP/Bash sözdizimi, kod biçimi, hedefli testler ve canlı servis
canary kontrolleri uygulanır.
ONOXSOFT 2026.8.16 — Sistem Domain SSL ve Yükleme Kalkanı
Bu sürüm, wildcard veya çoklu alan adı sertifikalarının `mail`, `webmail`, `panel`,
`webdisk`, `autodiscover` ve `autoconfig` servislerine eksiksiz bağlanmasını sağlar;
Dosya Yöneticisi'ndeki 100 MB yükleme sınırını da gerçek web sunucusu katmanlarıyla
eşitler.
Sistem domainlerinde doğru SSL
- AutoSSL, DNS-01 ve manuel sertifika kurulumundan sonra sertifika yalnız ana vhost'a
değil, altı ayrı sistem vhost'una da yeniden bağlanır.
- Sertifikanın SAN kapsamı doğrulanır. Apex-only bir sertifika yanlışlıkla
`mail.<domain>` gibi kapsamadığı bir servise atanmaz; tek seviyeli wildcard kapsamı
doğru uygulanır.
- Ana vhost artık sistem domainlerini alias olarak sahiplenmez. Böylece OpenLiteSpeed
listener eşleşmesi özel webmail, panel ve otomatik yapılandırma vhost'larını gölgelemez.
- OpenLiteSpeed toplu yeniden yazımında ana domain, bilinen sistem öneki kaldırılarak
bulunur. `.com`, `.com.tr` ve diğer tüm alan adı derinliklerinde aynı yöntem çalışır.
- Diskteki sertifika gerçekten hedef hostname'i kapsamıyorsa OLS vhost'una bağlanmaz;
yanlış ortak ad sertifikası servis edilmesi önlenir.
Panelde gerçek 6/6 durumu
- Sistem Domainleri göstergesi, OpenLiteSpeed'in gerçek
`<kullanıcı>-<hostname>/vhconf.conf` yolunu denetler.
- Çalışan servislerin 0/6 veya pasif görünmesine neden olan eski yol varsayımı
kaldırıldı.
Dosya Yöneticisi 100 MB yükleme düzeltmesi
- OpenLiteSpeed panel vhost'una `upload_max_filesize=100M` ve multipart ek yükü için
`post_max_size=128M` uygulanır.
- PHP-FPM havuzları, Nginx istek sınırı ve OLS/LSPHP ayarları aynı limite hizalandı.
- Kurulum, panel güncellemesi, panel vhost üretimi ve web sunucusu geçişi bu ayarları
yeniden garanti eder; PHP paket güncellemesi limiti tekrar 2M/8M'ye düşüremez.
- Onarım aracı tam idempotenttir: ikinci ve sonraki çalıştırmalar OLS/Nginx
yapılandırmasına boşluk eklemez, dosyayı yeniden yazmaz ve `changed=false` döndürür.
Kesintisiz OpenLiteSpeed bakım döngüsü
- On beş dakikalık web sunucusu self-heal görevi artık yapılandırma değişmediyse
OpenLiteSpeed'i yeniden başlatmaz. Böylece WordPress güncellemesi veya normal ziyaret
sırasında görülebilen anlık `ERR_CONNECTION_REFUSED` penceresi kaldırıldı.
- Catch-all vhost, listener eşlemeleri ve varsayılan sertifika içerik hashleriyle
karşılaştırılır; yalnız gerçek değişiklikte tek kontrollü yeniden yükleme yapılır.
- Komut sonucu `changed` ve `reloaded` alanlarını döndürür; gereksiz yeniden başlatmalar
denetim kaydından ve canlı trafikten ayırt edilebilir.
AutoSSL DNS ve oran limiti koruması
- Public DNS'te hem A hem AAAA kaydı bulunmadığı doğrulanan domainler ACME/Let's Encrypt'e
gönderilmeden temiz biçimde atlanır. Böylece başka firmada, parkta veya DNS'i kaldırılmış
domainler başarısız doğrulama ve oran limiti tüketmez.
- Resolver hatası ile gerçek `NXDOMAIN/NODATA` birbirinden ayrılır. Geçici resolver
belirsizliği sistemi kilitlemez; kanıtlanmış harici IP veya kayıtsız domain ise sertifika
denemesini güvenli biçimde durdurur.
- IPv6-only domainler desteklenir; geçerli AAAA kaydı A kaydı yok diye reddedilmez.
E-posta kotası doğruluğu
- Posta kutusu kotaları fiziksel olarak önceden ayrılmış disk gibi toplanmaz. Her kutunun
kotası kendi üst sınırı, hosting mail kotası ise gerçek toplam kullanıma göre uygulanır.
- Örneğin 10 GB mail alanında iki adet 1 GB kutu bulunması yeni hesap açmayı yanlışlıkla
engellemez; gerçek kullanım toplam limite ulaştığında koruma yine devreye girer.
- Kota göstergesi yüzdesi ve sert limit uyarısı gerçek `usage_bytes` üzerinden hesaplanır;
toplam tanımlı kutu kotası yalnız bilgi amacıyla korunur.
Denetim ve güvenlik araçları dayanıklılığı
- Fail2ban jail durumunda çok büyük yasaklı IP listesi süreç argüman sınırını aşamaz; kart
ilk 200 IP'yi gösterir, tam liste ayrı ayrıntı görünümünde kalır.
- Boş Dovecot giriş günlüğü artık hata değil başarılı boş sonuçtur.
- GitHub CRS API geçici olarak bozuk/limitli yanıt verdiğinde ModSecurity güncelleme kontrolü
JSON ayrıştırma hatası üretmez; kurulu CRS çalışmaya devam eder ve registry durumu raporlanır.
- Yüksek frekanslı salt-okuma ve zamanlanmış uzlaştırma çağrılarının başarılı sonuçları
örneklenir; gerçek başarısızlıklar eksiksiz kaydedilmeye devam eder.
- Başarıyla rollback edilmiş Turbo uyumsuzluk uyarıları altı saatte bir örneklenir;
kırmızı gerçek hata görünürlüğü korunurken aynı güvenli uyarı yüzlerce kez yazılmaz.
- Turbo autopilot DNS'i pasif veya hesabı kapanmış stale domainleri sysapi'ye göndermez;
bulunmayan docroot kaynaklı yinelenen `turbo-dropin` hataları kesilir.
- Çakışan WordPress snapshot işleri tekrar kuyruğunda deneme hakkı tüketmez; yinelenen iş
sessizce düşürülür ve stale kilit iş timeout'undan sonra otomatik açılır.
Lisans ve Container Hosting görünümü
- Enterprise lisansın `ops_containers` yetkisi sunucu tarafında ve menüde aynı wildcard
semantiğiyle değerlendirilir; güncelleme sonrası derlenmiş arayüz ve Inertia önbelleği
birlikte yenilenir.
- Müşteri Container Hosting erişiminde lisans yetkisi ile hosting paketi kotası ayrı
korunur: pakette `container_hosting` açık ve `container_max` sıfırdan büyük olmalıdır.
Böylece lisanslı yönetim ekranı yanlış kilitlenmez, kotasız müşteri de sınırsız kaynak açamaz.
Doğrulama
- Wildcard, apex-only, DNS-01 ve ana vhost alias senaryoları için regresyon testleri
eklendi.
- OLS gerçek vhost yolu, sertifika kapsam kontrolü ve tüm yükleme katmanlarının limit
sözleşmesi otomatik testlerle korunuyor.
- Yükleme onarım aracı gerçek FPM, OLS ve Nginx fixture'larında art arda iki kez
çalıştırılarak dosya hashlerinin değişmediği doğrulanıyor.
- PHP sözdizimi, Bash sözdizimi, kod biçimi ve hedefli Pest testleri uygulanır.
- E-posta kotası, public DNS NODATA, IPv4/IPv6 kararları, OLS sıfır-değişiklik davranışı,
Fail2ban çıktı sınırı ve geçici ModSecurity registry kesintisi regresyon testleriyle korunur.
ONOXSOFT 2026.8.15 — Sistem Domain SSL ve Dosya Yükleme
Bu sürüm, wildcard veya çoklu alan adı sertifikalarının `mail`, `webmail`, `panel`,
`webdisk`, `autodiscover` ve `autoconfig` servislerine eksiksiz bağlanmasını sağlar;
Dosya Yöneticisi'ndeki 100 MB yükleme sınırını da gerçek web sunucusu katmanlarıyla
eşitler.
Sistem domainlerinde doğru SSL
- AutoSSL, DNS-01 ve manuel sertifika kurulumundan sonra sertifika yalnız ana vhost'a
değil, altı ayrı sistem vhost'una da yeniden bağlanır.
- Sertifikanın SAN kapsamı doğrulanır. Apex-only bir sertifika yanlışlıkla
`mail.<domain>` gibi kapsamadığı bir servise atanmaz; tek seviyeli wildcard kapsamı
doğru uygulanır.
- Ana vhost artık sistem domainlerini alias olarak sahiplenmez. Böylece OpenLiteSpeed
listener eşleşmesi özel webmail, panel ve otomatik yapılandırma vhost'larını gölgelemez.
- OpenLiteSpeed toplu yeniden yazımında ana domain, bilinen sistem öneki kaldırılarak
bulunur. `.com`, `.com.tr` ve diğer tüm alan adı derinliklerinde aynı yöntem çalışır.
- Diskteki sertifika gerçekten hedef hostname'i kapsamıyorsa OLS vhost'una bağlanmaz;
yanlış ortak ad sertifikası servis edilmesi önlenir.
Panelde gerçek 6/6 durumu
- Sistem Domainleri göstergesi, OpenLiteSpeed'in gerçek
`<kullanıcı>-<hostname>/vhconf.conf` yolunu denetler.
- Çalışan servislerin 0/6 veya pasif görünmesine neden olan eski yol varsayımı
kaldırıldı.
Dosya Yöneticisi 100 MB yükleme düzeltmesi
- OpenLiteSpeed panel vhost'una `upload_max_filesize=100M` ve multipart ek yükü için
`post_max_size=128M` uygulanır.
- PHP-FPM havuzları, Nginx istek sınırı ve OLS/LSPHP ayarları aynı limite hizalandı.
- Kurulum, panel güncellemesi, panel vhost üretimi ve web sunucusu geçişi bu ayarları
idempotent olarak yeniden garanti eder; PHP paket güncellemesi limiti tekrar 2M/8M'ye
düşüremez.
Doğrulama
- Wildcard, apex-only ve DNS-01 sertifika bağlama senaryoları için regresyon testleri
eklendi.
- OLS gerçek vhost yolu, sertifika kapsam kontrolü ve tüm yükleme katmanlarının limit
sözleşmesi otomatik testlerle korunuyor.
- PHP sözdizimi, Bash sözdizimi, kod biçimi ve hedefli Pest testleri uygulanır.
ONOXSOFT 2026.8.14 — Varsayılan Sayfa Gizliliği ve DNS Gruplama
Bu sürüm, internete açık varsayılan hosting sayfalarındaki bağlantı ve hesap
bilgilerini kaldırır; DNS yanıtı vermeyen sertifikaları SSL/AutoSSL ekranlarında
ayrı ve doğrudan görünür bir gruba taşır.
Varsayılan sayfa güvenliği
- FTP/SFTP sunucusu, portlar, SSH portu, hosting kullanıcı adı ve işlem tarihleri
artık genel placeholder sayfalarında gösterilmez.
- Hassas alanlar yalnız HTML'den değil, önizleme tokenlarından, uygulama
payload'ından ve `envsubst` izin listesinden de çıkarıldı.
- Sysapi, kullanıcı adını yalnız dosya sahipliğini ayarlamak için kullanır; genel
şablona aktaramaz.
- Eski şablon setindeki bağlantı kartları da temizlendi; böylece eski kurulum
yollarından yeniden sızıntı oluşmaz.
Güvenli toplu yenileme
- “Tüm Hesaplara Yeniden Dağıt” işlemi yalnız `ONOX-PLACEHOLDER` işaretini taşıyan
mevcut genel sayfaları yeniler.
- Placeholder bulunmayan docroot oluşturulmaz; müşterinin kendi `index.html`
dosyası hiçbir durumda değiştirilmez.
SSL / AutoSSL görünürlüğü
- DNS kaydı veya nameserver delegasyonu bulunmayan aktif domain sertifikaları,
normal yenilenebilir sertifikalardan ayrı tutulur.
- “DNS Olmayan / Pasif Domainler” grubu hem SSL sertifikaları hem AutoSSL yönetim
ekranında doğrudan görünür; Gelişmiş işlemler veya özel filtre açmak gerekmez.
- Bu grupta yanıltıcı kalan süre gösterilmez ve DNS düzeltilmeden yenileme eylemi
teşvik edilmez.
Doğrulama
- Hassas tokenların şablonlara geri eklenmesini önleyen güvenlik testi eklendi.
- Aktif DNS ve pasif DNS sertifikalarının iki yönetim ekranında doğru gruplandığını
doğrulayan regresyon testleri eklendi.
- PHP, Bash ve üretim Vue/Vite derleme kontrolleri uygulanır.
ONOXSOFT 2026.8.13 — Turbo Fast-Path Tarama Yükü
Bu sürüm, çok sayıda hosting hesabı bulunan sunucularda saatlik Turbo fast-path
temizliğinin müşteri dizinlerini gereksiz yere tekrar tekrar taramasını giderir.
Kök neden
`onox:turbo-fastpath-sweep` altındaki sysapi sürücüsü aynı ağaç olan
`/home/users` ve `/home` yollarını birlikte `find` komutuna veriyordu. Böylece
`/home/users` altındaki bütün müşteri dosyaları iki kez dolaşılıyor; ardından her
site önbelleği sayım, dosya silme ve boş dizin temizliği için üç ayrı kez daha
taranıyordu. 169 sunucusunda bu işlem tek çekirdeğin yaklaşık `%90`'ını kullanıyordu.
Düzeltme
- Müşteri docroot'ları artık Apache, Nginx, OpenLiteSpeed ve Caddy vhost
yapılandırmalarını okuyan ortak `onx_all_docroots` kaynağından alınır.
- Aynı docroot birden çok alan adına bağlı olsa bile yalnızca bir kez işlenir.
- Bayat `index.html` sayımı/silimi ve boş dizin temizliği her site için tek bir
depth-first `find` geçişinde tamamlanır.
- TTL, silinen dosya sayısı ve sysapi JSON yanıt sözleşmesi değişmemiştir.
Güvenlik ve uyumluluk
- Tarama yalnızca vhost yapılandırmasında bulunan gerçek docroot'ların
`wp-content/cache/onox-static` dizinine girer.
- Müşteri içerikleri değil, yalnız TTL'i geçmiş Turbo statik ayna dosyaları silinir.
- Davranış sözleşmesi birim testi ve Bash sözdizimi kontrolüyle korunur.
ONOXSOFT 2026.8.12 — OLS Cache-Buster Koruması
Bu sürüm, botların aynı WordPress içeriğini anlamsız ve sürekli değişen sorgu
parametreleriyle çağırarak sayfa önbelleğini atlatmasını OpenLiteSpeed katmanında
durdurur.
Kök neden
169 sunucusunda `fiberkablotamircisi.com` alan adına GPTBot kimliğiyle saniyede
yaklaşık bir kez `/?f=93891214088`, `/?m=45824189682` benzeri istekler geliyordu.
Her URL benzersiz göründüğü için WordPress cache devre dışı kalıyor, PHP ve
Wordfence uzun süre CPU tüketiyordu.
Düzeltme
- Yalnız `GET` isteklerinde ve sorgu dizesi yalnızca tek harf ile en az yedi
rakamdan oluşuyorsa temiz URL'ye kalıcı 301 yönlendirmesi uygulanır.
- Gerçek sorgular (`?s=arama`, sayfalama, filtre ve UTM parametreleri) etkilenmez.
- Kural hem yeni OLS vhost üretiminde hem web sunucusu geçişindeki toplu OLS
yeniden-yazımında üretilir; sonraki provisioning/switch işlemlerinde kaybolmaz.
- Sistem alt alan adları (mail, webmail, panel, autodiscover/autoconfig) kapsam
dışındadır.
Canlı doğrulama
- Sahte tek-harf sorgusu: 301 → temiz URL → 200, geçerli SSL.
- Normal WordPress arama sorgusu: yönlendirme olmadan 200.
- Etkilenen domainin aktif PHP işçisi: 1 uzun çalışan süreçten 0'a indi.
- Toplam LSAPI işçi sayısı ölçüm anında 95'ten 48'e düştü.
ONOXSOFT 2026.8.11 — WordPress Koruması ve Telemetri Yükü
Bu sürüm, yoğun hesap barındıran sunucularda gereksiz periyodik yükü azaltır ve
WordPress saldırı jail'lerinin kurulum/güncelleme sonrasında gerçekten etkin
kalmasını garanti eder.
Düzeltilenler
- WordPress fail2ban kurucusu artık yalnızca paket içinde beklemiyor; temiz
kurulumda, panel güncellemesinde ve web sunucusu geçişi sonrasında otomatik,
idempotent ve config-test kapılı olarak çalışıyor.
- `GET /xmlrpc.php` taramaları HTTPS yönlendirme durumlarıyla birlikte algılanıyor.
Jetpack/WordPress.com istisnaları korunuyor.
- Olmayan `.php`/webshell yollarını seri biçimde tarayan istemciler için yalnız
404 yanıtlarını sayan, yanlış pozitif eşiği yüksek `onox-php-probe` jail'i eklendi.
- Turbo Shield telemetri özeti artık pencere içinde değişmemiş günlük dosyaları
tekrar okumuyor.
- Ortak vhost/docroot keşfi, her vhost için çok sayıda `basename`, `grep`, `head`,
`awk` ve `stat` süreci açmak yerine Bash içinde tek geçişte ayrıştırılıyor.
Standart `/home/users/<hesap>/...` sahipliği doğrudan güvenli yol bilgisinden
çözülüyor; özel docroot'larda sayısal UID fallback'i korunuyor.
Canlı ölçüm
- 169 sunucusunda Turbo Shield örnekleme süresi aynı sonuçla yaklaşık 36.0
saniyeden 2.59 saniyeye düştü.
- Fail2ban kurucusunun dört filtre smoke testi ve tam config testi geçti; yeni
jail seti rollback korumasıyla etkinleşti.
Güvenlik ve uyumluluk
- Çalışan PHP uçları eşleşmez; PHP probe filtresi yalnız 404 yanıtlarını sayar.
- Meşru WordPress XML-RPC entegrasyonları için mevcut CIDR ve User-Agent
istisnaları korunmuştur.
- Apache, Nginx, OpenLiteSpeed ve Caddy erişim log yolları aynı jail setinde
izlenmeye devam eder.
ONOXSOFT 2026.8.10 — Posta TLS ve Kuyruk Dayanıklılığı
Bu bakım sürümü, üç sunuculu canlı filo taramasında tespit edilen Dovecot TLS DH eksikliğini ve Horizon systemd servisindeki geçersiz MariaDB bağımlılığını kalıcı olarak giderir. 2026.8.9 hesap açma ve SSL doğrulama düzeltmelerinin tamamını içerir.
Düzeltilenler
- Dovecot için RFC 7919 `ffdhe2048` parametreleri güvenli ve hızlı biçimde üretilir; `ssl_dh` yapılandırması hem yeni kurulumda hem bağımsız mail kurulumunda zorunlu hale gelir.
- Panel hostname sertifikası Dovecot'un varsayılan POP3/IMAP sertifikası olarak kullanılır. Global TLS ayarları domain SNI bloklarından önce yüklenerek self-signed fallback ve yapılandırma sıra uyarıları kaldırılır.
- Mevcut sunucular her panel güncellemesinde mail stack self-heal işleminden geçer. Eksik DH dosyası ve yapılandırması atomik olarak oluşturulur, `doveconf` doğrulaması geçmeden Dovecot yeniden yüklenmez.
- POP3/IMAP istemcilerinde görülen `Diffie-Hellman key exchange requested, but no DH parameters provided` TLS hatası giderilir.
- Horizon ve klasik queue worker systemd unit dosyaları artık MariaDB'yi geçerli `mariadb.service` adıyla bekler.
- Önceki sürümlerin hatalı `After=... mariadb` satırı mevcut sunucularda güncelleme sırasında atomik olarak onarılır ve systemd daemon yapılandırması yenilenir.
- Kuyruk servisinin boot sıralaması MariaDB ve Redis hazır olduktan sonra başlayacak biçimde doğrulanır; yeniden başlatmalarda geçici job/provisioning hatası riski azaltılır.
- Apache'den OpenLiteSpeed'e geçişte müşteri adına özel bir Linux grubu varmış gibi çalışan hatalı `chown user:user` kaldırıldı. Ortak `onoxsoft-users` kullanan hesaplarda eski `apache` sahipli WordPress dosyaları artık müşteri UID'sine geçirilir; Wordfence/eklenti yazma döngüsü ve buna bağlı PHP yükü oluşmaz.
Dahil edilen önceki düzeltmeler
- Reseller ve genel hosting hesabı açma yollarındaki `document_root` kaynaklı HTTP 500 koruması.
- Yarım provisioning işlerinin güvenli tekrar denemesi ve ana-domain bütünlük denetimi.
- OpenLiteSpeed geçişi sonrasında wildcard SSL/SNI doğrulama bekleme penceresi ve otomatik self-heal.
ONOXSOFT 2026.8.9 — Hesap Açma ve SSL Doğrulama
Bu bakım sürümü, reseller panelinden hosting hesabı açılırken görülen `SQLSTATE 1364 / document_root` kaynaklı HTTP 500 hatasını giderir ve hesap oluşturma zincirini yarım kayıt bırakmayacak şekilde güçlendirir.
Düzeltilenler
- Reseller hesap açma akışı artık eksik bir ana-domain placeholder satırı yazmaz. Hesap güvenli biçimde `Beklemede` oluşturulur; Linux kullanıcısı, ana domain, DNS, vhost ve sistem subdomainleri tek asenkron provisioning işiyle kurulur.
- Zorunlu `document_root` değeri tüm ham `Domain::create()` yollarında model seviyesinde hesabın home dizininden güvenli olarak türetilir. Gelecekte merkezi provisioner atlanırsa MySQL strict-mode 1364 hatası ve HTTP 500 oluşmaz.
- Provision kuyruğuna geçici olarak ulaşılamadığında kullanıcıya jenerik 500 verilmez; hesap tekrar provision edilebilir `Beklemede` durumunda korunur ve olay denetim kaydına yazılır.
- Provision retry denetimi yalnız `linux_uid` alanına bakmaz. Linux kullanıcısı oluşmuş fakat ana domain zinciri yarıda kalmış hesaplar artık yanlışlıkla tamamlanmış sayılmaz; domain kurulumu yeniden denenir.
- Ana domain satırı asenkron işte henüz oluşmamışken aynı domainle ikinci hesap açılması reseller, admin ve REST API yollarında engellenir.
- Kullanıcı-yüzlü hesap provisioning işleri ayrı `provisioning` kuyruğuna alınır; yedekleme ve tarama gibi uzun arka plan işlerinin arkasında beklemez.
- OpenLiteSpeed graceful reload sonrasında wildcard sertifika SNI doğrulama penceresi 0,75 saniyeden 5 saniyeye çıkarıldı. Sertifika doğru bağlandığı halde yoğun sunucuda görülen sahte self-heal hata raporları kaldırıldı.
Canlı olay düzeltmesi
`zedmak.com` reseller hesabı oluşturulurken ana-domain placeholder insert'i `document_root` alanını göndermediği için istek HTTP 500 ile bitiyordu. Kök neden kaldırıldı; yarım kalan hesabın Linux kullanıcısı, home dizini, domain, DNS veya vhost artığı oluşturmadığı doğrulandı ve güvenli provisioning için ayrıldı.
2026.8.8'de yayımlanan wildcard SSL kalkanı, OLS alias/sertifika koruması ve web sunucusu geçiş kapıları bu pakete dahildir.
ONOXSOFT 2026.8.8 — Wildcard SSL Kalkanı
Bu bakım sürümü, wildcard alan adlarında sertifika dosyası sağlıklı görünmesine rağmen aktif web sunucusunun apex veya varsayılan sertifikayı sunabildiği `ERR_CERT_COMMON_NAME_INVALID` sınıfını kalıcı olarak giderir.
Düzeltilenler
- SSL self-heal artık yalnız diskteki sertifika dosyasını değil, aktif `:443` listener'ının sentetik wildcard SNI adına gerçekten sunduğu sertifikayı da doğrular.
- Sağlıklı wildcard sertifika diskte mevcutsa yeni Let's Encrypt siparişi açılmaz; mevcut sertifika aktif vhost'a yeniden bağlanır ve `*.domain` listener eşlemesi onarılır.
- Öncelikli sertifika dosyası apex-only veya süresi dolmuşsa sonraki sağlıklı wildcard adayları da taranır.
- OpenLiteSpeed toplu vhost rewrite işlemi mevcut `vhAliases` listesini korur; `*.domain` alias'ı artık sabit `www.domain` değeriyle ezilmez.
- OLS cert-link, wildcard vhost'u Apache'den gelen apex-only sertifikaya geri düşürmez; wildcard SAN ve en az 24 saat geçerlilik şartı uygular.
- Web sunucusu geçiş kapısı bütün wildcard vhost'ları loopback üzerinden sentetik SNI ile sınar. Hedef sürücü wildcard sertifikayı sunamıyorsa geçiş kusurlu halde tamamlanmak yerine atomik olarak geri alınır.
- Mevcut wildcard sertifikanın yeniden üretim yapılmadan bağlanabildiğini ve OLS alias/sertifika koruma kurallarını doğrulayan regresyon testleri eklendi.
Canlı olay düzeltmesi
`alcipanfiyatlari.com` wildcard vhost'unda sunucuda geçerli `*.alcipanfiyatlari.com` sertifikası bulunmasına rağmen OLS apex sertifikasını sunuyordu. Sertifika yeniden üretilmeden doğru vhost'a bağlandı; wildcard alias/listener eşlemesi yenilendi ve `umraniyeyapi.alcipanfiyatlari.com` dış HTTPS doğrulaması başarılı hale getirildi.
2026.8.5–2026.8.7 arasındaki OLS geçiş, WordPress Fail2Ban ve denetim sağlığı düzeltmelerinin tamamı bu pakete dahildir.
ONOXSOFT 2026.8.7 — Denetim kaydı ve büyük MySQL sunucusu uyumu
Bu bakım sürümü, güvenli biçimde geri alınmış Turbo uyumsuzluklarının kırmızı sistem arızası gibi görünmesini ve büyük MariaDB sunucularında gerçek veritabanı listesinin 20 saniyede zaman aşımına uğramasını giderir.
Düzeltilenler
- Turbo drop-in veya edge etkinleştirmesi sonrasında origin zaten `500` veriyorsa ve işlem eksiksiz rollback yaptıysa audit sonucu artık `failure` yerine `warning` olarak sınıflandırılır.
- Gerçek vhost/yapılandırma hataları ve rollback doğrulaması olmayan Turbo hataları kırmızı `failure` olarak kalır.
- `mysql-db-list` zaman aşımı, 169 sunucusunda ölçülen yaklaşık 17 saniyelik information_schema taramasına güvenli pay bırakacak şekilde 20 saniyeden 45 saniyeye çıkarıldı.
- Turbo audit sınıflandırması için iki canlı hata imzasını kapsayan regresyon testi eklendi.
2026.8.5 wildcard TLS/OLS rewrite düzeltmeleri ile 2026.8.6 WordPress Fail2Ban düzeltmelerinin tamamı bu pakete dahildir.
ONOXSOFT 2026.8.6 — WordPress trafik koruması
Bu bakım sürümü, WordPress giriş, yorum ve XML-RPC saldırılarının OpenLiteSpeed access loglarında Fail2Ban tarafından görülmesine rağmen geçerli zaman damgası bulunamadığı için sayılmaması sorununu giderir.
Düzeltilenler
- OLS/Apache access log biçimi için açık Fail2Ban tarih deseni eklendi.
- `wp-comments-post.php`, `wp-login.php` ve `xmlrpc.php` filtrelerine gerçek log satırıyla otomatik eşleşme testi eklendi.
- Filtre testi veya Fail2Ban yapı testi başarısız olduğunda mevcut jail ve filtre dosyalarını ayrı ayrı, doğru konumlarına döndüren rollback düzenlendi.
- 169 sunucusunda korumalar etkinleştirildi; canlı loglarda üç jail'in olayları saydığı doğrulandı.
- Koruma etkinleşmeden önce başlamış, uzun süren iki XML-RPC PHP işçisi kontrollü biçimde sonlandırıldı.
Önceki sürümdeki ana düzeltmeler
2026.8.5 ile yayınlanan wildcard TLS, PowerDNS API, OpenLiteSpeed özel `.htaccess`/pretty-URL koruması ve DNS-01 sertifika self-heal değişikliklerinin tamamı bu pakete dahildir.
ONOXSOFT 2026.8.5 «Şemsiye»
Yayın tarihi: 1 Ağustos 2026 · Kanal: stable · Önceki: 2026.8.4 «Mühür»
Bu düzeltme sürümü, panel DNS'sinde joker kayıt kullanan alan adlarında DNS-01
sertifikasının alınmasına rağmen OpenLiteSpeed'in eski apex sertifikasını sunmaya
devam etmesine yol açan eksik sertifika bağını kapatır.
Wildcard SSL ve OpenLiteSpeed
- DNS-01 ile üretilen sertifikaların merkezi `/etc/onoxsoft/customer-ssl` yolu,
sertifika çözümleyicisinin birinci sınıf ve öncelikli kaynağı oldu.
- OLS sertifika bağlayıcısı yeni yönetilen DNS-01 sertifikasını, Apache'den kalan
eski HTTP-01 sertifikasından önce seçer. Böylece `*.alanadi.tld` SAN'ı kaybolmaz.
- Wildcard sertifika alındıktan sonra panel artık yalnız “başarılı” kaydı yazmaz;
aktif web sunucusunun vhost'unu yeni cert/key ile yeniden üretir ve reload eder.
- Vhost yeniden yazılamazsa işlem sessizce başarılı görünmez: sertifika durumu
`error` olur, hata denetim kaydına girer ve panel açık bir uyarı gösterir.
- DNS-01 sonucu sertifika tablosuna issuer, challenge, SAN, gerçek bitiş tarihi ve
dosya yollarıyla kaydedilir; wildcard sertifika mail SNI eşlemesine de bağlanır.
- Wildcard için özel document-root tanımlandıysa SSL vhost yenilemesinde korunur.
- Gecelik SSL self-heal artık panel DNS'si aktif joker vhost'ların gerçekten
`*.alanadi.tld` SAN'ı sunup sunmadığını denetler; apex-only sertifikaları DNS-01
wildcard sertifikasına çevirip web ve mail servislerine otomatik bağlar.
Özel URL kuralları ve OLS geçişi
- Müşteri OLS vhost şablonundaki sabit genel `index.php` kuralı kaldırıldı; üretilen
`${REWRITE_RULES}` bloğu artık gerçekten şablona yazılıyor.
- WordPress/Laravel gibi bilinen CMS'lerin güvenli front-controller kuralı korunurken,
özel `.htaccess` kullanan PHP sitelerinin ürün, kategori, haber ve sayfa kuralları
OLS sözdizimine çevrilip query parametreleriyle birlikte taşınıyor.
- Toplu OLS yeniden-yazım aracı da aynı özel kuralları korur; geçiş veya sonradan
vhost düzeltmesi yapılınca iç sayfalar artık ana sayfaya düşmez.
- Çevirici özel kural bulunan bir `.htaccess` dosyasını işleyemezse genel kurala
sessizce düşmek yerine işlemi durdurur, mevcut çalışan vhost'u korur ve açık hata yazar.
- Toplu yeniden-yazım DNS-01 wildcard sertifikalarını ve geçerli mevcut cert/key
bağlarını korur; URL onarımı SSL'i apex-only sertifikaya geri çeviremez.
PowerDNS DNS-01 hazırlığı
- `onx-pdns-api-enable` preflight'ındaki `pipefail + grep -q` SIGPIPE hatası giderildi.
Kurulu ve çalışan `pdns.service` artık yanlışlıkla “systemd unit yok” sayılmaz.
- Unit varlığı doğrudan systemd `LoadState` üzerinden doğrulanır; bulunmayan servis
yine kapalı güvenlik davranışıyla reddedilir.
Canlı doğrulama
- 169 sunucusunda panel DNS'sindeki `*.profildemircelikfiyatlari.com` kaydı korundu.
- DNS-01 ile `profildemircelikfiyatlari.com` ve `*.profildemircelikfiyatlari.com`
SAN'larını içeren Let's Encrypt sertifikası üretildi ve OLS vhost'una bağlandı.
- `https://esenyurt.profildemircelikfiyatlari.com/` ve ana alan adı TLS doğrulaması
açıkken HTTP 200 verdi; önceki hostname mismatch/HTST kaynaklı erişim hatası kapandı.
- `https://umraniye.santiyeetrafisackapama.com/` için apex + wildcard Let's Encrypt
sertifikası üretildi; TLS doğrulama sonucu `0`, ana sayfa HTTP 200.
- Ümraniye sitesinde `/urunler/`, `/urun/osb-pano` ve `/haberler/1` rotaları ayrı
içerik ve başlıklarla HTTP 200 verdi; “bütün iç URL'ler ana sayfaya gidiyor” hatası kapandı.
Geri dönüş
Güncelleme rollback'li self-update hattıyla uygulanır. Kod, veritabanı, frontend,
integrity manifesti veya sağlık kapılarından biri başarısız olursa önceki çalışan
sürüme otomatik dönüş yapılır. DNS-01 ile alınmış geçerli sertifika dosyaları geri
dönüşte silinmez; önceki web sunucusu yapılandırması korunur.
ONOXSOFT 2026.8.4 «Mühür»
Yayın tarihi: 1 Ağustos 2026 · Kanal: stable · Önceki: 2026.8.3 «Geçit»
Bu düzeltme sürümü, OpenLiteSpeed geçişinden sonra lisans ve müşteri alan adlarının
yanlış SNI sertifikasına düşmesini önler. Lisans istemcisi kanonik API adresini kullanır;
eski ONOX lisans yolları mevcut kurulumlarda otomatik uyarlanır.
Lisans API ve SSL
- Kanonik lisans uç noktası `https://license.onox.com.tr` olarak birleştirildi. Yeni
kurulum, satın alma, heartbeat, kurtarma ve marketplace çağrıları aynı doğrulanmış
SNI hostunu kullanır.
- Eski `https://onox.com.tr/license` ve `https://onox.com.tr/lisans` değerleri yalnız
ONOX adresleri için çalışma anında kanonik hosta çevrilir. Özel veya kurum içi lisans
sunucusu tanımları değiştirilmez.
- TLS doğrulaması açık kalır. Sertifika hostname uyuşmazlığını gizlemek için SSL
doğrulamasını kapatan bir geçici çözüm kullanılmaz.
- OLS sertifika bağlama adımı, alan adına ait mevcut joker/SAN sertifikasını vhost
`vhssl` bloğuna taşır; listener'ın panel sertifikasına sessizce düşülmez.
OpenLiteSpeed geçiş uyumluluğu
- OLS vhost üreticisinin `.htaccess` çeviricisi, self-update'in gerçekten kurduğu
`/usr/local/onoxsoft/bin` konumundan bulunur; eski ve çalışmayan yol geriye uyumlu
yedek olarak korunur.
- `public_html/license -> ../uygulama/public` benzeri doğrudan symlink mount'larının
ön denetleyici kuralları unified rewrite sırasında korunur. `/license/api/*`, `/buy`
ve benzer alt yollar kök sitenin `index.php` dosyasına düşüp 404 üretmez.
- Yalnız güvenli isimli ve gerçek `index.php` içeren doğrudan symlink'ler çevrilir;
WordPress gibi normal dizinlere ek yönlendirme yazılmaz.
Canlı doğrulama
- Matrix'te 517 OLS vhost doğru sertifikasına bağlandı. `onox.com.tr`,
`license.onox.com.tr` ve `get.onox.com.tr` geçerli `*.onox.com.tr` sertifikasıyla
doğrulandı.
- Lisans tier API'si TLS doğrulaması açıkken HTTP 200 verdi; Matrix lisansı otomatik
kurtarıldı ve Enterprise planı 28 Haziran 2028 bitiş tarihiyle yeniden görüldü.
- Heartbeat başarıyla JWT yeniledi; lisans nedeniyle durdurulan Postfix, Dovecot,
Rspamd ve ClamAV servisleri tekrar aktif doğrulandı.
- Beta, Matrix ve 169 sunucularının lisans istemci adresleri kanonik hosta taşındı;
üç sunucudan da API ve sertifika doğrulaması başarılı geçti.
Geri dönüş
Güncelleme tam rollback'li güncelleyiciyle uygulanır. Kod, veritabanı, frontend,
integrity manifesti veya sağlık kapılarından biri başarısız olursa önceki çalışan
sürüme otomatik dönüş yapılır.
ONOXSOFT 2026.8.3 «Geçit»
Yayın tarihi: 1 Ağustos 2026 · Kanal: stable · Önceki: 2026.8.2 «Gözcü»
Bu sürüm; web sunucusu geçişlerini tek bir atomik sağlık kapısında birleştirir,
OpenLiteSpeed altında 503 üreten vhost/LSAPI kaynak taşmasını sınırlar ve sysapi,
ModSecurity, logrotate ile büyük hesap taramalarının denetim sonuçlarını güvenilir
hâle getirir. Geçiş tamamlanamazsa eski çalışan sürücü portlarıyla birlikte otomatik
geri alınır; yarım geçiş başarı olarak raporlanmaz.
---
Web sunucusu geçişleri
- Apache, Nginx, OpenLiteSpeed ve Caddy için panel `:666` ile müşteri `:80/:443`
listener'larının sahibi artık kod, servis ekranı ve yönetim arayüzünde aynı aktif
sürücü olarak gösterilir.
- Geçiş motoru eski sürücüyü durdurduktan sonra üç portun da boşalmasını bekler; hedef
sürücü doğrulanamazsa aynı üç portu serbest bırakıp önceki çalışan sürücüyü geri getirir.
- Panel vhost üretimi, müşteri vhost göçü ve OpenLiteSpeed unified rewrite işlemleri artık
zorunlu kapıdır. Eksik veya bozuk tek bir vhost sessizce atlanıp “başarılı” gösterilmez.
- OpenLiteSpeed büyük vhost filolarında unified rewrite için gerçekçi süre tanınır; işlem
sonunda servis durumu ve yapılandırılmış sonuç birlikte doğrulanır.
- İki dakikalık web sunucusu watchdog'u artık yalnız veritabanındaki etkin sürücüyü yeniden
başlatır. OLS etkin olduğunda pasif Apache'yi kaldırıp `80/443/666` portlarını çakıştıran
eski davranış kaldırıldı; sürücü çözülemezse yanlış servisi başlatmak yerine açık alarm verir.
- Watchdog ile geçiş motoru aynı `/run/onoxsoft/webserver-switch.lock` kilidini kullanır.
Veritabanı sürücü kaydı henüz eski değerdeyken watchdog'un geçiş ortasında eski sunucuyu
yeniden başlatması ve portları hedef sürücüden geri alması engellenir.
- OpenLiteSpeed'e geçmeden önce aktif domain'lerin kullandığı tüm PHP sürümlerinin karşılık
gelen `lsphp` çalışma zamanları ve temel eklentileri hazırlanır. Eksik bir sürümü daha eski
PHP'ye sessizce düşürmek yerine geçiş trafiğe dokunmadan önce açık hatayla durur.
- Apache PHP-FPM havuzundaki hesap limitleri ile güvenli `.user.ini` direktifleri OLS
`phpIniOverride` yapılandırmasına taşınır. Bellek, yükleme, zaman aşımı, oturum dizini,
`open_basedir` ve devre dışı fonksiyonlar sürücü değişiminde kaybolmaz.
- Eski veya içe aktarılmış OLS listener map'lerinde ana müşteri vhost'unun `webmail.*`,
`panel.`, `mail.` ve otomatik yapılandırma adreslerini gölgelemesi temizlenir. Ayrı sistem
vhost'u varsa kesin eşleşme ona bırakılır; müşteri wildcard ve diğer alias'ları korunur.
- WordPress ve diğer CMS sitelerinin `.htaccess` dosyasındaki güvenli alan-adı yönlendirmeleri
OLS front-controller kurallarından önce taşınır. Apache'de çalışan eski→yeni alan adı 301'i
geçişte kaybolup eksik bir `index.php` üzerinden 500 üretmez.
- Servis raporu `openlitespeed` anahtarını doğru `lsws` birimine eşler ve pasif Apache'yi
panel servisi gibi göstermeyerek geçiş sonrası yanlış kırmızı alarmı önler.
Sysapi çıktı güvenilirliği
- Ortak JSON yazıcısı yalnız JSON standardına uygun sayıları tırnaksız üretir. `curl`
bağlantı kuramadığında gelen `000` değeri artık geçersiz JSON sayısı oluşturmaz.
- Yapılandırılmış sonuç bekleyen sağlık kapıları, exit code `0` olsa bile eksik veya bozuk
JSON'u açık tanı mesajıyla reddeder. Böylece “unknown” hatasının gerçek çıktıyı saklaması
önlenir.
- OpenLiteSpeed WebAdmin `:7080` ön hazırlığı servis henüz kapalıyken `http_code: 0`
döndürür; OLS başladıktan sonra listener ve gerçek HTTPS cevabı ayrıca zorunlu doğrulanır.
- Başarılı fleet polling çağrılarının örnekleme anahtarı artık domain/hesap payload'ına göre
çoğalmaz. `record-list`, salt-okuma `wp-cli`, cgroup, SSL, posta ve servis durum okumaları
15 dakikalık pencerede komut başına tek sağlık izi bırakır; tüm hatalar ve mutasyonlar
hedef payload'ıyla eksiksiz denetlenmeye devam eder.
- Büyük hesapların disk taraması düşük CPU/I/O önceliğinde ve 30 saniyelik kontrollü bütçeyle
çalışır. Zaman aşımı artık `exit 124` denetim hatası veya yanlış `0 B` kota değeri üretmez;
son doğru kullanım ve güncellenme zamanı korunur.
- Turbo toplu durum taraması, yüzlerce OLS sistem alt alanı yapılandırmasını okumadan önce eler.
Büyük vhost filolarında `sysapi:turbo-list` 30 saniyelik köprü bütçesini aşmaz.
- Autopilot canary'sinin siteyi koruyarak tamamen geri aldığı drop-in uyumsuzluğu gerçek sistem
arızası gibi kırmızı kaydedilmez; 12 saatlik back-off korunarak beklenen uyumluluk uyarısı olur.
- ModSecurity denetim günlüğü, dağıtımın mevcut httpd/nginx logrotate kurallarıyla ikinci kez
kaydedilmez. OLS günlüğü için systemd'ye yalnız `/usr/local/lsws/logs` yazma izni verilerek
günlük logrotate işinin salt-okunur dosya sistemi hatasıyla topluca durması önlenir.
- OWASP CRS 3.3.10'daki XML öznitelik güvenlik kuralları OLS için eski sürüme düşürülmez.
Yalnız OLS parser'ının desteklemediği `901181` geri-alma aksiyonu sürücüye özel atomik
uyumluluk kopyasından çıkarılır; XML öznitelik denetimi açık kalır ve kurallar eksiksiz yüklenir.
OpenLiteSpeed 503 ve kaynak izolasyonu
- Müşteri vhost'larının LSAPI süreçleri ortak `apache` UID'si yerine ilgili hosting hesabı
UID/GID'siyle çalışır. Sistem alt alan adlarının paylaşımlı sistem havuzu korunur.
- Müşteri başına LSAPI havuzu yoğun paylaşımlı sunucular için beş worker ile sınırlandı;
boş worker'lar 60 saniyede temizlenir. Yüzlerce vhost'un teorik olarak binlerce PHP
süreci açıp `fork()` baskısı ve 503 üretmesi engellenir.
- Bellek ve süreç tavanları müşteri havuzu başına güvenli sınırlara çekildi. Yeni vhost
üretimiyle mevcut vhost'ların unified rewrite yolu aynı ayarları kullanır.
Doğrulama ve geri dönüş
- Shell → gerçek süreç → `SysapiResult` hattı için zero-padded HTTP kodu regresyon testi
eklendi.
- OLS aktivasyonu bozuk yapılandırılmış çıktıda durur ve çıktının kendisini tanıda gösterir.
- Panel sürücü sahipliği testi, panel adapter'ının aktif sürücüden ayrışmasını engeller.
- Watchdog sözleşme testi, pasif Apache'nin OLS/Nginx/Caddy yanında yeniden başlatılmasını
ve port yarışının ileride geri gelmesini engeller.
Canlı doğrulama
- Aynı imzalı paket Beta, Matrix ve 169 üretim sunucularında tam rollback'li güncelleyiciyle
uygulandı; üç kurulumda da migration, cache, sysapi, health ve panel kapıları geçti.
- Üç sunucuda OLS aktif, Apache pasif bırakıldı; `80/443/666` portlarının tamamının sahibi
OpenLiteSpeed olarak doğrulandı.
- OLS yapılandırma testi, ModSecurity SQLi duman testi, günlük logrotate görevi, PHP IMAP
modülleri ve panel sağlık URL'leri canlıda yeniden kontrol edildi.
- 169 sunucusundaki zehirli sayısal crawler sorguları PHP'ye ulaşmadan `410`, olmayan PHP
dosyası taramaları `404` dönecek şekilde daraltıldı; normal site ve gerçek PHP yolları açık kaldı.
Güncelleme
Sistem → Güncellemeler ekranından kurulabilir. Güncelleme öncesi kod ve veritabanı
snapshot'ı alınır; migration, web sunucusu aktivasyonu veya sağlık kapısı başarısız olursa
önceki çalışan sürüme otomatik geri dönüş uygulanır.
2026.8.2 «Gözcü»
Yayın tarihi: 1 Ağustos 2026 · Kanal: stable · Önceki: 2026.8.1 «Amiral»
Bu sürüm; domainlerin gerçek DNS/IP durumunu görünür kılar, yoğun sunucularda
zamanlayıcı kaynak taşmasını önler, uzak yedekleme sonrasında yerel diskin
gereksiz büyümesini durdurur ve panel genelindeki dil ile sysapi denetimlerini
tutarlı hâle getirir.
---
Domain, NS ve IP sağlık uyarıları
- Domainin yetkili NS sunucuları, public DNS yanıtı ve gerçek A/IP sonucu ayrı
ayrı denetlenir.
- Domain park servisine düşmüşse, hiç IP yanıtı vermiyorsa veya beklenen sunucu
IP’sinden farklı bir adrese gidiyorsa yönetici panosunda kırmızı uyarı oluşur.
- Sağlık sonucu ve son kontrol zamanı saklanır; geçici resolver hataları doğru
DNS sonucu gibi gösterilmez.
- DNS sağlık alanları mevcut kurulumlara migration ile eklenir.
Panel dili ve durum etiketleri
- active, suspended, pending ve benzeri ortak durum kodları merkezi
dil sistemine bağlandı.
- Hesap seçici ve e-posta yönetimi dâhil aynı durumun geçtiği ekranlarda Türkçe
karşılıklar kullanılır; diğer panel dilleriyle uyum korunur.
- Ham İngilizce durum kodlarının farklı bileşenlerde yeniden görünmesini önleyen
ortak çeviri eşlemesi eklendi.
Google Drive yedekleri ve yerel disk kullanımı
- Google Drive veya başka bir offsite hedef başarıyla doğrulanmadan yerel kopya
silinmez; tek kopya güvenliği korunur.
- Uzak tam hesap yedeği posta verisini kapsıyorsa ikinci bir yerel posta arşivi
oluşturulmaz.
- Root korumalı yedek dizinleri artık panel kullanıcısının doğrudan dosya
kontrolüne bırakılmaz. Dosya varlığı güvenli, salt-okuma sysapi üzerinden
toplu doğrulanır.
- Diskte bulunduğu hâlde yanlışlıkla “yerelden silinmiş” işaretlenen kayıtlar
otomatik düzeltilir; böylece Google Drive göndericisi bu dosyaları atlamaz.
- Günlük offsite güvenlik ağı yalnız son 24 saati değil, gönderilmemiş tüm yerel
yedekleri tarar. Başarılı yüklemeden sonra yerel kopya politika gereği
temizlenir.
- Tamamlanmış taşımalardan kalan geçici arşivler ve yerel yedek sapmaları için
güvenli temizleme/uzlaştırma akışları eklendi.
Zamanlayıcı ve yüksek yük dayanıklılığı
- Laravel zamanlayıcısı süreç genelinde flock ile tekilleştirildi; bir dakika
turu uzasa bile ikinci bir bakım turu üstüne binmez.
- /etc/cron.d altında kalıp Cronie tarafından ikinci görev gibi okunabilen
eski zamanlayıcı yedekleri güvenli yedek dizinine taşınır.
- Çok sayıda vhost taranırken sahip adı için her dizinde NSS sorgusu yapmak
yerine sayısal UID kullanılır ve /etc/passwd eşlemesi bir kez kurulur.
Böylece systemd-userwork süreçlerinin binlerce çoğalıp RAM ve load tüketmesi,
panelde 503/zaman aşımı üretmesi engellenir.
- Swap bulunmayan yoğun kurulumlarda bakım turlarının sistemi tamamen
kilitlemesine karşı kurulum ve canlı onarım kontrolleri güçlendirildi.
Sysapi ve denetim kaydı düzeltmeleri
- apache-modules-list, cron-audit-read, turbo-dropin,
turbo-edge ve wp-cli işlemlerindeki gerçek kök hatalar giderildi.
- Apache modül algılama farklı servis/paket düzenleriyle uyumlu hâle getirildi.
- Turbo ve WordPress salt-okuma kontrolleri başarısız işlem gibi raporlanmaz;
başarılı polling kayıtları örneklenerek denetim kaydı seli önlenir.
- Başarısız işlemler görünür kalır; hata gizleme veya kör “başarılı” sonucu
üretilmez.
PHP 8.2 IMAP kurulumu
- Kurulum ve güncelleme aktif PHP çalışma zamanını ayırt eder.
- OpenLiteSpeed/LSPHP 8.2 ile Remi PHP 8.2 için doğru IMAP paketi ve eklentisi
idempotent biçimde kurulur, etkinliği gerçek PHP binary’siyle doğrulanır.
- E-posta kimlik doğrulama ekranındaki yanlış veya elle uygulanması gereken
paket talimatı kaldırıldı.
---
Canlı doğrulama
- 2026.8.2 temiz yükseltme ve migration akışı üç üretim sunucusunda doğrulandı.
- Tek zamanlayıcı zinciri, kilit davranışı ve yoğun vhost taraması canlı yük
altında test edildi; kullanıcı çözümleme işçisi taşması oluşmadı.
- Google Drive hedefi, yerel kayıt uzlaştırması ve yalnız başarılı offsite
kopyadan sonra silme güvenlik kapısı doğrulandı.
- Panel, müşteri siteleri, MariaDB, Redis, OpenLiteSpeed ve ONOX servisleri
yükseltme sonrasında sağlık kontrollerinden geçti.
Güncelleme
Sistem → Güncellemeler ekranından kurulabilir. Güncelleme öncesi kod ve
veritabanı snapshot’ı alınır; migration veya sağlık kapısı başarısız olursa
otomatik geri dönüş uygulanır.
2026.8.1 «Amiral»
Bu amiral sürüm, yoğun yük veya geçici sysapi erişim sorununun panelde
“servis durdu”, “0 kayıt” ya da “işlem başarılı” gibi yanlış bir sonuca
dönüşmesini engeller. Taşıma ve web sunucusu geçişleri de doğrulanmadan
tamamlanmış sayılmaz.
Yük altında doğru ve hızlı sağlık görünümü
- Sağlık ölçümleri `fresh`, `stale`, `last_good`, `collecting`,
`partial` ve `unavailable` durumlarıyla taşınır.
- Yeni ölçüm zaman aşımına uğrarsa son sağlıklı veri ve yaşı gösterilir;
eski veri hiçbir zaman güncelmiş gibi, ölçüm hatası da “durduruldu” veya
sıfırmış gibi sunulmaz.
- Servis ekranı her unit için ayrı `systemctl` çağrısı yapmak yerine tek,
süre sınırlı toplu systemd sorgusu kullanır.
- Firewall dinleyicileri, fail2ban ve ClamAV ölçümleri veri alınamadığında
boş/başarılı sonuç üretmez; kullanıcıya ölçümün durumu açıkça gösterilir.
- Arka plan yenilemeleri tekilleştirilir ve kontrollü geri çekilmeyle yeniden
denenir; hata sessizce yutulmaz.
Başarısız kuyruk işleri
- Panodaki “Başarısız işler” uyarısı artık genel log sayfasına değil, gerçek
kuyruk yönetim ekranına gider.
- Tek iş veya tüm işler yeniden denenebilir; kayıt gerçekten başarısız işler
tablosundan ayrılmadıysa işlem başarılı sayılmaz.
- Tek kayıt silme ve tüm başarısız kayıtları temizleme işlemleri açık onayla
yapılır.
- Kendini periyodik olarak yenileyen sağlık probe’ları son denemede de hata
verirse durum UI ve loglarda korunur; operatörün elle düzeltemeyeceği yinelenen
kayıtlarla `failed_jobs` tablosu doldurulmaz.
Taşıma ve web sunucusu geçiş güvenliği
- cPanel taşıması tamamlanmadan önce hesap doktoru hem onarım hem temiz
doğrulama geçişini çalıştırır.
- Hedef hesabın web sunucusu için ana domain, vhost yükleme ve sentetik joker
host istekleri uçtan uca doğrulanır.
- Domain envanteri okunamazsa kontrol başarılı varsayılmaz; geçiş veya taşıma
fail-closed davranır.
- Apache panelin `:666` arka ucu olarak çalışırken nginx/Caddy müşteri
sürücüsüyle karıştırılmaz; OpenLiteSpeed ise kendi gerçek yapılandırma
testinden geçer.
- Web sunucusu geçişinde vhost sayımı, sağlık kapısı veya HTTP/joker kontrolü
başarısız olursa yeni sürücü kalıcılaştırılmaz ve önceki çalışan sürücüye
güvenli geri dönüş uygulanır.
- OpenLiteSpeed LSAPI kullandığı için Apache/nginx’e ait FPM havuzu kontrolleri
OLS hesaplarında yanlış arıza üretmez.
Yayın kapısı
Stable dağıtım öncesinde AlmaLinux 9/10 üzerinde aşağıdaki matrisin tamamı
geçmelidir:
1. Temiz kurulum ve `2026.7.87` sürümünden yükseltme.
2. Apache, nginx, OpenLiteSpeed ve Caddy geçişleri ile geri dönüş senaryoları.
3. cPanel taşıması; ana domain, addon domain ve joker domain doğrulamaları.
4. Kontrollü CPU/IO yükü altında panel sağlık ekranları ve sysapi zaman
aşımı senaryoları.
5. Başarısız kuyruk işini yeniden deneme, tek silme ve toplu temizleme.
Bu matris tamamlanmadan sürüm stable kanalına yükseltilmemelidir.