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.
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/
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 web sitesini açın
- 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 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"
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"
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
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 ö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"
}
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
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}`);
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ı 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}`);
});
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}`);
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ı'
});
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`);
};
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`);
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})`);
});
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ı`);
};
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}`);
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}`);
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'
});
Yapılandırma Değişkenleri için En İyi Uygulamalar
- Asla sırları kaydetmeyin: Tüm hassas verileri ortam değişkenlerinde saklayın.
- Ortam başına ayrı yapılandırmalar kullanın: Hazırlık ve üretim ortamları için farklı değişkenler tanımlayın.
- Sırları düzenli olarak döndürün: API anahtarlarını ve şifreleri periyodik olarak değiştirin.
-
İ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}`);
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ı');
};
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}`);
});
Ö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ü`);
İş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}`);
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');
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`);
};
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}`);
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}`);
});
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ı`);
};
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}`);
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;
};
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;
};
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;
}
}
}
};
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:
- API anahtarının doğru olduğunu kontrol edin:
heroku authorizations - Jetonun süresinin dolmadığından emin olun
- Ortam değişkenindeki fazlalık boşlukları kontrol edin
- Gerekirse jetonu yeniden oluşturun:
heroku authorizations:create
Sorun: Uygulama Adı Zaten Alınmış
Belirtiler: "ad zaten alınmış" hatası.
Çözümler:
- Benzersiz adlar kullanın (ekip/rastgele son ek ekleyin)
- UUID tabanlı adlar:
app-${Date.now()} - 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}`;
};
Sorun: Dyno Oluşumu Başarısız
Belirtiler: Ölçeklendirme işlemi hata döndürüyor.
Çözümler:
- Procfile'da işlem tipini doğrulayın
- Dyno kotanızın yeterli olduğundan emin olun
- Uygulamanın askıya alınmadığını kontrol edin
- 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:
- Buildpack seçimini optimize edin
- Bağımlılıkları önbelleğe alın
- Büyük derlemeleri küçük parçalara bölün
- Önceden oluşturulmuş slug'lar kullanın
Sorun: Oran Sınırı Aşıldı
Belirtiler: HTTP 429 yanıtı.
Çözümler:
- İstek kuyruğu uygulayın
- Üstel geri çekilme ile yeniden deneyin
- İstekleri toplu olarak yapın
- 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;
}
}
Ü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');
}
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ışı:
- GitHub push'u iş akışını tetikler
- Testler CI'de çalışır
- Heroku API, kaynak blob'dan derleme oluşturur
- Hazırlıktan üretime yükseltme yapılır
- 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)