homepage/source/_articles/2019-08-08-yandex-disk-image-hosting.md

70 lines
3.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Яндекс.Диск для хостинга картинок
keywords: [яндекс.диск, хостинг картинок, yandex disk, image hosting, hosting]
---
У [Яндекс.Диска][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
```
Но есть проблема. Для запросов нужен токен. Без токена не получится использовать
это API для публичного хостинга.
Решение - сервер [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 "OAuth 0c4182a7c2cf4521964a72ff57a34a07"
}
tls anwinged@ya.ru
}
```
Директива `proxy /img` будет направлять все запросы с `preview.vakhrushev.me/img`
на `https://webdav.yandex.ru/img`. Таким образом во внешний
мир будет смотреть только директория `img`, а остальные останутся скрытыми.
Кроме 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
[vault]: https://docs.ansible.com/ansible/latest/user_guide/vault.html