Storage Server dla własnej strony: zdjęcia, pliki do pobrania, archiwa

Opublikowano 6 min czytania

Miejsce na serwerze WWW jest drogie, miejsce na Storage Serverze nie. Ten artykuł pokazuje, co da się wynieść, jaki protokół działa z serwera WWW i jak pliki bezpiecznie docierają do odwiedzających.

Na serwerze WWW miejsce na dysku jest najdroższym dobrem. Leży na szybkich dyskach NVMe SSD, zbudowanych dla baz danych i PHP, a z każdym gigabajtem wyraźnie drożeje. Jednocześnie leżą tam rzeczy, które tej szybkości nigdy nie potrzebują: oryginalne zdjęcia, pliki wideo, archiwa do pobrania, stare kopie zapasowe.

Storage Server kosztuje ułamek tego i zdejmuje dokładnie to obciążenie. Ten artykuł pokazuje, co warto wynieść, jaki protokół działa z serwera WWW, jak pliki bezpiecznie docierają do odwiedzających i gdzie są granice.

Co warto wynieść, a czego nie

Idzie na Storage ServerZostaje na serwerze WWW
Oryginały zdjęć i filmówMiniatury i przycięte wersje
Archiwa do pobrania, pliki ISO, zbiory PDFCSS, JavaScript, czcionki
Dane surowe, eksporty, archiwa logówBaza danych
Kopie zapasowe stronyWszystko, co jest potrzebne przy każdym wywołaniu strony

Linia podziału jest prosta: co jest czytane rzadko i przesyłane raz, w jednym dużym kawałku, powinno leżeć na przestrzeni dyskowej. Co doładowuje się przy każdym wywołaniu strony, zostaje tam, gdzie jest szybko.

Czym Storage Server jest, a czym nie jest

Storage Server to przestrzeń dyskowa w sieci z kontami użytkowników. Łączysz się danymi dostępowymi i czytasz albo zapisujesz pliki. Nie jest magazynem obiektowym z publicznymi adresami i nie jest CDN-em.

W praktyce znaczy to tyle: w swojej stronie nie możesz podlinkować zdjęcia wprost na przestrzeń dyskową, bo każdy dostęp wymaga zalogowania. Twój serwer WWW pobiera plik i podaje go dalej, albo sam generujesz odnośniki do pobrania ograniczone czasowo. Jak zrobić to porządnie, opisuję niżej.

Brzmi jak ograniczenie, ale ma zaletę: nikt nie wyciągnie twoich plików, zgadując adresy albo przekazując dalej odnośnik. Dostęp idzie zawsze przez twoją aplikację, a więc przez twoje reguły.

Wzorzec, który sprawdza się w praktyce

Trzy kroki, nic więcej:

  1. Oryginały leżą na przestrzeni dyskowej. Wgrywa się je raz i potem rzadko rusza.
  2. Wersje pochodne powstają raz i leżą na serwerze WWW. Czyli miniatury, przycięte warianty, skompresowane wersje. Są małe i są potrzebne przy każdym wywołaniu strony.
  3. Pobierania idą przez twoją aplikację. Mały skrypt sprawdza uprawnienie, pobiera plik z przestrzeni dyskowej i wydaje go.

Kto odwróci to i będzie przy każdym wywołaniu ściągał miniatury świeżo z przestrzeni dyskowej, zbuduje sobie wolną stronę. Opóźnienie sieci dla każdego pliku się sumuje, a galeria z czterdziestoma zdjęciami czeka czterdzieści razy.

Jaki protokół do jakiego przypadku

ProtokółPortDobry doWymaga
SMB / CIFS445montowania jako kataloguprawnień root na serwerze
SSHFS23montowania jako katalog, szyfrowaneuprawnień root na serwerze
SFTP23dostępu z PHP, skryptów, transferówwychodzącego portu 23
WebDAV przez HTTPS443hostingu współdzielonego, środowisk z ograniczeniamitylko HTTPS
rsync23synchronizacji dużych katalogówwychodzącego portu 23
BorgBackup23kopii zapasowych z deduplikacjąwychodzącego portu 23

Najważniejsza decyzja nie zależy od gustu, tylko od twoich uprawnień: na własnym serwerze montujesz przestrzeń dyskową jako katalog i każda aplikacja może jej używać, nic o niej nie wiedząc. Jak to zrobić, opisuje artykuł Storage Server jako dysk sieciowy.

Na hostingu współdzielonym nie masz uprawnień root, montowanie jest więc wykluczone. Tam droga idzie przez WebDAV albo SFTP z poziomu aplikacji, a WebDAV stawia zwykle mniejszy opór, bo port 443 praktycznie nigdy nie jest zablokowany.

Konfiguracja dostępu z PHP

Do SFTP wystarczy czysta biblioteka PHP, nie potrzeba żadnego rozszerzenia na serwerze:

composer require phpseclib/phpseclib:~3.0
use phpseclib3\Net\SFTP;

$sftp = new SFTP('u123456.storage.kernelhost.net', 23);
if (!$sftp->login('u123456-sub1', $passwort)) {
    throw new RuntimeException('Nie udało się zalogować');
}

// Wgranie pliku
$sftp->put('/bilder/2026/original.jpg', '/tmp/upload.jpg', SFTP::SOURCE_LOCAL_FILE);

// Odczyt pliku
$inhalt = $sftp->get('/bilder/2026/original.jpg');

Do WebDAV wystarczy nawet wbudowane rozszerzenie curl:

$ch = curl_init('https://u123456.storage.kernelhost.net/bilder/2026/original.jpg');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_USERPWD        => 'u123456-sub1:' . $passwort,
    CURLOPT_TIMEOUT        => 30,
]);
$inhalt = curl_exec($ch);
curl_close($ch);

Oba przykłady używają subkonta, nie konta głównego. Dlaczego, wyjaśnia następny rozdział.

Do każdego celu osobne subkonto

Każdy Storage Server pozwala na maksymalnie 100 subkont, i to w każdym pakiecie. Każde dostaje:

  • własny katalog startowy, z którego nie wychodzi,
  • własne hasło,
  • własne uprawnienia protokołów, czyli na przykład tylko SFTP i żadnej Samby.

Dla strony znaczy to tyle: jedno subkonto dla serwera WWW, któremu wolno tylko SFTP i które widzi tylko /web, drugie dla kopii zapasowej, które widzi tylko /backup. Jeśli serwer WWW zostanie kiedyś przejęty, napastnik nie dojdzie do kopii zapasowych, bo to konto wcale ich nie zna.

Jedna granica istnieje: subkonto nie dostaje własnego przydziału miejsca. Zostaje w swoim katalogu, ale może stamtąd wypełnić całą przestrzeń z pakietu. Kto chce naprawdę ograniczyć poszczególnych użytkowników, potrzebuje przed Storage Serverem aplikacji, która to przejmie. Dokładnie taki układ pokazuje artykuł Połączenie Nextcloud ze Storage Serverem.

Bezpieczne wydawanie plików do pobrania

Najczęstszym błędem jest wpuszczenie danych dostępowych do przeglądarki, choćby przez odnośnik z nazwą użytkownika i hasłem. Poprawnie jest tak, że twój serwer zestawia połączenie i podaje plik dalej:

<?php
// Sprawdzenie uprawnienia, zanim stanie się cokolwiek innego
if (!nutzer_darf_datei($_GET['id'])) {
    http_response_code(403);
    exit;
}

$sftp = neue_verbindung();
$datei = $sftp->get(pfad_zu($_GET['id']));

header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="dokument.pdf"');
header('Content-Length: ' . strlen($datei));
echo $datei;

Przy bardzo dużych plikach lepiej czytać blokami, zamiast ładować wszystko do pamięci, bo inaczej pęknie limit pamięci PHP. Użyj do tego ob_end_flush() i wydawaj plik po kawałku.

Kto spodziewa się wielu jednoczesnych pobierań, powinien dodatkowo pamiętać, że każde trwające pobieranie zajmuje jeden proces PHP. Od pewnej skali takie rzeczy powinny stać na własnym serwerze, a nie na hostingu współdzielonym.

Kopia zapasowa strony na przestrzeni dyskowej

To jest najprostszy początek i daje coś od razu. Przy pomocy rsync przesyłasz tylko zmiany:

rsync -az --delete -e "ssh -p 23" \
      /var/www/example.com/ \
      u123456-sub2@u123456.storage.kernelhost.net:/backup/web/

Do kopii zapasowych z deduplikacją i szyfrowaniem lepszym wyborem jest BorgBackup, na przestrzeni dyskowej jest dostępny natywnie. Do tego dochodzą migawki samej przestrzeni dyskowej jako druga warstwa: w zależności od pakietu 10, 20, 30 albo 40 migawek ręcznych, plus tyle samo automatycznych w rytmie dziennym, tygodniowym i miesięcznym.

Różnica wobec kopii na tym samym serwerze jest decydująca: usunięty albo zaszyfrowany dysk zabiera kopię lokalną ze sobą, kopii na osobnej przestrzeni dyskowej nie zabierze.

Zanim zaczniesz: dwa przełączniki

W panelu klienta znajdziesz przy Storage Serverze przycisk „Ustawienia dostępu”. Dwie rzeczy muszą być w porządku:

  • Dostępność zewnętrzna musi być włączona, inaczej twój serwer WWW nie dojdzie do przestrzeni dyskowej przez internet.
  • Potrzebny protokół musi być dopuszczony, czyli Samba dla SMB, SSH dla SFTP i rsync, WebDAV dla drogi przez HTTPS.

W nowo zamówionych serwerach wszystko to jest aktywne. Kto z powodów bezpieczeństwa wyłącza to, czego nie potrzebuje, powinien pamiętać, że właśnie to jest później najczęstszą przyczyną „już nie działa”.

Który pakiet pasuje

PakietMiejsceSubkontaMigawkiCena
Storage-11 TB10010 plus 10 automatycznych9,99 EUR
Storage-25 TB10020 plus 20 automatycznych29,99 EUR
Storage-310 TB10030 plus 30 automatycznych39,99 EUR
Storage-420 TB10040 plus 40 automatycznych69,99 EUR

Wszystkie Storage Servery stoją w Niemczech, obsługują FTP, FTPS, SFTP, SCP, Samba, WebDAV i WebDAVs, przynoszą natywnie rsync oraz BorgBackup i mają IPv4 i IPv6. Nie ma opłaty instalacyjnej, rozliczenie idzie w modelu PrePaid bez minimalnego okresu umowy. Możesz więc zacząć od 1 TB i powiększyć pakiet później, bez przeprowadzki.

Przykładowy rachunek: 1 TB dodatkowego miejsca na serwerze WWW kosztuje, zależnie od dostawcy, wielokrotność 9,99 euro miesięcznie, a leży potem na tej samej maszynie co strona. Przestrzeń dyskowa obok jest nie tylko tańsza, jest też osobna.

Najczęstsze pytania

Czy mogę wstawić zdjęcia do strony bezpośrednio ze Storage Servera?
Nie przez bezpośredni odnośnik w znaczniku obrazka. Storage Server nie jest publicznym serwerem WWW, każdy dostęp wymaga zalogowania. Twój serwer WWW pobiera plik i podaje go dalej, albo generujesz odnośniki do pobrania ograniczone czasowo. Przy miniaturach lepszą drogą jest wygenerować je raz i trzymać w pamięci podręcznej na serwerze WWW.
Jaki protokół wybrać z serwera WWW?
Na własnym serwerze z uprawnieniami root najwygodniejsze są SMB albo SSHFS, przestrzeń dyskowa pojawia się wtedy jako zwykły katalog. Na hostingu współdzielonym bez uprawnień root to nie działa, tam drogą najmniejszego oporu jest WebDAV przez HTTPS, bo port 443 praktycznie nigdy nie jest zablokowany.
Czy Storage Server zastępuje CDN?
Nie. CDN rozkłada kopie na wiele lokalizacji i wydaje je wprost odwiedzającym. Storage Server to miejsce składowania w jednej lokalizacji, w którym każdy dostęp wymaga zalogowania. Jedno dopełnia drugie: oryginały na Storage Serverze, wydawane wersje przez serwer WWW albo CDN.
Ile subkont mogę utworzyć?
Do 100, w każdym pakiecie. Każde subkonto ma własny katalog startowy, własne hasło i własne uprawnienia protokołów. Strona dostaje w ten sposób konto, któremu wolno tylko SFTP i które widzi tylko swój katalog, a kopia zapasowa dostaje osobne.
Czy mogę przypisać subkontu własne miejsce?
Nie, limitu miejsca na subkonto nie ma. Subkonto zostaje w swoim katalogu, ale może tam zająć całe miejsce z pakietu. Kto chce ograniczyć poszczególnych użytkowników, musi zrobić to w swojej własnej aplikacji.
Jak szybki jest dostęp?
Przy dużych plikach ciągiem bardzo dobry, wąskim gardłem jest łącze twojego serwera WWW. Przy wielu małych dostępach po kolei do każdego pliku dochodzi opóźnienie sieci. Dlatego oryginały i archiwa powinny leżeć na Storage Serverze, a często ładowane drobiazgi jak miniatury w pamięci podręcznej na serwerze WWW.
Czy dane dostępowe są widoczne w przeglądarce?
Tylko jeśli zbudujesz to źle. Poprawnie jest tak, że serwer WWW zestawia połączenie i podaje plik dalej. Dane dostępowe zostają wtedy na serwerze i nie pojawiają się ani w kodzie źródłowym, ani w adresie.
Czy mogę w ten sposób robić też kopie zapasowe strony?
Tak, i to jest najprostszy początek. Z rsync albo BorgBackup przesyłasz tylko zmiany, a do tego dochodzą migawki samej przestrzeni dyskowej jako druga warstwa. W zależności od pakietu możliwych jest od 10 do 40 migawek, plus tyle samo automatycznych.
Czy potrzebuję do tego własnego serwera?
Nie. Z hostingu współdzielonego też to działa, wtedy przez WebDAV albo SFTP z poziomu PHP. Tylko montowanie jako dysk wymaga uprawnień root, a przez to własnego serwera.
Ile to kosztuje?
Storage-1 z 1 TB kosztuje 9,99 euro miesięcznie, Storage-2 z 5 TB 29,99, Storage-3 z 10 TB 39,99, a Storage-4 z 20 TB 69,99. Bez opłaty instalacyjnej, w modelu PrePaid i bez minimalnego okresu umowy, lokalizacja Niemcy.

Storage Server Webserver WebDAV SFTP Mediendateien Downloads Backup