Ana içeriğe geç
v26.3

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: PaketTSE (Cloud'a karşı Swissbit) → Hesap (e-posta, Magic Link ile parolasız) → Firma bilgileriÇevrimiçi ad (alt alan adı) → Yasal & ÖdemeTamamlandı (ö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.

OperationalConfig.SelfServiceSignupEnabled  (bool, Default: false)

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 Accepted ile 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ç nokta 429 (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 = true ve EndDate sürenin ötesinde; IsTrial = false olan 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=true olduğ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/verify uçtan uca bağlanmış olmalı.
  • Bayrak OperationalConfig içinde etkinleştirilmiş olmalı.