İçeriğe geç
Fleet Eğitim

Docker Compose ile kurulum

Sürüm 1.0.0 · yayın 21 Ekim 2026

Kurumun kendi sunucusunda, tek bir kurum (tek tenant) için tek sunucu kurulumu. Postgres, Valkey ve Keycloak pakete dahildir. Katalog, video ve eğitim paketleri platform konsolundan gelir; kursiyerlerin kişisel verisi kurumun sunucusunda kalır.

Dosya Ne yapar
compose.yaml Servisler: postgres, valkey, keycloak, training-api, training-web
.env.example Ayarlar: sürüm, adresler, kurum, konsol kimlik bilgileri, parolalar, anahtarlar

İmajlar (training-api, training-web, keycloak) aynı sürüm numarasını taşır (FLEET_VERSION).

Gereksinimler

  • Linux sunucu, en az 2 çekirdek, 4 GB bellek, 20 GB disk
  • Docker Engine ve Docker Compose 2.23 ya da üstü
  • TLS sertifikası olan bir ters vekil sunucu (nginx, Traefik, Caddy ya da yük dengeleyici) ve üç DNS adı
  • Dışarıya çıkış: izin listesi. Tamamen internetsiz kurulum desteklenmez: katalog, lisans ve paketler konsoldan, videolar Cloudflare’den gelir.

Kurulum

  1. Bu klasörü sunucuya kopyalayın ve ayarları doldurun:

    cp .env.example .env
    chmod 600 .env

    Sürüm, imaj deposu ve konsol değerleri (FLEET_*, CONSOLE_*) kurulum kaydıyla birlikte verilir. Parolalar ve anahtarlar kurulumda bir kez üretilir (dosyadaki açıklamalar). .env’i ve veritabanı yedeklerini birlikte saklayın: TRAINING_CRYPTO_SECRET_KEY olmadan şifreli alanlar okunamaz.

  2. Ters vekil sunucuda üç adı yayınlayın (BIND_IP varsayılanı 127.0.0.1):

    Ad Hedef Not
    PANEL_HOST http://127.0.0.1:8080 Eğitim paneli
    API_HOST http://127.0.0.1:8081 training-api (panel ve mobil uygulama)
    AUTH_HOST http://127.0.0.1:8180 Keycloak; X-Forwarded-* başlıkları iletilmeli

    AUTH_HOST için /admin yolunu yalnızca kurumun ağından açmanız önerilir.

  3. İmaj deposuna konsol kimlik bilgisiyle bir kez giriş yapın, sonra açın. Ayrı bir depo hesabı yoktur: kullanıcı adı CONSOLE_CLIENT_ID, parola CONSOLE_CLIENT_SECRET. Depo lisans geçerliyken çekmeye izin verir; lisans biterse yeni sürüm çekilemez, çalışan sistem durmaz.

    # parola sorulunca CONSOLE_CLIENT_SECRET
    docker login egitim-registry.xenopsoftware.com -u <CONSOLE_CLIENT_ID>
    docker compose pull
    docker compose up -d

    İlk açılışta Keycloak fleet realm’ini kurar, training-api veritabanını oluşturur ve kurumun tenant’ını (TENANT_SLUG) ilk yöneticisiyle (TENANT_ADMIN_EMAIL) açar. Durum:

    docker compose ps
    curl -fsS http://127.0.0.1:8081/actuator/health/readiness
  4. https://PANEL_HOST adresinde ilk yöneticiyle (TENANT_ADMIN_EMAIL, TENANT_ADMIN_PASSWORD) girin; parola ilk girişte değiştirilir. TENANT_ADMIN_PASSWORD artık kullanılmaz, .env’den silebilirsiniz.

TENANT_SLUG sonradan değiştirilemez; değiştirilirse training-api ikinci bir tenant açmak yerine açılmayı reddeder.

Çıkış adresleri

Kurumun güvenlik duvarında açılması gerekenler (HTTPS, 443). Bunların dışında çıkış gerekmez.

Kaynak Hedef Ne için
Sunucu CONSOLE_URL ve CONSOLE_TOKEN_URI’deki adlar Katalog, lisans, heartbeat, paketler
Sunucu FLEET_REGISTRY’deki ad (egitim-registry.xenopsoftware.com) İmajlar; arşivle kurulumda gerekmez
Sunucu Kurumun SMTP sunucusu, kimlik sistemi, OTLP Yalnızca ayarlandıysa
Kursiyer cihazları PANEL_HOST, API_HOST, AUTH_HOST Panel, API ve giriş
Kursiyer cihazları *.cloudflarestream.com, videodelivery.net Video oynatma
Mobil uygulama CONSOLE_URL’deki ad Firma koduyla sunucu keşfi

Kapalı ağ

Sunucu imaj deposuna çıkamıyorsa sürümün release’indeki fleet-egitim-<sürüm>-images.tar.gz kullanılır. Arşivde compose.yaml’daki bütün imajlar (postgres ve valkey dahil, linux/amd64) vardır ve compose’un beklediği adlarla yüklenir. Arşivi internete çıkabilen bir makinede indirip doğrulayın, sonra sunucuya taşıyın:

cosign verify-blob --key cosign.pub --bundle SHA256SUMS.bundle SHA256SUMS
sha256sum -c SHA256SUMS --ignore-missing

Sunucuda:

docker load -i fleet-egitim-<sürüm>-images.tar.gz
docker compose up -d

docker compose pull çalıştırmayın. .env’deki FLEET_REGISTRY ve FLEET_VERSION release’teki env.example’daki gibi kalmalı, imajlar o adlarla yüklenir. Güncelleme aynı yoldan yapılır: yedek, yeni arşivin docker load’u, FLEET_VERSION, docker compose up -d.

Kimlik sistemi ve e-posta

  • Kurumun kimlik sistemi (Active Directory, Entra ID, OIDC/SAML) Keycloak’a bağlanır: Kimlik sistemini bağlama. Keycloak yönetim konsolu: https://AUTH_HOST/admin, kullanıcı admin, parola KEYCLOAK_ADMIN_PASSWORD.
  • Davet e-postaları Keycloak’un SMTP’siyle gider: yönetim konsolunda fleet → Realm settings → Email altında kurumun SMTP sunucusunu girin, sonra .env’de INVITE_MODE=email yapıp docker compose up -d çalıştırın. SMTP yoksa davette geçici parola panelde gösterilir.

Yedek

Yedek iki veritabanıdır (training, keycloak) ve .env’dir. Paket önbelleği (training_tmp) yedeklenmez; konsoldan yeniden çekilir.

docker compose exec -T postgres pg_dump -U postgres -Fc training > training-$(date +%F).dump
docker compose exec -T postgres pg_dump -U postgres -Fc keycloak > keycloak-$(date +%F).dump

Güncelleme

Güncellemeyi kurum başlatır; otomatik güncelleme yoktur.

  1. Yedek alın (yukarıda). Migration’lar yalnızca ileri yönlüdür; geri dönüş yedekten yapılır.

  2. .env’de FLEET_VERSION’ı yeni sürüme çekin.

  3. Açın:

    docker compose pull
    docker compose up -d

Aynı ana sürüm içinde en fazla bir minör sürüm atlanabilir (1.2 → 1.4 olur, 1.2 → 1.5 olmaz); LTS’ten bir sonraki LTS’e doğrudan geçilebilir. Desteklenmeyen bir geçişte training-api veritabanına dokunmadan durur ve önce hangi sürüme geçileceğini loglar (docker compose logs training-api).

İmza doğrulama

İmajlar cosign ile imzalıdır ve SBOM’ları (SPDX) imaja eklidir. Sürümün cosign.pub ve images.txt dosyalarıyla:

cosign verify --key cosign.pub <imaj>@<digest>
cosign verify-attestation --key cosign.pub --type spdxjson <imaj>@<digest>

İnternetsiz ağda --insecure-ignore-tlog=true ekleyin (şeffaflık kaydına erişilemez, yalnızca anahtar doğrulanır).

Geri dönüş

Eski imajı yeni şemayla açmak desteklenmez; training-api açılmayı reddeder. Geri dönmek için:

docker compose stop training-api keycloak
docker compose exec -T postgres dropdb -U postgres training
docker compose exec -T postgres createdb -U postgres -O training_app training
docker compose exec -T postgres pg_restore -U postgres -d training --no-owner --role=training_app < training-<tarih>.dump
# keycloak veritabanı da aynı şekilde (sahibi keycloak)
# .env'de FLEET_VERSION'ı önceki sürüme alın
docker compose up -d

Ayar referansı (.env)

Sürümle gelen .env.example dosyasındaki bütün ayarlar.

Sürüm ve imajlar

AyarÖrnekAçıklama
FLEET_REGISTRYegitim-registry.xenopsoftware.com/fleet-egitimKurulum kaydıyla birlikte verilir. Yükseltme: FLEET_VERSION'ı değiştirip docker compose pull && docker compose up -d (önce yedek alın, README). Aynı ana sürümde en fazla bir minör sürüm atlanabilir. Depoya konsol kimlik bilgisiyle (CONSOLE_CLIENT_ID / CONSOLE_CLIENT_SECRET) giriş yapılır; lisans geçerliyken çekilebilir (README, Kurulum).
FLEET_VERSION1.0.0

Adresler

AyarÖrnekAçıklama
PANEL_HOSTegitim.example.com.trÜç ad da ters vekil sunucunuzda HTTPS ile yayınlanır (README, Ters vekil sunucu). Eğitim paneli (kursiyer ve yöneticiler)
API_HOSTegitim-api.example.com.trtraining-api (panel ve mobil uygulama buraya bağlanır)
AUTH_HOSTegitim-giris.example.com.trKeycloak (giriş ekranı)
BIND_IP127.0.0.1Portların bağlandığı adres. Ters vekil sunucu aynı makinedeyse 127.0.0.1 kalır.

Kurum (tek tenant)

AyarÖrnekAçıklama
TENANT_SLUGkurumİlk açılışta açılır; slug sonradan değiştirilemez. 3-40 karakter: küçük harf, rakam ve tire.
TENANT_NAMEKurum A.Ş.
TENANT_ADMIN_EMAIL[email protected]İlk yönetici. Parola geçicidir, ilk girişte değiştirilir. INVITE_MODE=email ve SMTP ayarlıysa boş bırakılabilir: yöneticiye parolasını belirleyeceği e-posta gider.
TENANT_ADMIN_PASSWORD—

Platform konsolu

AyarÖrnekAçıklama
CONSOLE_URL—Katalog, video ve paketler konsoldan gelir. Değerler kurulum kaydıyla birlikte verilir.
CONSOLE_TOKEN_URI—
CONSOLE_CLIENT_ID—
CONSOLE_CLIENT_SECRET—
CONSOLE_LEARNER_KEY—Konsola kursiyer yerine bu anahtarla türetilen takma kimlik gider. Kurulumda bir kez üretin, sonra değiştirmeyin.

Parolalar ve anahtarlar (kurulumda bir kez üretin)

AyarÖrnekAçıklama
POSTGRES_PASSWORD—
TRAINING_DB_PASSWORD—
KEYCLOAK_DB_PASSWORD—
VALKEY_PASSWORD—
KEYCLOAK_ADMIN_PASSWORD—Keycloak yönetim konsolu (https://AUTH_HOST/admin), kullanıcı admin. Yalnızca ilk açılışta uygulanır.
KEYCLOAK_BACKEND_CLIENT_SECRET—training-api'nin Keycloak yönetim hesabı (fleet-backend). Realm ilk açılışta bu değerle kurulur; sonradan değiştirmek için Keycloak'ta da değiştirin.
TRAINING_PACKAGES_TOKEN_SECRET—Paket dosyalarına erişim token'ları (HMAC)
TRAINING_CRYPTO_SECRET_KEY—Veritabanındaki gizli alanların şifreleme anahtarı (AES-256, base64 32 bayt: openssl rand -base64 32). Kaybolursa şifreli alanlar okunamaz; yedekle birlikte saklayın.

İsteğe bağlı

AyarÖrnekAçıklama
INVITE_MODEtemporary-passwordDavet: temporary-password (geçici parola panelde gösterilir) ya da email (Keycloak'ın SMTP'si, README)
OTEL_EXPORTER_OTLP_ENDPOINT—OpenTelemetry toplayıcısı (iz ve metrik), ör. http://otel-collector:4318
POSTGRES_MEMORY512mBellek sınırları
KEYCLOAK_MEMORY1g
TRAINING_API_MEMORY1g