вживую Медиа-хост для приложений, витрин и маркетплейсов
Изображения и видео в каждом нужном размере на вашем домене
Пришлите оригинал одним подписанным запросом. keepix сделает именованные варианты, разложит видео на ступени качества, снимет метаданные и отдаст всё это с вашего поддомена — с вечным кешем и без единого похода в чужой интернет.
- 1 ГБ бесплатно, без карты
- WebP q82 и HLS
- Ноль сторонних запросов
- 696 423файлов на хранении
- 701 714вариантов собрано
- 40 GBвариантов готовы к отдаче
- 424работ на стоке
- 0сторонних запросов
вживую Прямо из базы сервиса, пересобирается каждый час — последний раз в 01:25 UTC.
Что происходит при приёме
Шесть шагов, из которых не выпрыгнешь
На сервисе лежат файлы, которые прислали люди: фото в отзывах, видеообзоры. Всё ниже написано ради них, а не для галочки.
- 00 Подписанный запрос Один POST с оригиналом в теле и подписью HMAC над методом, путём, временем и хешем тела.
- 01 Тип определяется разбором По содержимому, а не по расширению и не по словам клиента. Расширение файла на выходе ставим мы.
-
02
Проверка на вирусы
Сканер недоступен — приём отказывает с
503, а не пропускает файл. - 03 Перекодирование Изображение никогда не отдаётся таким, каким пришло. Ни один байт присланного файла не уходит наружу.
- 04 Метаданные снимаются EXIF и GPS не переживают перекодирования. Это встроено в путь, а не оставлено на того, кто загружает.
- 05 Адреса в ответе Адрес объявляет сервис. Вы его храните и никогда не вычисляете.
SVG не принимается и не отдаётся. Никогда.
Ни на входе, ни на выходе: это исполняемая разметка, а не картинка. Внутри может жить скрипт, и он выполнится в браузере читателя от имени вашего домена. Проверка идёт дважды — по типу содержимого и по началу файла. Как устроен приём.
Что он умеет
Всё, что сервис делает с вашим файлом
И ровно столько: ни каталога товаров, ни отзывов, ни участников — только байты, адреса и варианты.
-
Именованные варианты
thumb400,card1000,full1400 — WebP с качеством 82. Вариант просят по имени, а не числом пикселей:?w=473— это и взрыв кеша, и бесплатный способ занять процессор. -
Видео целым набором
HLS до трёх ступеней, кадр-обложка с начала ролика, беззвучный клип первых секунд и прогрессивный MP4 для старых клиентов. Входит в платные тарифы.
-
Ваш домен, а не наш
Файлы отдаются с
img.вашдомен. Читатель видит ваш адрес и ваш бренд. На бесплатном тарифе домен общий. -
Адрес живёт вместе с файлом
В адресе — хеш содержимого. Кеш держится вечно, а заменённое изображение доходит до читателя сразу.
-
Медиатека без единой строчки кода
Папки, перетаскивание мышью, поиск по названию, описанию и тегам — прямо в кабинете.
-
Два ключа, смена без простоя
В ходу всегда два ключа подписи. Секрет показывается один раз и панели управления не передаётся.
-
Расход виден по дням
Хранение, трафик отдачи и операции считаются с начала месяца, а сверх пакета счёт помётровый — до сотых цента. Кабинет рисует это графиками, прогнозирует конец месяца и выгружает каждый день в CSV.
-
Стереть обычные загрузки человека
Один
eraseпо вашемуowner_ref— в ответе число стёртых объектов. Записи и байты уходят сразу. Ограничение для стока. -
Новый размер без повторной загрузки
Оригинал лежит в холодном дереве и наружу не отдаётся. Новый вариант через год собирается из него.
-
Потеряли адрес? Спросите ещё раз
resolveвозвращает адреса по вашему ключу — их объявляет сервис, угадывать не нужно. -
Он не ходит в интернет
Сервис не знает ни одного стороннего адреса и не держит ваших записей: только арендатор, ключ, вид, байты, варианты.
Один запрос
Оригинал входит. Адреса выходят.
Каждый приватный запрос несёт четыре заголовка и HMAC-SHA256 над методом, путём вместе со строкой запроса, временем и хешем тела. Окно — 300 секунд; повтор подписывается заново.
- Идемпотентно: те же байты под тем же ключом возвращают те же адреса
- Отказ приходит с кодом, и у каждого кода одна английская формулировка
-
reconcileсверяет тысячу записей за запрос
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
$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'];
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
- 10 ГБ места
- 40 ГБ трафика отдачи
- 10 000 операций
- файл до 100 МБ
- видео и HLS
Pro
Популярный- 25 ГБ места
- 100 ГБ трафика отдачи
- 100 000 операций
- файл до 512 МБ
- видео и HLS
Business
- 100 ГБ места
- 400 ГБ трафика отдачи
- 1 000 000 операций
- файл до 2 ГБ
- видео и HLS
Вопросы
Что спрашивают до первого файла
Почему нельзя попросить произвольную ширину вроде ?w=473?
Потому что каждая отдельная ширина — это новый файл, который надо сделать, сохранить и закешировать. Открытый набор — это и взрыв кеша, и бесплатный способ занять процессор. Набор именованный и конечный — thumb, card, full, — и нужный выбирают по имени. Страница вариантов показывает, какой из них нужен блоку заданной ширины.
Оригинал хранится?
Да, в холодном дереве, и наружу он не отдаётся никогда. Ровно для этого его и держат: когда через год понадобится новый вариант, он собирается из оригинала, и файл не придётся присылать снова.
Можно ли отдавать файлы с моего домена?
На платных тарифах — да, с поддомена вроде img.вашдомен. Читатель видит ваш адрес и ваш
бренд. На бесплатном тарифе домен отдачи общий.
Что будет, когда я выйду за пакет?
На платных тарифах излишек считается помётрово, до сотых цента за гигабайт и операцию. На бесплатном приём просто останавливается: ничто не начинает тихо тратить ваши деньги.
Как стереть загрузки одного человека?
Один POST /api/v1/erase с вашим owner_ref. Строки и байты на диске уходят
сразу, а ответ называет число стёртых объектов. См. Файлы и люди. Файлы стока защищены и после снятия с витрины; см. правило 409.
Пришлите первый файл — адреса придут в ответе
Бесплатный тариф: 1 ГБ хранилища, карта не нужна. Остальное — когда пакет станет тесным.