# Yedek Tanılaması

https://dev.wisecp.com/tr/yedek-tanilamasi

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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/settings' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/backup/settings', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
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"}'
```

```javascript
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();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/diagnostics' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/backup/diagnostics', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/disk' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
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');
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/directory-listing?path=templates' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
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();
```

```php
$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);
```

```php
// 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 JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/settings/backup/tables' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch('https://panel.ornek.com/api/v1/admin/settings/backup/tables', {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$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);
```

```php
// 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.

## İlgili Makaleler

- [Yedek Zamanlamaları](https://dev.wisecp.com/tr/yedek-zamanlamalari)
- [Yedek Depolama](https://dev.wisecp.com/tr/yedek-depolama)
- [Zamanlanmış Görev Ekleme](https://dev.wisecp.com/tr/zamanlanmis-gorev-ekleme)
