Заметка про хостинг фотографий
This commit is contained in:
parent
6284216f56
commit
252e133be1
@ -1,61 +1,68 @@
|
|||||||
---
|
---
|
||||||
title: Яндекс.Диск как хостинг картинок
|
title: Яндекс.Диск для хостинга картинок
|
||||||
description: Использование возможностей Яндекс.Диска для хостинга картинок
|
|
||||||
keywords: [яндекс.диск, хостинг картинок, yandex disk, image hosting, hosting]
|
keywords: [яндекс.диск, хостинг картинок, yandex disk, image hosting, hosting]
|
||||||
draft: true
|
|
||||||
---
|
---
|
||||||
|
|
||||||
Я искал простой и надежный хостинг картинок для блога. Чтобы хранил картинки
|
У [Яндекс.Диска](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
|
||||||
|
```
|
||||||
|
|
||||||
Яндекс.Диском я пользовался и до этого. Я знал, что он поддерживает
|
Но есть проблема. Для запросов нужен токен. Без токена не получится использовать
|
||||||
протокол WebDav. Это удобный протокол, с помощью которого можно подключить Диск
|
это API для публичного хостинга.
|
||||||
в виде жесткого диска себе в систему.
|
|
||||||
|
|
||||||
Одним из первых вариантов было написать прокси для того, чтобы использовать
|
Решение - сервер [Caddy](caddy) в качестве прокси. Caddy очень
|
||||||
именно WebDav и проксировать к нему запросы. У меня был бы web-server,
|
удобно использовать в качестве фронтенда для внутренних сервисов.
|
||||||
который принимал бы http-запросы и направлял их Диску.
|
Он просто настраивается, а самое главное - поддерживает автоматический
|
||||||
|
выпуск и обновление SSL-сертификатов буквально одной строчкой конфига.
|
||||||
С этой мыслью я и пошел читать документацию к Яндекс.Диску. И в самом конце
|
Скроем токен в конфигурации сервера, и будем передавать его при обращении
|
||||||
наше жемчужину. Оказывается, именно для изображений Диск умеет создавать
|
к Яндекс.Диску:
|
||||||
превью. Можно просто передать нужное разрешений и диск отдаст картинку.
|
|
||||||
|
|
||||||
Это было то, что нужно. Но для публичного использования было одно препятствие.
|
|
||||||
Для доступа к данным нужно авторизоваться. Делается это с помощью http-заголовка
|
|
||||||
`Authorization`.
|
|
||||||
|
|
||||||
Получалось, что все равно нужен прокси, чтобы скрыть авторизационные данные.
|
|
||||||
Прокрутив решения с отдельным приложением, которое бы подставляло в
|
|
||||||
запросы заголовок `Authorization`, я вспомнил о сервере [Caddy](caddy).
|
|
||||||
С его помощью прокси настраивается буквально в три строки.
|
|
||||||
|
|
||||||
```
|
```
|
||||||
preview.vakhrushev.me {
|
preview.vakhrushev.me {
|
||||||
proxy /img https://webdav.yandex.ru {
|
proxy /img https://webdav.yandex.ru {
|
||||||
transparent
|
transparent
|
||||||
header_upstream User-Agent "yandex-disk-previewer/1.0"
|
header_upstream User-Agent "yandex-disk-previewer/1.0"
|
||||||
header_upstream Authorization "Basic {{ '{{' }} (yandex_disk.login ~ ':' ~ yandex_disk.password) | b64encode {{ '}}' }}"
|
header_upstream Authorization "OAuth 0c4182a7c2cf4521964a72ff57a34a07"
|
||||||
}
|
}
|
||||||
|
|
||||||
tls anwinged@ya.ru
|
tls anwinged@ya.ru
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Данные авторизации я поместил в хранилище Ansible Vault и подставляю
|
Директива `proxy /img` будет направлять все запросы с `preview.vakhrushev.me/img`
|
||||||
при развертывании конфигурации на свой сервер. Также настройка прокси
|
на `https://webdav.yandex.ru/img`. Таким образом во внешний
|
||||||
ограничивает директории, к которым можно получить доступ.
|
мир будет смотреть только директория `img`, а остальные останутся скрытыми.
|
||||||
Так как на Яндекс.Диске у меня хранятся и личные данные.
|
|
||||||
|
|
||||||
[ya-disk](https://disk.yandex.ru)
|
Кроме OAuth авторизации можно использовать Basic, передавая логин и
|
||||||
[ya-api](https://yandex.ru/dev/disk/doc/dg/concepts/quickstart-docpage/)
|
[пароль приложения](app-password). Мне этот способ удобнее,
|
||||||
[ya-api-preview](https://yandex.ru/dev/disk/doc/dg/reference/preview-docpage/)
|
чтобы не заморачиваться с OAuth. Логин и пароль я храню
|
||||||
[caddy](https://caddyserver.com/)
|
зашифрованными с помощью [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
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
{# Description #}
|
{# Description #}
|
||||||
{% if page.description is defined %}
|
{% if page.description is defined %}
|
||||||
<meta name="description" content="{{ page.description }}">
|
<meta name="description" content="{{ page.description }}">
|
||||||
|
{% elseif page.title is defined %}
|
||||||
|
<meta name="description" content="{{ page.title }}">
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if page.keywords is defined and page.keywords %}
|
{% if page.keywords is defined and page.keywords %}
|
||||||
|
Loading…
Reference in New Issue
Block a user