From 252e133be10dfa2aecf39be2aa3f8f44814fe09c Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Tue, 3 Sep 2019 22:54:11 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=BC=D0=B5=D1=82=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BF=D1=80=D0=BE=20=D1=85=D0=BE=D1=81=D1=82=D0=B8=D0=BD=D0=B3?= =?UTF-8?q?=20=D1=84=D0=BE=D1=82=D0=BE=D0=B3=D1=80=D0=B0=D1=84=D0=B8=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../2019-08-08-yandex-disk-image-hosting.md | 87 ++++++++++--------- source/_includes/head.twig | 2 + 2 files changed, 49 insertions(+), 40 deletions(-) diff --git a/source/_articles/2019-08-08-yandex-disk-image-hosting.md b/source/_articles/2019-08-08-yandex-disk-image-hosting.md index 29a7666..977405e 100644 --- a/source/_articles/2019-08-08-yandex-disk-image-hosting.md +++ b/source/_articles/2019-08-08-yandex-disk-image-hosting.md @@ -1,61 +1,68 @@ --- -title: Яндекс.Диск как хостинг картинок -description: Использование возможностей Яндекс.Диска для хостинга картинок +title: Яндекс.Диск для хостинга картинок keywords: [яндекс.диск, хостинг картинок, yandex disk, image hosting, hosting] -draft: true --- -Я искал простой и надежный хостинг картинок для блога. Чтобы хранил картинки -годами, давал прямые ссылки и не закрылся в течение хотя бы пары лет. +У [Яндекс.Диска](ya-disk) есть замечательная функция. Он может создавать превью +загруженных фотографий. Эта функциональность не афишируется, но описана +в [документации](ya-api-preview). -Раньше я использовал в качестве хостинга фотографий для блога сервис -Яндекс.Фотки. С его помощью можно было получить картинки разных разрешений -для адаптивной верстки. Сервис работал уже продолжительно время, у него была -большая аудитория, им было удобно пользоваться. +У меня есть фотография на Диске `/img/kemsky.jpg`. Чтобы получить ее превью, +нужно выполнить запрос: -Но в один момент Яндекс решил закрыть сервис. Вместо него появился Яндекс.Диск, -а фотоальбомы теперь были представлены в виде коллекций. Так же просто как -раньше уже было не получить прямых ссылок на загруженные фотки. +``` +GET /img/kemsky.jpg?preview&size=XS +User-Agent: my_application/0.0.1 +Host: webdav.yandex.ru +Authorization: OAuth 0c4182a7c2cf4521964a72ff57a34a07 +``` -Яндекс.Диском я пользовался и до этого. Я знал, что он поддерживает -протокол WebDav. Это удобный протокол, с помощью которого можно подключить Диск -в виде жесткого диска себе в систему. +Но есть проблема. Для запросов нужен токен. Без токена не получится использовать +это API для публичного хостинга. -Одним из первых вариантов было написать прокси для того, чтобы использовать -именно WebDav и проксировать к нему запросы. У меня был бы web-server, -который принимал бы http-запросы и направлял их Диску. - -С этой мыслью я и пошел читать документацию к Яндекс.Диску. И в самом конце -наше жемчужину. Оказывается, именно для изображений Диск умеет создавать -превью. Можно просто передать нужное разрешений и диск отдаст картинку. - -Это было то, что нужно. Но для публичного использования было одно препятствие. -Для доступа к данным нужно авторизоваться. Делается это с помощью http-заголовка -`Authorization`. - -Получалось, что все равно нужен прокси, чтобы скрыть авторизационные данные. -Прокрутив решения с отдельным приложением, которое бы подставляло в -запросы заголовок `Authorization`, я вспомнил о сервере [Caddy](caddy). -С его помощью прокси настраивается буквально в три строки. +Решение - сервер [Caddy](caddy) в качестве прокси. Caddy очень +удобно использовать в качестве фронтенда для внутренних сервисов. +Он просто настраивается, а самое главное - поддерживает автоматический +выпуск и обновление SSL-сертификатов буквально одной строчкой конфига. +Скроем токен в конфигурации сервера, и будем передавать его при обращении +к Яндекс.Диску: ``` preview.vakhrushev.me { proxy /img https://webdav.yandex.ru { transparent header_upstream User-Agent "yandex-disk-previewer/1.0" - header_upstream Authorization "Basic {{ '{{' }} (yandex_disk.login ~ ':' ~ yandex_disk.password) | b64encode {{ '}}' }}" + header_upstream Authorization "OAuth 0c4182a7c2cf4521964a72ff57a34a07" } tls anwinged@ya.ru } ``` -Данные авторизации я поместил в хранилище Ansible Vault и подставляю -при развертывании конфигурации на свой сервер. Также настройка прокси -ограничивает директории, к которым можно получить доступ. -Так как на Яндекс.Диске у меня хранятся и личные данные. +Директива `proxy /img` будет направлять все запросы с `preview.vakhrushev.me/img` +на `https://webdav.yandex.ru/img`. Таким образом во внешний +мир будет смотреть только директория `img`, а остальные останутся скрытыми. -[ya-disk](https://disk.yandex.ru) -[ya-api](https://yandex.ru/dev/disk/doc/dg/concepts/quickstart-docpage/) -[ya-api-preview](https://yandex.ru/dev/disk/doc/dg/reference/preview-docpage/) -[caddy](https://caddyserver.com/) +Кроме OAuth авторизации можно использовать Basic, передавая логин и +[пароль приложения](app-password). Мне этот способ удобнее, +чтобы не заморачиваться с OAuth. Логин и пароль я храню +зашифрованными с помощью [Ansible Vault](vault). +И строчка с заголовком тогда будет выглядеть так: + +``` +header_upstream Authorization "Basic {{ '{{' }} (yandex_disk.login ~ ':' ~ yandex_disk.password) | b64encode {{ '}}' }}" +``` + +А так будет выглядеть ссылка на картинку: + +``` +https://preview.vakhrushev.me/img/kemsky.jpg?preview&size=XXL +``` + +![Кемский поселок](https://preview.vakhrushev.me/img/kemsky.jpg?preview&size=XXL) + +[ya-disk]: https://disk.yandex.ru +[ya-api]: https://yandex.ru/dev/disk/doc/dg/concepts/quickstart-docpage/ +[ya-api-preview]: https://yandex.ru/dev/disk/doc/dg/reference/preview-docpage/ +[caddy]: https://caddyserver.com/ +[app-password]: https://yandex.ru/support/passport/authorization/app-passwords.html diff --git a/source/_includes/head.twig b/source/_includes/head.twig index 9272fb8..2c94136 100644 --- a/source/_includes/head.twig +++ b/source/_includes/head.twig @@ -11,6 +11,8 @@ {# Description #} {% if page.description is defined %} +{% elseif page.title is defined %} + {% endif %} {% if page.keywords is defined and page.keywords %}