Заметка про хостинг фотографий

This commit is contained in:
Anton Vakhrushev 2019-09-03 22:54:11 +03:00
parent 6284216f56
commit 252e133be1
2 changed files with 49 additions and 40 deletions

View File

@ -1,61 +1,68 @@
--- ---
title: Яндекс.Диск как хостинг картинок title: Яндекс.Диск для хостинга картинок
description: Использование возможностей Яндекс.Диска для хостинга картинок
keywords: [яндекс.диск, хостинг картинок, yandex disk, image hosting, hosting] 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 для публичного хостинга.
в виде жесткого диска себе в систему.
Одним из первых вариантов было написать прокси для того, чтобы использовать Решение - сервер [Caddy](caddy) в качестве прокси. Caddy очень
именно WebDav и проксировать к нему запросы. У меня был бы web-server, удобно использовать в качестве фронтенда для внутренних сервисов.
который принимал бы http-запросы и направлял их Диску. Он просто настраивается, а самое главное - поддерживает автоматический
выпуск и обновление SSL-сертификатов буквально одной строчкой конфига.
С этой мыслью я и пошел читать документацию к Яндекс.Диску. И в самом конце Скроем токен в конфигурации сервера, и будем передавать его при обращении
наше жемчужину. Оказывается, именно для изображений Диск умеет создавать к Яндекс.Диску:
превью. Можно просто передать нужное разрешений и диск отдаст картинку.
Это было то, что нужно. Но для публичного использования было одно препятствие.
Для доступа к данным нужно авторизоваться. Делается это с помощью http-заголовка
`Authorization`.
Получалось, что все равно нужен прокси, чтобы скрыть авторизационные данные.
Прокрутив решения с отдельным приложением, которое бы подставляло в
запросы заголовок `Authorization`, я вспомнил о сервере [Caddy](caddy).
С его помощью прокси настраивается буквально в три строки.
``` ```
preview.vakhrushev.me { preview.vakhrushev.me {
proxy /img https://webdav.yandex.ru { proxy /img https://webdav.yandex.ru {
transparent transparent
header_upstream User-Agent "yandex-disk-previewer/1.0" 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 tls anwinged@ya.ru
} }
``` ```
Данные авторизации я поместил в хранилище Ansible Vault и подставляю Директива `proxy /img` будет направлять все запросы с `preview.vakhrushev.me/img`
при развертывании конфигурации на свой сервер. Также настройка прокси на `https://webdav.yandex.ru/img`. Таким образом во внешний
ограничивает директории, к которым можно получить доступ. мир будет смотреть только директория `img`, а остальные останутся скрытыми.
Так как на Яндекс.Диске у меня хранятся и личные данные.
[ya-disk](https://disk.yandex.ru) Кроме OAuth авторизации можно использовать Basic, передавая логин и
[ya-api](https://yandex.ru/dev/disk/doc/dg/concepts/quickstart-docpage/) [пароль приложения](app-password). Мне этот способ удобнее,
[ya-api-preview](https://yandex.ru/dev/disk/doc/dg/reference/preview-docpage/) чтобы не заморачиваться с OAuth. Логин и пароль я храню
[caddy](https://caddyserver.com/) зашифрованными с помощью [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

View File

@ -11,6 +11,8 @@
{# Description #} {# Description #}
{% if page.description is defined %} {% if page.description is defined %}
<meta name="description" content="{{ page.description }}"> <meta name="description" content="{{ page.description }}">
{% elseif page.title is defined %}
<meta name="description" content="{{ page.title }}">
{% endif %} {% endif %}
{% if page.keywords is defined and page.keywords %} {% if page.keywords is defined and page.keywords %}