VEEAM // Boyutlar Arası Yedekleme Yolculuğu :root{ --green:#00ff88;--green-dim:#00b35f;--cyan:#4fe3ff;--violet:#8b7bff;--amber:#ffc46b;--red:#ff5d6c; --ink:#e8f4ee;--muted:#6f8a7d;--mono:'Consolas','SF Mono',monospace; } *{margin:0;padding:0;box-sizing:border-box} html,body{height:100%;overflow:hidden;background:#02050a;color:var(--ink);font-family:'Segoe UI',system-ui,sans-serif} canvas#space{position:fixed;inset:0;z-index:0} button{font-family:var(--mono)} /* ---- dimension container ---- */ .dim{position:fixed;inset:0;z-index:2;display:flex;align-items:center;justify-content:center; padding:70px 6vw 90px;overflow-y:auto;opacity:0;visibility:hidden;transform:scale(1.06); transition:opacity .8s ease,transform .8s ease,visibility .8s} .dim.on{opacity:1;visibility:visible;transform:scale(1)} .wrap{max-width:980px;width:100%;margin:auto} .tag{font-family:var(--mono);font-size:11px;letter-spacing:.4em;color:var(--green);margin-bottom:16px} h2{font-size:clamp(26px,4.2vw,48px);font-weight:200;line-height:1.15} h2 b{font-weight:700} .g{color:var(--green)}.c{color:var(--cyan)}.v{color:var(--violet)}.a{color:var(--amber)}.r{color:var(--red)} .lead{margin-top:18px;max-width:640px;font-size:15.5px;line-height:1.8;color:#b9cfc4} .lead b{color:var(--ink)} .story{margin-top:14px;font-family:var(--mono);font-size:12.5px;color:var(--amber); border-left:2px solid var(--amber);padding:8px 14px;background:rgba(255,196,107,.05);max-width:640px;line-height:1.7} /* portal button = warp trigger */ .portal{margin-top:36px;display:inline-flex;align-items:center;gap:14px;padding:15px 34px; background:transparent;border:1px solid var(--green-dim);color:var(--green);border-radius:40px; font-size:13px;letter-spacing:.22em;cursor:pointer;text-transform:uppercase;transition:.3s;position:relative} .portal:hover{background:rgba(0,255,136,.09);box-shadow:0 0 34px rgba(0,255,136,.3);letter-spacing:.28em} .portal::after{content:'⟶';font-size:16px} .portal.locked{opacity:.35;pointer-events:none} .unlock-hint{display:block;margin-top:12px;font-family:var(--mono);font-size:11px;color:var(--muted);letter-spacing:.15em} /* nav */ #dimnav{position:fixed;top:0;left:0;right:0;z-index:40;display:flex;gap:2px;padding:14px 24px; font-family:var(--mono);font-size:10px;letter-spacing:.1em;flex-wrap:wrap} #dimnav span{padding:6px 12px;border:1px solid transparent;border-radius:20px;color:var(--muted); cursor:pointer;transition:.3s;white-space:nowrap} #dimnav span:hover{color:var(--ink)} #dimnav span.on{color:var(--green);border-color:rgba(0,255,136,.4);background:rgba(0,255,136,.06)} #dimnav span.done::before{content:'✓ ';color:var(--green)} /* warp overlay */ #warp{position:fixed;inset:0;z-index:100;pointer-events:none;opacity:0;background:#02050a;transition:opacity .18s} #warp.go{opacity:1} #warptext{position:fixed;inset:0;z-index:101;display:flex;align-items:center;justify-content:center; font-family:var(--mono);font-size:13px;letter-spacing:.5em;color:var(--green);opacity:0;transition:opacity .3s;pointer-events:none} #warptext.go{opacity:1} /* ---------- generic interactive bits ---------- */ .grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px;margin-top:30px} .card{background:rgba(6,18,12,.6);backdrop-filter:blur(8px);border:1px solid rgba(0,255,136,.14); border-radius:12px;padding:20px;transition:.3s;cursor:pointer;position:relative} .card:hover{border-color:var(--green);transform:translateY(-4px)} .card.picked{border-color:var(--cyan);box-shadow:0 0 24px rgba(79,227,255,.25)} .card h4{font-family:var(--mono);font-size:12.5px;letter-spacing:.1em;color:var(--cyan);margin-bottom:8px} .card p{font-size:13px;line-height:1.65;color:#a8bfb3} .card .port{display:inline-block;margin-top:10px;font-family:var(--mono);font-size:10.5px;color:var(--amber); border:1px solid rgba(255,196,107,.35);border-radius:4px;padding:2px 8px} .reveal-box{margin-top:22px;padding:18px 22px;border:1px dashed rgba(79,227,255,.4);border-radius:10px; background:rgba(79,227,255,.05);font-size:13.5px;line-height:1.75;color:#cfeef8;display:none;max-width:720px} .reveal-box.show{display:block;animation:pop .4s ease} .reveal-box b{color:var(--cyan)} @keyframes pop{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:none}} /* VM + snapshot scene */ .vmscene{margin-top:30px;display:flex;gap:26px;align-items:center;flex-wrap:wrap} .vm{width:190px;border:1px solid var(--amber);border-radius:14px;padding:18px;background:rgba(20,14,4,.6); font-family:var(--mono);text-align:center;position:relative} .vm .t{color:var(--amber);font-size:13px;letter-spacing:.1em} .vm .file{margin-top:12px;font-size:11px;color:var(--ink);background:rgba(255,196,107,.1); border-radius:6px;padding:8px;transition:.5s} .vm .st{margin-top:10px;font-size:10px;color:var(--muted);min-height:28px;line-height:1.5} .snapring{position:absolute;inset:-8px;border:2px solid var(--green);border-radius:18px;opacity:0;transform:scale(1.15)} .vm.snapped .snapring{animation:snap .9s ease forwards} @keyframes snap{0%{opacity:0;transform:scale(1.2)}40%{opacity:1}100%{opacity:1;transform:scale(1)}} .steps{flex:1;min-width:260px;font-family:var(--mono);font-size:12px;color:var(--muted)} .steps div{padding:8px 0 8px 24px;position:relative;opacity:.3;transition:.4s} .steps div.lit{opacity:1;color:var(--ink)} .steps div.lit::before{content:'▸';position:absolute;left:0;color:var(--green)} /* CBT block visual */ .disk{display:grid;grid-template-columns:repeat(16,1fr);gap:4px;margin-top:26px;max-width:560px} .blkc{aspect-ratio:1;background:rgba(79,227,255,.12);border-radius:3px;transition:.3s} .blkc.chg{background:var(--cyan);box-shadow:0 0 8px var(--cyan)} .blkc.read{background:var(--green)} .cbt-legend{margin-top:12px;font-family:var(--mono);font-size:11px;color:var(--muted)} .cbt-legend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin:0 6px 0 14px;vertical-align:-1px} /* chain builder */ .chainrow{display:flex;gap:10px;align-items:center;margin-top:28px;flex-wrap:wrap;min-height:86px} .cblk{border:1px solid var(--violet);border-radius:10px;padding:14px 16px;text-align:center; font-family:var(--mono);background:rgba(139,123,255,.07);animation:pop .4s ease} .cblk .t{font-size:14px;color:var(--violet);font-weight:700} .cblk .s{font-size:9.5px;color:var(--muted);margin-top:4px} .cblk.full{border-color:var(--green)}.cblk.full .t{color:var(--green)} .cblk.merging{animation:merge .8s ease forwards} @keyframes merge{to{opacity:0;transform:translateX(-40px) scale(.5)}} .chain-controls{margin-top:20px;display:flex;gap:12px;flex-wrap:wrap} .mini{padding:10px 20px;background:transparent;border:1px solid rgba(139,123,255,.5);color:var(--violet); border-radius:24px;font-size:11.5px;letter-spacing:.12em;cursor:pointer;transition:.3s} .mini:hover{background:rgba(139,123,255,.12)} .mini:disabled{opacity:.3;cursor:default} .mini.gr{border-color:var(--green-dim);color:var(--green)} .mini.gr:hover{background:rgba(0,255,136,.1)} /* SOBR tiers interactive */ .sobr{margin-top:30px;display:flex;flex-direction:column;gap:12px} .tier{display:flex;gap:20px;align-items:center;border:1px solid rgba(139,123,255,.2);border-radius:12px; padding:18px 24px;background:rgba(10,8,24,.5);transition:.4s;position:relative;overflow:hidden} .tier.active{border-color:var(--green);box-shadow:0 0 24px rgba(0,255,136,.15)} .tier h4{font-size:14px;color:var(--violet);font-family:var(--mono);letter-spacing:.1em} .tier p{font-size:12.5px;color:#a8bfb3;margin-top:4px;line-height:1.6} .tier .chip{position:absolute;right:22px;font-family:var(--mono);font-size:10px;color:var(--green); border:1px solid var(--green-dim);padding:4px 10px;border-radius:14px;opacity:0;transition:.4s} .tier.active .chip{opacity:1} .agebar{margin-top:26px;max-width:640px} .agebar input{width:100%;accent-color:var(--green)} .agebar .lbl{display:flex;justify-content:space-between;font-family:var(--mono);font-size:10.5px;color:var(--muted);margin-top:6px} #agecap{font-family:var(--mono);font-size:12px;color:var(--green);margin-top:14px;letter-spacing:.1em} /* ransomware sim */ .attack-scene{margin-top:28px;display:flex;gap:24px;flex-wrap:wrap} .repo-box{flex:1;min-width:250px;border:1px solid var(--line,#1f3242);border-radius:14px;padding:20px; background:rgba(6,10,18,.6);font-family:var(--mono)} .repo-box h4{font-size:12px;letter-spacing:.15em;margin-bottom:14px} .repo-box.normal h4{color:var(--cyan)} .repo-box.hard h4{color:var(--green)} .fchip{display:inline-block;margin:3px;padding:6px 10px;font-size:10.5px;border-radius:5px; background:rgba(79,227,255,.1);color:#bfeefc;transition:.4s} .repo-box.hard .fchip{background:rgba(0,255,136,.1);color:#c8ffe3} .fchip.enc{background:rgba(255,93,108,.2);color:var(--red);text-decoration:line-through} .fchip.shield::before{content:'🛡 '} .attackbtn{margin-top:30px;padding:14px 32px;background:rgba(255,93,108,.08);border:1px solid var(--red); color:var(--red);border-radius:30px;font-size:12px;letter-spacing:.2em;cursor:pointer;transition:.3s} .attackbtn:hover{background:rgba(255,93,108,.18);box-shadow:0 0 28px rgba(255,93,108,.3)} .verdict{margin-top:22px;font-family:var(--mono);font-size:12.5px;line-height:1.8;display:none;max-width:700px} .verdict.show{display:block;animation:pop .4s} .verdict .bad{color:var(--red)} .verdict .good{color:var(--green)} body.quake{animation:quake .5s} @keyframes quake{0%,100%{transform:none}20%{transform:translate(-6px,3px)}40%{transform:translate(5px,-4px)}60%{transform:translate(-4px,-2px)}80%{transform:translate(3px,4px)}} /* restore */ .rst-result{margin-top:24px;padding:20px;border:1px solid var(--green-dim);border-radius:12px; background:rgba(0,255,136,.05);font-size:13.5px;line-height:1.75;display:none;max-width:720px} .rst-result.show{display:block;animation:pop .5s} .rst-result b{color:var(--green)} .rtx{font-family:var(--mono);font-size:11px;color:var(--muted);margin-top:10px} /* final ports */ table{width:100%;margin-top:26px;border-collapse:collapse;font-family:var(--mono);font-size:12px} th{text-align:left;padding:10px 8px;color:var(--green);letter-spacing:.12em;font-size:10.5px;border-bottom:1px solid rgba(0,255,136,.3)} td{padding:9px 8px;border-bottom:1px solid rgba(0,255,136,.08);color:#a8bfb3} td:first-child{color:var(--ink)} td:last-child{color:var(--amber)} .recap{margin-top:26px;display:flex;flex-direction:column;gap:8px;font-family:var(--mono);font-size:12.5px} .recap div{padding:10px 14px;border-left:2px solid var(--green-dim);background:rgba(0,255,136,.04);color:#a8bfb3} .recap b{color:var(--green)} ::-webkit-scrollbar{width:5px}::-webkit-scrollbar-thumb{background:var(--green-dim);border-radius:3px} @media (prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}
BOYUT DEĞİŞTİRİLİYOR
BOYUT 00 // BAŞLANGIÇ

Bir sunucu düşün.
İçinde şirketin tüm faturaları.
Yarın sabah açılmazsa?

Bu yolculukta tek bir dosyayı takip edeceğiz: muhasebe sunucusu SRV-MUHASEBE içindeki fatura_2026.pdf. Onu üretim ortamından alıp, Veeam evreninin bütün boyutlarından geçirip, bir felaketin içinden sağ çıkaracağız. Sonunda yedeklemenin nasıl çalıştığını uçtan uca anlamış olacaksın.

GÖREV: fatura_2026.pdf'yi ölümsüz kıl. ARAÇ: Veeam Backup & Replication. SÜRE: 7 boyut.
BOYUT 01 // ÜRETİM ORTAMI

Her şey bir snapshot ile başlar.

Veeam çalışan bir VM'i asla durdurmaz. Bunun yerine hypervisor'a (vSphere/Hyper-V) "bu VM'in şu anki halinin fotoğrafını çek" der. Ama fotoğraftan önce kritik bir adım var: Application-Aware Processing. VM içine geçici bir runtime process gönderilir, Windows VSS tetiklenir; SQL, Exchange, Active Directory gibi uygulamalar disklerini tutarlı duruma getirir. Böylece yedekten dönen veritabanı "bozuk" değil, tertemiz uyanır.

SRV-MUHASEBE
📄 fatura_2026.pdf
durum: çalışıyor · kullanıcılar aktif
1 · Guest process enjekte edildi (VIX/WMI)
2 · VSS writer'lar donduruldu (freeze)
3 · Hypervisor snapshot alındı (<1 sn)
4 · VSS çözüldü (thaw) — kullanıcılar hiçbir şey fark etmedi
5 · Veeam artık donmuş kopyadan okuyor
Snapshot bir yedek değildir — sadece "değişiklikleri şimdilik başka dosyaya yaz" komutudur. Veeam okumayı bitirir bitirmez snapshot silinir (consolidate). Snapshot'ı günlerce açık bırakmak üretim diskini şişirir; Veeam bu yüzden işi biter bitmez temizler.
// önce snapshot almalısın
BOYUT 02 // BACKUP PROXY

Veri hangi yoldan akacak?
Rotayı sen seç.

Snapshot hazır. Şimdi Backup Proxy devreye girer: üzerindeki Veeam Data Mover servisi veriyi okur, sıkıştırır, tekilleştirir ve repository'ye yollar (veri kanalı: TCP 2500–3300). Ama önce bir karar var — proxy, VM diskine hangi transport moduyla ulaşacak? Birine tıkla:

▸ DIRECT STORAGE ACCESS

Proxy, üretim depolamasına FC/iSCSI/NFS ile doğrudan bağlanır. ESXi hostlarına ve üretim ağına hiç dokunmaz.

EN HIZLI

▸ VIRTUAL APPLIANCE (HOT-ADD)

Sanal proxy, VM'in disklerini SCSI hot-add ile kendine takar ve hypervisor I/O yığınından okur.

HIZLI · SANAL PROXY

▸ NETWORK (NBD/NBDSSL)

Veri, ESXi yönetim arayüzü üzerinden ağdan çekilir. En yavaşı — ama her ortamda çalışır.

EVRENSEL YEDEK PLAN

Peki neden 1 TB'lık disk dakikalar içinde yedeklenir?

Cevap: Changed Block Tracking (CBT). Hypervisor, son yedekten beri hangi blokların değiştiğini harita olarak tutar. Veeam sadece sorar: "dünden beri ne değişti?" — ve yalnızca o blokları okur. Butona bas, farkı gör:

değişmemiş blok değişen blok (CBT işaretledi) Veeam'in okuduğu
// bir transport modu seç ve CBT demosunu çalıştır
BOYUT 03 // YEDEK ZİNCİRİ

fatura_2026.pdf artık bir zincirin içinde yaşıyor.

Proxy'nin gönderdiği veri, repository'de dosyalara yazılır: Pazar günü tam yedek .VBK, hafta içi her gece değişenler .VIB (increment), zincirin haritası ise .VBM metadata dosyası. Restore anında Veeam bu zinciri okuyarak istediğin günü yeniden inşa eder. Kendin dene — birkaç gece yedek al:

▸ FOREVER FORWARD INCREMENTAL

Tek full + sonsuz increment. Saklama dolunca en eski VIB, VBK'ya merge edilir — az yer, az I/O. (Az önce yaptığın buydu.)

▸ REVERSE INCREMENTAL

En güncel nokta daima tam VBK'dır; eski haller .VRB dosyalarına geriye yazılır. En hızlı restore, ama yedek sırasında 3x I/O.

▸ SYNTHETIC FULL

Periyodik yeni full, üretimden değil mevcut zincirden repository üzerinde sentezlenir. Üretim hiç yorulmaz.

// en az 3 gece yedek al ve bir merge yap
BOYUT 04 // SCALE-OUT REPOSITORY

Yedek yaşlandıkça katman değiştirir.
Zamanı sen kaydır.

SOBR, birden çok depolamayı tek mantıksal havuzda birleştirir ve yedeklerin yaşam döngüsünü otomatik yönetir. Aşağıdaki kaydırıcıyla fatura_2026.pdf'nin yedeğini yaşlandır — hangi katmana süzüldüğünü izle:

BUGÜN30 GÜN90 GÜN1 YIL+
// yedek 0 günlük — Performance tier'da, anlık restore'a hazır

◉ PERFORMANCE TIER

Hızlı blok depolama. Günlük operasyonel restore'lar buradan saniyeler içinde döner.

YEDEK BURADA

◎ CAPACITY TIER

S3 uyumlu obje depolama. Move/copy politikasıyla yedekler otomatik buraya taşınır — site dışı kopya (3-2-1'in "1"i) kendiliğinden oluşur.

YEDEK BURADA

◌ ARCHIVE TIER

S3 Glacier / Azure Archive. En eski yedekler donmuş uzayda, en düşük maliyetle yıllarca saklanır.

YEDEK BURADA
İpucu: Capacity tier'da copy modu yedek daha Performance'tayken kopyasını buluta koyar (anında site dışı koruma); move modu ise belirlenen yaştan sonra taşıyıp yerel alanı boşaltır. İkisi birlikte de kullanılabilir.
BOYUT 05 // KARA DELİK

Saat 03:12. Ağa bir ransomware sızdı.
Önce yedekleri arıyor.

Modern saldırıların ilk hedefi üretim değil, yedeklerdir — çünkü yedeği olmayan kurban fidyeyi öder. Aşağıda iki repository var: sıradan bir Windows paylaşımı ve bir Hardened Repository (Linux + XFS immutability: yedekler belirlenen süre boyunca root bile olsa silinemez/değiştirilemez). Saldırıyı başlat, farkı gör:

SIRADAN REPOSITORY (SMB)

fatura.vbkpzt.vibsalı.vibçar.vibharita.vbm

HARDENED REPOSITORY ⛨

fatura.vbkpzt.vibsalı.vibçar.vibharita.vbm
✗ Sıradan repository: tüm yedekler şifrelendi. Kurtarma noktası yok.
✓ Hardened repository: immutability bayrağı yazma/silme isteklerini reddetti. Zincir sapasağlam.

Veeam'in diğer savunma katmanları da devrede: SureBackup yedekleri izole sanal laboratuvarda otomatik açıp doğrular (3-2-1-1-0'daki sıfır hata); v13'teki Threat Hunter yedek verisinde zararlı taraması yapar; inline entropy analizi şifreleme davranışını daha yedek alınırken yakalar; Veeam ONE ise anormal increment büyümesini görüp alarm çalar — şifreli veri sıkışmaz, artımlı yedek aniden şişer, teleskop bunu kaçırmaz.
// önce saldırıyı görmelisin
BOYUT 06 // GERİ DÖNÜŞ

Sabah 08:00. Patron kapıda:
"fatura_2026.pdf nerede?"

Üretim sunucusu şifrelendi ama Hardened Repository'deki zincir sağlam. Şimdi kritik soru: nasıl geri döneceksin? Veeam sana tek yol değil, senaryoya göre seçenek sunar. Birini seç:

▸ INSTANT RECOVERY

VM, yedek dosyasının içinden doğrudan çalıştırılır — Mount Service (TCP 9401) yedeği datastore gibi sunar. Dakikalar içinde ayaktasın; arka planda Storage vMotion ile üretime taşınır.

RTO: DAKİKALAR

▸ FILE-LEVEL RESTORE

Tüm VM'e gerek yok — yedek mount edilir, dosya gezgininden sadece fatura_2026.pdf çekilir. Guest Catalog indeksi sayesinde dosya aramayla saniyede bulunur.

TEK DOSYA

▸ FULL VM RESTORE

VM komple, istenen restore point'ten yeniden inşa edilir. En temiz dönüş — biraz daha uzun sürer, saldırı sonrası genelde antivirüs taramalı Secure Restore ile yapılır.

TAM YENİDEN İNŞA
// bir restore yöntemi seç
BOYUT 07 // KOMUTA MERKEZİ

Yolculuk tamam. İşte evrenin tam haritası.

fatura_2026.pdf kurtarıldı. Şimdi büyük resmi bağlayalım — tüm bu boyutları kim izler, kim yönetir?

▸ ENTERPRISE MANAGER

Birden çok VBR sunucusunu tek web konsolundan yönetir (TCP 9443). Federe katalog aramasıyla tüm sitelerdeki dosyalar tek sorguda bulunur; self-service portal ile kullanıcılar kendi dosyalarını kendileri kurtarır — gece 3'te kimse aranmaz.

▸ VEEAM ONE

İzleme ve raporlama teleskopu: SLA raporları, kapasite planlama, koruma boşluğu analizi ve az önce gördüğün ransomware anomali alarmları.

▸ v13 ÇAĞI

Güncel sürüm v13: Linux tabanlı sertleştirilmiş Software Appliance, tarayıcıdan Web UI, gRPC iletişimi, BLAKE3 hashing, Kerberos önceliği, Threat Hunter ve Veeam Intelligence AI asistanı.

BOYUT 01 — App-aware VSS + snapshot: tutarlı, kesintisiz fotoğraf
BOYUT 02 — Proxy + transport modu + CBT: sadece değişen bloklar akar
BOYUT 03 — VBK/VIB/VBM zinciri: her gece yeni bir zaman noktası
BOYUT 04 — SOBR: yaşlanan yedek Performance → Capacity → Archive'a süzülür
BOYUT 05 — Hardened repo + SureBackup + Threat Hunter: kara deliğe geçit yok
BOYUT 06 — Instant / file-level / full restore: senaryona göre dönüş
SONUÇ3-2-1-1-0: 3 kopya · 2 ortam · 1 site dışı · 1 immutable · 0 doğrulama hatası
SERVİSGÖREVPORT
Veeam Backup ServiceJob motoru & koordinasyon (VBR)TCP 9392
Guest Catalog ServiceDosya indeksleme kataloğuTCP 9393
Mount ServiceInstant recovery / dosya restore mountTCP 9401
Installer ServiceBileşen dağıtımı (tüm yönetilen sunucular)TCP 6160
Transport ServiceProxy/repository bileşen iletişimiTCP 6162
Data Mover kanallarıAsıl yedek veri akışıTCP 2500–3300
Enterprise ManagerWeb UI & REST APITCP 9443
PostgreSQLConfiguration DB (v12+ varsayılan)TCP 5432
/* ============ starfield + warp engine ============ */ const cv=document.getElementById('space'),ctx=cv.getContext('2d'); let W,H,DPR=Math.min(devicePixelRatio||1,2); function rs(){W=innerWidth;H=innerHeight;cv.width=W*DPR;cv.height=H*DPR;ctx.setTransform(DPR,0,0,DPR,0,0)} rs();addEventListener('resize',rs); const reduced=matchMedia('(prefers-reduced-motion: reduce)').matches; /* per-dimension tint */ const TINTS=['0,60,35','60,45,10','10,45,60','35,20,70','35,20,70','60,12,20','0,60,35','0,60,35']; let tintFrom='0,60,35',tintTo='0,60,35',tintP=1; const stars=[];for(let i=0;i.05?.35:1)+')'; ctx.fillRect(0,0,W,H); const mix=(a,b,p)=>a.split(',').map((v,i)=>Math.round(+v+(+b.split(',')[i]-+v)*p)).join(','); const tint=mix(tintFrom,tintTo,tintP); const g=ctx.createRadialGradient(W/2,H/2,0,W/2,H/2,Math.max(W,H)*.8); g.addColorStop(0,`rgba(${tint},.25)`);g.addColorStop(1,'transparent'); ctx.fillStyle=g;ctx.fillRect(0,0,W,H); const cx=W/2,cy=H/2; for(const s of stars){ s.d+=(0.0004+warpSpeed*.045)*(0.3+s.d); if(s.d>1){s.d=0.001;s.a=Math.random()*6.28} const r=s.d*Math.max(W,H)*.75; const x=cx+Math.cos(s.a)*r, y=cy+Math.sin(s.a)*r; const a=.25+.6*Math.abs(Math.sin(s.tw+t*.5)); if(warpSpeed>.05){ const len=warpSpeed*90*s.d; ctx.strokeStyle=`rgba(180,255,225,${Math.min(1,a+warpSpeed*.5)})`; ctx.lineWidth=s.s; ctx.beginPath();ctx.moveTo(x,y); ctx.lineTo(cx+Math.cos(s.a)*(r+len),cy+Math.sin(s.a)*(r+len));ctx.stroke(); }else{ ctx.fillStyle=`rgba(225,255,242,${a})`; ctx.fillRect(x,y,s.s,s.s); } } } frame(); /* ============ dimension nav ============ */ const NAMES=['00 GİRİŞ','01 ÜRETİM','02 PROXY','03 ZİNCİR','04 SOBR','05 KARA DELİK','06 RESTORE','07 KOMUTA']; const nav=document.getElementById('dimnav'); NAMES.forEach((n,i)=>{const s=document.createElement('span');s.textContent=n; s.onclick=()=>warpTo(i);nav.appendChild(s)}); const tabs=[...nav.children];tabs[0].classList.add('on'); let cur=0,warping=false; function warpTo(i){ if(warping||i===cur)return;warping=true; const w=document.getElementById('warp'),wt=document.getElementById('warptext'); document.getElementById('d'+cur).classList.remove('on'); wt.classList.add('go'); let sp=0;const acc=setInterval(()=>{sp+=.08;warpSpeed=sp;if(sp>=1)clearInterval(acc)},30); tintFrom=TINTS[cur];tintTo=TINTS[i];tintP=0; setTimeout(()=>{ tabs[cur].classList.remove('on');tabs[cur].classList.add('done'); cur=i;tabs[cur].classList.add('on'); const d=document.getElementById('d'+i);d.scrollTop=0;d.classList.add('on'); const dec=setInterval(()=>{warpSpeed-=.07;if(warpSpeedsetTimeout(()=>{s.classList.add('lit');st.textContent='durum: '+msgs[i]; if(i===2)document.getElementById('vmbox').classList.add('snapped'); if(i===steps.length-1){document.getElementById('snapinfo').classList.add('show');unlock(1)} },500+i*750)); } function unlock(n){document.getElementById('p'+n).classList.remove('locked'); const h=document.getElementById('h'+n);if(h)h.textContent='// geçit açıldı ✓';} /* ============ DIM2: transport + CBT ============ */ const MODEINFO=[ 'Direct Storage Access seçildi. Fiziksel proxy, SAN fabric üzerinden LUN\u2019ları doğrudan okur. Üretim ağı ve ESXi hostları sıfır yük görür — büyük ortamların birinci tercihi. Gereksinim: proxy\u2019nin depolamayı görebilmesi (zoning/masking).', 'Hot-Add seçildi. Proxy bir VM olduğu için yedeklenen diskleri kendine "takar". Kurulumu kolay, performansı iyi — sanal-ağırlıklı ortamların pratik yolu. Her cluster\u2019a bir sanal proxy koymak altın kuraldır.', 'NBD seçildi. Veri ESXi yönetim arayüzünden (VMkernel) akar. Yapılandırma gerektirmez, her yerde çalışır; ama yönetim ağının bant genişliğiyle sınırlıdır. Diğer modlar başarısız olursa Veeam otomatik buna düşer (failover).']; let modePicked=false,cbtRun=false; function pickMode(el,i){ document.querySelectorAll('#d2 .grid .card').forEach(c=>c.classList.remove('picked')); el.classList.add('picked'); const b=document.getElementById('modeinfo');b.innerHTML=MODEINFO[i];b.classList.add('show'); modePicked=true;check2(); } const disk=document.getElementById('disk'); for(let i=0;i<64;i++){const d=document.createElement('div');d.className='blkc';disk.appendChild(d)} const changed=new Set();while(changed.size{if(changed.has(i))b.classList.add('chg')}); function cbtDemo(on){ const blocks=[...disk.children]; blocks.forEach(b=>b.classList.remove('read')); const targets=on?blocks.filter((b,i)=>changed.has(i)):blocks; targets.forEach((b,i)=>setTimeout(()=>b.classList.add('read'),i*(on?90:22))); const info=document.getElementById('cbtinfo'); setTimeout(()=>{ info.innerHTML=on ?'CBT açık: 64 bloktan sadece 9\u2019u okundu (%14). Gerçek dünyada 1 TB\u2019lık VM\u2019in günlük değişimi çoğu zaman %1\u20135 arasıdır — artımlı yedek bu yüzden dakikalar sürer. İlk (full) yedek yine de tam okumadır; sihir ikinci geceden itibaren başlar.' :'CBT kapalı: 64 blokun tamamı okundu. Her gece tüm diski taramak hem saatler sürer hem üretim depolamasını yorar. CBT bozulursa Veeam bunu algılar ve otomatik resetleyebilir.'; info.classList.add('show');cbtRun=true;check2(); },targets.length*(on?90:22)+200); } function check2(){if(modePicked&&cbtRun)unlock(2)} /* ============ DIM3: chain builder ============ */ const chainEl=document.getElementById('chain'); const DAYS=['PZT','SALI','ÇAR','PER','CUM','CMT']; let nights=0,merges=0; function addBlock(cls,t,s){const d=document.createElement('div');d.className='cblk '+cls; d.innerHTML=`
${t}
${s}
`;chainEl.appendChild(d);return d} addBlock('full','.VBK','FULL · PAZAR'); function addNight(){ if(nights>=6)return; addBlock('','.VIB','INC · '+DAYS[nights]);nights++; const info=document.getElementById('chaininfo'); info.innerHTML=`Gece ${nights}: CBT'nin işaretlediği değişen bloklar yeni bir .VIB dosyasına yazıldı. Zincirde artık ${nights+1} restore noktası var — fatura_2026.pdf'nin ${nights+1} farklı geçmiş hâline dönebilirsin. .VBM metadata dosyası zincir haritasını güncelledi.`; info.classList.add('show'); if(nights>=3)document.getElementById('mergebtn').disabled=false; if(nights>=6)document.getElementById('nightbtn').disabled=true; check3(); } function mergeOldest(){ const vibs=chainEl.querySelectorAll('.cblk:not(.full)'); if(!vibs.length)return; const v=vibs[0];v.classList.add('merging'); setTimeout(()=>{v.remove();merges++; const info=document.getElementById('chaininfo'); info.innerHTML='Merge tamam: Saklama süresi dolan en eski increment, full yedeğin (.VBK) içine "yürütüldü" — full artık bir gün ileriyi temsil ediyor. Buna forever forward incremental denir: zincir hiç bitmez, sadece kendini ileri taşır. Disk alanı sabit kalır, yeni full almak için üretime dönmek gerekmez.'; info.classList.add('show');check3(); },800); } function check3(){if(nights>=3&&merges>=1)unlock(3)} const CMODES={ ffi:'Forever Forward Incremental: varsayılan ve en verimli mod. Tek VBK + sürekli VIB; saklama dolunca merge. Deduplication cihazlarında merge maliyetli olabilir — orada synthetic/active full tercih edilir.', rev:'Reverse Incremental: her yedekte değişen bloklar doğrudan VBK\u2019ya yazılır, eski halleri .VRB\u2019ye çıkarılır. Son nokta daima tam yedek olduğu için restore şimşek hızındadır; bedeli yedek sırasında 3 kat I/O.', syn:'Synthetic Full: periyodik (ör. haftalık) yeni bir VBK, üretimden okumadan, repository\u2019deki mevcut VBK+VIB\u2019lerden sentezlenir. Zincir kısalır, restore hızlanır, üretim hiç yorulmaz. ReFS/XFS block cloning ile sentez neredeyse anlıktır.'}; function showChainMode(el,k){ document.querySelectorAll('#d3 .grid .card').forEach(c=>c.classList.remove('picked')); el.classList.add('picked'); const b=document.getElementById('cmodeinfo');b.innerHTML=CMODES[k];b.classList.add('show'); } /* ============ DIM4: SOBR age slider ============ */ function ageMove(v){ const caps=[ [0,'// yedek 0-30 günlük — Performance tier\u2019da, anlık restore\u2019a hazır',0], [30,'// yedek 30+ günlük — move politikası devrede: S3 Capacity tier\u2019a taşındı. Site dışı kopya (3-2-1\u2019in "1"i) artık bulutta',1], [70,'// yedek 1 yaşını aştı — Archive tier\u2019a (Glacier) süzüldü: en düşük maliyet, yıllarca uyku. Restore mümkün ama önce "rehydrate" gerekir',2]]; let tier=0,cap=caps[0][1]; for(const c of caps)if(v>=c[0]){cap=c[1];tier=c[2]} document.getElementById('agecap').textContent=cap; [0,1,2].forEach(i=>document.getElementById('t'+i).classList.toggle('active',i===tier)); } /* ============ DIM5: attack ============ */ let attacked=false; function attack(){ if(attacked)return;attacked=true; document.body.classList.add('quake'); setTimeout(()=>document.body.classList.remove('quake'),600); const norm=[...document.querySelectorAll('#rnorm .fchip')]; const hard=[...document.querySelectorAll('#rhard .fchip')]; norm.forEach((f,i)=>setTimeout(()=>{f.classList.add('enc');f.textContent=f.textContent+'.locked'},300+i*260)); hard.forEach((f,i)=>setTimeout(()=>f.classList.add('shield'),300+i*260)); setTimeout(()=>{document.getElementById('verdict').classList.add('show');unlock(5)},300+norm.length*260+400); document.getElementById('atkbtn').style.opacity=.35; } /* ============ DIM6: restore ============ */ const RST=[ 'Instant Recovery başlatıldı. Mount Service yedeği NFS datastore olarak sundu, SRV-MUHASEBE yedek dosyasının içinden boot etti — süre: ~3 dakika. Kullanıcılar çalışmaya döndü; yazılan yeni veriler redo log\u2019a gidiyor. Arka planda Storage vMotion VM\u2019i gerçek datastore\u2019a taşıyacak, kimse fark etmeyecek.
RTO ≈ dakikalar · veri kaybı: son yedekten bu yana (RPO)
', 'File-Level Restore tamam. Dün gecenin restore point\u2019i mount edildi, Guest Catalog indeksinde "fatura_2026" araması 0.4 sn sürdü, dosya orijinal yerine kopyalandı. Koca VM\u2019i geri yüklemeye gerek kalmadı — patron daha kahvesini bitirmeden dosya masasında.
en sık kullanılan restore türü budur: %90 vaka = tek dosya/klasör
', 'Secure Restore ile Full VM Restore başladı. VM, saldırı öncesi son temiz restore point\u2019ten yeniden inşa ediliyor; disk imajı üretime dönmeden önce antivirüs motoruyla taranıyor — zararlının yedekten geri gelmesine izin yok. En temiz dönüş yolu bu.
saldırı sonrası best practice: asla taranmamış yedeği doğrudan üretime açma
']; function restore(el,i){ document.querySelectorAll('#d6 .grid .card').forEach(c=>c.classList.remove('picked')); el.classList.add('picked'); const r=document.getElementById('rst');r.innerHTML=RST[i];r.classList.add('show'); unlock(6); }