Self-Service Kayıt (Mimari)¶
Self-Service kayıt, ilgilenen kişilerin satış temasına gerek kalmadan kendilerine bir DiKAS Cloud örneği kurmasına olanak tanır – isteğe bağlı olarak ücretsiz bir deneme (Trial) veya doğrudan ücretli, canlı bir örnek olarak. Bu sayfa teknik mimariyi, yapılandırmayı ve güvenlik mekanizmalarını açıklar. Son kullanıcı bakış açısı Çevrimiçi Kayıt sayfasında anlatılmıştır.
Varsayılan olarak devre dışı (Dark-Rollout)
Herkese açık huni, SelfServiceSignupEnabled bayrağıyla güvence altına alınmıştır ve teslim
durumunda kapalıdır. Bayrak false olduğu sürece tüm herkese açık uç noktalar 404
döner. Bir etkinleştirmeden önce Etkinleştirmeden önce altındaki
maddelerin karşılanması gerekir.
Genel Bakış¶
Süreç, herkese açık bir ön yüz sihirbazından ve bir dizi anonim arka uç uç noktasından oluşur.
Asıl provizyon işlemi, Portal ve Trial yolunun da kullandığı aynı ILicenseProvisioningService
üzerinden yürür.
| Alan | Yer |
|---|---|
| Ön yüz sihirbazı | Rota /signup (PublicOnboardingWizardComponent, dikas-web uygulaması) |
| Magic Link onayı | Rota /signup/verify |
| Arka uç uç noktaları | /api/v1/onboarding/public/* ve /api/v1/trial/start |
| Özellik paketi | Dikas.Features.Licensing |
Sihirbaz yedi adımdan geçirir: Paket → TSE (Cloud'a karşı Swissbit) → Hesap (e-posta, Magic Link ile parolasız) → Firma bilgileri → Çevrimiçi ad (alt alan adı) → Yasal & Ödeme → Tamamlandı (örnek URL'si ve erişim bilgileri).
SelfServiceSignupEnabled Özellik Bayrağı¶
Bayrak, tekil (singleton) OperationalConfig belgesinde (sabit kimlik operationalconfig) bir
özellik olarak bulunur ve yalnızca veritabanı üzerinden ya da Admin arayüzünden
değiştirilebilir – bunun için hiçbir ortam değişkeni yoktur.
Her herkese açık uç nokta önce CheckSelfServiceEnabledAsync()'i çağırır ve bayrak false
olduğu sürece 404 Not Found ile yanıt verir. Huni böylece bilinçli olarak etkinleştirilene
kadar görünmez kalır.
Herkese Açık Uç Noktalar¶
Tüm uç noktalar [AllowAnonymous]'tur ve bayrak ile kötüye kullanım önleme tedbirleriyle
güvence altına alınmıştır.
| Yöntem ve Yol | Amaç |
|---|---|
POST /api/v1/onboarding/public/orders |
Anonim taslak sipariş oluşturma (gizli sipariş token'ı döner) |
PUT /api/v1/onboarding/public/orders/{id} |
Taslağı güncelleme (token'a bağlı) |
POST /api/v1/onboarding/public/orders/{id}/reserve-name |
Çevrimiçi adı kısa süreliğine rezerve etme |
POST /api/v1/onboarding/public/register |
Parolasız müşteri oluşturma, Magic Link gönderme |
POST /api/v1/onboarding/public/orders/{id}/bind |
Siparişi Magic Link ile doğrulanan hesaba bağlama ([Authorize]) |
POST /api/v1/onboarding/public/payment/set |
Stripe SetupIntent/PaymentIntent oluşturma (ClientSecret döner) |
POST /api/v1/onboarding/public/payment/webhook |
Stripe webhook'u (ödeme onayı) |
POST /api/v1/onboarding/public/orders/{id}/submit |
Örneği provizyonlama |
GET /api/v1/onboarding/public/payment-config |
Ön yüz için Stripe Publishable Key |
POST /api/v1/trial/start |
Doğrudan self-service deneme (sipariş/portal hesabı olmadan) |
Güvenlik / Kötüye Kullanım Önleme¶
Her provizyon gerçek maliyetler (COGS) oluşturduğundan, birbirinden bağımsız birden fazla koruma katmanı aktiftir:
- Honeypot – gizli bir form alanı; doldurulmuşsa
202 Acceptedile sessizce reddedilir (provizyon yapılmaz). - IP başına hata sınırlayıcı – üstel gecikme, 10 hatadan sonra kilit (1 sa) veya 20 hatadan sonra kilit (24 sa).
- IP ve 24 saat başına provizyon kotası (
MaxPublicProvisionsPerIpPer24h, varsayılan 3). Bu kota hem herkese açık gönderimde hem de Trial başlangıcında geçerlidir ve başarı durumunda sıfırlanmaz. Kota aşılırsa uç nokta429(code: SIGNUP_RATE_LIMITED) ile yanıt verir. - Magic Link bombardımanına karşı IP ve saat başına e-posta gönderim kotası
(
MaxPublicEmailSendsPerIpPerHour, varsayılan 5). - Klasik e-posta onayı yerine Magic Link; tıklama adresi doğrular ve siparişin bağlandığı bir Portal JWT'si döner.
- Gerçek istemci IP'si – Ingress'in arkasında kaynak IP,
ForwardedHeadersüzerinden belirlenir. Güvenilir ağlar (KnownNetworks), deployment'ta cluster CIDR'sine ayarlanmalıdır, aksi halde IP kotası çöker.
Bellek içi kotalar
Kotalar bellekte tutulur (kayan zaman penceresi). Bir yük dengeleyicinin arkasında birden fazla örnek varsa, her örnek kendi başına sayar; bu durumda bir sticky session veya ortak bir önbellek öngörülmelidir.
Yapılandırma¶
Seçenekler Onboarding bölümünden yüklenir (OnboardingOptions). Tüm değerlerin kodda anlamlı
varsayılanları vardır; çift alt çizgi ile ortam değişkeni üzerinden geçersiz kılınabilir.
| Anahtar | Varsayılan | Anlamı |
|---|---|---|
Onboarding__MaxPublicProvisionsPerIpPer24h |
3 |
IP / 24 sa başına maks. provizyon (Gönderim + Trial) |
Onboarding__MaxPublicEmailSendsPerIpPerHour |
5 |
IP / saat başına maks. Magic Link e-postası |
Onboarding__RequireEmailVerifyBeforeProvision |
true (Portal) |
Provizyondan önce e-posta onayını zorunlu kılma |
Onboarding__RequireOnlinePaymentForNonTrial |
false (Portal) |
Trial olmayan durumlarda gerçek çevrimiçi ödemeyi zorunlu kılma |
Ödeme¶
Ödeme, merkezi bir DiKAS hesabı üzerinden Stripe ile yürür (mandant başına değil).
| Anahtar | Anlamı |
|---|---|
Signup__Stripe__SecretKey |
Stripe Secret Key (gerçek ödeme adaptörünü etkinleştirir) |
Signup__Stripe__PublishableKey |
Ön yüz için Publishable Key |
Signup__Stripe__WebhookSecret |
Webhook için imza gizli anahtarı |
SecretKey ayarlanmamışsa bir boş (null) adaptör aktiftir (Dev/Test). OnboardingPaymentMethod
değerleri: SepaLastschrift = 1, StripeSetupIntent = 2 (önce Trial, ödeme yöntemi kaydet),
StripePaymentIntent = 3 (önce ödeme, anında ödeme).
Yaşam Döngüsü ve Temizlik¶
İki arka plan hizmeti huniyi temiz tutar:
İptal edilen siparişler¶
OnboardingCleanupService (günlük), 14 günden (CleanupAbandonedOnboardingsCommand,
yapılandırılabilir) daha uzun süredir hareketsiz olan iptal edilmiş/ödenmemiş siparişleri
kaldırır – bağlı bir müşterisi olmayan sahipsiz anonim herkese açık taslaklar dahil – ve
bunların çevrimiçi ad rezervasyonunu yeniden serbest bırakır. Provizyonu yapılmış/ödenmiş
siparişler dokunulmadan kalır.
Süresi dolmuş denemeler (kuru çalıştırma, dark)¶
TrialDeprovisioningService, bilinçli olarak temkinli tasarlanmış bir hizmettir:
- Deneme sonundan sonraki ek süresi (
GraceDays, varsayılan 30) geçmiş olan süresi dolmuş denemeleri bulur (IsTrial = trueveEndDatesürenin ötesinde;IsTrial = falseolan dönüştürülmüş/ödenmiş lisanslar asla ele alınmaz). - DRY-RUN'da yalnızca daha sonraki bir canlı çalıştırmanın hangi mandant veritabanlarını
(
{DatabasePrefix}_maindb,{DatabasePrefix}_gastrocurrent) silecek olduğunu kaydeder – kendisi hiçbir şeyi silmez. - Varsayılan olarak tamamen devre dışıdır ve yalnızca
TrialDeprovision__Enabled=trueolduğunda çalışır.
| Anahtar | Varsayılan | Anlamı |
|---|---|---|
TrialDeprovision__Enabled |
false |
Ana anahtar; false = hizmet hiç çalışmaz |
TrialDeprovision__GraceDays |
30 |
Deneme sonrası gün cinsinden ek süre |
Gerçek DB silme işlemi uygulanmamıştır
Mandant veritabanlarının fiilen silinmesi bilinçli olarak bağlanmamıştır. Bu, açık bir onay ile doğrulanmış bir veritabanı adı eşlemesi gerektirir ve süre sonu uygulamasıyla (deneme sonu → kilit → dışa aktarım) koordine edilmelidir.
Denetim (Audit)¶
Her provizyon, IAuditLogger üzerinden kayıt altına alınır ve operatör denetim görünümünde
görünür (GET /api/v1/audit/logs/{date}, yalnızca Admin rolü):
| Olay | Tetikleyici |
|---|---|
TRIAL_PROVISIONED |
Başarılı Trial başlangıcı (çevrimiçi ad, lisans kimliği, süre ile) |
TRIAL_CONVERTED_PAID |
Bir Trial'ın ücretli bir lisansa dönüşümü |
Zaman damgası ve istemci IP'si istekten gelir; anonim denemelerde kullanıcı olarak - görünür.
Erişim bilgileri denetim kaydına yazılmaz.
Etkinleştirmeden Önce¶
SelfServiceSignupEnabled herhangi bir zaman true olarak ayarlanmadan önce:
-
ForwardedHeaders:KnownNetworks, prod deployment'ta gerçek cluster CIDR'sine ayarlanmış olmalı (aksi halde IP kotası etkisiz kalır). - Stripe anahtarları (
Signup__Stripe__*) ayarlanmış olmalı – aksi halde gerçek bir sağlayıcıyla „hemen canlı" bir ödeme ücretsiz olurdu. - Magic Link gönderimi ve
/signup/verifyuçtan uca bağlanmış olmalı. - Bayrak
OperationalConfigiçinde etkinleştirilmiş olmalı.