Storage Server для вашего сайта: изображения, загрузки, архивы

Опубликовано 6 мин. чтения

Место на веб-сервере дорогое, на Storage Server нет. В статье разобрано, что можно вынести, какой протокол работает со стороны веб-сервера и как файлы безопасно доходят до посетителей.

На веб-сервере дисковое место это самое дорогое, что там есть. Оно лежит на быстрых NVMe-SSD, рассчитанных на базы данных и PHP, и с каждым гигабайтом заметно дорожает. При этом там же лежат вещи, которым эта скорость не нужна никогда: оригиналы фотографий, видеофайлы, архивы для загрузки, старые резервные копии.

Storage Server стоит малую долю от этого и забирает ровно эту нагрузку. В статье разобрано, что имеет смысл вынести, какой протокол работает со стороны веб-сервера, как файлы безопасно доходят до посетителей и где границы.

Что стоит выносить, а что нет

Место на хранилищеОстаётся на веб-сервере
Оригиналы изображений и видеоМиниатюры и обрезанные версии
Архивы для загрузки, файлы ISO, подборки PDFCSS, JavaScript, шрифты
Сырые данные, экспорты, архивы журналовБаза данных
Резервные копии сайтаВсё, что нужно при каждом открытии страницы

Граница простая: что читается редко и передаётся один раз большим куском, тому место на хранилище. Что подгружается при каждом открытии страницы, остаётся там, где быстро.

Что такое Storage Server и чем он не является

Storage Server это сетевое хранилище с учётными записями. Вы подключаетесь с данными доступа и читаете или записываете файлы. Это не объектное хранилище с публичными адресами и не CDN.

На практике это значит: вставить в страницу изображение прямой ссылкой на хранилище нельзя, потому что каждое обращение требует входа. Ваш веб-сервер забирает файл и передаёт его дальше, либо вы сами создаёте ссылки на загрузку с ограниченным сроком. Как сделать это чисто, разобрано ниже.

Звучит как ограничение, но в этом есть и плюс: никто не утащит ваши файлы, угадывая адреса или передавая ссылку дальше. Доступ всегда идёт через ваше приложение, а значит по вашим правилам.

Схема, которая работает на практике

Три шага, больше ничего:

  1. Оригиналы лежат на хранилище. Их загружают один раз и потом трогают редко.
  2. Производные версии создаются один раз и лежат на веб-сервере. То есть миниатюры, обрезанные варианты, сжатые версии. Они маленькие, и они нужны при каждом открытии страницы.
  3. Загрузки идут через ваше приложение. Небольшой скрипт проверяет право доступа, забирает файл с хранилища и выдаёт его.

Кто перевернёт это и будет при каждом открытии тянуть миниатюры с хранилища заново, построит медленный сайт. Время передачи по сети на каждый файл складывается, и галерея из сорока изображений ждёт сорок раз.

Какой протокол для какого случая

ПротоколПортХорош дляТребует
SMB / CIFS445монтирования как каталогаправ root на сервере
SSHFS23монтирования как каталога, с шифрованиемправ root на сервере
SFTP23доступа из PHP, скриптов, передачисходящего порта 23
WebDAV по HTTPS443shared-хостинга, ограниченных окруженийтолько HTTPS
rsync23синхронизации больших каталоговисходящего порта 23
BorgBackup23резервных копий с дедупликациейисходящего порта 23

Главное решение зависит не от вкуса, а от ваших прав: на своём сервере вы монтируете хранилище как каталог, и любое приложение может им пользоваться, ничего о нём не зная. Как это делается, разобрано в статье Подключение Storage Server как сетевого диска.

На shared-хостинге прав root у вас нет, монтирование поэтому отпадает. Там путь идёт через WebDAV или SFTP из самого приложения, и WebDAV обычно сопротивляется меньше, потому что порт 443 практически никогда не закрыт.

Настройка доступа из PHP

Для SFTP достаточно библиотеки на чистом PHP, расширение на сервере не нужно:

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('Ошибка входа');
}

// Загрузка файла
$sftp->put('/bilder/2026/original.jpg', '/tmp/upload.jpg', SFTP::SOURCE_LOCAL_FILE);

// Чтение файла
$inhalt = $sftp->get('/bilder/2026/original.jpg');

Для WebDAV хватает даже встроенного расширения 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);

Оба примера используют суб-аккаунт, а не основной аккаунт. Почему, в следующем разделе.

Для каждой задачи свой суб-аккаунт

Каждый Storage Server допускает до 100 суб-аккаунтов, причём в любом тарифе. Каждый получает:

  • свой начальный каталог, из которого он не выходит,
  • свой пароль,
  • свой набор разрешённых протоколов, то есть например только SFTP и никакой Samba.

Для сайта это значит: один суб-аккаунт для веб-сервера, которому разрешён только SFTP и виден только /web, второй для резервных копий, которому виден только /backup. Если веб-сервер однажды захватят, до резервных копий злоумышленник не доберётся, потому что этот аккаунт их просто не знает.

Одна граница есть: собственной доли места суб-аккаунт не получает. Он остаётся в своём каталоге, но может заполнить там весь объём тарифа. Кому нужно действительно ограничивать отдельных пользователей, тому нужно приложение впереди, которое это возьмёт на себя. Статья Подключение Nextcloud к Storage Server показывает именно такую схему.

Безопасная выдача загрузок

Самая частая ошибка это пустить данные доступа в браузер, например через ссылку с именем пользователя и паролем. Правильно так: ваш сервер устанавливает соединение и передаёт файл дальше:

<?php
// Проверка права доступа, прежде чем произойдёт что-либо ещё
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;

У очень больших файлов лучше читать блоками, а не грузить всё в память, иначе лимит памяти PHP не выдержит. Поставьте для этого ob_end_flush() и отдавайте файл частями.

Кто ждёт много одновременных загрузок, тому стоит учесть ещё одно: каждая идущая загрузка занимает процесс PHP. С определённого масштаба такому место за своим сервером, а не за shared-хостингом.

Резервное копирование сайта на хранилище

Это самый простой старт, и польза от него сразу. С rsync вы передаёте только изменения:

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

Для резервных копий с дедупликацией и шифрованием лучше подходит BorgBackup, на хранилище он доступен нативно. К этому добавляются снимки самого хранилища как второй уровень: в зависимости от тарифа 10, 20, 30 или 40 ручных снимков, плюс столько же автоматических в ежедневном, еженедельном и ежемесячном ритме.

Отличие от резервной копии на том же сервере решающее: удалённый или зашифрованный диск забирает локальную копию с собой, копию на отдельном хранилище нет.

Прежде чем начать: два переключателя

В личном кабинете у Storage Server есть кнопка «Настройки доступа». Два момента должны быть в порядке:

  • Внешняя доступность должна быть включена, иначе ваш веб-сервер не доберётся до хранилища через интернет.
  • Нужный протокол должен быть разрешён, то есть Samba для SMB, SSH для SFTP и rsync, WebDAV для пути через HTTPS.

На вновь заказанных серверах всё это включено. Кто из соображений безопасности отключает ненужное, пусть помнит: именно это потом самая частая причина жалобы «перестало работать».

Какой тариф подходит

ТарифМестоСуб-аккаунтыСнимкиЦена
Storage-11 ТБ10010 плюс 10 автоматических9,99 EUR
Storage-25 ТБ10020 плюс 20 автоматических29,99 EUR
Storage-310 ТБ10030 плюс 30 автоматических39,99 EUR
Storage-420 ТБ10040 плюс 40 автоматических69,99 EUR

Все Storage Server стоят в Германии, говорят на FTP, FTPS, SFTP, SCP, Samba, WebDAV и WebDAVs, нативно приносят с собой rsync и BorgBackup и имеют IPv4 и IPv6. Платы за установку нет, расчёт идёт по модели PrePaid без минимального срока. То есть вы можете начать с 1 ТБ и позже увеличить объём, не переезжая.

Для расчёта: 1 ТБ дополнительного места на веб-сервере стоит, смотря у кого, в несколько раз больше 9,99 евро в месяц, и лежит он тогда на той же машине, что и сайт. Хранилище рядом не только дешевле, оно ещё и отдельное.

Частые вопросы

Можно ли вставить изображения в сайт прямой ссылкой на Storage Server?
Прямой ссылкой в теге изображения нет. Storage Server это не публичный веб-сервер, каждое обращение к нему требует входа. Ваш веб-сервер забирает файл и передаёт его дальше, либо вы создаёте ссылки на загрузку с ограниченным сроком. Для миниатюр лучший путь это создать их один раз и закешировать на веб-сервере.
Какой протокол выбрать со стороны веб-сервера?
На своём сервере с правами root удобнее всего SMB или SSHFS, хранилище тогда выглядит как обычный каталог. На shared-хостинге без прав root так не получится, там путь наименьшего сопротивления это WebDAV по HTTPS, потому что порт 443 практически никогда не закрыт.
Заменяет ли Storage Server сеть CDN?
Нет. CDN раскладывает копии по многим площадкам и отдаёт их прямо посетителям. Storage Server это место хранения на одной площадке, и каждое обращение к нему требует входа. Одно дополняет другое: оригиналы на хранилище, выдаваемые версии через веб-сервер или CDN.
Сколько суб-аккаунтов можно создать?
До 100, в любом тарифе. У каждого суб-аккаунта свой начальный каталог, свой пароль и свой набор разрешённых протоколов. Так сайт получает аккаунт, которому разрешён только SFTP и виден только его каталог, а резервное копирование получает отдельный.
Можно ли выделить суб-аккаунту собственный объём?
Нет, квоты на суб-аккаунт не существует. Суб-аккаунт остаётся в своём каталоге, но может занять там всё место тарифа. Кто хочет ограничивать отдельных пользователей, должен делать это в своём приложении.
Насколько быстрый доступ?
Для больших файлов целиком очень хороший, узкое место это канал вашего веб-сервера. Для множества мелких обращений подряд к каждому файлу добавляется время передачи по сети. Поэтому оригиналам и архивам место на хранилище, а часто запрашиваемой мелочи вроде миниатюр в кеше на веб-сервере.
Видны ли данные доступа в браузере?
Только если вы соберёте это неправильно. Правильно так: веб-сервер устанавливает соединение и передаёт файл дальше. Данные доступа остаются тогда на сервере и не появляются ни в исходном коде, ни в адресе.
Можно ли так же делать резервные копии сайта?
Да, и это самый простой старт. С rsync или BorgBackup вы передаёте только изменения, к этому добавляются снимки хранилища как второй уровень. В зависимости от тарифа возможны от 10 до 40 снимков, плюс столько же автоматических.
Нужен ли для этого свой сервер?
Нет. С shared-хостинга это тоже работает, тогда через WebDAV или SFTP прямо из PHP. Права root и свой сервер нужны только для монтирования хранилища как диска.
Сколько это стоит?
Storage-1 на 1 ТБ стоит 9,99 евро в месяц, Storage-2 на 5 ТБ 29,99, Storage-3 на 10 ТБ 39,99 и Storage-4 на 20 ТБ 69,99. Без платы за установку, по модели PrePaid и без минимального срока, расположение в Германии.

Storage Server Webserver WebDAV SFTP Mediendateien Downloads Backup