Яндекс.Диск для хостинга картинок

У Яндекс.Диска есть замечательная функция. Он может создавать превью загруженных фотографий. Эта функциональность не афишируется, но описана в документации.

У меня есть фотография на Диске /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