DEV Community

Cover image for Heroku API Kullanımı: Kapsamlı Entegrasyon Rehberi (2026)
Tobias Hoffmann
Tobias Hoffmann

Posted on • Originally published at apidog.com

Heroku API Kullanımı: Kapsamlı Entegrasyon Rehberi (2026)

TL;DR

Heroku API, geliştiricilerin dağıtımı otomatikleştirmesini, uygulamaları yönetmesini, eklentileri yapılandırmasını ve altyapıyı programlı olarak ölçeklendirmesini sağlar. OAuth 2.0 ve jeton tabanlı kimlik doğrulama, uygulamalar, dyno'lar, derlemeler ve işlem hatları için RESTful uç noktaları kullanır ve hesap başına saatte 10.000 istek limitine sahiptir. Bu teknik rehberde, kimlik doğrulama kurulumu, temel uç noktalar, CI/CD entegrasyonu ve üretim dağıtım stratejileri adım adım aktarılmıştır.

Apidog’u hemen deneyin

Giriş

Heroku, 170'ten fazla ülkede 4 milyondan fazla uygulamaya güç vermektedir. Dağıtım otomasyonu, CI/CD işlem hatları veya çoklu uygulama yönetimi araçları geliştiren geliştiriciler için Heroku API entegrasyonu artık bir gereklilik.

Gerçekçi bir senaryo: 10'dan fazla Heroku uygulamasını yöneten ekipler, manuel dağıtımlar ve yapılandırma değişiklikleri nedeniyle haftada 8-12 saat kaybedebiliyor. Sağlam bir Heroku API entegrasyonu ile dağıtımları otomatikleştirebilir, trafiğe göre dyno'ları ölçeklendirebilir ve ortamlar arası yapılandırmayı senkronize edebilirsiniz.

Bu rehber, Heroku API entegrasyonunun tüm pratik adımlarını kapsar: Jeton kimlik doğrulama, uygulama ve dyno yönetimi, derleme işlem hatları, eklenti sağlama ve hata giderme. Sonuçta, üretime hazır bir Heroku entegrasyonunu kodlayabileceksiniz.

💡 Apidog, API entegrasyon testlerini kolaylaştırır. Heroku uç noktalarınızı test edin, kimlik doğrulama akışlarını doğrulayın, API yanıtlarını inceleyin ve yapılandırma sorunlarını tek panelden giderin. API şemalarını içe aktarın, yanıtlara mock ekleyin ve test senaryolarını ekibinizle paylaşın.

Heroku API Nedir?

Heroku, platform üzerindeki uygulama ve altyapıyı yönetmek için RESTful bir Platform API'si sunar. API ile şunları programatik olarak yönetebilirsiniz:

  • Uygulama oluşturma, yapılandırma ve silme
  • Dyno ölçeklendirme ve süreç yönetimi
  • Derleme ve sürüm yönetimi
  • Eklenti sağlama ve yapılandırma
  • İşlem hattı ve tanıtım yönetimi
  • Alan adı ve SSL sertifikası yönetimi
  • Günlük boşaltma ve izleme kurulumu
  • Ekip ve işbirlikçi yönetimi

Temel Özellikler

Özellik Açıklama
RESTful Tasarım JSON yanıtlarıyla standart HTTP yöntemleri
Jeton Kimlik Doğrulaması OAuth 2.0 destekli Taşıyıcı jeton
Aralık İstekleri Büyük sonuç kümeleri için sayfalama
Oran Sınırlandırması Hesap başına saatte 10.000 istek
Tekrarlanabilir Oluşturmalar Güvenli yeniden deneme davranışı
Gzip Sıkıştırma Yanıt sıkıştırma ile bant genişliği tasarrufu

API Mimarisinin Genel Görünümü

Heroku API, sürümlü bir REST API yapısı kullanır:

https://api.heroku.com/
Enter fullscreen mode Exit fullscreen mode

API, JSON:API spesifikasyonunu ve tutarlı kaynak kalıplarını takip eder.

API Sürümleri Karşılaştırması

Sürüm Durum Kimlik Doğrulama Kullanım Durumu
Platform API (v3) Mevcut Taşıyıcı Jeton Tüm yeni entegrasyonlar
GitHub Entegrasyonu Mevcut OAuth 2.0 GitHub bağlantılı uygulamalar
Kapsayıcı Kayıt Defteri Mevcut Docker kimlik doğrulama Kapsayıcı dağıtımları

Başlarken: Kimlik Doğrulama Kurulumu

Adım 1: Heroku Hesabı Oluşturun

API'ye erişim için bir Heroku hesabı gerekir:

Heroku hesap oluşturma sayfası ekran görüntüsü

  1. Heroku web sitesini açın
  2. Kaydol'a tıklayın ve bir hesap oluşturun
  3. E-posta adresinizi doğrulayın
  4. Hesap kurulumunu tamamlayın

Adım 2: Heroku CLI'yi Kurun

CLI, API jetonları oluşturmaya ve komutları test etmeye yardımcı olur:

# macOS
brew tap heroku/brew && brew install heroku

# Windows
npm install -g heroku

# Linux
curl https://cli-assets.heroku.com/install.sh | sh
Enter fullscreen mode Exit fullscreen mode

Adım 3: API Jetonu Oluşturun

Heroku CLI ile kimlik doğrulama yapın:

# Heroku'ya giriş yapın
heroku login

# Bu, kimlik doğrulama için bir tarayıcı açar
# Giriş yaptıktan sonra jetonunuz yerel olarak depolanır
Enter fullscreen mode Exit fullscreen mode

API jetonunuzu almak için:

# Mevcut yetkilendirme jetonunuzu görüntüleyin
heroku authorizations:create --short-lived

# Uzun ömürlü bir jeton (CI/CD için)
heroku authorizations:create --description "CI/CD Pipeline" --expires-in "1 year"
Enter fullscreen mode Exit fullscreen mode

Güvenlik: Jetonları kodda değil, ortam değişkenlerinde saklayın.

# .env dosyası örneği
HEROKU_API_KEY="api_anahtarınız_buraya"
HEROKU_APP_NAME="uygulama-adınız"
Enter fullscreen mode Exit fullscreen mode

Adım 4: Jeton Kimlik Doğrulamayı Anlayın

Her API isteğinde aşağıdaki başlıkları kullanın:

Authorization: Bearer {api_key}
Accept: application/vnd.heroku+json; version=3
Enter fullscreen mode Exit fullscreen mode

Adım 5: İlk API Çağrınızı Yapın

Kimlik doğrulamanızı test edin:

curl -n https://api.heroku.com/account \
  -H "Accept: application/vnd.heroku+json; version=3" \
  -H "Authorization: Bearer $HEROKU_API_KEY"
Enter fullscreen mode Exit fullscreen mode

Beklenen yanıt örneği:

{
  "id": "kullanıcı-kimliği-burada",
  "email": "developer@example.com",
  "name": "Geliştirici Adı",
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2026-03-20T14:22:00Z"
}
Enter fullscreen mode Exit fullscreen mode

Adım 6: Kodda Kimlik Doğrulama Uygulaması

Yeniden kullanılabilir bir API istemcisi oluşturun:

const HEROKU_API_KEY = process.env.HEROKU_API_KEY;
const HEROKU_BASE_URL = 'https://api.heroku.com';

const herokuRequest = async (endpoint, options = {}) => {
  const response = await fetch(`${HEROKU_BASE_URL}${endpoint}`, {
    ...options,
    headers: {
      'Authorization': `Bearer ${HEROKU_API_KEY}`,
      'Accept': 'application/vnd.heroku+json; version=3',
      'Content-Type': 'application/json',
      ...options.headers
    }
  });

  if (!response.ok) {
    const error = await response.json();
    throw new Error(`Heroku API Hatası: ${error.message}`);
  }

  return response.json();
};

// Kullanım
const account = await herokuRequest('/account');
console.log(`Giriş yapıldı: ${account.email}`);
Enter fullscreen mode Exit fullscreen mode

Uygulama Yönetimi

Yeni Bir Uygulama Oluşturma

Heroku'da programatik olarak uygulama oluşturmak için:

const createApp = async (appName, region = 'us') => {
  const response = await herokuRequest('/apps', {
    method: 'POST',
    body: JSON.stringify({
      name: appName,
      region: region
    })
  });

  return response;
};

// Kullanım
const app = await createApp('harika-uygulamam-2026');
console.log(`Uygulama oluşturuldu: ${app.name}`);
console.log(`Git URL'si: ${app.git_url}`);
console.log(`Web URL'si: ${app.web_url}`);
Enter fullscreen mode Exit fullscreen mode

Beklenen Uygulama Yanıtı

{
  "id": "uygulama-uuid-burada",
  "name": "harika-uygulamam-2026",
  "region": { "name": "us" },
  "created_at": "2026-03-25T10:00:00Z",
  "updated_at": "2026-03-25T10:00:00Z",
  "git_url": "https://git.heroku.com/harika-uygulamam-2026.git",
  "web_url": "https://harika-uygulamam-2026.herokuapp.com",
  "owner": { "email": "developer@example.com" },
  "build_stack": { "name": "heroku-24" }
}
Enter fullscreen mode Exit fullscreen mode

Uygulamaları Listeleme

Tüm uygulamalarınızı çekmek için:

const listApps = async (limit = 50) => {
  const response = await herokuRequest(`/apps?limit=${limit}`);
  return response;
};

// Kullanım
const apps = await listApps();
apps.forEach(app => {
  console.log(`${app.name} - ${app.web_url}`);
});
Enter fullscreen mode Exit fullscreen mode

Uygulama Detaylarını Alma

Bir uygulamanın detayını alın:

const getApp = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}`);
  return response;
};

// Kullanım
const app = await getApp('harika-uygulamam-2026');
console.log(`Yığın: ${app.build_stack.name}`);
console.log(`Bölge: ${app.region.name}`);
Enter fullscreen mode Exit fullscreen mode

Uygulama Yapılandırmasını Güncelleme

Bir uygulama ayarını değiştirmek için:

const updateApp = async (appName, updates) => {
  const response = await herokuRequest(`/apps/${appName}`, {
    method: 'PATCH',
    body: JSON.stringify(updates)
  });

  return response;
};

// Kullanım
const updated = await updateApp('eski-uygulama-adı', {
  name: 'yeni-uygulama-adı'
});
Enter fullscreen mode Exit fullscreen mode

Bir Uygulamayı Silme

Bir uygulamayı programatik olarak kaldırın:

const deleteApp = async (appName) => {
  await herokuRequest(`/apps/${appName}`, {
    method: 'DELETE'
  });

  console.log(`Uygulama ${appName} başarıyla silindi`);
};
Enter fullscreen mode Exit fullscreen mode

Dyno Yönetimi

Dyno'ları Ölçeklendirme

Uygulamanızı yukarı/aşağı ölçeklendirin:

const scaleDyno = async (appName, processType, quantity) => {
  const response = await herokuRequest(`/apps/${appName}/formation/${processType}`, {
    method: 'PATCH',
    body: JSON.stringify({
      quantity: quantity
    })
  });

  return response;
};

// Kullanım
const formation = await scaleDyno('uygulamam', 'web', 3);
console.log(`${formation.quantity} ${processType} dyno'suna ölçeklendirildi`);
Enter fullscreen mode Exit fullscreen mode

Dyno Oluşumunu Alma

Mevcut dyno yapılandırmasını çekin:

const getFormation = async (appName, processType = null) => {
  const endpoint = processType
    ? `/apps/${appName}/formation/${processType}`
    : `/apps/${appName}/formation`;

  const response = await herokuRequest(endpoint);
  return response;
};

// Kullanım
const formation = await getFormation('uygulamam');
formation.forEach(proc => {
  console.log(`${proc.type}: ${proc.quantity} dyno (@ ${proc.size})`);
});
Enter fullscreen mode Exit fullscreen mode

Mevcut Dyno Boyutları

Dyno Tipi Kullanım Durumu Aylık Maliyet
eco Hobi projeleri, demolar 5$
basic Küçük üretim uygulamaları 7$
standard-1x Standart iş yükleri 25$
standard-2x Yüksek performanslı uygulamalar 50$
performance Üretim açısından kritik uygulamalar 250$ +
private Kurumsal izolasyon Özel

Dyno'ları Yeniden Başlatma

Bir uygulamanın tüm dyno'larını yeniden başlatın:

const restartDynos = async (appName, processType = null) => {
  const endpoint = processType
    ? `/apps/${appName}/formation/${processType}`
    : `/apps/${appName}/dynos`;

  await herokuRequest(endpoint, {
    method: 'DELETE'
  });

  console.log(`${appName} için dyno'lar yeniden başlatıldı`);
};
Enter fullscreen mode Exit fullscreen mode

Tek Seferlik Dyno'ları Çalıştırma

Yalıtılmış dyno'da komut çalıştırmak için:

const runCommand = async (appName, command) => {
  const response = await herokuRequest(`/apps/${appName}/dynos`, {
    method: 'POST',
    body: JSON.stringify({
      command: command,
      size: 'standard-1x'
    })
  });

  return response;
};

// Kullanım
const dyno = await runCommand('uygulamam', 'npm run migrate');
console.log(`Dyno başlatıldı: ${dyno.id}`);
Enter fullscreen mode Exit fullscreen mode

Yapılandırma Değişkenleri

Yapılandırma Değişkenlerini Alma

Bir uygulamanın ortam değişkenlerini çekin:

const getConfigVars = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}/config-vars`);
  return response;
};

// Kullanım
const config = await getConfigVars('uygulamam');
console.log(`DATABASE_URL: ${config.DATABASE_URL}`);
console.log(`NODE_ENV: ${config.NODE_ENV}`);
Enter fullscreen mode Exit fullscreen mode

Yapılandırma Değişkenlerini Ayarlama

Ortam değişkenini güncelleyin:

const setConfigVars = async (appName, variables) => {
  const response = await herokuRequest(`/apps/${appName}/config-vars`, {
    method: 'PATCH',
    body: JSON.stringify(variables)
  });

  return response;
};

// Kullanım
const updated = await setConfigVars('uygulamam', {
  NODE_ENV: 'production',
  API_SECRET: 'gizli_anahtarınız',
  LOG_LEVEL: 'info'
});
Enter fullscreen mode Exit fullscreen mode

Yapılandırma Değişkenleri için En İyi Uygulamalar

  1. Asla sırları kaydetmeyin: Tüm hassas verileri ortam değişkenlerinde saklayın.
  2. Ortam başına ayrı yapılandırmalar kullanın: Hazırlık ve üretim ortamları için farklı değişkenler tanımlayın.
  3. Sırları düzenli olarak döndürün: API anahtarlarını ve şifreleri periyodik olarak değiştirin.
  4. İlgili değişkenlere ön ek ekleyin: Örn. STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET

Derleme ve Sürüm Yönetimi

Bir Derleme Oluşturma

API üzerinden kodunuzu dağıtmak için:

const createBuild = async (appName, sourceBlobUrl) => {
  const response = await herokuRequest(`/apps/${appName}/builds`, {
    method: 'POST',
    body: JSON.stringify({
      source_blob: {
        url: sourceBlobUrl
      }
    })
  });

  return response;
};

// Kullanım
const build = await createBuild('uygulamam', 'https://storage.example.com/source.tar.gz');
console.log(`Derleme başlatıldı: ${build.id}`);
console.log(`Durum: ${build.status}`);
Enter fullscreen mode Exit fullscreen mode

Derleme Durumunu Alma

Bir derlemenin durumunu takip edin:

const getBuild = async (appName, buildId) => {
  const response = await herokuRequest(`/apps/${appName}/builds/${buildId}`);
  return response;
};

// Tamamlanana kadar yokla
const checkBuildStatus = async (appName, buildId, maxAttempts = 30) => {
  for (let i = 0; i < maxAttempts; i++) {
    const build = await getBuild(appName, buildId);

    if (build.status === 'succeeded') {
      console.log('Derleme başarılı!');
      return build;
    } else if (build.status === 'failed') {
      throw new Error(`Derleme başarısız: ${build.output}`);
    }

    console.log(`Derleme devam ediyor... deneme ${i + 1}`);
    await new Promise(resolve => setTimeout(resolve, 5000));
  }

  throw new Error('Derleme zaman aşımına uğradı');
};
Enter fullscreen mode Exit fullscreen mode

Sürümleri Listeleme

Bir uygulamanın sürüm geçmişini alın:

const listReleases = async (appName, limit = 10) => {
  const response = await herokuRequest(`/apps/${appName}/releases?limit=${limit}`);
  return response;
};

// Kullanım
const releases = await listReleases('uygulamam');
releases.forEach(release => {
  console.log(`v${release.version} - ${release.description} - ${release.created_at}`);
});
Enter fullscreen mode Exit fullscreen mode

Önceki Sürüme Geri Dönme

Bir sürüme rollback yapmak için:

const rollback = async (appName, releaseId) => {
  const response = await herokuRequest(`/apps/${appName}/releases`, {
    method: 'POST',
    body: JSON.stringify({
      rollback: releaseId
    })
  });

  return response;
};

// Kullanım
const rollbackRelease = await rollback('uygulamam', 42);
console.log(`v${rollbackRelease.version} sürümüne geri dönüldü`);
Enter fullscreen mode Exit fullscreen mode

İşlem Hattı Yönetimi

Bir İşlem Hattı Oluşturma

CI/CD pipeline oluşturmak için:

const createPipeline = async (pipelineName) => {
  const response = await herokuRequest('/pipelines', {
    method: 'POST',
    body: JSON.stringify({
      name: pipelineName
    })
  });

  return response;
};

// Kullanım
const pipeline = await createPipeline('uygulamam-işlem-hattı');
console.log(`İşlem hattı oluşturuldu: ${pipeline.id}`);
Enter fullscreen mode Exit fullscreen mode

Uygulamaları İşlem Hattına Ekleme

Bir pipeline'a uygulama ekleyin:

const addAppToPipeline = async (pipelineId, appName, stage) => {
  const response = await herokuRequest('/pipeline-couplings', {
    method: 'POST',
    body: JSON.stringify({
      pipeline: pipelineId,
      app: appName,
      stage: stage // 'development', 'staging', 'production'
    })
  });

  return response;
};

// Kullanım
await addAppToPipeline(pipelineId, 'uygulamam-dev', 'development');
await addAppToPipeline(pipelineId, 'uygulamam-staging', 'staging');
await addAppToPipeline(pipelineId, 'uygulamam-prod', 'production');
Enter fullscreen mode Exit fullscreen mode

Slug'ı Bir Sonraki Aşamaya Yükseltme

Bir slug'ı pipeline aşamaları arasında taşıyın:

const promoteSlug = async (slugId, toApp) => {
  await herokuRequest('/promotions', {
    method: 'POST',
    body: JSON.stringify({
      from: toApp, // Kaynak uygulama
      to: toApp,   // Hedef uygulama (bir sonraki aşama)
      slug: slugId
    })
  });

  console.log(`Slug ${slugId}, ${toApp} uygulamasına yükseltildi`);
};
Enter fullscreen mode Exit fullscreen mode

Eklenti Yönetimi

Eklentileri Sağlama

Heroku uygulamasına eklenti ekleyin:

const provisionAddon = async (appName, addonPlan, config = {}) => {
  const response = await herokuRequest('/addon-attachments', {
    method: 'POST',
    body: JSON.stringify({
      app: appName,
      plan: addonPlan,
      config: config
    })
  });

  return response;
};

// Kullanım
const db = await provisionAddon('uygulamam', 'heroku-postgresql:mini', {});
console.log(`Veritabanı sağlandı: ${db.addon.name}`);
console.log(`DATABASE_URL: ${db.addon.config_vars.DATABASE_URL}`);
Enter fullscreen mode Exit fullscreen mode

Popüler Eklentiler

Eklenti Plan Başlangıç Fiyatı Kullanım Durumu
heroku-postgresql mini 5$/ay Üretim veritabanı
heroku-redis mini 5$/ay Önbellekleme
papertrail choklad 7$/ay Günlük toplama
sentry geliştirici Ücretsiz Hata izleme
mailgun sandbox Ücretsiz E-posta teslimatı
newrelic lite Ücretsiz Uygulama izleme

Eklentileri Listeleme

Yüklü eklentileri çekmek için:

const listAddons = async (appName) => {
  const response = await herokuRequest(`/apps/${appName}/addons`);
  return response;
};

// Kullanım
const addons = await listAddons('uygulamam');
addons.forEach(addon => {
  console.log(`${addon.plan.name} - $${addon.pricing.plan.price} - ${addon.state}`);
});
Enter fullscreen mode Exit fullscreen mode

Eklentileri Kaldırma

Bir eklentiyi kaldırmak için:

const removeAddon = async (appName, addonId) => {
  await herokuRequest(`/apps/${appName}/addons/${addonId}`, {
    method: 'DELETE'
  });

  console.log(`Eklenti ${addonId}, ${appName} uygulamasından kaldırıldı`);
};
Enter fullscreen mode Exit fullscreen mode

Alan Adı ve SSL Yönetimi

Özel Alan Adları Ekleme

Bir uygulamaya özel domain ekleyin:

const addDomain = async (appName, domainName) => {
  const response = await herokuRequest(`/apps/${appName}/domains`, {
    method: 'POST',
    body: JSON.stringify({
      hostname: domainName
    })
  });

  return response;
};

// Kullanım
const domain = await addDomain('uygulamam', 'api.example.com');
console.log(`CNAME hedefi: ${domain.cname}`);
Enter fullscreen mode Exit fullscreen mode

SSL Sertifikalarını Yapılandırma

Özel domain için SSL ekleyin:

const addSslCertificate = async (appName, domainId, certificateChain, privateKey) => {
  const response = await herokuRequest(`/apps/${appName}/domains/${domainId}/ssl_endpoint`, {
    method: 'PATCH',
    body: JSON.stringify({
      ssl_cert: {
        cert_chain: certificateChain,
        private_key: privateKey
      }
    })
  });

  return response;
};
Enter fullscreen mode Exit fullscreen mode

ACM ile Otomatik SSL

Otomatik Sertifika Yönetimi'ni etkinleştirin:

const enableACM = async (appName, domainName) => {
  const response = await herokuRequest(`/apps/${appName}/domains/${domainName}/sni_endpoint`, {
    method: 'POST',
    body: JSON.stringify({
      kind: 'acm'
    })
  });

  return response;
};
Enter fullscreen mode Exit fullscreen mode

Oran Sınırlandırma ve Kotalar

Oran Sınırlarını Anlama

Heroku API'de oran sınırları:

  • Standart Limit: Hesap başına saatte 10.000 istek
  • Pencere: 60 dakikalık kayan pencere
  • Sıfırlama: Otomatik olarak pencere sonunda

Limitin aşılması HTTP 429 döndürür.

Oran Sınırlandırma İşlemeyi Uygulama

Üstel geri çekilme ile oran sınırına uygun istek atmak için:

const makeRateLimitedRequest = async (endpoint, options = {}, maxRetries = 3) => {
  for (let attempt = 1; attempt <= maxRetries; attempt++) {
    try {
      const response = await herokuRequest(endpoint, options);

      // Oran sınırı başlıklarını kontrol et
      const remaining = response.headers.get('RateLimit-Remaining');
      const resetTime = response.headers.get('RateLimit-Reset');

      if (remaining < 100) {
        console.warn(`Düşük kota kaldı: ${remaining}, ${resetTime} tarihinde sıfırlanıyor`);
      }

      return response;
    } catch (error) {
      if (error.message.includes('429') && attempt < maxRetries) {
        const delay = Math.pow(2, attempt) * 1000;
        console.log(`Oran sınırlandırıldı. ${delay}ms içinde tekrar deneniyor...`);
        await new Promise(resolve => setTimeout(resolve, delay));
      } else {
        throw error;
      }
    }
  }
};
Enter fullscreen mode Exit fullscreen mode

Oran Sınırlandırma Başlıkları

Başlık Açıklama
RateLimit-Limit Saatte maksimum istek sayısı
RateLimit-Remaining Pencerede kalan istek
RateLimit-Reset Pencerenin sıfırlandığı zaman

Yaygın Sorun Giderme

Sorun: Kimlik Doğrulama 401 Hatası

Belirtiler: "Geçersiz kimlik bilgileri" hatası.

Çözümler:

  1. API anahtarının doğru olduğunu kontrol edin: heroku authorizations
  2. Jetonun süresinin dolmadığından emin olun
  3. Ortam değişkenindeki fazlalık boşlukları kontrol edin
  4. Gerekirse jetonu yeniden oluşturun: heroku authorizations:create

Sorun: Uygulama Adı Zaten Alınmış

Belirtiler: "ad zaten alınmış" hatası.

Çözümler:

  1. Benzersiz adlar kullanın (ekip/rastgele son ek ekleyin)
  2. UUID tabanlı adlar: app-${Date.now()}
  3. Ad alanı ön ekleri: ekip-adı-uygulama-adı-ortam
const generateUniqueAppName = (baseName) => {
  const timestamp = Date.now().toString(36);
  const random = Math.random().toString(36).substring(2, 6);
  return `${baseName}-${timestamp}-${random}`;
};
Enter fullscreen mode Exit fullscreen mode

Sorun: Dyno Oluşumu Başarısız

Belirtiler: Ölçeklendirme işlemi hata döndürüyor.

Çözümler:

  1. Procfile'da işlem tipini doğrulayın
  2. Dyno kotanızın yeterli olduğundan emin olun
  3. Uygulamanın askıya alınmadığını kontrol edin
  4. Dyno saat kullanımını inceleyin: heroku ps --app=uygulamam

Sorun: Derleme Zaman Aşımı

Belirtiler: Derlemeler 30 dakika sonra takılıyor.

Çözümler:

  1. Buildpack seçimini optimize edin
  2. Bağımlılıkları önbelleğe alın
  3. Büyük derlemeleri küçük parçalara bölün
  4. Önceden oluşturulmuş slug'lar kullanın

Sorun: Oran Sınırı Aşıldı

Belirtiler: HTTP 429 yanıtı.

Çözümler:

  1. İstek kuyruğu uygulayın
  2. Üstel geri çekilme ile yeniden deneyin
  3. İstekleri toplu olarak yapın
  4. Oran sınırı başlıklarını izleyin
// Basit oran sınırlayıcı
class HerokuRateLimiter {
  constructor(requestsPerMinute = 150) {
    this.queue = [];
    this.interval = 60000 / requestsPerMinute;
    this.processing = false;
  }

  async add(requestFn) {
    return new Promise((resolve, reject) => {
      this.queue.push({ requestFn, resolve, reject });
      this.process();
    });
  }

  async process() {
    if (this.processing || this.queue.length === 0) return;

    this.processing = true;

    while (this.queue.length > 0) {
      const { requestFn, resolve, reject } = this.queue.shift();

      try {
        const result = await requestFn();
        resolve(result);
      } catch (error) {
        reject(error);
      }

      if (this.queue.length > 0) {
        await new Promise(r => setTimeout(r, this.interval));
      }
    }

    this.processing = false;
  }
}
Enter fullscreen mode Exit fullscreen mode

Üretim Dağıtım Kontrol Listesi

Canlıya geçerken aşağıdakileri kontrol edin:

  • [ ] CI/CD için uzun ömürlü API jetonları kullanın
  • [ ] Jetonları güvenli sır yönetiminde saklayın (Vault, AWS Secrets Manager)
  • [ ] Oran sınırlama ve istek kuyruğu uygulayın
  • [ ] Hata işlemeyi kapsamlı yapın
  • [ ] API çağrıları için günlük kaydı tutun
  • [ ] Dyno saat kullanımını izleyin
  • [ ] Harici günlük kaydı için log drain yapılandırın
  • [ ] CI/CD pipeline yükseltmelerini ayarlayın
  • [ ] Otomatik Sertifika Yönetimi'ni aktif edin
  • [ ] Veritabanı yedekleme stratejisi oluşturun

İzleme ve Uyarı

Aşağıdaki metrikleri izleyin:

const metrics = {
  apiCalls: {
    total: 0,
    successful: 0,
    failed: 0,
    rateLimited: 0
  },
  dynoHours: {
    used: 0,
    quota: 1000
  },
  deployments: {
    successful: 0,
    failed: 0,
    avg_duration: 0
  }
};

// Hata oranı uyarısı
const failureRate = metrics.apiCalls.failed / metrics.apiCalls.total;

if (failureRate > 0.05) {
  sendAlert('Heroku API hata oranı %5\'in üzerinde');
}

// Dyno saat kullanımında uyarı
if (metrics.dynoHours.used > metrics.dynoHours.quota * 0.8) {
  sendAlert('Dyno saat kullanımı %80\'in üzerinde');
}
Enter fullscreen mode Exit fullscreen mode

Gerçek Dünya Kullanım Durumları

Otomatik CI/CD İşlem Hattı

Bir SaaS ekibi, GitHub'dan otomatik dağıtımlar için:

  • Zorluk: Manuel dağıtımlar hatalara ve gecikmelere yol açıyordu
  • Çözüm: GitHub Actions + Heroku API entegrasyonu
  • Sonuç: Sıfır kesinti süreli, %90 daha hızlı sürümler

Uygulama akışı:

  1. GitHub push'u iş akışını tetikler
  2. Testler CI'de çalışır
  3. Heroku API, kaynak blob'dan derleme oluşturur
  4. Hazırlıktan üretime yükseltme yapılır
  5. Sonuç ekibe bildirilir

Çoklu Ortam Yönetimi

Bir danışmanlık firması, 50+ müşteri uygulamasını yönetiyor:

  • Zorluk: Ortamlar arasında manuel yapılandırma
  • Çözüm: Heroku API ile merkezi yapılandırma yönetimi
  • Sonuç: Tutarlı yapılandırmalar, haftada 8 saat kazanç

Entegrasyon noktaları:

  • Ortamlar arası yapılandırma senkronizasyonu
  • Otomatik eklenti sağlama
  • Toplu müşteri alımı işlemleri

Trafiğe Dayalı Otomatik Ölçeklendirme

Bir e-ticaret platformu trafik artışlarını yönetiyor:

  • Zorluk: Satış dönemlerinde manuel ölçeklendirme
  • Çözüm: Heroku API ile otomatik ölçeklendirme
  • Sonuç: 10 kat trafik artışında sıfır kesinti

Otomasyon mantığı:

  • Metrikler API'si ile yanıt süresi takibi
  • P95 gecikme 500ms üzerindeyse ölçeklendirme
  • Düşük trafikte ölçek küçültme
  • Sürekli yüksek kullanımda uyarı sistemi

Sonuç

Heroku API ile platform fonksiyonlarına tam erişim sağlayarak:

  • Taşıyıcı jeton kimlik doğrulamasını güvenli şekilde yönetin ve döndürün
  • Oran sınırını proaktif izleyin (saatte 10K)
  • Pipeline yönetimi ile sağlam CI/CD akışı kurun
  • Sağlam hata yönetimiyle güvenilir dağıtım sağlayın
  • Apidog, Heroku entegrasyonlarınız için API testini ve ekip işbirliğini kolaylaştırır

SSS Bölümü

Heroku API ne için kullanılır?

Heroku API, uygulamaların, dyno'ların, eklentilerin ve altyapının programlı yönetimini sağlar. Yaygın kullanım durumları: CI/CD otomasyonu, çoklu uygulama yönetimi, otomatik ölçeklendirme, altyapı izleme.

Heroku API anahtarı nasıl alınır?

Heroku CLI'yi kurun, heroku login komutunu çalıştırın, ardından heroku authorizations:create ile bir yetkilendirme oluşturun. Dönen jetonu ortam değişkenlerinde güvenli saklayın.

Heroku API'si ücretsiz mi?

Evet, Heroku API'si ücretsizdir. Kaynaklar (dyno, eklenti) için ödeme yaparsınız. Oran limiti: saatlik 10.000 istek.

Heroku API hangi kimlik doğrulamasını kullanır?

Taşıyıcı jeton kimlik doğrulaması: Her isteğe Authorization: Bearer {api_key} başlığı eklenir. Jetonlar kısa (1 saat) veya uzun (1 yıl) ömürlü olabilir.

Heroku API oran limitleri nasıl ele alınır?

RateLimit-Remaining başlığını izleyin, istek kuyruğu uygulayın. HTTP 429 aldığınızda üstel geri çekilme kullanın. Güvenli çalışmak için dakikada 150 isteğin altında kalın.

Git olmadan dağıtım yapabilir miyim?

Evet. Kaynak blob URL'sinden dağıtım için Derlemeler API'sini kullanın. Kodunuzu bulut depolamaya yükleyip, ilgili URL'yi derleme isteğinde belirtin.

Dağıtımları nasıl otomatikleştiririm?

Pipeline API ile CI/CD kurun. Derleme oluşturun, slug'ları aşamalar boyunca yükseltin, GitHub veya özel CI sistemleri ile entegre edin.

Sürüm ve derleme arasındaki fark nedir?

Derleme: Kaynak koddan slug oluşturur.

Sürüm: Slug + yapılandırma ile dağıtılabilir uygulama sürümü oluşturur.

Başarısız bir dağıtımı nasıl geri alırım?

Sürümleri API ile listeleyin, ardından rollback: <sürüm_kimliği> ile /releases'a POST yapın. Heroku önceki bir sürümden yeni sürüm oluşturur.

Birden fazla Heroku hesabını yönetebilir miyim?

Evet. Her hesap için ayrı API jetonları kullanın, HEROKU_API_KEY ortam değişkeniyle geçiş yapın.

Top comments (0)