Panelica'yı yazarken en çok korktuğum kısım hep teknik taraftı: farklı PHP
sürümleri, kullanıcı izolasyonu, Nginx/Apache, mail, DNS… Aylarca kafa
patlattığımız yer burasıydı. Sonunda panel oturdu.
Ama hosting sadece panel değil. Bir sağlayıcı için asıl döngü şu: müşteri gelir,
sipariş verir, ödeme alınır, hesap otomatik açılır, her ay fatura kesilir,
ödemezse askıya alınır. Yani faturalandırma ve provizyon. Biz de en başta "bunu
WHMCS'e bırakırız" dedik.
Sonra WHMCS'e yakından baktık: kapalı kaynak ve müşteri başına ücretli. Yani
büyüdükçe daha çok ödüyorsun, kaynağını göremiyorsun, istediğin gibi
genişletemiyorsun. Tam da Panelica'yı yazarken kaçtığımız "sisteme kilitlenme"
hissi. "Ne kadar zor olabilir ki, sonuçta CRUD" dedik. Ürün, plan, sipariş,
fatura… Klasik. İşte o cümleyi kuran herkesin başına gelen şey bizim de
başımıza geldi.
Faturalandırma sinsi çıktı, çünkü:
– Para işin içinde. Ödeme geçidinden (Stripe/PayPal) gelen webhook iki kere
gelirse, ağ koparsa ya da sıra karışırsa müşteriyi iki kere faturalandırma
riskin var. Idempotency'yi baştan doğru kurmadan billing yazmak, sonradan
"bu adam neden iki kere ödemiş?" diye log kurcalamak demek. Bu tek başına
panelin yarısı kadar uğraştırdı.
– Provizyon her panelde farklı. cPanel'in API'si başka, Plesk başka, Proxmox
bambaşka. "Hesap aç / askıya al / kapat" gibi basit görünen şeyi, her panele
ayrı ayrı değil de tek bir modül arayüzünün arkasına almak gerekiyordu. Bu
soyutlamayı kaç kez baştan yazdık, saymadım.
– Geri kalan "küçük" şeyler: müşteri paneli, ticket, reseller, çoklu dil, çoklu
tema, iade, para birimi… Her biri tek başına küçük, hepsi birden bir ürün.
Sonunda ortaya PNLCS çıktı: Laravel ile yazılmış, kendi sunucunda çalıştırdığın,
açık kaynak (MIT) bir hosting faturalandırma platformu. Panelica'ya bağlı değil,
bilerek cPanel/Plesk/DirectAdmin/Proxmox ile de çalışıyor. WHMCS bizi kilitlediği
için yazdık; o yüzden başkasını kilitlemesin diye açık bıraktık.
En büyük dersim şu oldu: bir üründe "sıkıcı" sandığın CRUD kısmı, çoğu zaman asıl
mühendisliğin saklandığı yerdir. Panel görünürde zor, ama para + dış sistemler +
idempotency bir araya gelince billing beni daha çok yıprattı.
Repo (MIT): https://github.com/Panelica/pnlcs
Merak ettiğim: ödeme/webhook tarafında idempotency'yi siz nasıl çözdünüz? Bir de
"kolay sanıp altından zor kalktığınız" bir CRUD projeniz oldu mu?
Source: r/minikdev · by /u/SatoshiTURK