keepix.cloud — картинки и видео на вашем домене Перейти к содержимому

вживую Медиа-хост для приложений, витрин и маркетплейсов

Изображения и видео в каждом нужном размере на вашем домене

Пришлите оригинал одним подписанным запросом. keepix сделает именованные варианты, разложит видео на ступени качества, снимет метаданные и отдаст всё это с вашего поддомена — с вечным кешем и без единого похода в чужой интернет.

  • 1 ГБ бесплатно, без карты
  • WebP q82 и HLS
  • Ноль сторонних запросов

вживую Прямо из базы сервиса, пересобирается каждый час — последний раз в 01:25 UTC.

Что происходит при приёме

Шесть шагов, из которых не выпрыгнешь

На сервисе лежат файлы, которые прислали люди: фото в отзывах, видеообзоры. Всё ниже написано ради них, а не для галочки.

  1. 00 Подписанный запрос Один POST с оригиналом в теле и подписью HMAC над методом, путём, временем и хешем тела.
  2. 01 Тип определяется разбором По содержимому, а не по расширению и не по словам клиента. Расширение файла на выходе ставим мы.
  3. 02 Проверка на вирусы Сканер недоступен — приём отказывает с 503, а не пропускает файл.
  4. 03 Перекодирование Изображение никогда не отдаётся таким, каким пришло. Ни один байт присланного файла не уходит наружу.
  5. 04 Метаданные снимаются EXIF и GPS не переживают перекодирования. Это встроено в путь, а не оставлено на того, кто загружает.
  6. 05 Адреса в ответе Адрес объявляет сервис. Вы его храните и никогда не вычисляете.

SVG не принимается и не отдаётся. Никогда.

Ни на входе, ни на выходе: это исполняемая разметка, а не картинка. Внутри может жить скрипт, и он выполнится в браузере читателя от имени вашего домена. Проверка идёт дважды — по типу содержимого и по началу файла. Как устроен приём.

Что он умеет

Всё, что сервис делает с вашим файлом

И ровно столько: ни каталога товаров, ни отзывов, ни участников — только байты, адреса и варианты.

  • Именованные варианты

    thumb 400, card 1000, full 1400 — WebP с качеством 82. Вариант просят по имени, а не числом пикселей: ?w=473 — это и взрыв кеша, и бесплатный способ занять процессор.

  • Видео целым набором

    HLS до трёх ступеней, кадр-обложка с начала ролика, беззвучный клип первых секунд и прогрессивный MP4 для старых клиентов. Входит в платные тарифы.

  • Ваш домен, а не наш

    Файлы отдаются с img.вашдомен. Читатель видит ваш адрес и ваш бренд. На бесплатном тарифе домен общий.

  • Адрес живёт вместе с файлом

    В адресе — хеш содержимого. Кеш держится вечно, а заменённое изображение доходит до читателя сразу.

  • Медиатека без единой строчки кода

    Папки, перетаскивание мышью, поиск по названию, описанию и тегам — прямо в кабинете.

  • Два ключа, смена без простоя

    В ходу всегда два ключа подписи. Секрет показывается один раз и панели управления не передаётся.

  • Расход виден по дням

    Хранение, трафик отдачи и операции считаются с начала месяца, а сверх пакета счёт помётровый — до сотых цента. Кабинет рисует это графиками, прогнозирует конец месяца и выгружает каждый день в CSV.

  • Стереть обычные загрузки человека

    Один erase по вашему owner_ref — в ответе число стёртых объектов. Записи и байты уходят сразу. Ограничение для стока.

  • Новый размер без повторной загрузки

    Оригинал лежит в холодном дереве и наружу не отдаётся. Новый вариант через год собирается из него.

  • Потеряли адрес? Спросите ещё раз

    resolve возвращает адреса по вашему ключу — их объявляет сервис, угадывать не нужно.

  • Он не ходит в интернет

    Сервис не знает ни одного стороннего адреса и не держит ваших записей: только арендатор, ключ, вид, байты, варианты.

Один запрос

Оригинал входит. Адреса выходят.

Каждый приватный запрос несёт четыре заголовка и HMAC-SHA256 над методом, путём вместе со строкой запроса, временем и хешем тела. Окно — 300 секунд; повтор подписывается заново.

  • Идемпотентно: те же байты под тем же ключом возвращают те же адреса
  • Отказ приходит с кодом, и у каждого кода одна английская формулировка
  • reconcile сверяет тысячу записей за запрос

Весь договор

curl
TS=$(date +%s); PATHQ="/api/v1/put?kind=media&key=48120&variants=card,full"
BH=$(sha256sum photo.jpg | cut -d' ' -f1)
SIG=$(printf 'POST\n%s\n%s\n%s' "$PATHQ" "$TS" "$BH" \
  | openssl dgst -sha256 -hmac "$KP_SECRET" -hex | sed 's/.*= //')

curl -X POST "https://keepix.cloud$PATHQ" \
  -H "X-Media-Tenant: $KP_TENANT" -H "X-Media-Key-Id: $KP_KEYID" \
  -H "X-Media-Ts: $TS" -H "X-Media-Sign: $SIG" \
  --data-binary @photo.jpg
PHP
$path = '/api/v1/put?kind=media&key=48120&variants=card,full';
$body = file_get_contents('photo.jpg');
$ts   = (string) time();
$sign = hash_hmac('sha256', "POST\n$path\n$ts\n" . hash('sha256', $body), $secret);

$ch = curl_init('https://keepix.cloud' . $path);
curl_setopt_array($ch, [
    CURLOPT_POST => true, CURLOPT_POSTFIELDS => $body, CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => ["X-Media-Tenant: $tenant", "X-Media-Key-Id: $keyId",
                           "X-Media-Ts: $ts", "X-Media-Sign: $sign"],
]);
$variants = json_decode(curl_exec($ch), true)['variants'];
Node.js
import { createHash, createHmac } from 'node:crypto';
import { readFile } from 'node:fs/promises';

const path = '/api/v1/put?kind=media&key=48120&variants=card,full';
const body = await readFile('photo.jpg');
const ts = String(Math.floor(Date.now() / 1000));
const bh = createHash('sha256').update(body).digest('hex');
const sign = createHmac('sha256', secret).update(`POST\n${path}\n${ts}\n${bh}`).digest('hex');

const res = await fetch('https://keepix.cloud' + path, { method: 'POST', body,
  headers: { 'X-Media-Tenant': tenant, 'X-Media-Key-Id': keyId, 'X-Media-Ts': ts, 'X-Media-Sign': sign } });
const { variants } = await res.json();

Тарифы

Пакет задаёт, что входит

Сверх него — помётровая оплата, и только на платных тарифах. На бесплатном приём останавливается, а не начинает тихо тратить ваши деньги.

Free

Попробовать и понять, подходит ли
бесплатно
  • 1 ГБ места
  • 5 ГБ трафика отдачи
  • 500 операций
  • файл до 25 МБ
  • без видео
Начать

Start

Один проект и первые пользователи
5,00 $ / мес
  • 10 ГБ места
  • 40 ГБ трафика отдачи
  • 10 000 операций
  • файл до 100 МБ
  • видео и HLS
Начать

Pro

Популярный
Витрина, видео и продажа своего в стоке
19,00 $ / мес
  • 25 ГБ места
  • 100 ГБ трафика отдачи
  • 100 000 операций
  • файл до 512 МБ
  • видео и HLS
Начать

Business

Несколько проектов и свои домены
79,00 $ / мес
  • 100 ГБ места
  • 400 ГБ трафика отдачи
  • 1 000 000 операций
  • файл до 2 ГБ
  • видео и HLS
Начать

Посчитать свой месяц на странице тарифов

Вопросы

Что спрашивают до первого файла

Почему нельзя попросить произвольную ширину вроде ?w=473?

Потому что каждая отдельная ширина — это новый файл, который надо сделать, сохранить и закешировать. Открытый набор — это и взрыв кеша, и бесплатный способ занять процессор. Набор именованный и конечный — thumb, card, full, — и нужный выбирают по имени. Страница вариантов показывает, какой из них нужен блоку заданной ширины.

Оригинал хранится?

Да, в холодном дереве, и наружу он не отдаётся никогда. Ровно для этого его и держат: когда через год понадобится новый вариант, он собирается из оригинала, и файл не придётся присылать снова.

Можно ли отдавать файлы с моего домена?

На платных тарифах — да, с поддомена вроде img.вашдомен. Читатель видит ваш адрес и ваш бренд. На бесплатном тарифе домен отдачи общий.

Что будет, когда я выйду за пакет?

На платных тарифах излишек считается помётрово, до сотых цента за гигабайт и операцию. На бесплатном приём просто останавливается: ничто не начинает тихо тратить ваши деньги.

Как стереть загрузки одного человека?

Один POST /api/v1/erase с вашим owner_ref. Строки и байты на диске уходят сразу, а ответ называет число стёртых объектов. См. Файлы и люди. Файлы стока защищены и после снятия с витрины; см. правило 409.

Пришлите первый файл — адреса придут в ответе

Бесплатный тариф: 1 ГБ хранилища, карта не нужна. Остальное — когда пакет станет тесным.