İçeriğe geç

Yapılandırma

FlowDesk API’si .NET yapılandırma kurallarını izler: values.yaml’da yazdığınız Bölüm:AltAnahtar biçimindeki her ayar, konteynere iki nokta üst üste yerine çift alt çizgiyle bir ortam değişkeni olarak geçer, ör. Database:Provider konteyner içinde Database__Provider olarak görünür. Chart bu dönüşümü sizin için yapar; siz yalnızca values.yaml’ı düzenlersiniz.

database:
provider: PostgreSql # veya SqlServer

Aynı imaj her iki motorla da çalışır; hangisini seçtiğiniz values.yaml’daki bu tek alanla belirlenir. Yanlış ayarlanan ya da seçtiğiniz motorla uyuşmayan bir CONNECTION_STRING (secret’ta) API’nin açılışta veritabanına bağlanamamasına ve pod’un sürekli yeniden başlamasına yol açar. Bağlantı dizesi biçimleri:

  • PostgreSQL (Npgsql biçimi, Search Path=dbo şart): Host=postgres;Port=5432;Database=flowdesk;Username=flowdesk;Password=<parola>;Search Path=dbo
  • SQL Server: Server=<host>,1433;Database=flowdesk;User Id=sa;Password=<parola>;TrustServerCertificate=True;Encrypt=True

Sonradan motor değiştirmek veri taşımayı gerektirir. Bu kararı kurulumdan önce verin.

API üç login sağlayıcısını destekler ve aynı anda birden fazlası açık olabilir:

Sağlayıcı Ne gerektirir
EmailPassword Hiçbir dış bağımlılık yok: kullanıcılar FlowDesk veritabanında, parolaları PBKDF2 ile saklanır. Ek yapılandırma gerekmez.
Ldap Kurumunuzun LDAP/AD sunucusu.
Keycloak Kurumunuzun Keycloak sunucusu (OIDC); kullanıcı, Keycloak’taki e-posta ile FlowDesk’teki yerel kullanıcı e-postası birebir eşleştirilerek doğrulanır.

Chart notu. shftco/flowdesk-kubernetes chart’ının şu anki values.yaml’ı yalnızca tek bir sağlayıcıyı (auth.provider, varsayılan Keycloak) Auth:Providers:0’a bağlar ve yalnızca Keycloak’a özgü ayarları (authority, clientId, redirectUris) render eder. LDAP için ayrı bir values.yaml alanı yoktur. auth.provider: EmailPassword yazarak parola tabanlı girişe geçebilirsiniz (dış bağımlılığı yoktur); LDAP’ı veya birden çok sağlayıcıyı aynı anda açmak chart’ın bugünkü hâliyle mümkün değildir. SHFT ile görüşün.

Keycloak kullanıyorsanız:

auth:
provider: Keycloak
authority: 'https://<keycloak-sunucunuz>/realms/<realm>'
clientId: flowdesk-web
redirectUris:
- 'https://<panel-adresiniz>/api/auth/callback/keycloak'
requireHttps: true
# KEYCLOAK_CLIENT_SECRET secret'ta, values.yaml'da DEĞİL.

Keycloak realm’inde: confidential client (Client authentication: ON), Standard Flow açık, PKCE S256, redirect URI redirectUris ile birebir aynı olmalı (uyuşmazsa girişte redirect_uri hatası alırsınız). Her kullanıcı Email verified: ON ve Temporary: OFF bir parola ile tanımlı olmalı, ve aynı e-postayla FlowDesk’te de bir kullanıcı olarak var olmalı. Biri eksikse o kullanıcı oturum açamaz.

messaging:
provider: RabbitMq # veya Kafka

Uygulama arka plan işlerini her durumda transactional outbox üzerinden yayınlar; bu ayar yalnızca yayınlanan mesajın hangi broker’a ulaştığını belirler, uygulama kodunu etkilemez. RabbitMq seçiliyken broker’a ulaşılamazsa API “Degraded” durumuna düşer ama HTTP trafiğine cevap vermeye devam eder. Arka plan işleri (bildirimler, otomasyon) birikir.

Kafka seçtiyseniz ek ayarlar gerekir:

messaging:
provider: Kafka
kafka:
bootstrapServers: 'broker1:9092,broker2:9092'
consumerGroup: flowdesk
topicPrefix: flowdesk
securityProtocol: SaslSsl # Plaintext | Ssl | SaslPlaintext | SaslSsl
saslMechanism: ScramSha512 # Plain | ScramSha256 | ScramSha512
saslUsername: flowdesk
# KAFKA_SASL_PASSWORD secret'ta.

Application:Environment=Production iken yerel olmayan bir Kafka broker’ı şifrelenmemiş (Plaintext) protokolle çalışamaz. API açılışı reddeder.

Lisanslama çevrimiçidir: tek bir anahtar, tek bir endpoint. Kurulumda sabit disk gerektiren, elle yüklenen bir dosya yoktur.

# values.yaml, anahtarın kendisi secret'ta (License__Key), burada değil
licensing:
stateDirectory: /var/lib/flowdesk # kalıcı olmalı, bkz. aşağı
serverUrl: 'https://license-api.flowdesk.com.tr' # SHFT'nin sunucusu, varsayılan yeterli
responseSigningKeys:
{ } # keyId -> açık anahtar (PEM), SHFT verir, bkz. aşağı

Akış: API açılışta ve sonrasında 12 saatte bir License:Key’i lisans sunucusuna gönderir; sunucu ECDSA P-256 ile imzalı bir cevap döner, API bu imzayı License:ResponseSigningKeys altındaki açık anahtarla doğrular, uygular ve License:StateDirectory altına cache’e alır. Doğrulama; imzayı, keyId’yi, bir tekrar-oynatma (replay) önleyen nonce’u ve cevabın bu kuruluma ait olduğunu (installationId) kontrol eder. Dört ayrı sahtecilik yolunu kapatır. Request body’de talep içeriği, müşteri verisi veya kullanıcı bilgisi hiçbir zaman yer almaz.

Hem License:Key hem License:ResponseSigningKeys:<keyId> SHFT tarafından verilir ve kurumunuza teslim edilir. Anahtar kurumunuzun kimliğini, imza anahtarı da cevabın gerçekten SHFT’den geldiğini doğrulamak için kullanılır; ikisi birlikte çalışır, biri eksikse lisans doğrulanmış sayılmaz.

Hiçbir lisans durumu açılışı engellemez. Bir kurulumun lisans sunucusuna hiç ulaşamaması ya da hiç anahtar girilmemiş olması bile API’nin başlamasını engellemez; sorun çalışır durumdaki bir sistem üzerinde giderilir. Dört durum:

Durum Anlamı
Beklemede (Pending) Anahtar girilmemiş, ya da henüz bir cevap alınmamış. Uygulama tam işlevseldir.
Geçerli (Valid) Sunucuya başarıyla bağlanıldı, kurulum yetkilendirilmiş.
Cache’le çalışıyor (Grace) Sunucuya ulaşılamıyor; API cache’teki son imzalı cevapla çalışmaya devam eder, panelde kalan gün sayısı gösterilir.
Bloke (Blocked) Reddedildi ya da cache süresi doldu. İş endpoint’leri FD:0011 döner; lisans ekranı, giriş ve /health açık kalır. Sorunu bu durumda bile giderebilirsiniz.

License:StateDirectory kalıcı bir volume üzerinde olmalıdır. Kalıcı değilse her yeniden başlatma, lisans sunucusu için yeni bir kurulum gibi görünür.

application:
environment: Production # veya Dev

Dev, gevşetilmiş kontrollerle kolay bir demo/deneme ortamı sağlar, ör. RabbitMQ’da guest/guest kabul edilir, yerel olmayan bir Kafka broker’ına şifrelenmemiş protokolle bağlanmaya izin verilir. Üretimde Production kullanın; Dev bırakmak bu gevşetilmiş kontrolleri üretimde de açık tutar.

Giden/gelen postayı tamamlamak için E-posta ayarları sayfasına geçin.