Loading...

CONTAINER APPS · CDNCTL REHBERİ

Çok servisli bir Docker projesini uçtan uca cdnctl ile taşıyın

Bu rehber, çok servisli docker-compose tarzı bir projeyi (web/API servisleri, arka plan worker'ları, veritabanı, cache ve mesaj yolu) tamamen cdnctl komut satırından CDN.com.tr yönetilen konteyner platformunda çalıştırmayı adım adım anlatır. Yer tutucu değerleri (<account-uuid>, imaj adları, portlar) kendinizinkilerle değiştirin.

Hızlı yol: docker-compose.yml'inizi doğrudan içe aktarın

Zaten bir docker-compose.yml'iniz varsa aşağıdaki manuel oluştur-ve-bağla adımlarını atlayabilirsiniz: platform compose dosyanızı çözümler ve onaya hazır bir plan önerir. Docker Compose içe aktarma rehberine ya da cdnctl compose referansına bakın. Buradaki uçtan uca adımlar, ince ayar ve compose içe aktarmanın kapsamadığı taşımalar için geçerliliğini korur.

1 · Kavramlar

  • Hesap = proje. Bir hesap birçok container app barındırabilir; kaç app çalıştırabileceğinizi paketiniz belirler.
  • App = bir konteyner imajı (bir servis). Her app'in portu, sağlık kontrolü, kaynakları, env değişkenleri ve secret'ları vardır; N replikaya ölçeklenebilir.
  • Yönetilen eklentiler, bir app'e iliştirdiğiniz durumlu arka uçlardır — postgres (PostgreSQL/TimescaleDB), mysql, redis ve nats (JetStream). Her eklenti, etkinleştirdiğiniz app için sağlanır ve kararlı bir küme-içi hostname sunar. Bağlantı bilgileri — host, port, kullanıcı, veritabanı ve üretilen parola — env ve secret olarak doğrudan o app'e enjekte edilir (örn. DATABASE_URL, REDIS_URL, NATS_URL), kullanıma hazırdır. Parola sizin için üretilir ve asla geri gösterilmez; sahibi olan app için bağlantı dizesini elle kurmazsınız.
  • Özel ağ ve servis keşfi. Hesabınızdaki app'ler özel bir ağı paylaşır. Her app, diğer app'lerinizden app adıyla erişilebilir — tıpkı bir docker-compose servis adı gibi — http://<app-adı>:<port> (app adınıza eşit bir iç DNS takma adı yayınlarız). Compose dosyanız http://hot-data-store:8082'ye gidiyorsa o app'e hot-data-store adını verip 8082 portunu tanımlayın; kendiliğinden çalışır. App'ler internete çıkabilir ama diğer müşterilerin özel servislerine erişemez.
  • Eklenti host'ları size döndürülür. Bir eklentiyi etkinleştirdiğinizde kararlı küme-içi host'unu cdnctl container addons list raporlar (host alanı). Aşağıdaki bağlantı dizelerindeki <db-host>/<redis-host>/<nats-host> odur — tahmin etmezsiniz.
  • Public yayınlama. Her app bir CDN.com.tr alt alan adında ya da kendi alan adınızda yayınlanabilir. Yayınlanan her servis kendi hostname'ini alır.

2 · cdnctl'i yapılandırın

Panel API token'ınızla bir kez kimlik doğrulayın (ya da kimlik bilgilerinizle login olun):

cdnctl configure --endpoint https://cdn.com.tr --token <your-api-token>
# verify
cdnctl accounts list
cdnctl container apps list --account <account-uuid>

3 · İmajları derleyip yayınlayın, çekme kimliği kaydedin

Her servisi linux/amd64 için derleyin ve platformun çekebileceği bir registry'ye push'layın. Depolar private ise hesaba bir çekme kimliği kaydedin:

# build & push (one image per service)
docker buildx build --platform linux/amd64 -t your-registry/app-web:1.0.0 --push .
docker buildx build --platform linux/amd64 -t your-registry/app-worker:1.0.0 --push .

# register pull credentials (token is stored encrypted, never returned)
cdnctl container registry-credentials create --account <account-uuid> \
  --name registry --registry-url https://index.docker.io/v1/ \
  --username <user> --password <token>
cdnctl container registry-credentials list --account <account-uuid>

Secret'ları asla imajlara gömmeyin. .env, derleme çıktıları ve VCS verilerini dışlamak için .dockerignore kullanın.

4 · Yönetilen eklentileri sağlayın (DB, cache, mesaj yolu)

Her eklenti bir app'e iliştirilir; önce o app'i oluşturur (adım 5), sonra eklentileri üzerinde etkinleştirirsiniz. Eklenti o app için sağlanır ve bağlantısı otomatik enjekte edilir — URL kurmaz, parola kopyalamazsınız:

# enable the backends your owner app needs (app created in step 5):
cdnctl container addons enable-postgres --account <account-uuid> --app <app-uuid> --storage-mb 10240
cdnctl container addons enable-redis    --account <account-uuid> --app <app-uuid>
cdnctl container addons enable-nats     --account <account-uuid> --app <app-uuid> --storage-mb 5120
cdnctl container addons list            --account <account-uuid> --app <app-uuid>

Artık o app'in ortamı kullanıma hazır değerleri içerir — onları kurmaz, referans verirsiniz:

# auto-injected into the app the addon is enabled on:
DATABASE_HOST, DATABASE_PORT, DATABASE_NAME, DATABASE_USER   # env
DATABASE_PASSWORD, DATABASE_URL                              # secrets (full postgres:// URL)
REDIS_URL        # redis://<redis-host>:6379/0
NATS_URL         # nats://<nats-host>:4222

cdnctl container addons list, her eklentinin kararlı host'unu, portunu, kullanıcısını ve veritabanı adını (örn. host: ca-…-postgres) başvuru için raporlar — üretilen parola asla döndürülmez. Yani sahibi olan app için DATABASE_URL'i elle yazmanız gerekmez; zaten üzerinde bir secret'tır.

Bir arka ucu app'ler arasında paylaşmak. Parolasız arka uçlara — NATS ve buradaki yapılandırmasıyla Redis — diğer app'lerinizden de erişilebilir: addons list'ten host'u alıp her tüketicide NATS_URL/REDIS_URL env'ini ayarlayın (adım 5). Parola korumalı SQL veritabanı farklıdır: parola yalnızca eklentinin sahibi app'e enjekte edildiği (ve asla gösterilmediği) için onu ikinci bir app'ten kullanmaya çalışmayın. Ya veritabanının tek app'e ait olmasına izin verin ve diğerleri ona sizin API'niz üzerinden erişsin, ya da parolasını kendinizin belirlediği kendi veritabanı imajınızı çalıştırın. App-app host'ları yalnızca app adlarınızdır (adım 1'deki docker-compose tarzı takma ad); http://hot-data-store:8082 gibi URL'ler docker-compose.yml yüklemeden çözülür.

5 · Her servisi oluşturun ve bağlayın

Servis başına bir app oluşturun. Sıra: app'i oluştur → eklentilerini etkinleştir (adım 4) → deploy et (adım 6). Eklentiyi etkinleştirmek, bağlantı enjekte edilmiş olarak app'i yeniden deploy eder; bu yüzden önce eklentinin sahibi olacak app'i burada oluşturun, sonra adım-4 komutlarını ona karşı çalıştırın. Servis tipine göre doğru sağlık kontrolünü seçin:

  • HTTP servisleri için --healthcheck-type http (varsayılan) — --healthcheck /yolunuz'u ayarlayın.
  • HTTP ucu olmayan TCP servisleri için --healthcheck-type tcp.
  • Dinlemeyen arka plan worker'ları için --healthcheck-type none.
# app-web OWNS the postgres/redis/nats addons you enable in step 4, so DATABASE_URL,
# REDIS_URL and NATS_URL are injected for you — you only add your own secrets here:
cdnctl container apps create --account <account-uuid> \
  --name app-web --image your-registry/app-web --tag 1.0.0 \
  --port 8080 --healthcheck-type http --healthcheck /health \
  --metrics-port 9090 --metrics-path /metrics \
  --registry-credential <cred-uuid> \
  --secrets-json '{"API_KEY":"<secret>"}'

# a background worker that shares the message bus. It does NOT own the addons, so point it
# at the passwordless NATS host from `addons list` (there is no DB password to copy):
cdnctl container apps create --account <account-uuid> \
  --name app-worker --image your-registry/app-worker --tag 1.0.0 \
  --healthcheck-type none --registry-credential <cred-uuid> \
  --env-json '{"NATS_URL":"nats://<nats-host>:4222"}' \
  --secrets-json '{"API_KEY":"<secret>"}'

--secrets-json ile geçirilen secret'lar şifreli Kubernetes secret'ı olarak saklanır; düz yapılandırmaya ya da loglara asla yazılmaz. Env/secret'ları sonradan cdnctl container apps update --account <account-uuid> --app <app-uuid> --env-json ... --secrets-json ... ile güncelleyin.

6 · Deploy edin, durum ve logları izleyin

Her app'i deploy edin (app'leriniz açılışta migration çalıştırıyorsa önce veritabanı şemasını kuran servisi deploy edin):

cdnctl container apps deploy --account <account-uuid> --app <app-uuid>
cdnctl container apps status --account <account-uuid> --app <app-uuid>
cdnctl container apps wait   --account <account-uuid> --app <app-uuid> --status running --timeout 300
cdnctl container apps logs   --account <account-uuid> --app <app-uuid> --tail 100
cdnctl container apps diagnose --account <account-uuid> --app <app-uuid>

7 · Servisleri public yayınlayın

Bir servise kendi CDN.com.tr alt alan adını verin (HTTPS sizin için halledilir):

cdnctl container apps expose --account <account-uuid> --app <app-uuid>
# returns the app's public_subdomain, e.g. https://<uid>.cdn.com.tr

Her app tek değişmez alt alan adı alır; ihtiyacınız kadar servisi yayınlayın — tek hesap, çok public hostname. Kendi alan adınızı kullanmak içinse onu bir delivery point olarak ekleyip app'e yönlendirin (alan adınız → CDN → servis).

Yalnızca public olması gereken servisleri yayınlayın. Arka plan worker'ları ve veritabanları özel kalır. Yayınladığınız her HTTP servisine kimlik doğrulama ekleyin.

8 · Gözlemlenebilirlik (tek cam)

İzleme yığınınızı sıradan app'ler olarak çalıştırın: servislerinizi kazıyan bir metrik toplayıcı ve public yayınladığınız bir gösterge paneli. Toplayıcıyı içeride tutun, yalnızca paneli yayınlayın:

# collector (internal): build an image with your scrape config baked in
cdnctl container apps create --account <account-uuid> --name metrics \
  --image your-registry/metrics --tag 1.0.0 --port 9090 --healthcheck-type http --healthcheck /-/healthy \
  --registry-credential <cred-uuid>
cdnctl container apps deploy --account <account-uuid> --app <metrics-app-uuid>

# dashboard: wire it to the collector via env, then expose it
cdnctl container apps create --account <account-uuid> --name dashboard \
  --image your-registry/dashboard --tag 1.0.0 --port 3000 --healthcheck-type http --healthcheck /api/health \
  --registry-credential <cred-uuid> \
  --env-json '{"METRICS_URL":"http://<metrics-host>:80"}' --secrets-json '{"ADMIN_PASSWORD":"<secret>"}'
cdnctl container apps deploy --account <account-uuid> --app <dashboard-app-uuid>
cdnctl container apps expose --account <account-uuid> --app <dashboard-app-uuid>

9 · Yaşam döngüsü ve geri alma

cdnctl container apps scale   --account <account-uuid> --app <app-uuid> --replicas 0   # stop
cdnctl container apps restart --account <account-uuid> --app <app-uuid>
cdnctl container apps delete  --account <account-uuid> --app <app-uuid>                 # removes app + its subdomain
cdnctl container addons disable-postgres --account <account-uuid> --app <app-uuid>       # keeps data
cdnctl container addons disable-postgres --account <account-uuid> --app <app-uuid> --delete-data --confirmation <app-name>

Bir veri eklentisini devre dışı bırakmak diskini varsayılan olarak korur; veriyi silmek açık onay ister. Bir app'i silmek public alt alan adını da kaldırır.