API & AI ajanları
GitLiman'ın tamamı bir API token'ıyla otomatikleştirilebilir. Masaüstündeki bir AI ajanı (Cursor, Claude Code, kendi script'in) tek token'la uygulama kurar, dosya gönderir, komut çalıştırır, veritabanı oluşturur — sunucuya hiç girmeden.
Kimlik doğrulama
Konsol → Ayarlar → API Token ile bir glp_ token oluştur. Her istekte başlık olarak gönder:
Authorization: Bearer glp_...
Temel adres: https://gitliman.com/api/v1. Token-gerektirmeyen GET /api/v1 ucu, tüm uçları
listeleyen bir kendini-tanımlama (self-doc) JSON'u döner — AI ajanları önce onu okuyabilir.
Uçlar
| Metot & yol | Ne yapar |
|---|---|
GET /me |
Token sahibi hesap bilgisi |
GET /deployments |
Uygulamalarını listeler |
GET /deployments/{id} |
Tek uygulama detayı |
POST /deploy |
Yeni uygulama dağıt (git/imaj/marketplace) |
POST /deployments/{id}/redeploy |
Yeniden dağıt (hard:true → sıfırdan) |
POST /deployments/{id}/stop · /start |
Durdur / başlat |
PATCH /deployments/{id}/env |
Ortam değişkenlerini ayarla |
PATCH /deployments/{id}/repo |
Kaynağı değiştir (git repo ya da imaj etiketi) |
POST /deployments/{id}/exec |
Konteynerde komut çalıştır (senkron ya da async:true) |
POST /deployments/{id}/files |
Masaüstü klasörünü gönder (tar.gz → hedef klasör) |
GET /deployments/{id}/commands/{cid} |
Async komut durumu/çıktısı |
GET /deployments/{id}/sites |
LAMP kutusundaki siteleri listeler (çoklu alan adı) |
POST /deployments/{id}/sites |
Yeni site (vhost) açar |
PATCH /deployments/{id}/sites/{klasör} |
Sitenin PHP sürümünü değiştirir (7.4–8.4) |
GET /deployments/{id}/sites/{klasör}/logs |
Site erişim/hata logları (son N satır) |
DELETE /deployments/{id}/sites/{klasör} |
Siteyi kaldırır (varsayılan: dosyalar KALIR) |
GET/POST /deployments/{id}/databases |
Kutu içi veritabanları (LAMP) — her biri kendi kullanıcısıyla |
GET/DELETE /deployments/{id}/databases/{ad} |
Bağlantı bilgisi / silme |
POST /deployments/{id}/databases/{ad}/import |
SQL dökümü aktar (.sql / .sql.gz) |
GET/POST /deployments/{id}/domains |
Alan adlarını listele / bağla |
POST /deployments/{id}/domains/{ad}/verify |
Doğrula (SSL etkinleşince yayına girer) |
DELETE /deployments/{id}/domains/{ad} |
Alan adını kaldır |
GET /databases · GET /databases/{id} |
Yönetilen veritabanları + bağlantı bilgisi |
POST /databases |
Yeni yönetilen veritabanı oluştur |
POST /deployments/{id}/attach-database |
Uygulamaya veritabanı bağla |
Örnek: bir Laravel projesini masaüstünden yayına al
TOKEN="glp_..."
API="https://gitliman.com/api/v1"
# 1) Uygulamayı bul (ya da POST /deploy ile oluştur)
curl -s $API/deployments -H "Authorization: Bearer $TOKEN"
# 2) Masaüstü klasörünü gönder (tar.gz olarak) → /var/www/html/uygulama
tar czf proje.tar.gz -C ./proje .
curl -s -X POST $API/deployments/12/files \
-H "Authorization: Bearer $TOKEN" \
-F "[email protected]" -F "path=uygulama"
# 3) Bağımlılık + göç (uzun sürer → async)
curl -s -X POST $API/deployments/12/exec \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"cmd":"cd /var/www/html/uygulama && composer install && php artisan migrate --force","async":true}'
# → {"command_id": 5, "poll": ".../commands/5"}
# 4) Durumu yokla
curl -s $API/deployments/12/commands/5 -H "Authorization: Bearer $TOKEN"
Senkron vs async komut
Kısa komutlar (ls, php -v) senkron çalışır ve çıktıyı hemen döner. Uzun komutlar
(composer install, npm run build, migrate, paket kurulumu) async:true ile
kuyruğa alınmalıdır — aksi halde istek ~60 sn'de zaman aşımına uğrar. Async çağrı anında
command_id döner; GET /deployments/{id}/commands/{cid} ile durumu (queued/running/
completed/failed) ve çıktıyı yoklarsın.
LAMP kutusunda çoklu site yönetimi
LAMP/LEMP paketi tek kutuda birçok siteyi barındırır (cPanel'in "addon domain"i). Panelden yapılan işin tamamı API'den de yapılabilir — 20 siteyi tek tek elle eklemek yerine bir betik ya da AI ajanı kurabilir. Site açmak yalnız kutunun içindeki sanal sunucu tanımını (vhost) üretir; alan adını GitLiman konsolundan bağlamayı (CNAME) ayrıca yapman gerekir, SSL sonra otomatik gelir.
# Siteleri listele
curl -s $API/deployments/12/sites -H "Authorization: Bearer $TOKEN"
# → {"sites":[{"domain":"a.com","folder":"a","aliases":"www.a.com","exists":true,"size":93}]}
# Yeni site aç (klasör verilmezse alan adının ilk parçasından türetilir, www alias'ı varsayılan AÇIK)
curl -s -X POST $API/deployments/12/sites \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"domain":"yilmazemlak.com","folder":"yilmazemlak"}'
# → 201 {"ok":true,"site":{"folder":"yilmazemlak","docroot":"/var/www/html/sites/yilmazemlak"}}
# → 409 aynı klasörle site zaten var · 422 geçersiz alan adı / Apache ayarı reddetti
# Site dosyalarını gönder (docroot: /var/www/html/sites/<klasör>)
tar czf site.tar.gz -C ./musteri-sitesi .
curl -s -X POST $API/deployments/12/files \
-H "Authorization: Bearer $TOKEN" -F "[email protected]" -F "path=sites/yilmazemlak"
# Sitenin PHP sürümünü değiştir (7.4 · 8.0 · 8.1 · 8.2 · 8.3 · 8.4)
curl -s -X PATCH $API/deployments/12/sites/yilmazemlak \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"php":"7.4"}'
# Siteye özel veritabanı + KENDİ kullanıcısı (site kodunda root KULLANMA)
curl -s -X POST $API/deployments/12/databases \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"name":"yilmazemlak_db"}'
# → 201 {"ok":true,"database":{"name":"...","user":"...","password":"...","host":"localhost"}}
# Site logları ("dün neden 500 verdi")
curl -s "$API/deployments/12/sites/yilmazemlak/logs?type=error&lines=100" -H "Authorization: Bearer $TOKEN"
# Siteyi kaldır — VARSAYILAN OLARAK DOSYALAR KALIR (yalnız tanım silinir, geri alınabilir)
curl -s -X DELETE $API/deployments/12/sites/yilmazemlak -H "Authorization: Bearer $TOKEN"
# Dosyaları da silmek GERİ ALINAMAZ, bilerek istenmeli:
curl -s -X DELETE $API/deployments/12/sites/yilmazemlak \
-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"purge":true}'
Site tanımı bozuk bir Apache ayarı üretirse otomatik geri alınır — hatalı bir istek kutudaki diğer siteleri düşürmez. Bu uçlar yalnız LAMP/LEMP paketinde çalışır; başka bir imajda "bu uygulama site yönetimini desteklemiyor" (422) döner.
20 siteyi tek betikle taşımak
Her site için dört çağrı yeter — site, dosyalar, veritabanı, alan adı:
for s in yilmazemlak akdenizotel bircanburak; do
# 1) site (PHP sürümünü siteye göre seçebilirsin)
curl -s -X POST $API/deployments/12/sites -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "{\"domain\":\"$s.com\",\"folder\":\"$s\",\"php\":\"8.1\"}"
# 2) dosyalar (arşivi klasörün İÇİNDEN paketle; ≥95 MB ise /files-presign yolunu kullan)
tar czf $s.tar.gz -C ./siteler/$s .
curl -s -X POST $API/deployments/12/files -H "Authorization: Bearer $TOKEN" -F "file=@$s.tar.gz" -F "path=sites/$s"
# 3) veritabanı + kendi kullanıcısı, ardından dökümü aktar
curl -s -X POST $API/deployments/12/databases -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "{\"name\":\"${s}_db\"}"
curl -s -X POST $API/deployments/12/databases/${s}_db/import -H "Authorization: Bearer $TOKEN" -F "sql=@./dumps/$s.sql.gz"
# 4) alan adı (CNAME/TXT yayılınca verify)
curl -s -X POST $API/deployments/12/domains -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d "{\"domain\":\"$s.com\"}"
done
Veritabanı bilgisini site config'ine yazmak için GET /databases/{ad} yanıtındaki kullanıcı/parolayı
kullan (root DEĞİL). WordPress'te bunu tek komutla da yaptırabilirsin:
curl -s -X POST $API/deployments/12/exec -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" -d '{"cmd":"cd /var/www/html/sites/yilmazemlak && wp config set DB_NAME yilmazemlak_db --allow-root"}'
Yüklenen dosyaların sahipliği siteye otomatik devredilir — WordPress eklenti/tema güncellemesi ve medya yüklemesi çalışır durumda kalır.
Not — iki farklı "veritabanı" var, karıştırma:
/api/v1/databases = konsoldan açtığın yönetilen veritabanları (ayrı sunucu/cluster).
/api/v1/deployments/{id}/databases = LAMP kutusunun içindeki gömülü MySQL şemaları.
İkincisinde her şema kendi kullanıcısıyla doğar: bir sitenin wp-config.php'si sızsa bile
diğer sitelerin verisi kapalı kalır — bu yüzden site kodunda root kullanma.
Veritabanı bilgisini AI'a verme
GET /api/v1/databases/{id} bağlantı bilgisini (host/port/kullanıcı/şifre/URL) döner. AI
ajanı bunu okuyup uygulamanın config dosyasına (.env, wp-config.php) yazabilir ya da
PATCH /env ile ortam değişkeni olarak enjekte edebilir.
Kalıcı yükleme klasörleri
Git dağıtımlarında yükleme klasörleri otomatik kalıcı diske (/data) bağlanır (Laravel
storage/app/public, Django media, Rails storage, uploads/public/uploads) —
redeploy ve hard-redeploy'da kaybolmaz. Ek klasör kalıcılaştırmak için ortam değişkeni:
GL_PERSIST_PATHS=uploads,public/media (virgülle ayrılmış göreli yollar).
Yükleme klasörünü git'e commit ETMEYİN. Upload'lar zaten kalıcı + yedeklidir; git'e
yalnızca kod ve sabit tasarım asset'leri (ör. public/images, public/css) girer.
İpucu: Repoya yeni dosya eklerken
git addyapmayı unutmayın —git commit -amyalnızca izlenen (tracked) dosyaların değişikliğini alır, yeni dosyaları atlar. Canlıda eksik görsel/asset'in en sık nedeni budur.
Sürekli yedek (sunucu kaybına karşı) — otomatik, her pakete dahil
Sunucu değişse bile veri kaybolmaz:
- Yüklemeler artımlı olarak sürekli yedeklenir; yeni bir sunucuda boş diskle açılınca otomatik geri yüklenir.
- Yönetilen MySQL sürekli binlog + periyodik tam yedek (base) alır → sunucu kaybında point-in-time recovery ile ~saniye/dakika kayıpla geri gelir.
Yani 1× (tek instance) planda bile sunucu kaybında upload'lar ve veritabanı geri gelir. 3× (HA) planlarda ise veri zaten instance'lar arasında replike edilir — anında devir, kayıp yok. Yedekler bizim tarafımızda tutulur (uygulama container'ında depolama sırrı bulunmaz).