Руководство по DenchikP CDN
DenchikP CDN хранит ваши файлы и раздаёт их по постоянным ссылкам. Этим можно управлять из веб-панели, из скриптов через API или из ShareX. Руководство описывает все возможности по порядку: от первой загрузки до настройки сервера.
1. Что такое DenchikP CDN
CDN (сеть доставки контента) отдаёт статические файлы — картинки, стили, скрипты, шрифты, архивы, документы — быстро и по неизменному адресу. DenchikP CDN состоит из четырёх частей:
| Адрес | Назначение |
|---|---|
| cdn.denchikp.com | Раздача файлов. Сюда ведут ссылки на ваши файлы. За ним стоит Cloudflare, поэтому популярные файлы кешируются. |
| cdnapi.denchikp.com | API: всё, что нужно для управления файлами, и публичные страницы ссылок для шаринга. |
| file.denchikp.com | Загрузка файлов (без ограничения размера тела запроса). Панель и ShareX отправляют файлы сюда. |
| static.denchikp.com | Панель управления, это руководство и справочник API. |
1.1. Как устроены адреса файлов
Любой файл имеет адрес вида
https://cdn.denchikp.com/<домен>/<папка>/<имя файла>
Например, https://cdn.denchikp.com/example.com/img/hero-banner.png:
- домен — «пространство» файлов. Обычно это домен вашего сайта (
example.com). Файлы разных доменов не пересекаются, и доступ к ним выдаётся отдельно. Есть общий доменpublic, доступный всем. - папка определяется автоматически по расширению файла:
img(картинки: jpg, png, webp, avif, svg, gif, heic и др.),video(mp4, webm, mov, mkv и др.),audio(mp3, wav, ogg, flac, m4a и др.),docs(pdf, документы Office и OpenDocument, txt, csv, md, epub),css,js,fonts(woff, woff2, ttf, otf, eot),files(всё остальное). Полный список — в разделе Справочник. Кроме того, существует служебная папкаprivateдля приватных файлов (см. Доступ и шаринг). - имя файла — случайный UUID (по умолчанию) либо исходное имя, если вы так захотите. Случайные имена надёжнее: их нельзя угадать и они не конфликтуют.
1.2. Что такое «домен» и какие они бывают
| Домен | Кто может загружать | Особенности |
|---|---|---|
| public | Любой владелец ключа, у которого разрешён public | Файлы удаляются автоматически 1-го числа каждого месяца в 03:00 UTC. Подходит для обмена файлами и тестов, но не для хранения. |
| ваш домен (например example.com) | Ключи, которым администратор выдал доступ, и ключ, подтвердивший владение доменом | Файлы хранятся постоянно. Работают защита от хотлинка и все остальные функции. |
Формат имени домена: латинские буквы, цифры и дефис, затем точка и зона (example.com, my-shop.org). Поддомены (cdn.example.com) как отдельные домены в панели не поддерживаются.
1.3. Основные понятия
| Термин | Что это |
|---|---|
| API ключ | Секретная строка, которая подтверждает, что запрос выполняет именно вы. Передаётся в заголовке X-Api-Key. У ключа есть имя, список доступных доменов, необязательные ограничения по IP и квоты. |
| Токен доступа | Дополнительный «урезанный» ключ (dpt_…) с ограниченными правами и лимитом запросов. Для скриптов и сторонних сервисов. |
| Квота | Лимит на объём и число файлов ключа (всего и за месяц). |
| Корзина | Место, куда попадают «мягко» удалённые файлы. Хранятся 30 дней и могут быть восстановлены. |
| Подписанная ссылка | Временная ссылка на файл с подписью. Работает без ключа до окончания срока. |
| Публичная ссылка | Ссылка на страницу скачивания (/s/<код>) с паролем, лимитом и сроком. Хранится на сервере, её можно отозвать. |
2. Быстрый старт
Вам понадобится API ключ. Ключи выдаёт администратор сервиса; если вы работаете в одиночку, ключ есть у владельца сервера (раздел Администрирование). Ключ — это пароль: не публикуйте его в репозиториях и чатах.
- Откройте https://static.denchikp.com/ и один раз подтвердите согласие с политикой и условиями использования.
- Введите ключ в поле «Войти через API ключ» (или войдите через Google, Discord, GitHub, Telegram и привяжите ключ — тогда вводить его повторно не придётся).
- Перейдите во вкладку «Загрузка», выберите домен и файл и нажмите «Загрузить файл».
- Скопируйте полученную ссылку и откройте её в браузере: файл раздаётся с
cdn.denchikp.com.

- Название и версии. Версия панели и версия API (бейдж подтягивается с сервера).
- Состояние сервиса. Бейджи доступности: статус API, аптайм за 24 часа и время ответа.
- Тема. Переключатель светлой и тёмной темы. Выбор запоминается в браузере.
- Способы входа. Google, Discord, GitHub, Telegram или напрямую по API ключу. Внешний аккаунт привязывается к ключу один раз.
- Разделы. Загрузка, файловый менеджер, удаление, скачивание, просмотр, валидация и личный кабинет.
То же самое из командной строки — загрузка файла и получение ссылки:
export DPCDN_KEY="ваш_ключ"
curl -X POST https://file.denchikp.com/upload \
-H "X-Api-Key: $DPCDN_KEY" \
-F "domain=example.com" \
-F "file=@./photo.png"$env:DPCDN_KEY = "ваш_ключ"
curl.exe -X POST https://file.denchikp.com/upload `
-H "X-Api-Key: $env:DPCDN_KEY" `
-F "domain=example.com" `
-F "file=@C:\Users\me\photo.png"import os, requests
r = requests.post(
"https://file.denchikp.com/upload",
headers={"X-Api-Key": os.environ["DPCDN_KEY"]},
data={"domain": "example.com"},
files={"file": open("photo.png", "rb")},
)
r.raise_for_status()
print(r.json()["url"])import { readFile } from 'node:fs/promises';
const form = new FormData();
form.append('domain', 'example.com');
form.append('file', new Blob([await readFile('photo.png')]), 'photo.png');
const res = await fetch('https://file.denchikp.com/upload', {
method: 'POST',
headers: { 'X-Api-Key': process.env.DPCDN_KEY },
body: form,
});
console.log((await res.json()).url);В ответ придёт JSON со ссылкой:
{
"status": "ok",
"url": "https://cdn.denchikp.com/example.com/img/6c1f0d1a-2b3c-4d5e-8f90-a1b2c3d4e5f6.png",
"size": 183204,
"domain": "example.com",
"folder": "img",
"filename": "6c1f0d1a-2b3c-4d5e-8f90-a1b2c3d4e5f6.png"
}
Что можно сделать дальше:
- удалить файл:
DELETE /deleteс телом{"url": "<ссылка>"}; - загрузить файл по внешней ссылке:
POST /upload/by-url; - загрузить файл больше 500 МБ или по частям:
/upload/session/*; - настроить ShareX, чтобы скриншоты загружались одной клавишей.
3. Панель управления
Панель — это обычная веб-страница https://static.denchikp.com/. Она работает в любом современном браузере, в том числе на телефоне, и сохраняет выбранную тему оформления (светлую или тёмную) в браузере.
3.1. Вход
Есть два способа авторизоваться:
| Способ | Как работает |
|---|---|
| По API ключу | Введите ключ в карточке «DenchikP CDN» и нажмите «Войти». Ключ запоминается в сессии браузера. |
| Через аккаунт (Google, Discord, GitHub, Telegram) | Войдите через провайдера и один раз привяжите к аккаунту свой API ключ. В дальнейшем панель сама подставляет ключ, пока вы вошли. |
Одновременно активна только одна сессия: вход другим способом завершает предыдущий. Кнопка «Отвязать API ключ» разрывает связь аккаунта с ключом, а «Выйти» завершает сессию.
3.2. Вкладка «Загрузка»
Самая простая загрузка: ключ, домен, файл.

- API ключ. Ключ или вход через аккаунт. Значок глаза показывает и скрывает ключ.
- Домен. public — общий домен (файлы чистятся раз в месяц). Для своего домена выберите «другой» и введите имя.
- Файл. Выберите файл или перетащите его в область.
- Загрузка по ссылке. Сервер сам скачает файл по http/https-ссылке и сохранит его в CDN.
- Имя файла. По умолчанию файлу даётся случайное имя (UUID). Включите галочку, чтобы сохранить исходное.
- Загрузить. После загрузки появится ссылка на файл с кнопками копирования.
- Для домена, которого нет в списке, выберите пункт для ручного ввода и впишите имя.
- Поле «Загрузить файл по ссылке» скачивает файл с внешнего адреса на стороне сервера. Это удобно для больших файлов и переноса с других хостингов. Адреса во внутренних сетях запрещены.
- Галочка «Сохранять оригинальное имя файла» оставляет исходное имя вместо UUID. Если файл с таким именем уже есть, панель предложит пропустить загрузку, сохранить под UUID или перезаписать файл.
3.3. Вкладки «Удаление», «Скачать», «Просмотр», «Валидация»
Это простые формы для разовых задач. Для повседневной работы удобнее файловый менеджер.

«Скачать» показывает файлы выбранной папки домена и скачивает их через API с вашим ключом — этот способ работает и для приватных файлов. «Просмотр» показывает папки домена и объём файлов в каждой. «Валидация» проверяет, что внешняя ссылка отвечает, и разбирает адрес CDN на части.



3.4. Личный кабинет
Во вкладке «Кабинет» собрано всё про ваш ключ: кто вы, тип ключа, какие домены доступны, сколько места использовано и сколько осталось. Ниже есть карточка «Мои домены» (см. свои домены).

- Вход. Через какой провайдер вы вошли и привязан ли ключ.
- Ключ. Имя ключа, доступные домены и ограничения по IP.
- Использование и квоты. Файлы, объём и остаток лимитов (в том числе помесячных).
- Домены. Список разрешённых доменов или «Любые».
Ниже находятся аналитика, webhooks, токены доступа, ShareX и список ваших файлов из базы данных с поиском. Вкладка «Админ» видна только ключам администраторов (создание и изменение ключей, журналы, запуск сканирования диска).
3.5. Свои домены
Карточка «Мои домены» закрепляет за вашим ключом собственный домен. После подтверждения владения только ваш ключ и администраторы могут загружать, менять и удалять файлы в папке этого домена. Читать файлы по-прежнему может кто угодно.

- Добавить домен. Введите основной домен, например example.com. Заявка действует 7 дней.
- Лимит доменов. Сколько доменов подтверждено и сколько разрешено для типа вашего ключа.
- Способ подтверждения. TXT в DNS (рекомендуется), CNAME, файл на сайте, meta-тег или автоматически через Cloudflare.
- Запись для DNS. Скопируйте тип, имя и значение записи кнопкой «Копировать» и добавьте их в DNS домена.
- Проверить. Сервер сам проверит DNS, файл или meta-тег. DNS может обновляться до часа.
- Подтверждён. Подтверждённый домен доступен только вашему ключу. «Освободить» снимает закрепление.
- Нажмите «Добавить домен» и введите основной домен, например
example.com. Адрес целиком (https://www.example.com/page) тоже подойдёт: лишнее отбрасывается. - Выберите способ подтверждения и добавьте то, что показывает панель. Рядом с каждым значением есть кнопка «Копировать».
- Нажмите «Проверить». DNS может обновляться до часа: если запись ещё не видна, повторите проверку позже.

| Способ | Что нужно сделать | Когда выбрать |
|---|---|---|
| TXT-запись (рекомендуется) | Добавить TXT-запись _dpcdn-challenge со значением из панели | Подходит почти всем и не зависит от работы вашего сайта |
| CNAME-запись | Добавить CNAME-запись _dpcdn-… на verify.cdn.denchikp.com | Если DNS-провайдер не принимает TXT |
| Файл на сайте | Создать файл /.well-known/dpcdn/<токен>.txt, в котором только токен | Нет доступа к DNS, но есть доступ к сайту |
| Meta-тег | Добавить <meta name="dpcdn-verify" content="…"> в <head> главной страницы | Если проще править шаблон сайта, чем создавать файл |
| Cloudflare | Вставить API-токен Cloudflare: запись добавится и проверится автоматически | Домен обслуживается Cloudflare |

- Адрес файла. Файл должен открываться по этому адресу без редиректов на другие сайты.
- Содержимое. Только токен, без пробелов и разметки.
Автоматически через Cloudflare
Откройте вкладку «Cloudflare» у домена и нажмите «Подключить Cloudflare». Создайте в Cloudflare API-токен (My Profile → API Tokens → Create Token → шаблон «Edit zone DNS», выберите одну зону) и вставьте его в форму. Сервис найдёт зону, добавит TXT-запись и сразу проверит домен.

- API-токен. С правами Zone:Read и DNS:Edit для одной зоны. Используется один раз и не сохраняется.
- Zone ID. Необязательно: без него зона ищется по имени домена.
Токен используется один раз: он не сохраняется на сервере, не пишется в журналы и не возвращается в ответе. После подтверждения его можно удалить в Cloudflare. Если DNS ещё не обновился, запись уже создана: нажмите «Проверить» через минуту.
Правила и ограничения
- Сколько доменов можно подтвердить, зависит от типа ключа: личный до 10, рабочий до 25, сервисный до 10. У администраторов лимита нет.
- Заявка действует 7 дней, неподтверждённых заявок может быть не больше 10.
- Домен, который уже используют другие ключи, закрепляет за вами администратор (вкладка «Админ»).
- Кнопка «Освободить» снимает закрепление. Файлы в папке остаются, но домен снова доступен другим.
- Автоматической перепроверки нет. Если домен перешёл другому владельцу, освободите его.
4. Файловый менеджер
Вкладка «Файлы» — основной инструмент: в ней можно искать, просматривать, загружать, переименовывать, перемещать, копировать, делиться и удалять файлы домена.

- API ключ. Подставляется автоматически при входе через аккаунт, иначе вводится вручную.
- Домен. Выберите из подсказок (недавние и доступные вашему ключу) или введите имя.
- Загрузка. Выбор файлов. Также работает перетаскивание в окно и вставка из буфера (Ctrl+V).
- Корзина. Удалённые файлы и их восстановление.
- Ссылки. Публичные ссылки для шаринга: отключение и отзыв.
- Дубликаты. Поиск и очистка файлов с одинаковым содержимым.
- Папки. Фильтр по типу файлов; полоса показывает долю папки в объёме домена.
- Поиск. По имени, типу и расширению. Справа — сортировка и переключатель вида.
- Файл. Клик — просмотр, галочка — выбор, «⋮» — меню действий.
4.1. Как открыть домен
- Введите API ключ (если вы вошли через аккаунт, он подставится сам).
- Выберите домен из подсказок или введите его имя и нажмите «Открыть» (или клавишу Enter).
- Под строкой с полями появятся шкалы квот: хранилище, число файлов и загрузки за месяц.
В подсказках домена сначала идут недавно открытые, затем доступные вашему ключу. Последний открытый домен запоминается в браузере.
4.2. Просмотр, поиск и сортировка
- Слева список папок. Число рядом с названием — количество файлов, полоса — доля в общем объёме. Папка «Приватные» появляется, когда в домене есть приватные файлы.
- Поиск работает по имени, типу и расширению.
- Сортировка: сначала новые или старые, по имени (А → Я и Я → А), сначала крупные или мелкие.
- Переключатель справа от сортировки меняет вид: плитка с миниатюрами или компактный список с размером и датой.
- Миниатюры больших картинок загружаются уменьшенными (WebP шириной 360 px), поэтому плитка открывается быстро даже для тяжёлых изображений.
4.3. Выбор файлов и массовые действия
Нажмите галочку на файле, чтобы выбрать его. Shift+клик выбирает диапазон, Ctrl+клик добавляет файл к выбору, Ctrl+A выбирает все файлы, подходящие под фильтр.

- Вид «Список». Компактный список с размером и датой. Переключатель запоминается.
- Выбрать все. Выбирает все файлы, подходящие под текущий фильтр.
- Выбранный файл. Shift+клик выделяет диапазон, Ctrl+клик добавляет файл к выбору.
- Массовые действия. Ссылки, ZIP, перемещение, копирование, срок жизни, доступ и удаление для всех выбранных файлов.
Для выбранных файлов доступны: получение ссылок в разных форматах, скачивание ZIP-архивом (до 200 файлов и 1 ГБ), перемещение, копирование, установка срока жизни, смена доступа (приватный или публичный) и удаление.
4.4. Меню файла
Кнопка «⋮» рядом с файлом (или щелчок по нему) открывает меню действий.

- Меню файла. Просмотр, редактор, скачивание, ссылки, размер и формат, поделиться, подписанная ссылка, приватность, срок жизни, контрольная сумма, проверка антивирусом, переименование, перемещение, копирование и удаление.
| Пункт | Что делает |
|---|---|
| Просмотр | Открывает картинку, видео, аудио, PDF или текстовый файл во встроенном окне. |
| Открыть в редакторе | Для текстовых файлов (HTML, CSS, JS, JSON, Markdown, конфиги и др.): редактор Monaco с подсветкой. Сохранение перезаписывает файл на месте. |
| Скачать | Скачивает файл через API с вашим ключом (работает и для приватных). |
| Копировать ссылку | Копирует адрес файла. |
| Ссылка как HTML / Markdown… | Ссылки в четырёх форматах: обычный URL, HTML, Markdown и CSS url(); переключатель в окне, кнопка «Копировать». |
| Размер и формат… | Только для картинок. См. Картинки. |
| Поделиться… | Публичная ссылка с паролем, сроком и лимитом. См. Доступ и шаринг. |
| Подписанная ссылка… | Временная ссылка без ключа. |
| Сделать приватным / публичным | Переносит файл в папку private и обратно. |
| Срок жизни… | Автоматическое удаление файла через заданное время. |
| Контрольная сумма… | SHA-256, SHA-1 или MD5 файла. |
| Проверить антивирусом | Если на сервере включён ClamAV (см. Безопасность). |
| Сведения о файле | Всё о файле в одном окне: имена, размер, тип, размеры картинки, кто и когда загрузил, домен и его владелец, видимость, срок жизни, публичные ссылки, скачивания и SHA-256. |
| Переименовать | Меняет имя файла; адрес файла изменится. |
| Переместить… / Дублировать… | Перенос или копия в другую папку и даже в другой домен (если у вашего ключа есть доступ к нему). |
| Удалить… | В корзину или навсегда. |


- Файл. Исходное и серверное имя, размер, тип по содержимому (с предупреждением, если не совпадает с расширением), даты.
- Кто загрузил. Ключ, его тип и привязанные аккаунты. Подробности видят только загрузивший, владелец домена и администратор.
- Копировать. Ссылка CDN и SHA-256 копируются в один клик.
Подробности о владельце (номер ключа и привязанные аккаунты Google, Discord, GitHub, Telegram) видят только тот, кто загрузил файл, владелец подтверждённого домена и администратор. Остальные ключи с доступом к домену видят лишь имя и тип загрузившего ключа.
4.5. Загрузка файлов
Файлы можно добавить тремя способами:
- кнопка «Загрузить» — выбрать один или несколько файлов;
- перетаскивание файлов в окно панели;
- вставка из буфера — нажмите Ctrl+V на вкладке «Файлы», и скопированный скриншот загрузится как
screenshot-ГГГГММДД-ЧЧММСС.png.
Во время загрузки показывается окно с общим и пофайловым прогрессом, скоростью и кнопкой отмены. Файлы больше 32 МБ загружаются частями по 8 МБ (при сбое сети часть отправляется повторно), и им присваивается случайное имя. Переключатель «Хранить» рядом с галочкой имён позволяет задать срок жизни для всех загружаемых файлов сразу (час, день, неделя, месяц).
4.6. Скачивание архивом и другие инструменты
- ZIP: выберите файлы и нажмите «Скачать ZIP». Внутри архива файлы лежат по путям
домен/папка/имя. - Корзина, Ссылки и Дубликаты — кнопки над списком (подробности в разделах Жизненный цикл файлов и Доступ и шаринг).
- Статистика использования домена и открытая «квота» всегда видны над списком.
4.7. Горячие клавиши
| Клавиши | Действие |
|---|---|
| Enter в поле домена | Открыть домен |
| Shift + клик | Выбрать диапазон файлов |
| Ctrl / ⌘ + клик | Добавить файл к выбору |
| Ctrl / ⌘ + A | Выбрать все файлы в текущем списке |
| Delete | Удалить выбранные файлы |
| F2 | Переименовать выбранный файл (если выбран один) |
| Esc | Закрыть меню или окно, снять выбор |
| Ctrl + V | Загрузить картинку из буфера обмена |
4.8. Тема и телефон
Кнопка с луной или солнцем в шапке переключает тему. Интерфейс подстраивается под узкие экраны: панель инструментов переносится в несколько строк, вкладки остаются закреплёнными сверху.


5. Картинки: размер и формат
Сервер умеет менять размер и формат изображений на лету, поэтому хранить несколько версий одной картинки не нужно. Поддерживаются исходники jpg, png, webp и gif из папок img и files.
5.1. Из панели
В меню картинки выберите «Размер и формат…».

- Предпросмотр. Результат считается на сервере; ниже — формат, размеры и экономия по сравнению с оригиналом.
- Размеры. Ширина и высота в пикселях (до 4096). Пустое поле — «авто».
- Режим. «Вписать» не увеличивает картинку; «Обрезать» заполняет рамку.
- Формат. WebP, AVIF, JPEG, PNG или «Авто» — формат выбирается по заголовку Accept браузера.
- Готовая ссылка. Ссылку или готовый тег <img> можно скопировать кнопками внизу.
Под предпросмотром видно формат, размеры и вес результата в сравнении с оригиналом. Кнопки «Копировать ссылку» и «Копировать <img>» копируют адрес или готовый тег.
5.2. Параметры в ссылке
Достаточно добавить параметры к адресу файла:
https://cdn.denchikp.com/example.com/img/hero-banner.png?w=800&format=webp&q=80
| Параметр | Значения | Описание |
|---|---|---|
w, h | 1–4096 | Ширина и высота в пикселях. Если указан один параметр, второй вычисляется по пропорциям. |
fit | scale-down (по умолчанию), contain, cover | scale-down вписывает картинку и никогда не увеличивает; cover обрезает по рамке (нужны оба размера). |
format | auto (по умолчанию), webp, avif, jpeg, png | При auto формат выбирается по заголовку Accept браузера: WebP, если он поддерживается, иначе исходный формат. |
q | 1–100 (по умолчанию 80) | Качество для WebP, AVIF и JPEG. |
- Применяется поворот по метаданным EXIF; метаданные в результат не копируются.
- Прозрачность при сохранении в JPEG заменяется белым фоном.
- Анимированные GIF отдаются как есть.
- Результаты кешируются на сервере (до 2 ГБ, старые записи удаляются), повторные запросы отдаются мгновенно и с заголовком
Cache-Control: public, max-age=604800. - Без параметров обычная ссылка на файл по-прежнему отдаёт оригинал.
srcset: <img src="…?w=800&format=webp" srcset="…?w=400&format=webp 400w, …?w=800&format=webp 800w, …?w=1600&format=webp 1600w" sizes="(max-width: 800px) 100vw, 800px">. Одна загруженная картинка заменяет целый набор версий.auto добавляет Vary: Accept, поэтому браузеры и Cloudflare хранят отдельные копии для разных форматов. Если нужен предсказуемый результат, укажите формат явно.6. Жизненный цикл файлов
6.1. Корзина
Кнопка «Удалить…» предлагает два варианта: «В корзину» (рекомендуется) и «Удалить навсегда».

- Удалить навсегда. Файл удаляется с диска без восстановления.
- В корзину. Рекомендуемый вариант: файл можно вернуть в течение 30 дней.
Файл в корзине перестаёт открываться по ссылке, но остаётся на сервере 30 дней, после чего удаляется автоматически. Корзина лежит вне веб-каталога, а её содержимое не учитывается в квоте.

- Срок хранения. Файлы лежат в корзине 30 дней, затем удаляются навсегда.
- Восстановить. Файл возвращается по прежнему адресу (если имя не занято).
- Удалить навсегда. Освобождает место сразу.
- Элемент. Справа — размер и сколько осталось до автоматического удаления.
- Восстановить возвращает файл по прежнему адресу. Если в этом месте уже лежит другой файл с таким именем, восстановление не перезаписывает его — файл остаётся в корзине, а панель сообщает о конфликте.
- Удалить навсегда и Очистить корзину освобождают место сразу.
- Из API:
POST /trash,GET /trash,POST /trash/restore,DELETE /trash. ОбычныйDELETE /deleteпо-прежнему удаляет файл сразу и без возможности восстановления.
6.2. Срок жизни файла
Файлу можно задать время, через которое он удалится сам, минуя корзину: от минуты до десяти лет.

- Срок. Через это время файл удалится сам (без корзины). «Другое» — свой срок в часах; «Снять срок» убирает таймер.
- Установить срок можно из меню файла, для выбранных файлов сразу, а также при загрузке: переключатель «Хранить» в шапке файлового менеджера или поле
ttl(в секундах) вPOST /upload. - Рядом с файлом отображается значок с оставшимся временем.
- Срок привязан к адресу файла: он переезжает вместе с ним при перемещении и переименовании и снимается, когда файл отправляют в корзину.
- Проверка выполняется раз в минуту.
public чистится целиком в начале каждого месяца, а срок жизни работает в любом домене.6.3. Дубликаты
Кнопка «Дубликаты» ищет среди файлов вашего ключа файлы с одинаковым содержимым (по SHA-256) и помогает убрать лишние.

- Итог. Сколько групп и лишних копий найдено и сколько места можно освободить.
- Группа. Отметьте файл, который нужно оставить; остальные уйдут в корзину.
- Удалить лишние копии. Сервер сам проверит, что содержимое совпадает.
- Откройте домен и нажмите «Дубликаты». Панель посчитает хэши только у файлов одинакового размера, это быстро.
- В каждой группе отметьте файл, который нужно оставить (по умолчанию — самый старый).
- Нажмите «Удалить лишние копии». Остальные копии уйдут в корзину, а публичные ссылки шаринга на них начнут вести на оставшийся файл.
Чтобы не создавать дубликаты заново, передавайте dedupe=true в POST /upload: если в домене у вашего ключа уже есть такой же файл, сервер не сохраняет новый, а возвращает адрес существующего с признаком deduplicated.
6.4. Очистка домена public
Файлы в домене public автоматически удаляются 1-го числа каждого месяца. Это выполняет задача планировщика на сервере (см. Администрирование). Для хранения используйте собственный домен.
7. Доступ и шаринг
Файл в CDN по умолчанию публичный: каждый, кто знает адрес, может его открыть. Для всего, что должно быть доступно ограниченному кругу, предусмотрены четыре инструмента. Они не исключают друг друга.
| Инструмент | Для чего | Можно отозвать? | Нужен пароль? |
|---|---|---|---|
Приватный файл (папка private) | Скрыть файл от прямого доступа. Открывается только по подписанной ссылке, через API или по публичной ссылке. | Да, вернув файл в публичные | Нет |
| Подписанная ссылка | Дать временный доступ без ключа (на минуты, часы, дни). | Нет, только дождаться срока (или перенести файл) | Нет |
| Публичная ссылка (шаринг) | Страница скачивания с паролем, сроком и лимитом скачиваний. | Да, в любой момент | Необязательно |
| Защита от хотлинка | Не дать другим сайтам встраивать ваши картинки и медиа. | — (настройка сервера) | Нет |
7.1. Приватные файлы
Пункт «Сделать приватным» (в меню файла или для выбранных файлов) переносит файлы в папку private того же домена. Прямая ссылка на них перестаёт открываться (ответ 403), а текущий адрес файла меняется.

Открыть приватный файл можно:
- из панели («Просмотр» открывает его в новой вкладке по временной ссылке, «Скачать» тянет через API с вашим ключом);
- по подписанной или публичной ссылке;
- через API с ключом:
GET /download/<домен>/private/<имя>.
/private/ (см. Администрирование). После переноса файлов панель сама проверяет это и предупреждает, если папка всё ещё открыта.7.2. Подписанные ссылки
Подписанная ссылка содержит срок действия и криптографическую подпись. Подменить срок, имя файла или режим скачивания нельзя — подпись перестанет совпадать.

- Срок. От 15 минут до 30 дней. Ссылку нельзя отозвать — только дождаться окончания срока.
- Только скачивание. Файл не откроется в браузере, а сразу скачается.
- Ссылка. Открывается без ключа и работает и для приватных файлов.
- Срок: от 15 минут до 30 дней в панели (через API — от 10 секунд до 30 дней).
- Режим «Только скачивание» заставляет браузер сохранить файл, а не открыть его. HTML, SVG и JavaScript всегда отдаются как вложение.
- Ссылку нельзя отозвать отдельно: она перестаёт работать по истечении срока, а также при переименовании, перемещении или удалении файла.
- Смена секрета подписи на сервере делает все выданные ссылки недействительными.
7.3. Публичные ссылки для шаринга
Публичная ссылка ведёт на страницу https://cdnapi.denchikp.com/s/<код> со сведениями о файле и кнопкой «Скачать».

- Срок действия. После истечения страница ссылки отвечает «Срок действия истёк».
- Лимит скачиваний. После исчерпания лимита ссылка перестаёт работать.
- Пароль. Необязательно. Передайте пароль получателю отдельным каналом.
- Название. Показывается на странице вместо имени файла.

- Публичная ссылка. Откроет страницу со сведениями о файле и кнопкой «Скачать».
Получатель увидит такую страницу:

- Скачать. Скачивание считается в лимите и в статистике.
Если задан пароль, вместо кнопки появляется поле ввода:

Особенности:
- Лимит скачиваний считается точно. Повторные запросы докачки (с заголовком
Range) не со смещения 0 в счётчик не попадают. - Предпросмотр картинки показывается только у ссылок без пароля и без лимита, иначе его можно было бы использовать для обхода ограничений.
- Пароль хранится в виде хэша. После 10 неверных попыток с одного IP за 10 минут сервер временно блокирует ввод (ответ 429).
- Файл можно переименовывать, перемещать и делать приватным — ссылка последует за ним. Если файл удалён или лежит в корзине, страница сообщит, что он недоступен; после восстановления ссылка снова заработает.
- Страницы не индексируются поисковиками и не кешируются.
Управлять ссылками удобно в окне «Ссылки» над списком файлов: там видно, сколько раз файл скачали, когда истекает срок, и можно отключить или отозвать ссылку.

- Описание. Название, наличие пароля, использовано скачиваний, срок. У истёкших и исчерпанных ссылок появляется отметка.
- Отключить. Временно закрывает ссылку, не удаляя её.
- Отозвать. Удаляет ссылку насовсем.
7.4. Защита от хотлинка
Хотлинк — это когда чужой сайт встраивает вашу картинку или видео прямо с вашего CDN и тем самым расходует ваш трафик. Правило в Apache разрешает такие файлы только со страниц самого домена-владельца и сайтов *.denchikp.com и *.denchikp.is. Запросы без заголовка Referer (прямое открытие ссылки, мессенджеры, большинство скриптов) пропускаются, домен public исключён.
8. Автоматизация
8.1. Ключи и токены
Для скриптов и сторонних сервисов не отдавайте основной ключ. Вместо этого создайте токен доступа с минимально нужными правами. Токен используется вместо ключа в том же заголовке X-Api-Key (начинается с dpt_).

- Создать токен. Токен показывается один раз — сохраните его сразу.
- Токен. Права, домены, лимит запросов в минуту, время последнего использования и срок действия.
- Отключить. Временное отключение без удаления.
- Отозвать. Токен перестаёт работать сразу.

- Права. Чтение, загрузка, удаление, изменение. Выдавайте только то, что нужно.
- Домены. Токен будет работать только с этими доменами.
- Лимит. Запросов в минуту; при превышении сервер отвечает 429.
- Срок действия. Рекомендуется ограничивать срок жизни токенов для внешних сервисов.
| Право | Что разрешает |
|---|---|
read | Просмотр и скачивание файлов, квоты, статистика, подписанные ссылки, поиск дубликатов, антивирусная проверка (только отчёт). |
upload | Загрузка: обычная, по ссылке и частями. |
delete | Удаление, корзина, срок жизни файлов, очистка дубликатов, перенос заражённых файлов в корзину. |
write | Перемещение, копирование, переименование, сохранение текстовых файлов, смена доступа, управление публичными ссылками. |
- Токен всегда ограничен правами, которые вы выбрали, и никогда не получает прав администратора.
- Можно ограничить токен списком доменов. Такой токен не вызывает методы, затрагивающие все домены сразу (общий список файлов, корзина целиком, статистика).
- У токена есть лимит запросов в минуту (по умолчанию 120). При превышении сервер отвечает 429 с заголовком
Retry-After, а в каждом ответе естьX-RateLimit-LimitиX-RateLimit-Remaining. - Токен показывается один раз сразу после создания, на сервере хранится только его хэш.

- Токен. Показывается только сейчас. На сервере хранится лишь его хэш.
upload на один домен и сроком действия. Для мониторинга — токен только с read. Если токен утёк, отзовите его в кабинете: он перестанет работать сразу (кеш проверки на сервере живёт не более 15 секунд).Типы ключей
Каждому ключу администратор назначает тип. Тип виден в кабинете, в админ-панели и в ботах.
| Тип | Для чего | Своих доменов | Привязка к аккаунтам |
|---|---|---|---|
| Личный | Один человек: кабинет, боты, ShareX, личные проекты | до 10 | да |
| Рабочий | Команда или проект: общие файлы и больше собственных доменов | до 25 | да |
| Сервисный | Автоматизация и интеграции: CI, серверы, скрипты | до 10 | нет |
Сервисный ключ нельзя привязать к Google, Discord, GitHub или Telegram и нельзя использовать для входа в кабинет: он только для API. Остальные возможности у всех типов одинаковы; различаются назначение и лимит собственных доменов.
8.2. ShareX
ShareX — популярная программа для скриншотов и записи экрана. В кабинете можно скачать готовый конфиг .sxcu, и снимки будут загружаться в CDN по горячей клавише.

- Ключ. Попадает в файл конфигурации — не публикуйте его. Для ShareX лучше выдать отдельный токен.
- Домен. Куда будут загружаться снимки.
- Скачать .sxcu. Откройте файл двойным щелчком, и ShareX предложит его установить.
- В кабинете введите ключ (лучше токен с правом
upload) и домен. - При желании включите «Сохранять исходные имена».
- Нажмите «Скачать .sxcu» и откройте файл двойным щелчком: ShareX предложит установить настройки.
- В ShareX выберите назначение загрузки «Custom uploader» и сделайте снимок. Ссылка окажется в буфере обмена.
8.3. Примеры запросов
Все примеры используют переменную DPCDN_KEY. Полный список методов — в справочнике API.
Загрузка по внешней ссылке
curl -X POST https://file.denchikp.com/upload/by-url \
-H "X-Api-Key: $DPCDN_KEY" -H "Content-Type: application/json" \
-d '{"domain":"example.com","source_url":"https://example.org/image.png"}'
Большие файлы по частям
Для файлов больше 500 МБ (и просто для надёжной загрузки по плохой сети) используйте сессию загрузки: начать, отправить части по 8 МБ, завершить. При сбое отправляйте часть повторно.
# 1. начать сессию
curl -X POST https://file.denchikp.com/upload/session/start \
-H "X-Api-Key: $DPCDN_KEY" -H "Content-Type: application/json" \
-d '{"domain":"example.com","ext":"zip","mime_type":"application/zip"}'
# {"status":"ok","upload_id":"...","chunk_size":8388608}
# 2. отправить части (поле file), номера с 1
curl -X PUT https://file.denchikp.com/upload/session/$ID/part/1 \
-H "X-Api-Key: $DPCDN_KEY" -F "[email protected]"
# 3. завершить
curl -X POST https://file.denchikp.com/upload/session/$ID/complete \
-H "X-Api-Key: $DPCDN_KEY"
Файл, собранный из частей, получает случайное имя.
Список файлов, скачивание, удаление
curl -X POST https://cdnapi.denchikp.com/browse \
-H "X-Api-Key: $DPCDN_KEY" -H "Content-Type: application/json" \
-d '{"domain":"example.com"}'curl -X DELETE https://cdnapi.denchikp.com/delete \
-H "X-Api-Key: $DPCDN_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://cdn.denchikp.com/example.com/img/photo.png"}'curl -X POST https://cdnapi.denchikp.com/trash \
-H "X-Api-Key: $DPCDN_KEY" -H "Content-Type: application/json" \
-d '{"urls":["https://cdn.denchikp.com/example.com/img/photo.png"]}'curl -X POST https://cdnapi.denchikp.com/files/zip \
-H "X-Api-Key: $DPCDN_KEY" -H "Content-Type: application/json" \
-d '{"urls":["https://cdn.denchikp.com/example.com/img/a.png","https://cdn.denchikp.com/example.com/files/b.pdf"]}' \
-o files.zipcurl -X POST https://cdnapi.denchikp.com/file/sign \
-H "X-Api-Key: $DPCDN_KEY" -H "Content-Type: application/json" \
-d '{"url":"https://cdn.denchikp.com/example.com/private/report.pdf","ttl_seconds":3600}'Пример для CI (GitHub Actions)
- name: Upload build artifact to CDN
env:
DPCDN_TOKEN: ${{ secrets.DPCDN_TOKEN }}
run: |
curl --fail -X POST https://file.denchikp.com/upload \
-H "X-Api-Key: $DPCDN_TOKEN" \
-F "domain=example.com" -F "name_mode=custom" -F "custom_filename=app-${{ github.sha }}.js" \
-F "ttl=2592000" \
-F "file=@dist/app.js"
Храните токен в секретах репозитория, а не в файлах. Параметр ttl удалит старые сборки через 30 дней.
Обработка лимитов и ошибок
- 429 — подождите
Retry-Afterсекунд и повторите запрос. Ограничение действует и на токены (лимит в минуту), и на подбор ключей (30 неудачных попыток с одного IP за 5 минут). - 5xx и обрывы сети — повторяйте с нарастающей паузой (1, 2, 4 секунды). Загрузки по частям безопасно повторять часть за частью.
- 409 при загрузке — файл с таким именем уже есть. Передайте
conflict_action=overwrite, чтобы перезаписать, или не задавайте имя (будет UUID).
8.4. Webhooks
Webhook присылает на ваш адрес POST-запрос с JSON каждый раз, когда в CDN что-то происходит: загрузка, удаление, перемещение, изменение файла и другие события. Это способ синхронизироваться с другими системами без постоянных опросов.

- Адрес. Только https. Адреса во внутренних сетях запрещены.
- Secret. Нужен для подписи запросов (HMAC-SHA256).
- События. Через запятую, либо * для всех событий.
- Тест и история. Тест отправляет событие PING; история показывает попытки доставки.
Параметры: адрес (только https; адреса во внутренних сетях запрещены), секрет (обязателен: без него события не отправляются) и список событий (через запятую или * для всех).
| Событие | Когда |
|---|---|
UPLOAD, UPLOAD_OVERWRITE | Файл загружен или перезаписан |
DELETE | Файл удалён или перенесён в корзину (trashed=true) |
RESTORE | Файл восстановлен из корзины |
EXPIRE | Файл удалён по сроку жизни |
BULK_DELETE | Массовое удаление |
FILE_MOVE, FILE_COPY, FILE_SAVE | Перемещение или переименование, копирование, сохранение текстового файла |
SCAN_FINISHED | Завершено сканирование диска (для администраторов) |
PING | Тестовая отправка кнопкой «Тест» |
Каждый запрос подписан: заголовки X-DP-Event, X-DP-Timestamp и X-DP-Signature (v1= и HMAC-SHA256 по строке {timestamp}.{тело}). Обязательно проверяйте подпись и свежесть метки времени (рекомендуется ±300 секунд):
import time, hmac, hashlib
def verify(headers, secret: str, body: bytes, tolerance=300) -> bool:
ts = int(headers["X-DP-Timestamp"])
if abs(time.time() - ts) > tolerance:
return False
msg = str(ts).encode() + b"." + body
expected = "v1=" + hmac.new(secret.encode(), msg, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, headers["X-DP-Signature"])const crypto = require('crypto');
function verify(headers, secret, rawBody, tolerance = 300) {
const ts = Number(headers['x-dp-timestamp']);
if (Math.abs(Date.now() / 1000 - ts) > tolerance) return false;
const expected = 'v1=' + crypto.createHmac('sha256', secret)
.update(`${ts}.`).update(rawBody).digest('hex');
const a = Buffer.from(expected), b = Buffer.from(headers['x-dp-signature']);
return a.length === b.length && crypto.timingSafeEqual(a, b);
}Если ваш сервер ответил кодом 408, 425, 429 или 5xx либо не ответил, доставка повторяется до трёх попыток с паузами 2 и 10 секунд. Все попытки записываются в историю: кнопка «История» показывает последние 50. Ответьте кодом 2xx как можно быстрее, а тяжёлую обработку выполняйте асинхронно.
8.5. Боты Discord и Telegram
Те же возможности доступны из мессенджеров: Discord-бот (слеш-команды) и Telegram-бот. Бот работает от имени вашего API ключа: привяжите аккаунт командой /bind (ключ вводится в диалоге бота), и все команды выполняются с вашими правами и ограничениями доменов.
| Что нужно сделать | Discord | Telegram |
|---|---|---|
| Загрузить файл (со сроком жизни и без дубликатов) | /upload с параметрами ttl и dedupe | /upload [domain] … [ttl=7d] [dedupe] |
| Удалить в корзину, посмотреть и восстановить | /trash, /trashlist, /restore, /emptytrash | /trash, /trashlist, /restore, /emptytrash |
| Срок жизни файла | /ttl, /expiring | /ttl <url> <1h|1d|7d|clear>, /expiring |
| Публичная ссылка для шаринга | /share, /shares, /unshare | /share <url> [срок] [pw=…] [max=N], /shares, /unshare <id> |
| Временная подписанная ссылка | /sign | /sign <url> [срок] [dl] |
| Приватный и публичный доступ | /private, /public | /private, /public |
| Дубликаты | /dedupe | /dedupe <domain> |
| Проверка антивирусом | /avscan | /avscan <url> |
| Ссылка на картинку нужного размера | /image | /image <url> [w=…] [h=…] [format=…] |
| Личная статистика | /mystats | /mystats [day|week|month|year] |
| Свои домены: список, добавление, проверка, удаление | /mydomains, /domain_add, /domain_check, /domain_remove | /mydomains, /adddomain <домен> [txt|cname|file|meta], /checkdomain <домен>, /removedomain <домен> |
Тип вашего ключа показывают /me, /cdn и сообщение после /bind. Остальные команды (/open, /browse, /folders, /move, /copy, /rename, /hash, /quota и другие) работают как раньше. Для опасных действий (очистка корзины, перенос заражённого файла в корзину) бот просит подтверждение кнопкой. Сроки в Telegram задаются сокращениями: 30m, 1h, 1d, 7d, 2w.
8.6. Деплой из GitHub
Приложение DenchikP CDN для GitHub выкладывает файлы из репозитория на CDN при каждом push. Удобно для статических сайтов, документации и сборок фронтенда: собрали в dist, сделали push, файлы уже на cdn.denchikp.com.
- Откройте «Аккаунт» → «Деплой из GitHub» и нажмите «Подключить GitHub».
- На GitHub выберите репозитории, к которым приложение получит доступ, и подтвердите установку. Вы вернётесь в панель.
- Выберите репозиторий, ветку, папку в репозитории (например
dist; пусто — весь репозиторий) и домен CDN, нажмите «Добавить деплой». - Сделайте push в ветку или нажмите «Выложить сейчас».

- Подключить GitHub. Откроет GitHub: выберите репозитории для приложения DenchikP CDN и вернитесь в панель.
- Аккаунт GitHub. Подключённые аккаунты и организации. Щелчок открывает настройки доступа к репозиториям на GitHub.
- Выложить сейчас. Выложить последний коммит ветки, не дожидаясь push.
- Новый деплой. Репозиторий, ветка, папка в репозитории (например dist) и домен CDN.
Ход деплоя виден в GitHub на странице коммита во вкладке Checks (проверка «DenchikP CDN»): список новых и обновлённых файлов со ссылками и ошибки, если были.
- Файлы раскладываются по папкам CDN по типу, как при обычной загрузке (
img,css,js,fonts,video,audio,docs,files). Вложенные папки репозитория не сохраняются, поэтому имена файлов внутри выбранной папки должны быть уникальными; повтор имени отмечается ошибкой. - Имена файлов сохраняются как в репозитории, поэтому ссылки постоянны:
dist/css/app.cssвсегда доступен какhttps://cdn.denchikp.com/<домен>/css/app.css. - Неизменённые файлы не перезаписываются и не расходуют квоту загрузок. Файлы, удалённые из репозитория, на CDN остаются.
- Скрытые файлы и папки (
.env,.githubи т. п.) иnode_modulesпропускаются. Действуют обычные квоты ключа, проверка антивирусом и права на домен: в подтверждённый чужой домен деплой невозможен. - Приложению нужны только права на чтение кода и запись проверок (Checks). Доступ к репозиториям меняется в настройках установки на GitHub (щелчок по имени аккаунта в карточке).
- Деплой работает от имени ключа, который подключил GitHub. Сервисные ключи GitHub не подключают.
8.7. Коннектор Claude
Коннектор DenchikP CDN подключает хранилище к Claude: ассистент может посмотреть квоты и домены, найти и прочитать файлы, показать статистику, создать временную ссылку и загрузить новый файл. Удобно для автоматизации: «выложи этот HTML на CDN и пришли ссылку», «найди мои CSS за этот месяц».
- В Claude (claude.ai) откройте «Настройки» → «Коннекторы» → «Добавить свой коннектор» и вставьте адрес
https://cdnapi.denchikp.com/mcp. - Откроется страница согласия DenchikP CDN. Если вы уже вошли в панель, она покажет ваш ключ; иначе введите свой обычный API ключ (не токен
dpt_…). - Нажмите «Разрешить». Claude получит собственный токен и сможет вызывать инструменты.
| Инструмент | Что делает |
|---|---|
| Аккаунт и квоты | Имя ключа, тариф, квоты, использование, доступные домены |
| Список файлов | Файлы, загруженные ключом, с поиском и фильтрами |
| Содержимое домена | Файлы домена по диску |
| Сведения о файле | Размер, тип, наличие на диске |
| Прочитать текстовый файл | Содержимое текстового файла или скрипта до 2 МБ |
| Статистика ключа | Загрузки, скачивания и просмотры за период |
| Временная ссылка | Подписанная ссылка с ограниченным сроком |
| Загрузить текстовый файл / файл в base64 | Новый файл из текста или base64 (до 8 МБ) |
| Загрузить по ссылке | Сервер сам скачивает файл по адресу http/https |
- Токен коннектора имеет только права «чтение» и «загрузка». Удалить, перезаписать или изменить существующий файл через коннектор нельзя; если имя файла занято, загрузка отклоняется.
- Ваш API ключ используется один раз для входа и не сохраняется. Коннектору выдаётся отдельный токен «Claude (MCP)» на 90 дней, по одному на ключ. Повторное подключение заменяет предыдущий токен.
- Отозвать доступ можно в любой момент: удалите токен «Claude (MCP)» в разделе токенов или отключите коннектор в Claude.
- Действуют обычные квоты ключа, ограничения по доменам, проверка антивирусом и лимит запросов токена (по умолчанию 120 в минуту).
- Ключи со списком разрешённых IP не подходят: Claude подключается с адресов Anthropic. Для коннектора создайте отдельный ключ без списка IP и, при желании, ограничьте ему домены и квоту.
9. Безопасность
9.1. Ключи
- Ключ — это пароль. Не коммитьте его в репозиторий, не вставляйте в код фронтенда и не отправляйте в чаты. Храните в переменных окружения или менеджере секретов.
- Давайте минимальные права. Для скриптов используйте токены с нужными правами и доменами, а не основной ключ.
- Ограничивайте ключи. Администратор может привязать к ключу список разрешённых доменов и IP-адресов, задать квоты и в любой момент отключить или ротировать ключ.
- Ротируйте при подозрении на утечку. Ротация создаёт новый ключ; старый перестаёт работать. Токены отзываются отдельно и сразу.
- Выбирайте тип ключа по назначению. Для скриптов и серверов администратор выдаёт сервисный ключ: его нельзя привязать к аккаунту и использовать для входа в кабинет, поэтому он не окажется в чужой сессии.
- Закрепляйте домены. Подтверждённый домен закрыт для записи другим ключам: чужой ключ не сможет залить файлы в папку вашего сайта.
- Не используйте один ключ в разных местах. Тогда по журналу видно, откуда идут запросы, и скомпрометированный ключ можно отключить, не ломая остальное.
9.2. Что защищает сам сервис
| Механизм | Как работает |
|---|---|
| Лимит запросов токенов | Скользящее окно в минуту, заголовки X-RateLimit-*, ответ 429 с Retry-After. |
| Защита от подбора ключей | После 30 неудачных авторизаций с одного IP за 5 минут запросы с этого адреса получают 429. |
| Защита паролей ссылок | 10 неверных паролей на одну ссылку с одного IP за 10 минут — временная блокировка. |
| Запрет внутренних адресов | Загрузка по ссылке и webhook'и не работают с локальными и частными адресами (защита от SSRF). |
| Подпись webhook'ов | HMAC-SHA256 с меткой времени и обязательным секретом. |
| Безопасная выдача чужого содержимого | HTML, SVG и JavaScript по подписанным и публичным ссылкам всегда отдаются как вложение; страницы ссылок отдаются с жёсткой политикой безопасности и без скриптов. |
| Приватные файлы | Лежат в папке private, закрытой веб-сервером; корзина хранится вне веб-каталога. |
| Антивирус | Необязательная проверка загрузок через ClamAV (см. ниже). |
| Журналирование | События загрузки, удаления, создания ссылок и токенов, срабатывания антивируса пишутся в журнал. |
9.3. Антивирусная проверка (ClamAV)
Пока ClamAV не настроен, проверка выключена и ничего не меняется. После включения проверяются все способы загрузки (обычная, по ссылке, частями, через ботов). Если найдена угроза, файл не сохраняется, а ответ 422 содержит название сигнатуры. Уже загруженные файлы можно проверить из меню файла.
Установка на сервере (Windows):
- Установите ClamAV и в
clamd.confвключите приём по сети:TCPSocket 3310иTCPAddr 127.0.0.1. ПараметрStreamMaxLengthзадаёт максимальный размер проверяемого потока (по умолчанию 25 МБ). - Настройте обновление баз (
freshclam) и запуститеclamdкак службу. - В
.envдобавьтеCLAMAV_ENABLED=1(при нестандартном адресе —CLAMAV_HOST,CLAMAV_PORT) и значениеCLAMAV_MAX_SCAN_BYTES, равноеStreamMaxLength. Перезапустите API. - Проверьте состояние:
GET /av/statusдолжен вернутьenabled: trueиreachable: true.
- Файлы больше
CLAMAV_MAX_SCAN_BYTESне проверяются. - Если
clamdнедоступен, по умолчанию загрузки принимаются, а ошибка пишется в журнал (CLAMAV_FAIL_MODE=open). Для строгого режима задайтеCLAMAV_FAIL_MODE=closed: тогда загрузки будут отклоняться с ответом 503.
9.4. Памятка по безопасности
- Выдайте скриптам токены вместо основного ключа и ограничьте их домены и сроки.
- Закройте в Apache папку
/private/и проверьте это: прямая ссылка на приватный файл должна отвечать 403. - Используйте длинные случайные имена файлов (режим по умолчанию).
- Для webhooks всегда проверяйте подпись и метку времени.
- Включите ClamAV, если пользователи могут загружать файлы с неизвестным содержимым.
- Следите за журналом и метриками: рост числа ответов 401, 403 и 429 — признак подбора ключей.
10. Аналитика и мониторинг
10.1. Статистика ключа
В кабинете показаны загрузки, удаления и скачивания через API за выбранный период, график загрузок по дням, распределение по папкам и доменам и самые большие файлы.

- Период. День, неделя, месяц или год.
- Показатели. Загрузки, объём, удаления и скачивания через API за период.
- График. Загрузки по дням.
/download, ZIP, боты). Открытия файлов по ссылкам cdn.denchikp.com обслуживает Cloudflare, и сервис их не видит. Для общей картины нагрузки пользуйтесь ссылкой «Stats» в подвале панели (дашборд Grafana).10.2. Проверка работоспособности
GET /version— версия API (её же показывает бейдж в шапке панели).GET /healthzиGET /readyz— проверки для мониторинга и балансировщиков.- Бейджи Uptime Kuma в шапке панели показывают статус, аптайм и время ответа.
10.3. Метрики Prometheus
GET /metrics отдаёт метрики в формате Prometheus: запросы по маршрутам и статусам, гистограмму длительности, число неудачных авторизаций и срабатываний лимитов, счётчики антивируса, число и объём файлов, корзину, активные ссылки, токены и размер кеша миниатюр. Доступ — ключом администратора либо заголовком Authorization: Bearer <METRICS_TOKEN>.
scrape_configs:
- job_name: dpcdn
scheme: https
metrics_path: /metrics
authorization:
credentials: "<METRICS_TOKEN>"
static_configs:
- targets: ["cdnapi.denchikp.com"]
Счётчики запросов хранятся в памяти и обнуляются при перезапуске API: Prometheus корректно переносит такие сбросы. Показатели хранилища обновляются не чаще раза в 30 секунд.
10.4. OpenAPI
Описание API в формате OpenAPI 3 доступно по адресу https://cdnapi.denchikp.com/openapi.json, интерактивная страница — https://cdnapi.denchikp.com/docs, ReDoc — https://cdnapi.denchikp.com/redoc. Схему можно импортировать в Postman, Insomnia или генератор клиентов. В Swagger кнопка Authorize принимает ключ или токен.

- Разделы документации. Руководство, справочник API, политика и условия.
- Поиск эндпоинта. Фильтрует содержание по методу и пути.
- Эндпоинт. Метод и путь. Щелчок открывает описание: параметры, примеры ответов и ошибки, у блоков кода есть кнопка копирования.
11. Администрирование
Раздел для тех, кто разворачивает и обслуживает сервер.
11.1. Как всё устроено
| Часть | Описание |
|---|---|
| Apache 2.4 | Принимает запросы, раздаёт файлы с диска (cdn.denchikp.com) и проксирует API на 127.0.0.1:8001. Виртуальные хосты: панель и CDN (порт 8083), загрузки (порт 8084). |
| API (FastAPI, uvicorn) | Приложение app_db.py; запускается вручную файлом start_db.bat без автоперезагрузки. |
| MySQL | Записи о файлах, ключи, токены, ссылки, корзина, статистика, журналы. Схема создаётся автоматически; новые таблицы появляются при запуске. |
| Файловое хранилище | Каталог проекта: <домен>/<папка>/<файл>. Служебные каталоги с префиксом _ (_cache, _tmp, _multipart) сканер игнорирует. |
| Корзина | Каталог _cdn_trash рядом с каталогом проекта (вне веб-каталога). Меняется переменной TRASH_PATH. |
| Cloudflare | Перед Apache: TLS, кеширование и защита. |
После изменения app_db.py или .env API нужно перезапустить вручную (остановить процесс uvicorn и снова запустить start_db.bat). Изменения Apache требуют перезапуска службы Apache.
11.2. Переменные окружения (.env)
Файл .env лежит в каталоге проекта и закрыт от раздачи правилами Apache. Он содержит секреты, поэтому не публикуйте его.
| Группа | Переменные | Описание |
|---|---|---|
| База данных | MYSQL_HOST, MYSQL_PORT, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE | Подключение к MySQL. |
| Сессии | SECRET_KEY | Подпись cookie-сессий. Используется и для подписанных ссылок, если не задан SIGNING_SECRET. |
| OAuth | GOOGLE_*, DISCORD_*, GITHUB_*, TELEGRAM_* (CLIENT_ID, CLIENT_SECRET, REDIRECT_URI, FRONTEND_REDIRECT) | Вход через внешние аккаунты. |
| Боты | DISCORD_BOT_INTERNAL_TOKEN, TELEGRAM_BOT_INTERNAL_TOKEN, DISCORD_PUBLIC_KEY, DISCORD_SKU_MAP | Связь с ботами и подписками Discord. |
| Сканирование диска | SCAN_IGNORE_DOMAINS, SCAN_IGNORE_FOLDERS, SCAN_IGNORE_FILES, SCAN_IGNORE_FILE_GLOBS | Что пропускать при синхронизации диска с БД. Служебные каталоги сайта (docs, guide, legal, privacy, terms, archive) должны быть в SCAN_IGNORE_DOMAINS. |
| Корзина | TRASH_PATH, TRASH_RETENTION_DAYS (30) | Каталог и срок хранения корзины. |
| Токены и лимиты | TOKEN_DEFAULT_RPM (120), AUTH_FAIL_LIMIT (30), AUTH_FAIL_WINDOW (300 с) | Лимит запросов токена по умолчанию, порог блокировки при подборе ключей. |
| Ссылки | PUBLIC_API_BASE (https://cdnapi.denchikp.com), SIGNING_SECRET, SHARE_BASE_URL | Хост ссылок, секрет подписи, адрес страниц шаринга. |
| Антивирус | CLAMAV_ENABLED, CLAMAV_HOST, CLAMAV_PORT (3310), CLAMAV_MAX_SCAN_BYTES (26214400), CLAMAV_FAIL_MODE (open или closed) | Интеграция с ClamAV. |
| Метрики | METRICS_TOKEN | Bearer-токен для скрейпера Prometheus. |
| Очистка public | CDN_ADMIN_API_KEY | Ключ администратора для вызова сканирования из скрипта очистки. |
11.3. Настройка Apache
Основные правила уже заложены в конфигурации виртуального хоста static.denchikp.com (псевдоним cdn.denchikp.com). Ниже — что делает каждая часть.
| Блок | Для чего |
|---|---|
ProxyPass для префиксов API | Панель на static.denchikp.com обращается к API по относительным адресам, поэтому каждый используемый префикс (/upload, /browse, /files, /trash, /shares, /tokens, /dedupe, /av и другие) должен быть проксирован на http://127.0.0.1:8001. Новый метод API с новым префиксом требует новой строки. |
ErrorDocument 403/404/500 | Страницы ошибок в дизайне сайта (/403, /404, /500). |
LimitRequestBody 524288000 | Ограничение размера запроса на хосте панели. На хосте загрузок file.denchikp.com стоит 0, там размер не ограничен. |
Правило для миниатюр (RewriteRule … /file/transform/…) | Позволяет писать ?w=800&format=webp прямо в адрес файла на cdn.denchikp.com. |
RewriteRule ^/[^/]+/private/ - [F,L] | Закрывает папку private. Без этого правила приватных файлов нет. |
| Блок хотлинка | Запрещает встраивание медиа с чужих сайтов (см. Доступ и шаринг). |
| Правила запрета для служебных файлов | Файлы .env, .vscode, *.py и подобные отдают 403. |
Фрагмент для новых установок (закрытие приватной папки и защита от хотлинка):
RewriteRule ^/[^/]+/private/ - [F,L]
RewriteCond %{HTTP_HOST} ^cdn\.denchikp\.com$ [NC]
RewriteCond %{REQUEST_URI} \.(?:jpe?g|jfif|png|apng|gif|webp|avif|svg|ico|bmp|tiff?|heic|heif|jxl|mp4|m4v|webm|mov|mkv|ogv|mp3|ogg|oga|opus|wav|flac|m4a|aac|woff2?|ttf|otf|eot|zip|pdf)$ [NC]
RewriteCond %{REQUEST_URI} !^/public/ [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://([^/:]+\.)?denchikp\.(com|is)(:[0-9]+)?(/|$) [NC]
RewriteCond %{REQUEST_URI} ^/([^/]+)/
RewriteCond %{HTTP_REFERER}|%1 !^https?://(?:[^/:]+\.)?([^/:|]+)(?::[0-9]+)?(?:/[^|]*)?\|\1$ [NC]
RewriteRule ^ - [F]
%1 не работает в правой части RewriteCond, поэтому домен передаётся в левую часть условия (%{HTTP_REFERER}|%1) и сравнивается внутри регулярного выражения через \1.После любых правок конфигурации проверьте синтаксис командой httpd -t и перезапустите службу Apache.
11.4. Расписание очистки public
Очистку домена public выполняет скрипт clean_public.ps1, запускаемый задачей планировщика Windows CDN - Clean Public:
- расписание: ежемесячно, 1-го числа в 03:00 по UTC, от имени SYSTEM;
- скрипт вызывает
POST /admin/public/purge: API удаляет содержимое доменаpublic, помечает записи файлов удалёнными и записывает каждое удаление в статистику, поэтому графики хранилища и числа файлов остаются точными. Для этого скрипту нужен ключ администратора в переменнойCDN_ADMIN_API_KEYв.env; - если API недоступен или ключа нет, скрипт удаляет файлы сам, как раньше, и отмечает в журнале, что удаления не попали в статистику;
- скрипт пишет журнал в
clean_public.logи умеет запускаться в режиме проверки (-DryRun) без удаления.
Запуск вручную для проверки:
powershell.exe -ExecutionPolicy Bypass -File C:\Apache24\htdocs\static.denchikp.com\clean_public.ps1 -DryRun
11.5. Сканирование диска
Сканер сверяет файлы на диске с записями в базе данных и добавляет записи для новых файлов, которые появились на диске в обход API. Существующие записи он не меняет. Он запускается кнопкой во вкладке «Админ», вызовом POST /admin/scan/start или автоматически скриптом очистки. Домены из SCAN_IGNORE_DOMAINS и каталоги с префиксом _ пропускаются.
11.6. Резервные копии и обновления
- База данных: регулярно делайте дамп MySQL (
mysqldump). Новые функции создают собственные таблицы автоматически; вручную менять схему не нужно. - Файлы: копируйте каталоги доменов и
.env. Каталоги_cacheи_tmp— временные, их копировать не нужно. - Перед обновлением кода сохраняйте копию
app_db.py, а после — перезапускайте API и проверяйтеGET /version. - Ключи: создаются и изменяются во вкладке «Админ» панели (домены, IP, квоты, ротация, отключение).
11.7. Журналы
События хранятся в базе данных (вкладка «Админ» → журналы, GET /admin/logs, поток в реальном времени GET /events) и в файле cdn.log в каталоге проекта. По ним видно загрузки, удаления, срабатывания лимитов и антивируса, создание и отзыв ссылок и токенов.
11.8. Типы ключей и домены пользователей
Тип ключа выбирается при создании и меняется в карточке «Редактирование выбранного ключа». Новые ключи по умолчанию личные, существующие после обновления стали личными. В списке ключей тип показан цветной меткой.

- Личный. Для одного человека.
- Рабочий. Для команды или проекта, больше собственных доменов.
- Сервисный. Для интеграций, без привязки к аккаунтам.
Карточка «Домены пользователей» показывает все заявки и закреплённые домены с владельцем и способом подтверждения.

- Закрепить вручную. Домен закрепляется за ключом без проверки: так выдают домены, которые уже использовались.
- Подтвердить. Ручное подтверждение заявки.
- Удалить. Снимает закрепление или удаляет заявку.
- Подтвердить — ручное подтверждение заявки, если владелец домена убедил вас другим способом.
- Закрепить домен за ключом — форма сверху: домен закрепляется без проверки, а заявки других ключей на него удаляются. Так выдают домены, которые уже использовались несколькими ключами (самостоятельно их закрепить нельзя).
- Удалить — снимает закрепление или удаляет заявку. Файлы не затрагиваются.
- Выдача домена в список разрешённых (поле «Добавить домен» в карточке ключа) по-прежнему даёт доступ другим ключам, даже если домен закреплён за владельцем.
- Если ключ стал сервисным после привязки к аккаунтам, привязки остаются, но создать новые нельзя: панель покажет предупреждение.
12. Диагностика
12.1. Коды ответов
Запросы к файлам и страницам, которые отклоняет веб-сервер (403, 404, 500), показывают страницу ошибки в дизайне сайта:

Ответы самого API приходят в виде JSON с полем detail.
| Код | Что значит | Что делать |
|---|---|---|
| 400 | Неверные параметры запроса (недопустимый домен, срок, формат, пустой список) | Прочитайте сообщение в поле detail: оно указывает, какой параметр неверен. |
| 401 | Нет ключа, ключ или токен недействителен, токен истёк | Проверьте заголовок X-Api-Key, срок действия токена и что он не был отозван. |
| 403 | Ключ отключён, IP не разрешён, нет доступа к домену, у токена нет нужного права; либо закрытая папка private, либо защита от хотлинка | Если ответ JSON — смотрите detail. Если пришла страница ошибки — запрос блокирует Apache (приватная папка или хотлинк). |
| 404 | Файл, ссылка или токен не найдены; файл находится в корзине | Проверьте адрес. Для публичных ссылок: она могла быть отключена или отозвана. |
| 409 | Конфликт: файл с таким именем уже есть, файл уже приватный/публичный | Выберите другое имя или режим «Перезаписать». |
| 410 | Срок действия ссылки истёк или исчерпан лимит скачиваний | Создайте новую ссылку. |
| 413 | Файл или запрос слишком большой (файл больше 500 МБ, архив больше 1 ГБ) | Загружайте частями (/upload/session/*) или уменьшите набор файлов. |
| 415 | Неподдерживаемый тип для изменения размера (не jpg, png, webp, gif) | Преобразование работает только для этих форматов. |
| 422 | Файл отклонён антивирусом либо тело запроса некорректно | Для антивируса в detail указана сигнатура. |
| 429 | Превышен лимит запросов или слишком много неудачных попыток | Подождите Retry-After секунд и повторите. Реже обращайтесь к API или увеличьте лимит токена. |
| 500 | Внутренняя ошибка сервера | Повторите запрос; если ошибка повторяется, сообщите администратору время и адрес запроса. |
| 503 | Сервис временно недоступен: антивирус недоступен в строгом режиме, не настроена проверка или подпись, сервер занят обработкой изображений | Повторите позже; для администратора — проверьте GET /av/status и переменные окружения. |
12.2. Частые вопросы
Файл не открывается по ссылке
- Проверьте адрес: домен, папка и имя должны совпадать символ в символ (регистр важен).
- Откройте файловый менеджер и найдите файл. Если его нет — возможно, он в корзине, удалён по сроку жизни или находился в домене
public(чистится 1-го числа каждого месяца). - Если это приватный файл — пользуйтесь подписанной или публичной ссылкой.
- Если вы только что заменили файл, а видите старый — сбросьте кеш браузера и Cloudflare.
Картинка не открывается со страницы моего сайта
Ответ 403 при запросе с чужой страницы означает сработавшую защиту от хотлинка: домен в адресе файла должен совпадать с доменом сайта, на котором картинка встроена. Для общих картинок используйте домен public.
Панель говорит, что нет доступа к домену
Ключу не выдан этот домен, вы вошли токеном с ограничением по доменам, либо домен закреплён за другим ключом (тогда писать в него может только владелец). Администратор может добавить домен ключу во вкладке «Админ». Домен public выдаётся отдельно.
Домен не подтверждается
Сообщение под заявкой подсказывает причину. Частые случаи:
- Запись ещё не появилась. DNS обновляется от нескольких секунд до часа. Проверьте запись командой
nslookup -type=TXT _dpcdn-challenge.example.com 1.1.1.1(подставьте свой домен). - Имя записи задвоено. Некоторые панели сами добавляют домен: если нужно вводить только host, указывайте
_dpcdn-challenge, а не полное имя. Признак ошибки: запись видна как_dpcdn-challenge.example.com.example.com. - Значение с лишними символами. Копируйте значение кнопкой «Копировать», без пробелов и переносов.
- Файл или meta-тег не находятся. Адрес должен открываться без входа и без редиректа на другой домен; в файле только токен. Если сайт защищён от ботов, используйте DNS.
- Домен уже занят. Если сообщение говорит, что он подтверждён другим владельцем или используется другими ключами, обратитесь к администратору.
Загрузка большого файла обрывается
Панель сама загружает файлы больше 32 МБ частями и повторяет неудачные части. В API используйте сессии загрузки. Загружайте на file.denchikp.com: на этом хосте нет ограничения размера запроса.
Как восстановить удалённый файл
Откройте «Корзину» в файловом менеджере и нажмите «Восстановить». Это возможно в течение 30 дней и только если файл удалён в корзину, а не «навсегда» или по сроку жизни.
Как перенести сайт на другой домен
Файлы можно переместить или скопировать в другой домен из меню файла (нужен доступ ключа к обоим доменам). Адреса при этом изменятся, поэтому ссылки на сайте придётся обновить.
Приватный файл всё равно открывается по прямой ссылке
Значит, Apache не закрывает папку /private/. Добавьте правило из раздела Настройка Apache, перезапустите Apache и очистите кеш Cloudflare для этого адреса.
Webhook не приходит
Откройте «Историю» webhook'а в кабинете: там видны код ответа и ошибка каждой попытки. Частые причины: адрес не https или указывает на внутренний адрес, не указан секрет, ваш сервер отвечает слишком долго или кодом не 2xx, событие не входит в список.
Панель ничего не показывает, а в консоли браузера 404 на /что-то
Для нового раздела панели не добавлен ProxyPass в Apache (см. Настройка Apache).
13. Справочник
13.1. Лимиты и значения по умолчанию
| Что | Значение |
|---|---|
| Размер файла при загрузке | до 500 МБ (больше — частями через сессии) |
| Размер части при загрузке по частям | 8 МБ; панель переходит на части от 32 МБ |
| Домены и папки | папки: img, video, audio, docs, css, js, fonts, files, private |
| ZIP-архив | до 200 файлов и 1 ГБ |
| Массовое удаление, корзина, смена доступа | до 500 файлов за запрос |
| Размеры изображений | до 4096 px по стороне, исходник до 100 мегапикселей; кеш миниатюр до 2 ГБ |
| Срок хранения корзины | 30 дней (TRASH_RETENTION_DAYS) |
| Срок жизни файла | от 60 секунд до 10 лет |
| Подписанная ссылка | от 10 секунд до 30 дней |
| Публичные ссылки | до 500 на ключ; лимит скачиваний 1–1 000 000; пароль 4–128 символов |
| Свои домены | личный ключ до 10, рабочий до 25, сервисный до 10; заявка живёт 7 дней, до 10 неподтверждённых; не более 20 проверок в минуту |
| Токены доступа | до 50 на ключ; лимит запросов 1–6000 в минуту (по умолчанию 120); срок до 10 лет |
| Блокировка при подборе ключей | 30 неудачных попыток с IP за 5 минут |
| Блокировка при подборе пароля ссылки | 10 попыток на ссылку и IP за 10 минут |
| Антивирус | проверяются файлы до 25 МБ (CLAMAV_MAX_SCAN_BYTES) |
Очистка public | 1-го числа каждого месяца в 03:00 UTC |
13.2. Типы файлов и папки
| Папка | Расширения |
|---|---|
img | jpg, jpeg, jfif, pjpeg, png, apng, webp, avif, svg, gif, ico, cur, bmp, tif, tiff, heic, heif, jxl |
video | mp4, m4v, webm, mov, mkv, avi, ogv, wmv, flv, 3gp, mpg, mpeg, ts, m2ts |
audio | mp3, wav, ogg, oga, opus, flac, m4a, aac, weba, wma, aif, aiff, mid, midi |
docs | pdf, doc, docx, xls, xlsx, ppt, pptx, odt, ods, odp, rtf, txt, csv, md, epub |
css | css |
js | js, mjs, cjs |
fonts | woff, woff2, ttf, otf, eot |
files | всё остальное (архивы, программы и т. д.) |
private | приватные файлы любого типа (создаётся при переводе файла в приватные) |
Текстовые файлы, которые можно открыть в редакторе: txt, js, json, html, css, scss, xml, md, yml, yaml, ini, conf, env, toml, log, py, php, java, c, cpp, cs, go, rs, rb, sh, bat, ps1, sql, csv и другие.
13.3. Словарь терминов
| Термин | Значение |
|---|---|
| CDN | Сеть доставки контента: раздаёт файлы быстро и по постоянным адресам. |
| Хотлинк | Встраивание чужого файла на свою страницу прямо по ссылке, с расходом чужого трафика. |
| Referer | Заголовок запроса с адресом страницы, с которой пришёл запрос. |
| HMAC | Способ подписи данных секретным ключом; по подписи можно проверить, что данные не подделаны. |
| TTL | Время жизни: через сколько файл или ссылка перестанут существовать. |
| Multipart-загрузка | Загрузка большого файла несколькими частями. |
| Webhook | Автоматический запрос на ваш адрес при наступлении события. |
| Квота | Лимит на объём и число файлов. |
| Тип ключа | Назначение ключа: личный, рабочий или сервисный. Определяет лимит собственных доменов и возможность привязки к аккаунтам. |
| Подтверждение домена | Доказательство, что домен ваш: запись в DNS, файл или meta-тег на сайте. После него писать в папку домена может только ваш ключ. |
| TXT, CNAME | Типы записей DNS: TXT хранит текст, CNAME указывает на другое имя. |
| SSRF | Атака, при которой сервер заставляют обратиться к внутреннему адресу; в CDN такие адреса запрещены. |
| Prometheus, Grafana | Системы сбора и показа метрик. |
14. История версий
| Версия API | Что нового |
|---|---|
| 6.18.0 | Деплой из GitHub: приложение DenchikP CDN выкладывает файлы репозитория на CDN при push, статус виден в GitHub Checks (см. Деплой из GitHub). В кабинете — тарифный план из Discord. |
| 6.16.4 | Очистка public выполняется через API (POST /admin/public/purge) и записывает удаления в статистику. Исправления безопасности: запрещены пути с «..» в адресах файлов и при скачивании, защита от межсайтовых запросов (CSRF) для входа по cookie, токены ботов сравниваются за постоянное время. |
| 6.16.3 | Массовое удаление (панель, API, боты) записывается в статистику удалений, поэтому графики хранилища и числа файлов больше не завышаются. |
| 6.16.2 | Новые папки video, audio и docs, больше форматов в img, js и fonts; папка выбирается по расширению файла. |
| 6.16 | Типы ключей (личный, рабочий, сервисный) в кабинете, админ-панели и ботах. Самостоятельное подтверждение собственных доменов: TXT или CNAME в DNS, файл или meta-тег на сайте, автоматически через Cloudflare. Подтверждённый домен закрыт для записи другим ключам. Команды доменов в ботах. |
| 6.15 | Боты Discord и Telegram получили новые команды: корзина, срок жизни, шаринг, подписанные ссылки, приватность, дубликаты, антивирус, ссылки на картинки, статистика; в /upload добавлены ttl и dedupe. Единая точка /bot/ops/{op} для ботов. |
| 6.14 | Антивирусная проверка ClamAV, метрики Prometheus (/metrics), расширенная схема OpenAPI. |
| 6.13 | Поиск дубликатов по хэшу, очистка с безопасным переносом в корзину, загрузка без дубликатов (dedupe). |
| 6.12 | Публичные ссылки для шаринга со страницей, паролем, сроком и лимитом скачиваний; срок жизни и ссылки следуют за перемещаемыми файлами. |
| 6.11 | Приватные файлы (папка private), подписанные ссылки, защита от хотлинка. |
| 6.10 | Токены доступа с правами, доменами и лимитом запросов; защита от подбора ключей. |
| 6.9 | Корзина (мягкое удаление и восстановление) и срок жизни файлов. |
| 6.8 | Изменение размера и формата картинок на лету (WebP, AVIF, JPEG, PNG), миниатюры в файловом менеджере. |
| 6.7 | Повторы и история доставки webhook'ов, тест PING, статистика ключа, скачивание ZIP, исправлена проверка токенов Telegram-бота. |
Полная история изменений по эндпоинтам отражена в справочнике API.