Yedek Tanılaması

1.7k görüntülenme Markdown

Yedek sisteminin ayarını tutan ve sunucunun yedek alabilirliğini ölçen altı uç.

Genel Bakış

Bu altı uç iki soruya bakar. İkisi ayarı tutar: sistem açık mı, neler yedeğin dışında kalsın. Dördü ise ölçer: sunucu yedek alabilir mi, disk yeter mi, hangi dizin ve tablo ne kadar yer kaplıyor.

Ölçen dördü yalnızca okur, hiçbir şeyi değiştirmez. Panelde hariç tutma ekranını besleyen de bunlardır: operatör ağacı gezer, tabloları boyutuna göre görür ve kararını verir.

Tanılama, yedek almadan önce sorulacak asıl sorudur. Yedek gecesinde beliren bir eksiği bugün gösterir; kritik bir eksik yedeği imkânsız kılar, uyarı ise zayıflatır.

Referans

Yedek Ayarlarını Getirme

get/api/v1/admin/settings/backup/settings
Settings/GetBackupSettings admin

Yedek sisteminin genel anahtarını ve hariç tutulanları döndürür.

Dönen alanlar data — 3
statusintYedek sisteminin açık olup olmadığı.
excluded_pathsstringYedeğe girmeyecek yollar. Dizi değil, tek bir metin.
excluded_tablesstringYedeğe girmeyecek tablolar. Dizi değil, tek bir metin.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/settings' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/backup/settings', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/backup/settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Genel anahtar KAPALIYKEN zamanlamalar durur ve elle yedek alma reddedilir.
$live = Api::Settings()->GetBackupSettings()['data']['status'] === 1;

Yedek Ayarlarını Yazma

put/api/v1/admin/settings/backup/settings
Settings/UpdateBackupSettings admin

Genel anahtarı açar ve hariç tutulan yol ile tabloları yazar.

Gövde 3
statusintYedek sistemini açar ya da kapatır.
excluded_pathsstringYedeğe girmeyecek yollar. Gönderdiğiniz metin eskisinin yerine geçer.
excluded_tablesstringYedeğe girmeyecek tablolar. Gönderdiğiniz metin eskisinin yerine geçer.
Dönen alanlar data — 3
dataobjectYazma sonrası güncel ayarlar. Getirme ucuyla aynı şekildedir.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PUT 'https://panel.ornek.com/api/v1/admin/settings/backup/settings' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":1,"excluded_tables":"api_logs,mail_logs"}'
const res = await fetch('https://panel.ornek.com/api/v1/admin/settings/backup/settings', {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    status: 1,
    excluded_tables: 'api_logs,mail_logs',
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/backup/settings');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'status'          => 1,
        'excluded_tables' => 'api_logs,mail_logs',
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Liste EKLENMEZ, degistirilir: eskisini okuyup uzerine yazin yoksa oncekiler duser.
$cur = Api::Settings()->GetBackupSettings()['data']['excluded_tables'];

Api::Settings()->UpdateBackupSettings([
    'excluded_tables' => $cur . ',mail_logs',
]);

Tanılamayı Okuma

get/api/v1/admin/settings/backup/diagnostics
Settings/GetBackupDiagnostics admin

Sunucunun yedek alacak donanıma sahip olup olmadığını söyler.

Dönen alanlar data — 4
criticalstring[]Yedeği imkânsız kılan eksikler: phar arşivleme, zlib sıkıştırma, spl dizin gezinme.
warningstring[]Yedeği zayıflatan eksikler: disk-monitor yer ölçümü, exec alt süreç, streaming-pipe akış borusu.
infostring[]Yalnız bilgi olan eksikler: mysqldump-cli dış döküm aracı.
okboolHer şey yolunda mı. Kritik ve uyarı listeleri boşken doğrudur; bilgi satırları saymaz.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/diagnostics' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/backup/diagnostics', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/backup/diagnostics');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Kritik liste doluysa yedek HIC alinamaz; uyari listesi yalnizca zayiflatir.
$d = Api::Settings()->GetBackupDiagnostics()['data'];
if ($d['critical']) throw new Exception('Backups cannot run on this server.');

Disk Bilgisini Okuma

get/api/v1/admin/settings/backup/disk
Settings/GetBackupDisk admin

Kurulumun bulunduğu diskte ne kadar yer kaldığını döndürür.

Dönen alanlar data — 4
freeintBoş alan.
totalintToplam alan.
usedintKullanılan alan.
sourcestringÖlçümün nereden geldiği. Doğrudan sistem çağrısı ya da kabuktan okunan disk aracı.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/disk' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/backup/disk', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const { data } = await res.json();

if (data.total === undefined) console.warn('disk measurement unavailable');
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/backup/disk');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Sunucu olcume izin vermiyorsa alanlar HIC gelmez; okumadan once varligini sinayin.
$disk = Api::Settings()->GetBackupDisk()['data'];
$free = $disk['free'] ?? null;

Dizin Ağacını Gezme

get/api/v1/admin/settings/backup/directory-listing
Settings/GetBackupDirectoryListing admin

Kurulum kökü altındaki dosya ve dizinleri döndürür.

Sorgu 1
pathstringKöke göreli alt yol. Boş bırakılırsa kök gelir.
Dönen alanlar data — 2 + entries[] — 6
pathstringİstenen yol.
entries[]object[]O dizindeki kayıtlar. Dizinler önce, sonra dosyalar; her grup ada göre sıralı.
entries[].namestringKaydın adı.
entries[].pathstringKöke göreli yolu.
entries[].typestringDizin mi dosya mı.
entries[].sizeint | nullDosyanın boyutu. Dizinlerde boştur.
entries[].has_childrenboolİçinde bir şey var mı.
entries[].has_subdirsboolİçinde başka dizin var mı. Ağacı açmadan genişletilebilir olduğunu anlamak için.
Hatalar 2
invalid_path422Yol geçersiz ya da dizin değil.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/directory-listing?path=templates' \
  -H "Authorization: Bearer $API_KEY"
const url = new URL('https://panel.ornek.com/api/v1/admin/settings/backup/directory-listing');
url.searchParams.set('path', 'templates');

const res  = await fetch(url, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/backup/directory-listing?' . http_build_query(['path' => 'templates']));
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Agac kokun DISINA cikamaz; yukari tirmanan yol 422 ile geri cevrilir.
$tree = Api::Settings()->GetBackupDirectoryListing([], ['path' => 'templates'])['data'];

Tabloları Ölçme

get/api/v1/admin/settings/backup/tables
Settings/GetBackupTables admin

Veritabanı tablolarını satır sayısı ve boyutuyla döndürür.

Dönen alanlar data[] — 3
namestringTablonun adı. Liste ada göre sıralı gelir.
rowsintSatır sayısı. Motorun verdiği tahmindir, sayım değil.
sizeintTablonun kapladığı yer. Veri ile dizinin toplamını verir.
Hatalar 1
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/tables' \
  -H "Authorization: Bearer $API_KEY"
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/backup/tables', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/settings/backup/tables');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// En sisman tablolari haric tutma ekranina beslemek icin: boyut arsiv boyutu DEGILDIR.
$tables = Api::Settings()->GetBackupTables()['data'];
usort($tables, fn ($a, $b) => $b['size'] <=> $a['size']);

Tuzaklar

Genel anahtar her şeyin önündedir

Yedek sistemi kapalıyken zamanlamalar çalışmaz ve elle yedek alma çağrısı reddedilir. Zamanlamalar listede durur, hedefler yerinde kalır, hiçbiri hata vermez. Bir kurulumda hiç yedek oluşmuyorsa önce bu alana bakın; zamanlamayı aramak zaman kaybı olur.

Hariç tutulan listeler eklenmez, değiştirilir

Yol ve tablo listeleri birer metin ve gönderdiğiniz değer eskisinin yerine geçer. Tek bir tablo eklemek isterken yalnız onu göndermek, önceki tüm satırları düşürür. Önce mevcut değeri okuyup üzerine ekleyin.

Disk bilgisi hiç gelmeyebilir

Sunucu yer ölçümüne izin vermiyorsa bu uç boş bir nesne döndürür; hata da vermez. Alanları okumadan önce varlığını sınayın, yoksa boş alanı sıfır sanıp diskin dolduğunu gösteren bir uyarı basarsınız. Aynı eksik tanılamada uyarı listesinde de görünür.

Dizin ağacı her şeyi göstermez

Ağaçtan öntanımlı olarak hariç tutulanlar elenir, yani listede hiç görünmezler. Yedek klasörünün kendisi de bunlardandır ve operatör onu yeniden adlandırsa bile elenmeye devam eder. Bu bilinçli bir seçim: yedeklerin kendisi yedeğe girseydi her koşu bir öncekini de taşırdı.

Satır sayısı tahmin, boyut arşiv değil

Tablo satır sayısı motorun tahminidir; gerçek sayıdan yüzde onlarca sapabilir ve fatura ya da rapor hesabına girmemelidir. Boyut da veriyle dizinin toplamıdır: sıkıştırılmış bir dökümün boyutu bundan çok daha küçük kalır. İkisi de neyin hariç tutulacağına karar vermeye yeter, kesin ölçüme değil.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.