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