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 ГБ сховища, картка не потрібна. Решта — коли пакет стане тісним.