İçeriğe geç
NetDevOps
12 dk okuma DevOps

Backstage ile Internal Developer Portal: Kurulum ve En İyi Uygulamalar

Modern yazılım geliştirme ekiplerinin karşılaştığı en büyük zorluklardan biri, binlerce mikroservis arasında kaybolmak ve ihtiyaç duydukları bilgilere, dokümantasyona veya altyapı araçlarına hızlıca erişememektir. Spotify tarafından açık kaynak olarak geliştirilen Backstage, bu problemi çözmek için tasarlanmış güçlü bir Internal Developer Portal çözümüdür. Bu makalede Backstage'in ne olduğunu, nasıl çalıştığını, kurulum sürecini ve kurumsal ortamda nasıl kullanılabileceğini detaylı olarak inceleyeceğiz.

Backstage Nedir ve Neden Kullanılmalıdır

Backstage, Spotify tarafından 2020 yılında açık kaynak olarak sunulan ve günümüzde CNCF (Cloud Native Computing Foundation) altında geliştirilen bir platform mühendisliği aracıdır. Temel amacı, geliştiricilerin ihtiyaç duyduğu tüm araçları, dokümantasyonu ve süreçleri tek bir noktadan erişilebilir kılmaktır. Geleneksel yaklaşımda her ekip kendi dokümantasyonunu, CI/CD pipeline'larını ve altyapı araçlarını bağımsız olarak yönetirken, Backstage bu chaos'ı merkezi bir portal aracılığıyla düzene sokar.

Platform Mühendisliği ve Internal Developer Portal Kavramları

Platform mühendisliği, son yıllarda DevOps evriminde öne çıkan bir disiplindir. Amaç, geliştirici ekiplerine self-servis araçlar ve otomasyonlar sunarak üretkenliklerini artırmaktır. Internal Developer Portal (IDP) ise bu platformun kullanıcı arayüzüdür. Backstage, bir IDP framework'ü olarak işlev görür; ancak tek başına bir altyapı sağlayıcı değildir. Backstage'in gücü, üzerine inşa edilen eklentiler ve entegrasyonlarla ortaya çıkar.

Backstage'in Temel Bileşenleri

Backstage dört ana bileşenden oluşur. İlk olarak Software Catalog, organizasyonunuzdaki tüm yazılım varlıklarını (servisler, API'ler, kütüphaneler, veritabanları) merkezi olarak depolar ve yönetir. İkinci bileşen olan TechDocs, kod içi dokümantasyon oluşturma ve yayınlama altyapısı sağlar. Scaffolder, standart şablonlar kullanarak yeni projeler oluşturmanızı otomatikleştirir. Son olarak Kubernetes plugin, Kubernetes kaynaklarını doğrudan Backstage arayüzünden görüntüleme ve yönetme imkanı sunar.

Software Catalog: Backstage'in Kalbi

Software Catalog, Backstage'in en kritik ve güçlü özelliğidir. Tüm organizasyonun yazılım varlıklarını keşfedilebilir, izlenebilir ve yönetilebilir hale getirir. Catalog olmadan Backstage, sadece boş bir kabuktan ibarettir; diğer tüm özellikler (TechDocs, Scaffolder, Kubernetes plugin) catalog entity'leri üzerine inşa edilir.

Entity Türleri ve Veri Modeli

Backstage, altı temel entity türü destekler. Component, koddan oluşan yazılım birimlerini temsil eder; backend servisi, web uygulaması veya kütüphane olabilir. API, bir component'in sağladığı veya kullandığı arayüzleri tanımlar; OpenAPI, gRPC, GraphQL veya AsyncAPI formatlarında olabilir. Resource, bir component'in bağımlı olduğu altyapı kaynaklarını ifade eder; veritabanı, S3 bucket veya mesaj kuyruğu gibi. System, birbirleriyle ilişkili component'lerin oluşturduğu mantıksal grubu temsil eder. Domain, daha üst seviye sistem gruplandırması sağlar. Son olarak Group ve User, organizasyon yapısını ve ownership modelini tanımlar.

Catalog-Info.yaml Dosyası ile Entity Tanımlama

Her entity, repository'nizin kök dizininde veya belirli bir klasörde bulunan catalog-info.yaml dosyası ile tanımlanır. Bu dosya formatı, Kubernetes manifest'lerinden ilham alınarak tasarlanmıştır ve YAML formatında yazılır.

apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: odeme-api
  description: Ödeme işlemleri API servisi
  annotations:
    github.com/project-slug: sirket/odeme-api
    backstage.io/techdocs-ref: dir:.
    backstage.io/kubernetes-id: odeme-api
    pagerduty.com/integration-key: PD-KEY-BURAYA
    sonarqube.org/project-key: sirket_odeme-api
  tags:
    - java
    - spring-boot
    - odeme
    - tier-1
  links:
    - url: https://grafana.sirket.com/d/odeme-api
      title: Grafana Dashboard
      icon: dashboard
spec:
  type: service
  lifecycle: production
  owner: group:odeme-ekibi
  system: ödeme-sistemi
  providesApis:
    - odeme-v1
  dependsOn:
    - resource:odeme-db
    - resource:odeme-events-topic

Bu örnekte görüldüğü gibi, metadata bölümünde entity'nin adı, açıklaması ve çeşitli annotation'ları yer alır. Annotation'lar, Backstage'in hangi plugin'lerin aktif olacağını belirler. Örneğin backstage.io/kubernetes-id annotation'ı varsa, Kubernetes sekmesi otomatik olarak görüntülenir. spec bölümünde ise entity'nin tipi, yaşam döngüsü, sahibi ve ilişkileri tanımlanır.

Ownership Modeli ve Organizasyon Yapısı

Backstage'in en önemli prensiplerinden biri "her entity'nin bir sahibi olmalıdır" kuralıdır. Ownership modeli, organizasyon hiyerarşisini yansıtır ve sorumlulukları belirler. Bir component'in sahibi bir Group veya User olabilir. Group, bir ekibi veya departmanı temsil eder; User ise bireysel geliştiricileri ifade eder. Best practice olarak, component'lerin bireysel kullanıcılar yerine gruplara ait olması önerilir; bu sayede ekip değişikliklerinde ownership güncellemesi daha kolay yapılır.

Ownership hiyerarşisi, Backstage'in keşif ve izleme özelliklerinin temelini oluşturur. Bir geliştirici, herhangi bir servisin kime ait olduğunu, hangi sistemlerin birbiriyle ilişkili olduğunu ve bir arıza durumunda kiminle iletişime geçmesi gerektiğini portal üzerinden kolayca öğrenebilir.

Backstage Kurulumu ve Yapılandırması

Backstage'i kurmanın birden fazla yolu vardır; Docker, Kubernetes veya doğrudan Node.js çalıştırma seçenekleri mevcuttur. Kurulum sürecini adım adım inceleyelim.

Node.js ile Yerel Kurulum

Backstage, Node.js tabanlı bir uygulamadır. Öncelikle sisteminizde Node.js (18.x veya üzeri) ve npm'in kurulu olduğundan emin olunmalıdır. Kurulum için backstage-cli aracını kullanacağız.

# Backstage oluşturma
npx @backstage/create-app@latest my-backstage

# Oluşturulan dizine gitme
cd my-backstage

# Geliştirme sunucusunu başlatma
cd my-backstage && yarn dev

Bu komutlar, varsayılan yapılandırma ile hazır bir Backstage örneği oluşturur. Uygulama varsayılan olarak 3000 portunda çalışır ve tarayıcı üzerinden erişilebilir hale gelir.

Docker ile Kurulum

Üretim ortamında Docker kullanmak, izolasyon ve tutarlılık açısından avantajlıdır. Backstage'in resmi Docker image'ı mevcuttur ve kolayca kullanılabilir.

# Docker image oluşturma
docker build -t my-backstage .

# Container çalıştırma
docker run -p 3000:3000 my-backstage

Dockerfile, Backstage'in Node.js tabanlı yapısını paketler ve çalıştırılabilir bir container oluşturur.

Kubernetes Helm ile Kurulum

Kubernetes ortamında çalıştırmak isteyenler için resmi Helm chart mevcuttur. Bu yöntem, Helm paket yöneticisi kullanılarak tek komutla kurulum yapmanızı sağlar.

# Helm repository ekleme
helm repo add backstage https://backstage.github.io/helm-charts
helm repo update

# Backstage deploy etme
helm install my-backstage backstage/backstage \
  --namespace backstage \
  --create-namespace

Bu kurulum, Kubernetes cluster'ınızda Backstage pod'unu çalıştırır ve servis aracılığıyla erişilebilir kılar. Özel yapılandırma için configmap ve secret kullanarak ortam değişkenleri ve hassas bilgileri yönetebilirsiniz.

Yapılandırma Dosyaları ve Kimlik Doğrulama

Backstage'in doğru çalışması için app-config.yaml dosyasının uygun şekilde yapılandırılması gerekir. Bu dosya, catalog, auth, proxy ve plugin ayarlarını içerir.

Temel Yapılandırma

Aşağıda temel bir app-config.yaml yapılandırması görüyoruz.

app:
  title: Şirket Developer Portal
  baseUrl: https://backstage.sirket.com

catalog:
  locations:
    - type: url
      target: https://github.com/sirket/catalog-info.yaml
      rules:
        - allow: [Component, API, Resource, System, Domain, User, Group]
    - type: file
      target: ./catalog-entities.yaml

auth:
  providers:
    github:
      development:
        clientId: ${GITHUB_CLIENT_ID}
        clientSecret: ${GITHUB_CLIENT_SECRET}

kubernetes:
  serviceLocatorMethod:
    type: multiTenant
  clusterLocatorMethods:
    - type: config
      clusters:
        - url: https://kubernetes.local
          name: production
          authProvider: serviceAccount
          skipTLSVerify: true

Bu yapılandırma, GitHub ile kimlik doğrulama, software catalog için location tanımları ve Kubernetes entegrasyonu ayarlarını içerir. Gerçek ortamda hassas bilgiler (API key'ler, secret'ler) ortam değişkenlerinden alınmalıdır.

GitHub Kimlik Doğrulaması

Kurumsal ortamda genellikle GitHub OAuth kullanılır. GitHub Developer Settings üzerinden yeni bir OAuth App oluşturmalı ve callback URL'sini doğru şekilde yapılandırmalısınız. Backstage, yetkili kullanıcıların kimliğini doğrulayarak kişiselleştirilmiş deneyim sunar ve entity'lerin ownership bilgisini GitHub kullanıcılarıyla eşleştirir.

TechDocs ile Dokümantasyon

TechDocs, Backstage'in yerleşik dokümantasyon çözümüdür. Markdown dosyalarınızı otomatik olarak HTML'e dönüştürür ve Backstage arayüzünde sunar. Bu yaklaşım, dokümantasyonun kodla birlikte yaşamasını sağlar; kod değiştikçe dokümantasyon da güncellenir.

TechDocs Kurulumu

TechDocs kullanmak için öncelikle Backstage'e plugin'in eklenmesi ve her repository'de mkdocs.yml dosyasının oluşturulması gerekir.

# Backstage app'e TechDocs plugin ekleme
cd my-backstage
yarn add @backstage/plugin-techdocs
yarn add @backstage/plugin-techdocs-backend

# Docker image'a mkdocs ekleme
echo RUN apk add mkdocs >> Dockerfile

Her repository'de ise şu dosyalar bulunmalıdır: docs/ klasörü içindeki Markdown dokümanlar, docs/index.md ana sayfası ve mkdocs.yml yapılandırma dosyası.

mkdocs.yml Yapılandırması

site_name: Ödeme API Dokümantasyonu
docs_dir: docs
site_dir: dist

nav:
  - Home: index.md
  - API Referansı:
      - Genel Bakış: api/overview.md
      - Endpoint Listesi: api/endpoints.md
  - Mimari: architecture.md

plugins:
  - techdocs-core

Bu yapılandırma ile TechDocs, docs klasöründeki Markdown dosyalarını okur ve Backstage üzerinde güzel bir dokümantasyon sitesi oluşturur.

Scaffolder ile Otomatik Proje Oluşturma

Scaffolder, geliştiricilerin standart şablonlar kullanarak yeni projeler oluşturmasını sağlar. Bu özellik, kurumsal standartların uygulanmasını ve yeni servislerin tutarlı bir yapıda başlatılmasını garanti eder.

Template Oluşturma

Bir template, STDIN (Template Definition) dosyası ve şablon dosyalarından oluşur. Aşağıda basit bir Node.js servis şablonu görüyoruz.

apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: nodejs-service-template
  title: Node.js Servis Şablonu
  description: Standart Node.js microservice yapısı
spec:
  owner: platform-ekibi
  type: service

  parameters:
    - title: Servis Bilgileri
      required:
        - componentName
        - description
      properties:
        componentName:
          title: Servis Adı
          type: string
        description:
          title: Açıklama
          type: string

  steps:
    - id: fetch-base
      name: Fetch Base
      action: fetch:cookiecutter
      input:
        url: https://github.com/sirket/nodejs-service-template/archive/main.zip
        values:
          name: ${{ parameters.componentName }}
          description: ${{ parameters.description }}

    - id: publish
      name: Publish to Catalog
      action: catalog:register
      input:
        catalogInfoUrl: ${{ steps[fetch-base].output.catalogInfoUrl }}

Bu şablon, kullanıcıdan servis adı ve açıklaması alır, hazır bir template'i klonlar ve software catalog'a kaydeder.

Kubernetes Entegrasyonu

Backstage'in Kubernetes plugin'i, container orkestrasyon süreçlerini görselleştirir ve yönetim kolaylığı sağlar. Geliştiriciler, servislerinin Kubernetes üzerindeki durumunu portal üzerinden izleyebilir.

Plugin Kurulumu

# Kubernetes plugin ekleme
cd my-backstage
yarn add @backstage/plugin-kubernetes
yarn add @backstage/plugin-kubernetes-backend

Kubernetes plugin'in çalışması için bir service account oluşturulmalı ve uygun RBAC yetkileri verilmelidir.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: backstage-kubernetes
  namespace: backstage
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: backstage-kubernetes
rules:
  - apiGroups: [""]
    resources: [pods, services, configmaps]
    verbs: [get, list, watch]
  - apiGroups: [apps]
    resources: [deployments, replicasets]
    verbs: [get, list, watch]
  - apiGroups: [networking.k8s.io]
    resources: [ingresses]
    verbs: [get, list, watch]

Bu RBAC yapılandırması, Backstage'in Kubernetes cluster'ından bilgi okumasını sağlar. Hassas işlemler (pod silme, deployment güncelleme) için ek yetkiler gerekebilir.

En İyi Uygulamalar ve Başarılı Implementasyon

Backstage implementasyonu başarısı, doğru strateji ve uygulamalara bağlıdır. Kurumsal ortamda value yaratması için dikkat edilmesi gereken kritik noktalar vardır.

Catalog Governance ve Linting

Catalog'un güvenilirliği, içindeki verilerin doğruluğuna bağlıdır. Her repository'de catalog-info.yaml dosyasının geçerliliğini kontrol eden bir CI pipeline oluşturulmalıdır.

# package.json scripts
{
  scripts: {
    lint:catalog: backstage-cli repo lint --catalog-only
  }
}

# .github/workflows/catalog.yml
name: Catalog Validation
on: [pull_request]
jobs:
  validate:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: node/setup-node@v3
      - run: yarn install
      - run: yarn lint:catalog

Bu CI kontrolü, hatalı catalog dosyalarının ana branch'e girmesini engeller ve portalın güvenilirliğini korur.

Annotation Policy

Her organizasyon, hangi annotation'ların zorunlu olduğunu belirleyen bir policy oluşturmalıdır. Örneğin, üretim servislerinin mutlaka PagerDuty entegrasyonuna sahip olması veya her component'in TechDocs dokümantasyonunun bulunması gibi kurallar konulabilir. Bu policy'ler, Scorecard eklentileri ile uygulanabilir.

Adoption Strategy

Backstage'i tüm organizasyona yaymak, dikkatli bir değişim yönetimi gerektirir. Önce küçük bir pilot ekiple başlamak, değer kanıtlamak ve ardından kademeli olarak genişletmek önerilir. İlk aşamada sadece software catalog ve basit dokümantasyon ile başlanabilir; sonraki aşamalarda Scaffolder ve Kubernetes entegrasyonları eklenebilir.

Başarısız implementasyonların en yaygın nedeni "boş catalog" sorunudur. Entity'ler manuel olarak eklenmeye çalışıldığında veya otomatik keşif yapılmadığında, portal kısa sürede kullanılmaz hale gelir. Otomatik keşif mekanizmaları (GitHub webhook'ları, CI pipeline entegrasyonları) kurularak catalog'un sürekli güncel kalması sağlanmalıdır.

Sonuç

Backstage, platform mühendisliği alanında devrim niteliğinde bir araçtır. Doğru implementasyon ile geliştirici üretkenliğini önemli ölçüde artırır, dokümantasyonu kodla bütünleştirir ve altyapı yönetimini merkezi hale getirir. Ancak başarı, teknik kurulumun ötesinde organizasyonel stratejiye bağlıdır. Catalog'un değer yaratması için tüm ekiplerin katkıda bulunması ve güncel tutması gerekir. Bugün Backstage'i pilot bir proje ile denemeye başlayarak, organizasyonunuzun developer experience'ını önemli ölçüde iyileştirebilirsiniz.