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 kılavuz, kimlik doğrulama kurulumunu, temel uç noktaları, CI/CD entegrasyonunu ve üretim dağıtım stratejilerini kapsar.
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 isteğe bağlı değil, zorunludur.
Gerçek şu ki: 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 kaybediyor. Sağlam bir Heroku API entegrasyonu, dağıtımları otomatikleştirir, trafiğe göre dyno'ları ölçeklendirir ve ortamlar arasındaki yapılandırmayı senkronize eder.
Bu kılavuz, Heroku API entegrasyon sürecinin tamamını ele almaktadır. Jeton kimlik doğrulama, uygulama ve dyno yönetimi, derleme işlem hatları, eklenti sağlama ve hata giderme konularını öğreneceksiniz. Sonunda, üretime hazır bir Heroku entegrasyonuna sahip olacaksınız.
Heroku API Nedir?
Heroku, Heroku platformundaki uygulamaları ve altyapıyı yönetmek için RESTful bir Platform API'si sağlar. API şunları yönetir:
- 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 | Yazma işlemleri için güvenli yeniden deneme davranışı |
| Gzip Sıkıştırma | Bant genişliği tasarrufu için yanıt sıkıştırma |
API Mimarisinin Genel Görünümü
Heroku, sürümlü bir REST API yapısı kullanır:
https://api.heroku.com/
API, tutarlı kaynak kalıpları ve ilişkileriyle JSON:API belirtimini 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ğrulaması | Kapsayıcı dağıtımları |
Başlarken: Kimlik Doğrulama Kurulumu
Adım 1: Heroku Hesabınızı Oluşturun
API'ye erişmeden önce bir Heroku hesabına ihtiyacınız var:

- Heroku web sitesini ziyaret edin
- Kaydol'a tıklayın ve bir hesap oluşturun
- E-posta adresinizi doğrulayın
- 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
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
API jetonunuzu alın:
# Mevcut yetkilendirme jetonunuzu görüntüleyin
heroku authorizations:create --short-lived
# Veya uzun ömürlü bir jeton oluşturun (CI/CD için)
heroku authorizations:create --description "CI/CD Pipeline" --expires-in "1 year"
Güvenlik notu: Jetonları asla kodda değil, ortam değişkenlerinde saklayın:
# .env dosyası
HEROKU_API_KEY="api_anahtarınız_buraya"
HEROKU_APP_NAME="uygulama-adınız"
Adım 4: Jeton Kimlik Doğrulamayı Anlayın
Heroku, Taşıyıcı jeton kimlik doğrulaması kullanır:
Authorization: Bearer {api_key}
Accept: application/vnd.heroku+json; version=3
Her API isteği bu başlıkları gerektirir.
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"
Beklenen yanıt:
{
"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"
}
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}`);
Uygulama Yönetimi
Yeni Bir Uygulama Oluşturma
Programlı olarak bir Heroku uygulaması oluşturun:
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}`);
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" }
}
Uygulamalarınızı Listeleme
Hesabınızdaki tüm uygulamaları alın:
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}`);
});
Uygulama Detaylarını Alma
Detaylı uygulama bilgilerini 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}`);
Uygulama Yapılandırmasını Güncelleme
Uygulama ayarlarını değiştirin:
const updateApp = async (appName, updates) => {
const response = await herokuRequest(`/apps/${appName}`, {
method: 'PATCH',
body: JSON.stringify(updates)
});
return response;
};
// Kullanım - uygulama adını değiştir
const updated = await updateApp('eski-uygulama-adı', {
name: 'yeni-uygulama-adı'
});
Bir Uygulamayı Silme
Hesabınızdan bir uygulamayı kaldırın:
const deleteApp = async (appName) => {
await herokuRequest(`/apps/${appName}`, {
method: 'DELETE'
});
console.log(`Uygulama ${appName} başarıyla silindi`);
};
Dyno Yönetimi
Dyno'ları Ölçeklendirme
Uygulamanızı yukarı veya 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 - web dyno'larını 3'e ölçeklendir
const formation = await scaleDyno('uygulamam', 'web', 3);
console.log(`${formation.quantity} ${processType} dyno'suna ölçeklendirildi`);
Dyno Oluşumunu Alma
Mevcut dyno yapılandırmasını görüntüleyin:
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})`);
});
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 uygulama için tüm dyno'ları 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ı`);
};
Tek Seferlik Dyno'ları Çalıştırma
Yalıtılmış dyno'larda komutları yürütün:
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 - veritabanı geçişini çalıştır
const dyno = await runCommand('uygulamam', 'npm run migrate');
console.log(`Dyno başlatıldı: ${dyno.id}`);
Yapılandırma Değişkenleri
Yapılandırma Değişkenlerini Alma
Ortam değişkenlerini alın:
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}`);
Yapılandırma Değişkenlerini Ayarlama
Ortam değişkenlerini 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'
});
Yapılandırma Değişkenleri için En İyi Uygulamalar
- Asla sırları kaydetmeyin - Tüm hassas veriler için ortam değişkenlerini kullanın
- Ortam başına ayrı yapılandırmalar kullanın - Hazırlık ve üretim için farklı değişkenler
- Sırları düzenli olarak döndürün - API anahtarlarını ve şifreleri üç ayda bir güncelleyin
- İlgili değişkenlere ön ek ekleyin -
STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET
Derleme ve Sürüm Yönetimi
Bir Derleme Oluşturma
Kodu API aracılığıyla dağıtın:
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}`);
Derleme Durumunu Alma
Derleme ilerlemesini kontrol 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ı');
};
Sürümleri Listeleme
Sürüm geçmişini görüntüleyin:
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}`);
});
Önceki Sürüme Geri Dönme
Önceki bir sürüme geri dönün:
const rollback = async (appName, releaseId) => {
const response = await herokuRequest(`/apps/${appName}/releases`, {
method: 'POST',
body: JSON.stringify({
rollback: releaseId
})
});
return response;
};
// Kullanım - 42. sürüme geri dön
const rollbackRelease = await rollback('uygulamam', 42);
console.log(`v${rollbackRelease.version} sürümüne geri dönüldü`);
İşlem Hattı Yönetimi
Bir İşlem Hattı Oluşturma
CI/CD işlem hatları kurun:
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}`);
Uygulamaları İşlem Hattına Ekleme
Uygulamaları işlem hattı aşamalarına bağlayın:
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');
Slug'ı Bir Sonraki Aşamaya Yükseltme
Kodu işlem hattı boyunca 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`);
};
Eklenti Yönetimi
Eklentileri Sağlama
Heroku eklentilerini kurun:
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 - PostgreSQL sağla
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}`);
Popüler Eklentiler
| Eklenti | Plan | Başlangıç Fiyatı | Kullanım Durumu |
|---|---|---|---|
| heroku-postgresql | mini | 5$/ay | Üretim veritabanı |
| heroku-redis | mini | 5$/ay | Önbellekleme, oturumlar |
| 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 görüntüleyin:
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}`);
});
Eklentileri Kaldırma
Eklentileri kaldırın:
const removeAddon = async (appName, addonId) => {
await herokuRequest(`/apps/${appName}/addons/${addonId}`, {
method: 'DELETE'
});
console.log(`Eklenti ${addonId}, ${appName} uygulamasından kaldırıldı`);
};
Alan Adı ve SSL Yönetimi
Özel Alan Adları Ekleme
Özel alan adlarını yapılandırın:
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}`);
SSL Sertifikalarını Yapılandırma
Özel alan adlarına 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;
};
ACM ile Otomatik SSL
Otomatik Sertifika Yönetimini 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;
};
Oran Sınırlandırma ve Kotalar
Oran Sınırlandırmalarını Anlama
Heroku, API kararlılığını korumak için oran sınırları uygular:
- Standart Limit: Hesap başına saatte 10.000 istek
- Pencere: 60 dakikalık kayan pencere
- Sıfırlama: Pencere geçtikten sonra otomatik olarak
Limitlerin aşılması HTTP 429 (Çok Fazla İstek) yanıtlarıyla sonuçlanır.
Oran Sınırlandırma İşlemeyi Uygulama
Yeniden denemeler için üstel geri çekilme kullanın:
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;
}
}
}
};
Oran Sınırlandırma Başlıkları
Heroku, her yanıta şu başlıkları ekler:
| Başlık | Açıklama |
|---|---|
RateLimit-Limit |
Saatte maksimum istek sayısı |
RateLimit-Remaining |
Pencerede kalan istek sayısı |
RateLimit-Reset |
Pencerenin sıfırlandığı Unix zaman damgası |
Yaygın Sorun Giderme
Sorun: Kimlik Doğrulama 401 Hatasıyla Başarısız Oluyor
Belirtiler: "Geçersiz kimlik bilgileri" hataları alınıyor.
Çözümler:
- API anahtarının doğru olduğunu doğrulayın:
heroku authorizations - Jetonun süresinin dolmadığından emin olun (uzun ömürlü jetonlar 1 yıl sürer)
- Ortam değişkenindeki fazladan boşlukları kontrol edin
- Gerekirse jetonu yeniden oluşturun:
heroku authorizations:create
Sorun: Uygulama Adı Zaten Alınmış
Belirtiler: "ad zaten alınmış" hatası alınıyor.
Çözümler:
- Küresel olarak benzersiz adlar kullanın - ekip veya rastgele son ek ekleyin
- UUID tabanlı adlar oluşturun:
app-${Date.now()} - Ad alanı ön ekleri kullanın:
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}`;
};
Sorun: Dyno Oluşumu Başarısız Oluyor
Belirtiler: Ölçeklendirme işlemleri hata döndürüyor.
Çözümler:
- Procfile'da işlem tipinin mevcut olduğunu doğrulayın
- Hesabın kullanılabilir dyno kotası olduğunu kontrol edin
- Uygulamanın askıya alınmadığından emin olun
- Dyno saat kullanımını gözden geçirin:
heroku ps --app=uygulamam
Sorun: Derleme Zaman Aşımıyla Başarısız Oluyor
Belirtiler: Derlemeler 30 dakika sonra takılıyor veya zaman aşımına uğruyor.
Çözümler:
- Diliniz için buildpack seçimini optimize edin
- Bağımlılıkları düzgün bir şekilde önbelleğe alın
- Büyük derlemeleri daha küçük dağıtımlara bölün
- Daha hızlı dağıtım için önceden oluşturulmuş slug'lar kullanın
Sorun: Oran Sınırı Aşıldı
Belirtiler: HTTP 429 yanıtları alınıyor.
Çözümler:
- İstek kuyruğu uygulayın
- Yeniden denemeler için üstel geri çekilme kullanın
- Mümkünse istekleri toplu olarak yapın
- Oran sınırı başlıklarını proaktif olarak 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;
}
}
Üretim Dağıtım Kontrol Listesi
Canlıya geçmeden önce:
- [ ] 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
- [ ] Kapsamlı hata işlemeyi ekleyin
- [ ] Tüm API çağrıları için günlük kaydını ayarlayın
- [ ] Dyno saat kullanımını izleyin
- [ ] Harici günlük kaydı için günlük boşaltmaları yapılandırın
- [ ] CI/CD için işlem hattı yükseltmelerini ayarlayın
- [ ] Otomatik Sertifika Yönetimini etkinleştirin
- [ ] Veritabanları için yedekleme stratejisi yapılandırın
İzleme ve Uyarı
Bu metrikleri takip edin:
const metrics = {
apiCalls: {
total: 0,
successful: 0,
failed: 0,
rateLimited: 0
},
dynoHours: {
used: 0,
quota: 1000
},
deployments: {
successful: 0,
failed: 0,
avg_duration: 0
}
};
// Yüksek hata oranında uyarı
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');
}
Gerçek Dünya Kullanım Durumları
Otomatik CI/CD İşlem Hattı
Bir SaaS ekibi GitHub'dan dağıtımları otomatikleştiriyor:
- Zorluk: Manuel dağıtımlar hatalara ve gecikmelere neden oluyordu
- Çözüm: GitHub Actions + Heroku API entegrasyonu
- Sonuç: Sıfır kesinti süreli dağıtımlar, %90 daha hızlı sürümler
Uygulama akışı:
- GitHub push'u iş akışını tetikler
- Testler CI'de çalışır
- Heroku API, kaynak blob'dan derleme oluşturur
- Hazırlık ortamından üretime yükseltme
- Başarı/başarısızlık durumunda ekibe bildirim
Çoklu Ortam Yönetimi
Bir danışmanlık firması 50'den fazla müşteri uygulamasını yönetiyor:
- Zorluk: Ortamlar arasında manuel yapılandırma senkronizasyonu
- Çözüm: Heroku API ile merkezi yapılandırma yönetimi
- Sonuç: Tutarlı yapılandırmalar, haftada 8 saat tasarruf
Temel entegrasyon noktaları:
- Geliştirme/hazırlık/üretim ortamları arasında yapılandırma değişkenlerini senkronize etme
- Otomatik eklenti sağlama
- Müşteri alımı için toplu işlemler
Trafiğe Dayalı Otomatik Ölçeklendirme
Bir e-ticaret platformu trafik artışlarını yönetiyor:
- Zorluk: Satış etkinlikleri sırasında manuel ölçeklendirme
- Çözüm: Heroku API ile yük tabanlı otomatik ölçeklendirme
- Sonuç: 10 kat trafik artışlarında sıfır kesinti süresi
Otomatik ölçeklendirme mantığı:
- Metrikler API'si aracılığıyla yanıt sürelerini izleme
- P95 gecikme süresi 500ms'den büyük olduğunda ölçeklendirme
- Düşük trafik dönemlerinde ölçeklendirme
- Sürekli yüksek kullanımda uyarı verme
Sonuç
Heroku API, platform işlevselliğine kapsamlı erişim sağlar. Temel çıkarımlar:
- Taşıyıcı jeton kimlik doğrulaması güvenli depolama ve döndürme gerektirir
- Oran sınırlama (saatte 10K) proaktif izleme gerektirir
- İşlem hattı yönetimi sağlam CI/CD iş akışları sağlar
- Doğru hata işleme dağıtım güvenilirliğini sağlar
- Apidog, Heroku entegrasyonları 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ı arasında CI/CD otomasyonu, çoklu uygulama yönetim araçları, otomatik ölçeklendirme sistemleri ve altyapı izleme panoları bulunur.
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öndürülen jetonu ortam değişkenlerinde güvenli bir şekilde saklayın.
Heroku API'si ücretsiz mi?
Evet, Heroku API'si ücretsizdir. Ancak, sağladığınız kaynaklar (dyno'lar, eklentiler vb.) için ödeme yaparsınız. API oran limitleri hesap başına saatte 10.000 istektir.
Heroku API hangi kimlik doğrulamasını kullanır?
Heroku, Taşıyıcı jeton kimlik doğrulaması kullanır. Her isteğe Authorization: Bearer {api_key} başlığını ekleyin. Jetonlar kısa ömürlü (1 saat) veya uzun ömürlü (1 yıla kadar) olabilir.
Heroku API oran limitleri nasıl ele alınır?
RateLimit-Remaining başlığını izleyin ve istek kuyruğu uygulayın. HTTP 429 yanıtları aldığınızda üstel geri çekilme kullanın. Güvenli çalışma 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 yapmak için Derlemeler API'sini kullanın. Kodunuzu bulut depolama alanına (S3, GCS) yükleyin ve derleme isteğinizde URL'yi referans alın.
Dağıtımları nasıl otomatikleştiririm?
CI/CD kurmak için İşlem Hattı API'sini kullanın. Derlemeler oluşturun, slug'ları aşamalar boyunca yükseltin ve GitHub veya özel CI sistemleriyle entegre edin.
Sürüm ve derleme arasındaki fark nedir?
Bir derleme, kaynak kodunuzu bir slug'a derler. Bir sürüm, bir slug'ı yapılandırma değişkenleriyle birleştirerek uygulamanızın dağıtılabilir bir sürümünü oluşturur.
Başarısız bir dağıtımı nasıl geri alırım?
Son sürümleri listelemek için Sürümler API'sini kullanın, ardından rollback: <sürüm_kimliği> ile /releases adresine POST yapın. Heroku, önceki sürümde yeni bir sürüm oluşturur.
Birden fazla Heroku hesabını yönetebilir miyim?
Evet. Her hesap için ayrı API jetonları kullanın ve HEROKU_API_KEY ortam değişkenini değiştirerek aralarında geçiş yapın.
