Sıfırdan Bir Hosting Platformu İnşa Etmek: Makdos Hikâyesi
2020 ile 2023 arasında, 500 ile 1.000 arası müşteriye hizmet verecek kadar büyüyen ve yılda yaklaşık yarım milyon dolar gelir üreten Makdos adlı bir hosting platformu kurup işlettim. Bu, boş bir depodan, gerçek para, gerçek müşteriler ve gerçek beklentilerle başa çıkan bir üretim sistemine giden yolun hikâyesidir.
Doğuş
Türkiye'deki hosting pazarı, aynı cPanel tabanlı çözümleri yeniden paketleyen bayilerle hep kalabalık oldu. Çoğu, aynı özellikleri, aynı arayüzleri ve aynı kısıtlamaları sunuyordu. Farklı bir şey inşa etmek için bir fırsat gördüm: özel bir kontrol paneline, daha iyi bir geliştirici deneyimine ve maliyet kısma yerine güvenilirlik için tasarlanmış bir altyapıya sahip modern bir hosting platformu.
Makdos'u 2020'nin başlarında, dünya tam karantinaya girerken inşa etmeye başladım. Zamanlama tesadüfiydi ama şanslıydı; çevrimiçi hizmetlere talep tavan yapıyordu ve işletmeler web varlıklarını kurmak ya da geliştirmek için adeta yarışıyordu.
Teknoloji Yığını
Doğru yığını seçmek kritikti, çünkü bunun karmaşık gereksinimlere sahip uzun soluklu bir proje olacağını biliyordum. İşte karar kıldığım yığın ve nedenleri.
Önyüz React ile inşa edildi ve daha sonra, pazarlama sayfalarının daha iyi SEO ve sunucu taraflı render edilmesi için Next.js'e taşındı. Müşteri paneli, markamızla uyumlu özel bir bileşen kütüphanesine sahip, tek sayfalık bir React uygulamasıydı. Stil için Tailwind CSS kullandım; bu, tasarımı tutarlı tuttu ve hızla iterasyon yapmayı kolaylaştırdı.
Arka uç, müşteriye dönük API için Node.js ile altyapı yönetim katmanı için Python ve FastAPI arasında bölündü. Node.js; kimlik doğrulama, faturalandırma, destek talepleri ve herhangi bir SaaS platformunu çalıştıran genel CRUD işlemlerini ele alıyordu. Python ve FastAPI ise ağır işleri üstleniyordu: sunucu sağlama, DNS kayıtlarını yönetme, web sunucularını yapılandırma ve alttaki Linux sistemleriyle etkileşim.
Neden iki dil? Node.js, web API'lerini hızla kurmak için mükemmeldir, ama altyapı otomasyonu Python'ın alanıdır. Sistem yönetimi, sunucu yapılandırması ve bulut sağlayıcı API'leri için kütüphane ekosistemi Python'da çok daha zengindir. FastAPI bana ihtiyaç duyduğum performans ve tip güvenliğini, OpenAPI üzerinden otomatik API dokümantasyonuyla birlikte sağladı.
Birincil veritabanı, güvenilirliği, genişletilebilirliği ve etrafındaki mükemmel araç ekosistemi için seçilen PostgreSQL'di. Önbellekleme, oturum depolama ve arka plan işlerinin işlenmesinde mesaj aracısı olarak Redis kullandım.
Kontrol Panelini İnşa Etmek
Kontrol paneli ürünün yüzüydü. İlk web sitesini kuran küçük işletme sahipleri gibi teknik olmayan kullanıcılar için yeterince sezgisel, ince ayar kontrolü isteyen yazılımcılar için ise yeterince güçlü olmalıydı.
Paneli "servisler" kavramı etrafında tasarladım: her müşterinin birden fazla servisi (paylaşımlı hosting, VPS, alan adı, SSL sertifikası) olabiliyor ve her servisin kendi yönetim arayüzü bulunuyordu. React bileşen mimarisi bu modele doğal olarak oturdu. Her servis türünün yapılandırma, izleme ve yönetim için kendi bileşen kümesi vardı.
Dosya yönetimi en çetrefilli özelliklerden biriydi. Sürükle-bırak yüklemelerini, sözdizimi vurgulamalı tarayıcı içi kod düzenlemeyi ve izin yönetimini destekleyen, web tabanlı bir dosya yöneticisi kurdum. Dosya yöneticisi, büyük yüklemeler sırasında gerçek zamanlı ilerleme güncellemeleri için arka uçla WebSocket üzerinden iletişim kuruyordu.
Veritabanı yönetimi bir başka önemli özellikti. Müşteriler MySQL ve PostgreSQL veritabanlarını doğrudan panelden oluşturabiliyor, yedekleyebiliyor ve geri yükleyebiliyordu. Yedekleme sistemi, hem manuel anlık görüntüleri hem de yapılandırılabilir saklama politikalarına sahip otomatik günlük yedeklemeleri destekliyordu.
Sağlama (Provisioning) Motoru
Sağlama motoru, tüm sistemin en karmaşık parçasıydı. Bir müşteri yeni bir hosting paketi sipariş ettiğinde sistemin; otomatik olarak bir Linux kullanıcısı oluşturması, disk kotalarını yapılandırması, bir web sunucusu sanal konağı kurması, bir FTP hesabı oluşturması, e-posta yönlendirmesini ayarlaması, SSL sertifikaları sağlaması ve DNS kayıtlarını güncellemesi gerekiyordu. Tüm bunların güvenilir, idempotent ve birkaç saniye içinde gerçekleşmesi gerekiyordu.
Sağlama motorunu Python'da, Celery ve Redis ile bir görev kuyruğu deseni kullanarak kurdum. Her sağlama adımı tek bir Celery görevi, genel sağlama iş akışı ise adımları sırayla yürüten bir Celery zinciriydi. Herhangi bir adım başarısız olursa sistem onu otomatik olarak yeniden deniyor ve yapılandırılabilir sayıda denemenin ardından tüm zinciri geri alıyordu.
İdempotentlik temel bir tasarım ilkesiydi. Her sağlama görevi, yan etkilere yol açmadan birden çok kez çalıştırılabilirdi. Bu, güvenilirlik için temel önemdeydi; bir görev zaman aşımına uğrayıp yeniden denenirse, yinelenen kaynaklar oluşturmamalı veya sistemi tutarsız bir durumda bırakmamalıydı.
Faturalandırma ve Abonelik Yönetimi
Bir hosting platformu, temelde üzerine teknik bir katman bindirilmiş bir faturalandırma sistemidir. Faturalandırmayı doğru yapmak, gelir ve müşteri güveni açısından kritikti.
Aylık ve yıllık planlara sahip, abonelik tabanlı bir faturalandırma sistemi kurdum. Müşteriler planlarını istedikleri zaman yükseltebiliyor, düşürebiliyor veya iptal edebiliyor, orantılı krediler ise otomatik olarak uygulanıyordu. Faturalandırma motoru, faturaları hesaplıyor, ödemeleri yerel Türk ödeme sağlayıcıları üzerinden işliyor ve başarısız ödemelerin yeniden denemelerini yapılandırılabilir vade tanıma süreleriyle ele alıyordu.
Fatura oluşturma, başlangıçta beklediğimden çok daha karmaşıktı. Türk vergi düzenlemeleri belirli fatura biçimleri gerektiriyor ve platformu işlettiğim üç yıl boyunca kurallar değişti. Fatura oluşturma mantığını bir arayüzün arkasına soyutladım; böylece düzenleyici değişiklikler yalnızca tek bir modülün güncellenmesini gerektiriyordu.
İzleme ve Operasyonlar
Bir hosting platformu işletmek, başkalarının web sitelerinden ve uygulamalarından sorumlu olmak demektir. Bizim altyapımız çökerse, müşterilerimizin işleri çöker. Kurduğum izleme yığını bu sorumluluğu yansıtıyordu.
Altyapı izleme için Prometheus ve Grafana kullandım; sağlama başarı oranları, faturalandırma işlem hacimleri ve müşteri destek yanıt süreleri gibi uygulamaya özgü metrikler için ise özel dışa aktarıcılar (exporter) yazdım. Uyarılar, eskalasyon politikalarıyla Alertmanager üzerinden yapılandırıldı: Slack'e bir uyarı, telefonuma kritik bir alarm.
Müşteriye dönük izleme de önemliydi. Her hosting hesabının; kaynak kullanımını (CPU, bellek, disk, bant genişliği), son erişim günlüklerini ve hata günlüklerini gösteren bir durum sayfası vardı. Bu, müşterilerin yaygın sorunları kendileri teşhis edebilmesi sayesinde destek taleplerini belirgin biçimde azalttı.
İşi Ölçeklendirmek
0'dan 500'ün üzerinde müşteriye büyümek, hem üründe hem de altyapıda sürekli iterasyon gerektirdi. Özellikleri destek talebi desenlerine göre önceliklendirmeyi öğrendim; birden çok müşteri aynı şeyi istiyorsa, o özellik yapılacaklar listesinin en üstüne çıkıyordu.
Müşteri desteği, kontrol paneline kendi inşa ettiğim entegre bir talep sistemi üzerinden yürütülüyordu. Destek temsilcileri, talebin yanında müşterinin servislerini, kaynak kullanımını ve son etkinliklerini görebiliyordu; bu da çözüm sürelerini çarpıcı biçimde kısaltıyordu.
Altyapı ölçeklendirmesi öngörülebilir bir desen izledi. Müşteri sayısı arttıkça, her biri Ansible playbook'larıyla aynı şekilde yapılandırılmış daha fazla paylaşımlı hosting düğümü ekledim. Bu Kod Olarak Altyapı (Infrastructure-as-Code) yaklaşımı, yeni bir düğümü ayağa kaldırmanın saatler değil dakikalar sürmesi anlamına geliyordu.
Gelir Yolculuğu
Yıllık yaklaşık 500.000 dolar gelire ulaşmak düz bir çizgi değildi. İlk yıl yavaştı; ürünü inşa etmek, ilk müşterileri kazanmak ve geri bildirime göre iterasyon yapmakla geçti. İkinci yıl, ağızdan ağıza yayılma ve SEO istikrarlı trafik getirmeye başladıkça belirgin bir büyüme gördü. Üçüncü yıla gelindiğinde platform, sağlıklı kâr marjlarıyla istikrarlı, yinelenen gelir üretiyordu.
Fiyatlandırma stratejisi zamanla evrildi. İlk benimseyenleri çekmek için agresif fiyatlandırmayla başladım, ardından özellik seti olgunlaştıkça fiyatları kademeli olarak artırdım. İndirimli yıllık planlar en popüler seçenekti ve öngörülebilir bir nakit akışı sağlıyordu.
Neyi Farklı Yapardım
Makdos'u bugün kuruyor olsaydım, otomatik testlere daha erken yatırım yapardım. Özellikle sağlama motoru, ancak birkaç üretim olayını yaşadıktan sonra eklediğim kapsamlı entegrasyon testlerine ihtiyaç duyuyordu.
Ayrıca en baştan daha sağlam bir API kurardım. Platform büyüdükçe üçüncü taraf entegrasyonları desteklememiz gerekti ve mevcut bir sisteme temiz, sürümlenmiş bir API'yi sonradan eklemek sancılıydı.
Son olarak, altyapı yönetim katmanını gerçekten bağımsız bir servise daha erken ayırırdım. Web uygulaması ile sağlama motoru arasındaki sıkı bağ, daha temiz bir mimarinin önleyebileceği dağıtım zorlukları yarattı.
Daha Büyük Resim
Makdos'u inşa etmek bana, başarılı bir platformun yalnızca koddan ibaret olmadığını öğretti; o, operasyon, destek, faturalandırma ve güvendir. Teknik zorluklar gerçek ve önemliydi, ancak operasyonel zorluklar da en az onlar kadar talepkârdı. Bir hosting platformu yönetmek, bana uygulama kodu yazmanın çok ötesine geçen bir full-stack mühendislik perspektifi kazandırdı.