
Dahili Sistem
Yürüttüğüm 24 projeyi tek tablodan izleyen dahili kontrol paneli. Alan adı ve sertifika bitişi, dağıtım durumu, arama ve ölçüm bağlantılarının eksikleri tek yerde toplanıyor. Panel kod değiştirmiyor; teşhis ediyor, düzeltmeyi ilgili projenin kendi reposunda ben yapıyorum.
Yirmi dört ayrı proje ve alan adı yürütürken bozulan şey kod değil, görünürlük. Bir sertifikanın süresi doluyor, bir dağıtım başarısız kalmış, bir sitede ölçüm kodu hiç kurulmamış — bunların hiçbiri hata olarak karşına çıkmıyor; yalnız bir gün birinin gözüne takılıyor. Sorunun asıl kısmı tespit değil, süre: bir eksiğin ne zamandan beri orada olduğunu bilmeden hangisinin önce düzeltileceğine karar veremiyorsun. İkinci mesele, izleme aracının kendisi bir risk kaynağı: yirmi dört projeye erişebilen bir anahtar kümesi, o anahtarların nerede durduğu sorusunu tasarımın merkezine koyuyor.
Tek kullanıcı: ben. Bu, panelin şeklini belirleyen bir kısıt — çok kullanıcılı yetkilendirme, davet akışı ve rol yönetimi yazılmadı. Buna karşılık kullanım anı iki farklı: sabah bakışı (bugün ne bozuldu) ve haftalık bakış (hangi eksik en uzun süredir duruyor). Panel bu ikisine göre bölünmüş.
Tek geliştirici. Kısıt analizinin kendisi, veri modeli, tarama script'i, panel arayüzü, bildirim katmanı ve dağıtım.
Sistem iki parçaya ayrılmış ve bu ayrım tasarımın merkezinde. Toplu tarama, panelin çalıştığı ortamda değil, zamanlanmış bir iş olarak dışarıda koşuyor: yirmi dört projeyi sırayla sorguluyor ve sonucu doğrudan Neon Postgres'e yazıyor. Panel yalnız okuyor. Sayfa yüklenirken hiçbir dış servise istek gitmiyor; ekranda görünen her şey daha önce yazılmış bir tarama sonucu. Veri modeli beş kavram üzerine kurulu: envanterdeki proje, tarama koşumu ve tekil tarama, tarama sonucu doğan bulgu, bulgudan türeyen öneri ve karara bağlanmış görev. Değişiklikler ayrı bir günlüğe yazıldığı için bir bulgunun ne zaman açıldığı ve ne kadar süredir durduğu geçmişten okunabiliyor. Panel bir bulgu gösterdiğinde yanında kopyalanabilir bir komut sunuyor; komut panelde değil, benim terminalimde çalışıyor.
Kararın gerekçesi iki sert kısıt. Birincisi zamanlayıcı: kullanılan barındırma planında zamanlanmış iş günde en fazla bir kez çalışıyor ve tetiklenme anı belirsiz. İkincisi süre: aynı planda fonksiyon zaman aşımı on saniye ve yirmi dört projelik tarama bu sürede bitmiyor. Tarama dışarı taşınınca ikisi de ortadan kalktı — sıklık sınırı yok, zaman aşımı yok.
ÖdünleşimSistem artık iki ayrı ortamda yaşıyor ve ikisinin ayarları birlikte doğru olmak zorunda. Tarama tarafında bir hata, panelde hata olarak görünmüyor; yalnız veri tazelenmemiş oluyor ve bunu fark etmek için tarama koşumlarının kendisine bakmak gerekiyor.
Ayrım zamanlayıcı kısıtından doğdu ama asıl değeri güvenlikte: yirmi dört projeye erişen anahtar kümesi taramanın koştuğu yerde duruyor, panelin ortamında yalnız tek bir projeyi sorgulayacak kadar yetki var. Panelin ele geçirilmesi bütün portfolyoya erişim anlamına gelmiyor.
ÖdünleşimAynı anahtar iki yerde yönetiliyor ve biri döndürüldüğünde diğerinin unutulması mümkün. Bunu yakalayan otomatik bir kontrol yok; unutulan taraf ancak ilgili özellik çalışmadığında ortaya çıkıyor.
Panel dağıtılmış bir uygulama; yerel dosya sistemine erişemiyor ve repoları okuyamıyor. Bu kısıtı aşmaya çalışmak yerine kapsam ona göre çizildi: panel sorunu ve bağlamını gösteriyor, yanına kopyalanabilir bir komut koyuyor, düzeltmeyi ben kendi terminalimde yapıyorum. Otomatik düzeltme yazan bir araç, yirmi dört farklı kod tabanında aynı varsayımlarla çalışmak zorunda kalırdı.
ÖdünleşimDüzeltme adımı otomatikleşmiyor; panel bir şeyin bozuk olduğunu söyleyebiliyor ama düzeldiğini yalnız bir sonraki taramada görebiliyor. Aradaki süre boyunca aynı bulgu ekranda durmaya devam ediyor.
Panel envanterinde alan adları, kayıt firması ve DNS bilgisi, trafik sayıları ve iletişim kayıtları var. Bunlar müşterilere ait; portfolyoda gösterilecek bir görselin bu bilgiyi taşıması mümkün değil. Bu vakadaki görselde projeler numaralandırılmış etiketlerle duruyor.
ÖdünleşimMaskeleme, panelin gerçek kullanım hissini zayıflatıyor: ekran görüntüsü sistemin ne yaptığını anlatıyor ama bir kullanıcının gördüğü şeyi göstermiyor. Bu bedel bilerek ödeniyor.
Panel tarafında Next.js ve Drizzle, tarama tarafında düz bir Node script'i — ikisi de aynı şemayı paylaşıyor, çünkü tek gerçek kaynak veritabanı. Neon, dağıtımla aynı serverless modelde ve dışarıdan koşan tarama işi için de erişilebilir; envanterin ikinci bir kopyası tutulmuyor. Zamanlayıcı olarak bir CI hattı kullanılmasının sebebi tercih değil kısıt: sıklık ve süre sınırı olmayan tek seçenek oydu. Oturum tarafında tek kullanıcı olduğu için karmaşık bir yetki modeli kurulmadı. Web Push, bir bulgunun fark edilme süresini kısaltmak için — e-posta kutusunda kaybolan bir uyarı, uyarı sayılmıyor.
Panel oturum korumalı ve rota koruması Node çalışma zamanında yürüyor. Envanterdeki hassas alanlar — kayıt firması, DNS yapılandırması, iletişim kaydı — yalnız panel içinde görünüyor ve hiçbir dış çıktıya, ekran görüntüsüne veya bu vakaya girmiyor. Geniş yetkili servis hesabı anahtarları panelin ortamında bulunmuyor; orada yalnız tek proje sorgulayacak kadar yetki var. Servis hesabı izinleri her mülk için elle veriliyor — otomatikleştirilmesi mümkün değil ve bu, izinlerin sessizce genişlemesini de engelliyor.
Bu panel kapalı bir sistem; tarih damgalı bir Lighthouse çıktısı bulunmadığı için buraya sayfa hızı skoru yazılmadı. Yapısal ölçü şu: sayfa yüklenirken dış servise istek gitmiyor, ekrandaki her değer veritabanından okunuyor. Yirmi dört projelik tarama on saniyelik bir fonksiyon zaman aşımına sığmadığı için panelin dışına taşındı; panelde kalan tek tarama yolu, tek proje için çalışan ve saniyelerle ölçülen "şimdi tara" ucu.
Envanteri başlangıçta depoda YAML dosyaları olarak tutuyordum ve veritabanına taşımayacağımı yazmıştım; sonra taşıdım ve YAML tarafını tamamen sildim. Bunu doğru bulmamın sebebi taşınma değil silinme: aynı bilginin iki kopyası varken hangisinin doğru olduğu er geç tartışma konusu oluyor. Aynı ders Bergaz Operasyon'da da çıkmıştı — orada dört ayrı sistem tuttuğu için aynı kişi iki yerde iki ayrı kayıt olarak duruyor ve eşleştirme elle yapılıyor. İkinci nokta tarama tarafı: bugün taramanın kendi sağlığını da veritabanına yazdırırdım. Panel şu an "veri var" ile "veri taze" arasındaki farkı göstermiyor; başarısız bir tarama koşumu, sessizce eski veriyi doğruymuş gibi bırakıyor.
Ne yapmak istediğinizi anlatın; ne kadar süreceğini ve nereden başlanacağını baştan söylerim.