Комментарии 25
Пробовал ocamlfuse — не понравилось.
Больше задержка и потребление CPU в районе 25% ядра на один запрос (с nginx 1-2%).
Use rclone, Luke!
Ну, тут не только X-Accel-Redirect все же.
Да, php и fpm сугубо опциональны. Можно было хоть псевдокодом написать.
Насчет хранилищ — да, все верно. Может, даже дешевле гуглдиска. Но тогда бы не было этой статьи :).
Ну и гуглдиск за деньги это использую лично я. У кого студенческий, это выйдет бесплатно. У кого файлы меньше 50мб — можно любой объем (покуда совесть позволяет) хоть в телеграме хранить и по bot api раздавать, до 2гб по user api.
Статья — ок, но открой для себя rclone serve :-).
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 для раздачи файлов на сайте. Понятное дело, что для коммерческого проекта это может не очень подходить, но для домашнего — вполне норм.
Для коммерческого проекта, я думаю, вообще не стоит. Но коммерческий проект и предполагает финансовые вложения. А у меня был оплачен гуглдиск на ближайший год и хотелось развернуться на том, что есть. И еще надо куда-то было девать любовь к экспериментам :)
Самое неприятное — стоимость трафика, 12 центов за гигабайт исходящего. Но на фоне остальных Object Storage не так уж и плохо. Но, конечно, google drive и ya.drive дешевле.
Латенси не очень, до 5 секунд. Примерно как в интерфейсе гуглдиска. Ассеты, например, раздавать не выйдет.
Первый запрос из зоны будет долгим, потом, из кеша CDN — достаточно быстро.
Прогреть кеш, чтобы небыло долгого первого запроса — можно через сторонние сервисы.
Возникает вопрос, а что, если, к примеру, приспособить его под вечное хранилище бекапов или логов, и лить по несколько ТБ каждый день? Прийдет день, когда скорость опустится до условных 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 и т.п. — хоть как-то скачать/закачать в консоли. :(
Зато их облако поддерживает webdav, можно поискать библиотеку или хоть курлом дергать, по аналогии с www.qed42.com/blog/using-curl-commands-webdav и fritool.ru/curl-for-webdav
Раздаем файлы с Google Drive посредством nginx