File storage rješenja: S3, CDN i backup

File storage odlučuje gdje žive uploadi, slike proizvoda, fakture i backupi kad više ne stanu mirno na disk web servera. Shop koji svaku fotografiju drži u wp-content/uploads radi dok se disk ne napuni, deploy ne obriše fajlove ili drugi server nema šta da servira. Kupci vide pokvarene slike. Vi vidite povratak podataka koji niko nikad nije probao.

U CodeWizu fajlove selimo na object storage, ispred javnog dijela stavljamo CDN i držimo backup koji se stvarno može vratiti. Uobičajene mete su AWS S3 i Google Cloud Storage, ponekad i S3-kompatibilan bucket kad je izlazni saobraćaj pravi problem. Aplikacija čuva bazu. Bucket čuva bajtove.

Ovo je za online prodavnice, sajtove pune medija, aplikacije koje primaju upload korisnika i svaki tim koji je već izgubio folder fajlova ili se boji da hoće. Ako je deploy strašan jer disk servera drži stanje, storage je dio koji treba prvo odvojiti.

File storage na AWS S3

Amazon S3 je naš uobičajeni izbor kad želite izdržljiv bucket, ogroman ekosistem i biblioteke u svakom jeziku koji isporučujemo. Fajlovi su objekti sa ključem, a ne fajlovi u stablu direktorija. To zvuči kao detalj. Mijenja backup, deploy i to koliko servera može servirati iste uploadove.

Kako podižemo bucket

  • Bucket u regionu blizu aplikacije, uz uključen Block Public Access. Javni fajlovi idu kroz CDN, a ne otvaranjem bucketa.
  • Poseban IAM korisnik ili rola koja smije dirati samo taj bucket, sa odvojenim kredencijalima za produkciju i staging.
  • Versioning, da se prepis ili loše brisanje može poništiti, i lifecycle pravilo koje gasi stare verzije i nedovršene multipart uploade.
  • Enkripcija na strani servera, i access logovi ili CloudTrail data events tamo gdje morate znati ko je čitao osjetljiv objekat.
  • Aplikacija podešena da upload strimuje pravo na S3. WordPress, Laravel i Node.js imaju provjerene adaptere. Lokalni disk prestaje biti izvor istine.

Kratko lifecycle pravilo obično dijeli uredan bucket od računa koji raste zauvijek:

{ "Rules": [{ "ID": "expire-old-versions", "Status": "Enabled", "Filter": { "Prefix": "" }, "NoncurrentVersionExpiration": { "NoncurrentDays": 30 }, "AbortIncompleteMultipartUpload": { "DaysAfterInitiation": 7 } }] }

AWS S3 vodič pokriva API. Mi predajemo bucket, politiku, izmjenu u aplikaciji i bilješku koji prefiksi su javni, privatni ili privremeni.

CDN: Redovi knjiga na policama biblioteke kao slika uređenog skladišta fajlova

Google Cloud Storage kad ste već na Googleu

Google Cloud Storage radi isti posao kao S3: izdržljivi objekti, potpisani pristup, lifecycle pravila i CDN ispred. Biramo ga kad je ostatak sistema već na Googleu, kad klijent standardizuje jedan cloud, ili kad je baš neka GCS mogućnost razlog. Ne držimo dva object storea iz inata.

Šta se mijenja u odnosu na S3

  • Identitet je IAM na Google Cloudu, a ne AWS access key. Workload identity ili usko ograničen service account zamjenjuje dugotrajni ključ tamo gdje platforma to dozvoljava.
  • Storage klase (Standard, Nearline, Coldline, Archive) prate koliko brzo vam bajtovi trebaju nazad. Fakture od prije tri godine ne trebaju Standard.
  • Uniform bucket-level access je uključen, tako da objektni ACL ne može tiho proturječiti politici bucketa.
  • Mijenja se adapter u aplikaciji. Ideja ne: baza čuva ključ objekta, bucket čuva bajtove, a obrisan server ne briše fajlove.

Googleova Cloud Storage dokumentacija je referenca za klase i signed URL-ove. Ako birate između njih dvoje bez postojeće obaveze, obično krećemo na S3 ili na Cloudflare R2 kad egress dominira troškom, i to kažemo prije nego što se bilo koji bucket napravi.

Disk, object storage ili oboje

File storage nije refleks za svaki sajt. Pet stranica i četiri fotografije ne trebaju bucket. Baza podataka ne smije „samo na S3” kao svoj živi direktorij. Podjela je u tome šta mora biti lokalno, a šta je blob.

MjestoDobro zaOblik cijeneNa šta paziti
Disk serveraAplikacija, mali sajtovi, bazaUključeno u VPSUmire sa diskom. Deploy ga može obrisati
AWS S3Uploadi, mediji, exporti, većina aplikacijaStorage, zahtjevi i egressEgress i previše glasan kod mogu dominirati računom
Google Cloud StorageIsto, unutar Google CloudaStorage klasa plus operacijeDrugačiji model identiteta
S3-kompatibilno (R2 i drugi)Javni mediji kad je egress skupČesto bez egress naknade prema internetuProvjerite funkcije koje vaš kod stvarno zove

Obrazac koji često koristimo: baza i aplikacija ostaju na serveru ili managed bazi, javni mediji idu u bucket iza CDN-a, a privatni dokumenti u drugi prefiks koji se nikad ne kešira. Selidba postojećeg foldera uploads je bulk kopija, izmjena koda, pa period u kojem se čita sa oba mjesta dok nismo sigurni da ništa još ne gleda u disk.

Ethernet kabl u fokusu ispred zamućenog namotaja mrežnih kablova

CDN ispred fajlova

Bucket u jednom regionu je izdržljiv. Nije brz za posjetioca na drugom kontinentu i ne treba da bude hostname u vašem HTML-u. CDN je ono što skladište fajlova učini dijelom sajta: vlastiti domen, keš i HTTPS, a bucket ostaje sakriven iza.

Šta podešavamo

  • Hostname poput media.example.com na Cloudflareu, uperen u bucket, dok bucket odbija anonimne zahtjeve sa bilo kojeg drugog mjesta.
  • Dug keš za fajlove čije se ime mijenja kad se sadržaj promijeni (hash ili jedinstveni id u ključu), a kratak za sve što se prepisuje na istom mjestu.
  • Varijante slika i kompresija na edgeu tamo gdje pomažu, bez keširanja HTML-a koji pripada prijavljenom korisniku.
  • Ograničenja za hotlink i zloupotrebu, da popularan fajl ne postane tuđi prolaz za vaš protok.

Privatni fajlovi nikad ne idu kroz javni keš. Signed URL, važeći nekoliko minuta, pravi je alat za fakturu ili preuzimanje kupca. Edge podešavanja smo opisali u vodiču za profesionalnu Cloudflare konfiguraciju, a praktičan upload API u našem PHP CDN uploaderu.

Ko smije pročitati fajl: javno, privatno i potpisano

Greška koja boli je tretirati svaki upload kao javan jer je tako bilo lakše prvi dan. Slike proizvoda jesu javne. Skenovi dokumenata, fakture i exporti nisu. To dijelimo namjerno.

  • Javni mediji žive pod prefiksom koji CDN smije keširati. Ključevi se ne mogu pogoditi ili su vezani za sadržaj. Listanje bucketa je ugašeno.
  • Privatni dokumenti ostaju u prefiksu bez javne politike. Aplikacija provjeri korisnika, pa izda signed URL koji ističe.
  • Privremeni uploadi padaju u prefiks sa lifecycle pravilom od dan-dva, da napušteni fajlovi ne rastu.
  • Pristup iz drugog naloga ide preko bucket politike za određenu rolu, a ne preko dijeljenog access keya zalijepljenog u chat.

Signed URL-ovi su kratki. Sat vremena je već izdašno za link u mejlu. URL koji radi i sljedeće godine samo je javan fajl sa više koraka.

Narandžasti Ethernet utikač izbliza na svijetloj pozadini

Backup strategije koje prežive loš dan

Object storage je izdržljiv kad disk umre. Nije backup protiv buga koji obriše pogrešan prefiks, procurjelog ključa ili naloga na koji se više ne možete prijaviti. Backup je druga kopija, na drugom mjestu, koju ste bar jednom vratili.

Šta zaista postavimo

  • Versioning i retention lock na bucketima koji drže podatke koje ne možete ponovo napraviti, tako da brisanje ne postane trajno prije dogovorenog broja dana.
  • Kopija u drugom regionu ili kod drugog provajdera za podatke koji bi zaustavili poslovanje: dump baze i prefiks privatnih dokumenata. Javni mediji se često mogu ponovo složiti, i to kažemo umjesto da ih slijepo kopiramo.
  • Dumpovi baze po rasporedu upisani u bucket, šifrovani, sa lifecycle pravilom koje prati koliko daleko biste se zaista vratili.
  • Vježba povratka. Uzmemo jedan fajl i jedan backup baze i vratimo ih na čistu mašinu. Backup koji nikad nije vraćen je nada.

Za shopove bolni gubitak nisu uvijek fotografije. To je narudžba koja je postojala samo u sesiji ili logu. Pisali smo o tome da svaka narudžba ostane povratna u tekstu o e-commerceu bez gubitka podataka. Backup fajlova i takvo hvatanje rješavaju različite probleme, a ozbiljan shop treba oboje.

Selidba postojećih uploada bez lomljenja URL-ova

Većina ovih poslova koje isporučimo je selidba, a ne prazno polje. Godinama fajlovi sjede na jednom serveru, a HTML, baza i tuđi sajtovi pokazuju na te URL-ove.

  1. Popis foldera, ukupne veličine i to koje putanje su javne.
  2. Kopija u bucket u pozadini. Ponavlja se dok dnevna razlika ne postane mala.
  3. Novi uploadi idu u bucket, a stari fajlovi se još čitaju sa diska dok kopija ne sustigne.
  4. Čitanje prelazi na bucket. Redirect ili CDN pravilo na starim URL-ovima drži linkove koji su već u Googleu i u starim mejlovima.
  5. Kopija na disku ostaje neko vrijeme. Briše se tek kad logovi pokažu da je niko ne čita.

Ovo radimo za WordPress i WooCommerce, Laravel i prilagođene Node.js aplikacije. Baza čuva ključeve. Tema ili API pravi javni URL. Upisane putanje /uploads/2024/... prolaze kroz skriptu, a ne kroz nadu da je search-and-replace po bazi bio dovoljan.

Česte greške sa skladištem fajlova

  • Javan bucket, ili politika sa Principal: "*" ostavljena iz tutorijala.
  • Access key u Git repozitoriju, ili jedan ključ koji dijele produkcija, staging i nečiji laptop.
  • Uploadi se i dalje pišu na lokalni disk „samo zasada”, pa sljedeći deploy ili drugi server nema fajlove.
  • Nema lifecycle pravila, pa nedovršeni uploadi i stare verzije rastu godinama.
  • Privatni PDF-ovi keširani na CDN-u, ili signed URL-ovi koji ističu za deset godina.
  • Backup na istom disku kao sajt, i povratak koji niko nije probao.

File storage: od čega zavisi cijena

Procjenu dajemo kad vidimo koliko fajlova imate, koliko su veliki i ko ih skida. Stavka za storage na računu često je ona mala.

  • Egress. Svaki gigabajt koji iz bucketa ide na internet se naplaćuje, osim ako ste izabrali skladište koje to ne naplaćuje. CDN keš ispred to smanji, ali ne ukida potrebu da se pogleda.
  • Zahtjevi. Stranica koja traži stotine sitnih objekata, ili skripta koja lista cijeli bucket, umije koštati više od gigabajta.
  • Gdje su fajlovi sad. Selidba nekoliko gigabajta je popodne. Selidba terabajta, sa prepravljanjem URL-ova i pažljivim prelaskom, jeste projekat.
  • Koliko su podaci privatni. Javne slike proizvoda su jednostavnije od potpisanog pristupa, enkripcije i druge kopije na drugom nalogu.

Izbor provajdera je dio istog razgovora. Kako slažemo opterećenja preko clouda opisali smo u vodiču za multi-cloud deployment. Bucket na pogrešnom kontinentu, ili egress koji niste izmjerili, dominiraće mjesečnim troškom dugo nakon što je setup gotov.

Kako radimo

  1. Upoznavanje: gdje fajlovi danas žive, koliko su veliki, koji su javni i šta bi vas izgubljen disk stvarno koštao.
  2. Plan: bucket, region, CDN hostname, privatni naspram javnih prefiksa i koliko unazad backup mora ići.
  3. Izgradnja: bucket, ključevi, adapter u aplikaciji, CDN i lifecycle pravila.
  4. Selidba: kopija u pozadini, pa novi uploadi u bucket, pa čitanje, dok stari URL-ovi i dalje odgovaraju.
  5. Dokaz: povratak jednog fajla i dumpa baze, i provjera da privatni objekti nisu za keš.
  6. Predaja: kratka bilješka prefiksa, ko drži ključeve i kako bi mjesečni račun trebalo da izgleda.

Zašto CodeWiz

  • Gradimo aplikacije koje čuvaju fajlove. WordPress, Laravel, Node.js i shopovi, pa adapter prati kako kod zaista snima upload.
  • Prvo open-source. Standardni S3 API i otvorene biblioteke, da ne ostanete na privatnom disku nekog panela.
  • Po mjeri. Mali sajt zadrži fajlove na disku ako bi bucket samo dodao trošak i pokretne dijelove.
  • Performanse i izdržljivost zajedno. CDN, backup i aplikacija su jedan posao. Više o CodeWizu.
  • Pristupačne cijene. Osnovani u Banjoj Luci 2023, radimo udaljeno sa klijentima lokalno i u inostranstvu. Vrhunski rad bez vrhunskih cijena.

Često postavljana pitanja

Koliko košta file storage?

Selidba uploada jednog sajta na bucket i CDN mali je projekat. Terabajti, privatni dokumenti i pažljiva migracija URL-ova traju duže. Procjenu dajemo kad vidimo obim i aplikaciju. Mjesečni račun za storage obično je skroman. Egress i broj zahtjeva su ono što provjerimo prije bilo kakvog obećanja.

Da li AWS S3 ili Google Cloud Storage?

Onaj pored kojeg vam aplikacija i tim već sjede. Ako krećete čisto, S3 je put sa najviše biblioteka, a S3-kompatibilan bucket vrijedi pogledati kad je protok skupi dio. Nećemo vas staviti na oba.

Je li bucket backup?

Nije. Bucket preživi mrtav disk. Ne preživi brisanje, loš deploy ili izgubljen nalog, osim ako imate versioning, drugu kopiju i povratak koji ste stvarno odradili. To postavimo i povratak odradimo jednom prije nego što to nazovemo backupom.

Hoće li stari URL-ovi slika i dalje raditi?

Hoće, ako ih isplaniramo. Novi fajlovi dobijaju URL bucketa preko CDN-a. Stare putanje dobiju redirect ili CDN pravilo, tako da linkovi u Googleu, mejlovima i na drugim sajtovima ne puknu. Kopiju na disku skidamo tek kad logovi pokažu da miruje.

Možete li čuvati fajlove za WordPress ili WooCommerce?

Da. Mediji i slike proizvoda silaze sa wp-content/uploads na bucket, a sajt i dalje pravi prave URL-ove. Baza i WordPress core ostaju na serveru, gdje im je mjesto.

Gdje treba da žive privatni dokumenti kupaca?

U prefiksu koji nije javan i nije keširan, a servira se samo preko kratkog signed URL-a nakon što aplikacija provjeri korisnika. Enkripcija i druga kopija važe kad bi gubitak tih fajlova bolio.

Spremni da fajlove sklonite sa diska servera?

Recite nam gdje uploadi danas žive i čega se bojite da izgubite. Predložićemo bucket, CDN hostname i backup koji možete vratiti. Javite nam se da krenemo, ili pogledajte naše usluge skladištenja fajlova.