70 lines
3.4 KiB
Markdown
70 lines
3.4 KiB
Markdown
---
|
||
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
|
||
```
|
||
|
||

|
||
|
||
[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
|