Installing with Docker Compose
Version 1.0.0 · released 21 October 2026
This guide is currently available in Turkish only. Commands, file names and settings are the same in every language; an English version is on the way.
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
-
Bu klasörü sunucuya kopyalayın ve ayarları doldurun:
cp .env.example .env chmod 600 .envSü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_KEYolmadan şifreli alanlar okunamaz. -
Ters vekil sunucuda üç adı yayınlayın (
BIND_IPvarsayılanı127.0.0.1):Ad Hedef Not PANEL_HOSThttp://127.0.0.1:8080Eğitim paneli API_HOSThttp://127.0.0.1:8081training-api (panel ve mobil uygulama) AUTH_HOSThttp://127.0.0.1:8180Keycloak; X-Forwarded-*başlıkları iletilmeliAUTH_HOSTiçin/adminyolunu yalnızca kurumun ağından açmanız önerilir. -
İmaj deposuna konsol kimlik bilgisiyle bir kez giriş yapın, sonra açın. Ayrı bir depo hesabı yoktur: kullanıcı adı
CONSOLE_CLIENT_ID, parolaCONSOLE_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 -
https://PANEL_HOSTadresinde ilk yöneticiyle (TENANT_ADMIN_EMAIL,TENANT_ADMIN_PASSWORD) girin; parola ilk girişte değiştirilir.TENANT_ADMIN_PASSWORDartı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, parolaKEYCLOAK_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’deINVITE_MODE=emailyapıpdocker 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.
-
Yedek alın (yukarıda). Migration’lar yalnızca ileri yönlüdür; geri dönüş yedekten yapılır.
-
.env’deFLEET_VERSION’ı yeni sürüme çekin. -
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
Settings reference (.env)
Every setting in the .env.example file shipped with the release (descriptions in Turkish).
Sürüm ve imajlar
| Setting | Example | Description |
|---|---|---|
| FLEET_REGISTRY | egitim-registry.xenopsoftware.com/fleet-egitim | Kurulum 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_VERSION | 1.0.0 |
Adresler
| Setting | Example | Description |
|---|---|---|
| PANEL_HOST | egitim.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_HOST | egitim-api.example.com.tr | training-api (panel ve mobil uygulama buraya bağlanır) |
| AUTH_HOST | egitim-giris.example.com.tr | Keycloak (giriş ekranı) |
| BIND_IP | 127.0.0.1 | Portların bağlandığı adres. Ters vekil sunucu aynı makinedeyse 127.0.0.1 kalır. |
Kurum (tek tenant)
| Setting | Example | Description |
|---|---|---|
| TENANT_SLUG | kurum | İlk açılışta açılır; slug sonradan değiştirilemez. 3-40 karakter: küçük harf, rakam ve tire. |
| TENANT_NAME | Kurum 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
| Setting | Example | Description |
|---|---|---|
| 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)
| Setting | Example | Description |
|---|---|---|
| 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ı
| Setting | Example | Description |
|---|---|---|
| INVITE_MODE | temporary-password | Davet: 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_MEMORY | 512m | Bellek sınırları |
| KEYCLOAK_MEMORY | 1g | |
| TRAINING_API_MEMORY | 1g |