Яндекс.Диск для хостинга картинок
У Яндекс.Диска есть замечательная функция. Он может создавать превью загруженных фотографий. Эта функциональность не афишируется, но описана в документации.
У меня есть фотография на Диске /img/kemsky.jpg
. Чтобы получить ее превью, нужно выполнить
запрос:
GET /img/kemsky.jpg?preview&size=XS
User-Agent: my_application/0.0.1
Host: webdav.yandex.ru
Authorization: OAuth 0c4182a7c2cf4521964a72ff57a34a07
Но есть проблема. Для запросов нужен токен. Без токена не получится использовать это API для публичного хостинга.
Решение - сервер 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 "OAuth 0c4182a7c2cf4521964a72ff57a34a07"
}
tls anwinged@ya.ru
}
Директива proxy /img
будет направлять все запросы с preview.vakhrushev.me/img
на
https://webdav.yandex.ru/img
. Таким образом во внешний мир будет смотреть только директория
img
, а остальные останутся скрытыми.
Кроме OAuth авторизации можно использовать Basic, передавая логин и пароль приложения. Мне этот способ удобнее, чтобы не заморачиваться с OAuth. Логин и пароль я храню зашифрованными с помощью Ansible Vault. И строчка с заголовком тогда будет выглядеть так:
header_upstream Authorization "Basic {{ (yandex_disk.login ~ ':' ~ yandex_disk.password) | b64encode }}"
А так будет выглядеть ссылка на картинку:
https://preview.vakhrushev.me/img/kemsky.jpg?preview&size=XXL
08.08.2019, anton@vakhrushev.me