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