Pull to refresh

Comments 25

Не рассматривали вариант монтирования диска в vps, через fuse например, и раздачи файлов как обычной статики?

Пробовал ocamlfuse — не понравилось.
Больше задержка и потребление CPU в районе 25% ядра на один запрос (с nginx 1-2%).

Да сейчас уже поздно, текущее решение хорошо работает. Дальше интересно копнуть в сторону телеграма: попробовать дробить файлы на куски и хранить в каком-нибудь приватном канале, а потом склеивать nginx'ом, но без lua (с lua любой дурак сможет). Проблема, естественно, с последним пунктом.

Статью надо было назвать «Использование X-Accel-Redirect в Nginx». PHP и fpm тут вообще ни к месту, гораздо интереснее было бы использовать Lua, либо другой язык сценариев, которые поддерживаются в Nginx. Для всего этого есть Object Storage, S3 подобные хранилища, в которых хранение 1.5 ТБ будет стоить не так уж дорого.

Ну, тут не только X-Accel-Redirect все же.
Да, php и fpm сугубо опциональны. Можно было хоть псевдокодом написать.


Насчет хранилищ — да, все верно. Может, даже дешевле гуглдиска. Но тогда бы не было этой статьи :).

Ну и гуглдиск за деньги это использую лично я. У кого студенческий, это выйдет бесплатно. У кого файлы меньше 50мб — можно любой объем (покуда совесть позволяет) хоть в телеграме хранить и по bot api раздавать, до 2гб по user api.

Статья — ок, но открой для себя rclone serve :-).

Спасибо, посмотрел — очень интересная штука.
Но раздавать получится только с поддерживаемых сервисов, насколько я понял, т.е. соц.сети и мессенджеры отпадают.

Стоимость хранения 1TB в месяц:

Amazon s3 — 23 usd — aws.amazon.com/ru/s3/pricing
Scaleway (s3-совместимый) — 10 euro — www.scaleway.com/en/pricing/#object-storage
Hetzner — 9.48 euro (incl. 20 % VAT) — www.hetzner.com/storage/storage-box
Google Drive (2 ТБ) — 700 рублей — one.google.com/storage?i=m
Yandex Disk — 300 рублей — disk.yandex.ru/tuning

Спасибо за статью, не думал, что можно использовать Google Drive/Yandex Disk для раздачи файлов на сайте. Понятное дело, что для коммерческого проекта это может не очень подходить, но для домашнего — вполне норм.

Для коммерческого проекта, я думаю, вообще не стоит. Но коммерческий проект и предполагает финансовые вложения. А у меня был оплачен гуглдиск на ближайший год и хотелось развернуться на том, что есть. И еще надо куда-то было девать любовь к экспериментам :)

Тут еще стоит добавить, что если прям хранить и иногда вытаскивать, можно использовать Google Cloud Coldline Storage, который в отличии от S3 Cold Storage умеет отдавать данные без предзапроса и стоит 4 доллара за терабайт (для europe-west-1 региона) + Get/Head запросы по 10 центов за 10к запросов.
Самое неприятное — стоимость трафика, 12 центов за гигабайт исходящего. Но на фоне остальных Object Storage не так уж и плохо. Но, конечно, google drive и ya.drive дешевле.
А есть данные по латенси у такого решения?

Латенси не очень, до 5 секунд. Примерно как в интерфейсе гуглдиска. Ассеты, например, раздавать не выйдет.

Можно пропустить через Cloudflare или подобные сервисы.
Первый запрос из зоны будет долгим, потом, из кеша CDN — достаточно быстро.
Прогреть кеш, чтобы небыло долгого первого запроса — можно через сторонние сервисы.
Интересно, а какие в принципе есть подводные камни злоупотребления гугл диском. К примеру, gsuite enterprise за $25 за юзера в месяц дает безлимитный диск каждому юзеру. Из того, что проверял, большие файлы закачиваются туда со скоростью 500Мбит/сек из европейского дата-центра, и после заливки файлов на 1ТБ скорость (пока) не упала.

Возникает вопрос, а что, если, к примеру, приспособить его под вечное хранилище бекапов или логов, и лить по несколько ТБ каждый день? Прийдет день, когда скорость опустится до условных 56Кбит, или старые файлы начнут исчезать, или просто позвонят, и скажут, что разорвут договор в одностороннем порядке, если не прекратить?
Я думаю что звонить никто не будет. Просто однажды забанят без предупреждения, как они делают в других случаях. И все файлы превратятся в тыкву.

Поясните, пожалуйста, что за трюк с PHP? Почему нельзя все одним конфигом nginx-а сделать?

Я тоже иногда промахиваюсь с ответами. Особенно, когда с телефона комментирую.

Точно, вот что я упустил рассказать.

Во-первых время жизни токена Google Drive — 1 час. И нужно как-то провернуть его ротацию. На голых конфигах это сделать не получится. Можно с помощью luа или используя вот такой вот подход, как в посте, но нам нужно проверить не истекло ли время действия токена и, в случае чего, дернуть гугл, чтоб его обновить. А потом этот токен мы уже передадим nginx'y.

Во-вторых через X-Accel-Redirect удобно делать динамические ссылки и прятать реальные id файла на гуглдиске.
Например, мы хотим, чтоб загрузка у нас была по ссылке /dl/{long long random string}, которая проживет примерно час и только для какого-нибудь конкретного пользователя. Мы можем написать обвязку (не обязательно на php), все проверить и, в случае успеха, отдать файл через X-Accel-Redirect.

Условно как-то так
$condition = /*
    такой файл вообще существует
    AND пользователь имеет право скачать этот файл
    AND время действия динамической ссылки не истекло
    AND ссылка вообще запрашивалась именно этим пользователем
    AND еще куча проверок на наш вкус
*/;
    
if (!$condition) {
    http_response_code(404);
    echo 'Не удалось найти файл' . PHP_EOL;
    exit();
}

http_response_code(204);
header('File-Id: ' . $fileId);
header('Filename: ' . 'test.zip');
header('X-Accel-Redirect: ' . rawurlencode('/google_drive/' . TOKEN));
раздачу файлов пользователям с любого облачного хранилища

Можно с помощью «этого» подключиться к облаку mail.ru на устройстве с линукс?
Древний arm (armv5eabi), на котором не смог (после n-ой итерации плюнул искать «старые версии всех компонентов») собрать ocamlfuse и т.п.
Уже и не нужен fuse и т.п. — хоть как-то скачать/закачать в консоли. :(
В теории так можно и с облака mail.ru, хотя у них нет публичного апи, так что так сразу не подскажу. Но это только отдавать файл пользователю.

Зато их облако поддерживает webdav, можно поискать библиотеку или хоть курлом дергать, по аналогии с www.qed42.com/blog/using-curl-commands-webdav и fritool.ru/curl-for-webdav
Sign up to leave a comment.

Articles