DenchikP CDN
Руководство Политика конфиденциальности Условия использования API Docs
← К панели
Содержание
  1. 1Что такое DenchikP CDN
  2. 1.1. Как устроены адреса файлов
  3. 1.2. Что такое «домен» и какие они бывают
  4. 1.3. Основные понятия
  5. 2Быстрый старт
  6. 3Панель управления
  7. 3.1. Вход
  8. 3.2. Вкладка «Загрузка»
  9. 3.3. Вкладки «Удаление», «Скачать», «Просмотр», «Валидация»
  10. 3.4. Личный кабинет
  11. 3.5. Свои домены
  12. Автоматически через Cloudflare
  13. Правила и ограничения
  14. 4Файловый менеджер
  15. 4.1. Как открыть домен
  16. 4.2. Просмотр, поиск и сортировка
  17. 4.3. Выбор файлов и массовые действия
  18. 4.4. Меню файла
  19. 4.5. Загрузка файлов
  20. 4.6. Скачивание архивом и другие инструменты
  21. 4.7. Горячие клавиши
  22. 4.8. Тема и телефон
  23. 5Картинки: размер и формат
  24. 5.1. Из панели
  25. 5.2. Параметры в ссылке
  26. 6Жизненный цикл файлов
  27. 6.1. Корзина
  28. 6.2. Срок жизни файла
  29. 6.3. Дубликаты
  30. 6.4. Очистка домена public
  31. 7Доступ и шаринг
  32. 7.1. Приватные файлы
  33. 7.2. Подписанные ссылки
  34. 7.3. Публичные ссылки для шаринга
  35. 7.4. Защита от хотлинка
  36. 8Автоматизация
  37. 8.1. Ключи и токены
  38. Типы ключей
  39. 8.2. ShareX
  40. 8.3. Примеры запросов
  41. Загрузка по внешней ссылке
  42. Большие файлы по частям
  43. Список файлов, скачивание, удаление
  44. Пример для CI (GitHub Actions)
  45. Обработка лимитов и ошибок
  46. 8.4. Webhooks
  47. 8.5. Боты Discord и Telegram
  48. 8.6. Деплой из GitHub
  49. 8.7. Коннектор Claude
  50. 9Безопасность
  51. 9.1. Ключи
  52. 9.2. Что защищает сам сервис
  53. 9.3. Антивирусная проверка (ClamAV)
  54. 9.4. Памятка по безопасности
  55. 10Аналитика и мониторинг
  56. 10.1. Статистика ключа
  57. 10.2. Проверка работоспособности
  58. 10.3. Метрики Prometheus
  59. 10.4. OpenAPI
  60. 11Администрирование
  61. 11.1. Как всё устроено
  62. 11.2. Переменные окружения (.env)
  63. 11.3. Настройка Apache
  64. 11.4. Расписание очистки public
  65. 11.5. Сканирование диска
  66. 11.6. Резервные копии и обновления
  67. 11.7. Журналы
  68. 11.8. Типы ключей и домены пользователей
  69. 12Диагностика
  70. 12.1. Коды ответов
  71. 12.2. Частые вопросы
  72. Файл не открывается по ссылке
  73. Картинка не открывается со страницы моего сайта
  74. Панель говорит, что нет доступа к домену
  75. Домен не подтверждается
  76. Загрузка большого файла обрывается
  77. Как восстановить удалённый файл
  78. Как перенести сайт на другой домен
  79. Приватный файл всё равно открывается по прямой ссылке
  80. Webhook не приходит
  81. Панель ничего не показывает, а в консоли браузера 404 на /что-то
  82. 13Справочник
  83. 13.1. Лимиты и значения по умолчанию
  84. 13.2. Типы файлов и папки
  85. 13.3. Словарь терминов
  86. 14История версий

Руководство по DenchikP CDN

DenchikP CDN хранит ваши файлы и раздаёт их по постоянным ссылкам. Этим можно управлять из веб-панели, из скриптов через API или из ShareX. Руководство описывает все возможности по порядку: от первой загрузки до настройки сервера.

Быстрый стартПолучите ключ, загрузите файл и откройте ссылку за пять минут.Файловый менеджерПросмотр, поиск, массовые операции, редактор, загрузка с компьютера и из буфера.Доступ и шарингПриватные файлы, подписанные и публичные ссылки, защита от хотлинка.АвтоматизацияКлючи и токены, curl, ShareX, webhooks, примеры для CI.БезопасностьКак хранить ключи, ограничивать права и защищать загрузки.АдминистрированиеНастройка Apache, переменные окружения, расписание, мониторинг.
Примечание
Это руководство отвечает на вопрос «как этим пользоваться». Точные параметры запросов, коды ответов и примеры JSON собраны в справочнике API; та же схема в формате OpenAPI доступна на https://cdnapi.denchikp.com/openapi.json.

1. Что такое DenchikP CDN

CDN (сеть доставки контента) отдаёт статические файлы — картинки, стили, скрипты, шрифты, архивы, документы — быстро и по неизменному адресу. DenchikP CDN состоит из четырёх частей:

АдресНазначение
cdn.denchikp.comРаздача файлов. Сюда ведут ссылки на ваши файлы. За ним стоит Cloudflare, поэтому популярные файлы кешируются.
cdnapi.denchikp.comAPI: всё, что нужно для управления файлами, и публичные страницы ссылок для шаринга.
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 (по умолчанию) либо исходное имя, если вы так захотите. Случайные имена надёжнее: их нельзя угадать и они не конфликтуют.
Совет
Ссылка на файл постоянная. Если файл нужно заменить, загрузите новый с тем же именем и режимом «Перезаписать» — адрес не изменится. Не забудьте, что Cloudflare и браузеры могут некоторое время отдавать старую версию.

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 ключ. Ключи выдаёт администратор сервиса; если вы работаете в одиночку, ключ есть у владельца сервера (раздел Администрирование). Ключ — это пароль: не публикуйте его в репозиториях и чатах.

  1. Откройте https://static.denchikp.com/ и один раз подтвердите согласие с политикой и условиями использования.
  2. Введите ключ в поле «Войти через API ключ» (или войдите через Google, Discord, GitHub, Telegram и привяжите ключ — тогда вводить его повторно не придётся).
  3. Перейдите во вкладку «Загрузка», выберите домен и файл и нажмите «Загрузить файл».
  4. Скопируйте полученную ссылку и откройте её в браузере: файл раздаётся с cdn.denchikp.com.
Главная страница панели DenchikP CDN12345
Главная страница панели. Вкладки находятся в левом столбце.
  1. Название и версии. Версия панели и версия API (бейдж подтягивается с сервера).
  2. Состояние сервиса. Бейджи доступности: статус API, аптайм за 24 часа и время ответа.
  3. Тема. Переключатель светлой и тёмной темы. Выбор запоминается в браузере.
  4. Способы входа. Google, Discord, GitHub, Telegram или напрямую по API ключу. Внешний аккаунт привязывается к ключу один раз.
  5. Разделы. Загрузка, файловый менеджер, удаление, скачивание, просмотр, валидация и личный кабинет.

То же самое из командной строки — загрузка файла и получение ссылки:

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"
}
Важно
Загружайте на file.denchikp.com, а не на cdnapi.denchikp.com: у первого нет ограничения на размер тела запроса. Остальные методы API вызываются на cdnapi.denchikp.com.

Что можно сделать дальше:

  • удалить файл: 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 ключ» разрывает связь аккаунта с ключом, а «Выйти» завершает сессию.

Совет
Если панель не принимает ключ, проверьте три вещи: ключ включён, ваш IP разрешён (если у ключа есть ограничение по IP), и у ключа есть доступ к нужному домену. Сообщения об ошибках описаны в разделе Диагностика.

3.2. Вкладка «Загрузка»

Самая простая загрузка: ключ, домен, файл.

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

3.3. Вкладки «Удаление», «Скачать», «Просмотр», «Валидация»

Это простые формы для разовых задач. Для повседневной работы удобнее файловый менеджер.

Вкладка «Удаление»
«Удаление»: удаление одного файла по ссылке и массовое удаление списком ссылок (до 500 штук).

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

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

3.4. Личный кабинет

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

Личный кабинет1234
Личный кабинет.
  1. Вход. Через какой провайдер вы вошли и привязан ли ключ.
  2. Ключ. Имя ключа, доступные домены и ограничения по IP.
  3. Использование и квоты. Файлы, объём и остаток лимитов (в том числе помесячных).
  4. Домены. Список разрешённых доменов или «Любые».

Ниже находятся аналитика, webhooks, токены доступа, ShareX и список ваших файлов из базы данных с поиском. Вкладка «Админ» видна только ключам администраторов (создание и изменение ключей, журналы, запуск сканирования диска).

3.5. Свои домены

Карточка «Мои домены» закрепляет за вашим ключом собственный домен. После подтверждения владения только ваш ключ и администраторы могут загружать, менять и удалять файлы в папке этого домена. Читать файлы по-прежнему может кто угодно.

Мои домены в личном кабинете123456
Карточка «Мои домены» в личном кабинете.
  1. Добавить домен. Введите основной домен, например example.com. Заявка действует 7 дней.
  2. Лимит доменов. Сколько доменов подтверждено и сколько разрешено для типа вашего ключа.
  3. Способ подтверждения. TXT в DNS (рекомендуется), CNAME, файл на сайте, meta-тег или автоматически через Cloudflare.
  4. Запись для DNS. Скопируйте тип, имя и значение записи кнопкой «Копировать» и добавьте их в DNS домена.
  5. Проверить. Сервер сам проверит DNS, файл или meta-тег. DNS может обновляться до часа.
  6. Подтверждён. Подтверждённый домен доступен только вашему ключу. «Освободить» снимает закрепление.
  1. Нажмите «Добавить домен» и введите основной домен, например example.com. Адрес целиком (https://www.example.com/page) тоже подойдёт: лишнее отбрасывается.
  2. Выберите способ подтверждения и добавьте то, что показывает панель. Рядом с каждым значением есть кнопка «Копировать».
  3. Нажмите «Проверить». 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
Подтверждение файлом на сайте12
Способ «Файл на сайте»: адрес файла и его содержимое.
  1. Адрес файла. Файл должен открываться по этому адресу без редиректов на другие сайты.
  2. Содержимое. Только токен, без пробелов и разметки.

Автоматически через Cloudflare

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

Подтверждение через Cloudflare12
Подтверждение через Cloudflare.
  1. API-токен. С правами Zone:Read и DNS:Edit для одной зоны. Используется один раз и не сохраняется.
  2. Zone ID. Необязательно: без него зона ищется по имени домена.

Токен используется один раз: он не сохраняется на сервере, не пишется в журналы и не возвращается в ответе. После подтверждения его можно удалить в Cloudflare. Если DNS ещё не обновился, запись уже создана: нажмите «Проверить» через минуту.

Примечание
Автоматическое подтверждение работает только в веб-панели. В ботах его нет: токен нельзя отправлять в чат.

Правила и ограничения

  • Сколько доменов можно подтвердить, зависит от типа ключа: личный до 10, рабочий до 25, сервисный до 10. У администраторов лимита нет.
  • Заявка действует 7 дней, неподтверждённых заявок может быть не больше 10.
  • Домен, который уже используют другие ключи, закрепляет за вами администратор (вкладка «Админ»).
  • Кнопка «Освободить» снимает закрепление. Файлы в папке остаются, но домен снова доступен другим.
  • Автоматической перепроверки нет. Если домен перешёл другому владельцу, освободите его.
Важно
Если сайт закрыт защитой от ботов или фильтром по IP, способы «Файл» и «Meta-тег» могут не пройти: проверка идёт с серверов CDN. В таком случае используйте DNS.

4. Файловый менеджер

Вкладка «Файлы» — основной инструмент: в ней можно искать, просматривать, загружать, переименовывать, перемещать, копировать, делиться и удалять файлы домена.

Файловый менеджер, режим плитки123456789
Файловый менеджер в режиме плитки.
  1. API ключ. Подставляется автоматически при входе через аккаунт, иначе вводится вручную.
  2. Домен. Выберите из подсказок (недавние и доступные вашему ключу) или введите имя.
  3. Загрузка. Выбор файлов. Также работает перетаскивание в окно и вставка из буфера (Ctrl+V).
  4. Корзина. Удалённые файлы и их восстановление.
  5. Ссылки. Публичные ссылки для шаринга: отключение и отзыв.
  6. Дубликаты. Поиск и очистка файлов с одинаковым содержимым.
  7. Папки. Фильтр по типу файлов; полоса показывает долю папки в объёме домена.
  8. Поиск. По имени, типу и расширению. Справа — сортировка и переключатель вида.
  9. Файл. Клик — просмотр, галочка — выбор, «⋮» — меню действий.

4.1. Как открыть домен

  1. Введите API ключ (если вы вошли через аккаунт, он подставится сам).
  2. Выберите домен из подсказок или введите его имя и нажмите «Открыть» (или клавишу Enter).
  3. Под строкой с полями появятся шкалы квот: хранилище, число файлов и загрузки за месяц.

В подсказках домена сначала идут недавно открытые, затем доступные вашему ключу. Последний открытый домен запоминается в браузере.

4.2. Просмотр, поиск и сортировка

  • Слева список папок. Число рядом с названием — количество файлов, полоса — доля в общем объёме. Папка «Приватные» появляется, когда в домене есть приватные файлы.
  • Поиск работает по имени, типу и расширению.
  • Сортировка: сначала новые или старые, по имени (А → Я и Я → А), сначала крупные или мелкие.
  • Переключатель справа от сортировки меняет вид: плитка с миниатюрами или компактный список с размером и датой.
  • Миниатюры больших картинок загружаются уменьшенными (WebP шириной 360 px), поэтому плитка открывается быстро даже для тяжёлых изображений.

4.3. Выбор файлов и массовые действия

Нажмите галочку на файле, чтобы выбрать его. Shift+клик выбирает диапазон, Ctrl+клик добавляет файл к выбору, Ctrl+A выбирает все файлы, подходящие под фильтр.

Файловый менеджер, список с выбранными файлами1234
Список с тремя выбранными файлами. Над списком появилась панель массовых действий.
  1. Вид «Список». Компактный список с размером и датой. Переключатель запоминается.
  2. Выбрать все. Выбирает все файлы, подходящие под текущий фильтр.
  3. Выбранный файл. Shift+клик выделяет диапазон, Ctrl+клик добавляет файл к выбору.
  4. Массовые действия. Ссылки, ZIP, перемещение, копирование, срок жизни, доступ и удаление для всех выбранных файлов.

Для выбранных файлов доступны: получение ссылок в разных форматах, скачивание ZIP-архивом (до 200 файлов и 1 ГБ), перемещение, копирование, установка срока жизни, смена доступа (приватный или публичный) и удаление.

4.4. Меню файла

Кнопка «⋮» рядом с файлом (или щелчок по нему) открывает меню действий.

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

В меню картинки выберите «Размер и формат…».

Диалог «Размер и формат»12345
Диалог «Размер и формат». Результат считается на сервере, внизу — готовая ссылка.
  1. Предпросмотр. Результат считается на сервере; ниже — формат, размеры и экономия по сравнению с оригиналом.
  2. Размеры. Ширина и высота в пикселях (до 4096). Пустое поле — «авто».
  3. Режим. «Вписать» не увеличивает картинку; «Обрезать» заполняет рамку.
  4. Формат. WebP, AVIF, JPEG, PNG или «Авто» — формат выбирается по заголовку Accept браузера.
  5. Готовая ссылка. Ссылку или готовый тег <img> можно скопировать кнопками внизу.

Под предпросмотром видно формат, размеры и вес результата в сравнении с оригиналом. Кнопки «Копировать ссылку» и «Копировать <img>» копируют адрес или готовый тег.

5.2. Параметры в ссылке

Достаточно добавить параметры к адресу файла:

https://cdn.denchikp.com/example.com/img/hero-banner.png?w=800&format=webp&q=80
ПараметрЗначенияОписание
w, h1–4096Ширина и высота в пикселях. Если указан один параметр, второй вычисляется по пропорциям.
fitscale-down (по умолчанию), contain, coverscale-down вписывает картинку и никогда не увеличивает; cover обрезает по рамке (нужны оба размера).
formatauto (по умолчанию), webp, avif, jpeg, pngПри auto формат выбирается по заголовку Accept браузера: WebP, если он поддерживается, иначе исходный формат.
q1–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. Корзина

Кнопка «Удалить…» предлагает два варианта: «В корзину» (рекомендуется) и «Удалить навсегда».

Диалог удаления файла12
Диалог удаления.
  1. Удалить навсегда. Файл удаляется с диска без восстановления.
  2. В корзину. Рекомендуемый вариант: файл можно вернуть в течение 30 дней.

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

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

6.2. Срок жизни файла

Файлу можно задать время, через которое он удалится сам, минуя корзину: от минуты до десяти лет.

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

6.3. Дубликаты

Кнопка «Дубликаты» ищет среди файлов вашего ключа файлы с одинаковым содержимым (по SHA-256) и помогает убрать лишние.

Поиск дубликатов123
Поиск дубликатов: группы, выбор файла, который нужно оставить, и кнопка очистки.
  1. Итог. Сколько групп и лишних копий найдено и сколько места можно освободить.
  2. Группа. Отметьте файл, который нужно оставить; остальные уйдут в корзину.
  3. Удалить лишние копии. Сервер сам проверит, что содержимое совпадает.
  1. Откройте домен и нажмите «Дубликаты». Панель посчитает хэши только у файлов одинакового размера, это быстро.
  2. В каждой группе отметьте файл, который нужно оставить (по умолчанию — самый старый).
  3. Нажмите «Удалить лишние копии». Остальные копии уйдут в корзину, а публичные ссылки шаринга на них начнут вести на оставшийся файл.
Важно
Адреса удалённых копий перестают работать. Прежде чем чистить, убедитесь, что на них нет ссылок на сайтах. Копии можно вернуть из корзины в течение 30 дней.

Чтобы не создавать дубликаты заново, передавайте dedupe=true в POST /upload: если в домене у вашего ключа уже есть такой же файл, сервер не сохраняет новый, а возвращает адрес существующего с признаком deduplicated.

6.4. Очистка домена public

Файлы в домене public автоматически удаляются 1-го числа каждого месяца. Это выполняет задача планировщика на сервере (см. Администрирование). Для хранения используйте собственный домен.

7. Доступ и шаринг

Файл в CDN по умолчанию публичный: каждый, кто знает адрес, может его открыть. Для всего, что должно быть доступно ограниченному кругу, предусмотрены четыре инструмента. Они не исключают друг друга.

ИнструментДля чегоМожно отозвать?Нужен пароль?
Приватный файл (папка private)Скрыть файл от прямого доступа. Открывается только по подписанной ссылке, через API или по публичной ссылке.Да, вернув файл в публичныеНет
Подписанная ссылкаДать временный доступ без ключа (на минуты, часы, дни).Нет, только дождаться срока (или перенести файл)Нет
Публичная ссылка (шаринг)Страница скачивания с паролем, сроком и лимитом скачиваний.Да, в любой моментНеобязательно
Защита от хотлинкаНе дать другим сайтам встраивать ваши картинки и медиа.— (настройка сервера)Нет

7.1. Приватные файлы

Пункт «Сделать приватным» (в меню файла или для выбранных файлов) переносит файлы в папку private того же домена. Прямая ссылка на них перестаёт открываться (ответ 403), а текущий адрес файла меняется.

Диалог «Сделать приватным»
Подтверждение: что изменится, когда файл становится приватным.

Открыть приватный файл можно:

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

7.2. Подписанные ссылки

Подписанная ссылка содержит срок действия и криптографическую подпись. Подменить срок, имя файла или режим скачивания нельзя — подпись перестанет совпадать.

Подписанная ссылка на приватный файл123
Подписанная ссылка на приватный файл.
  1. Срок. От 15 минут до 30 дней. Ссылку нельзя отозвать — только дождаться окончания срока.
  2. Только скачивание. Файл не откроется в браузере, а сразу скачается.
  3. Ссылка. Открывается без ключа и работает и для приватных файлов.
  • Срок: от 15 минут до 30 дней в панели (через API — от 10 секунд до 30 дней).
  • Режим «Только скачивание» заставляет браузер сохранить файл, а не открыть его. HTML, SVG и JavaScript всегда отдаются как вложение.
  • Ссылку нельзя отозвать отдельно: она перестаёт работать по истечении срока, а также при переименовании, перемещении или удалении файла.
  • Смена секрета подписи на сервере делает все выданные ссылки недействительными.

7.3. Публичные ссылки для шаринга

Публичная ссылка ведёт на страницу https://cdnapi.denchikp.com/s/<код> со сведениями о файле и кнопкой «Скачать».

Диалог «Поделиться файлом»1234
Создание ссылки: срок, лимит скачиваний, пароль и название.
  1. Срок действия. После истечения страница ссылки отвечает «Срок действия истёк».
  2. Лимит скачиваний. После исчерпания лимита ссылка перестаёт работать.
  3. Пароль. Необязательно. Передайте пароль получателю отдельным каналом.
  4. Название. Показывается на странице вместо имени файла.
Ссылка для шаринга создана1
Готовая ссылка копируется одной кнопкой.
  1. Публичная ссылка. Откроет страницу со сведениями о файле и кнопкой «Скачать».

Получатель увидит такую страницу:

Страница публичной ссылки1
Страница публичной ссылки.
  1. Скачать. Скачивание считается в лимите и в статистике.

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

Публичная ссылка с паролем
Публичная ссылка с паролем (светлая тема страницы подстраивается под систему получателя).

Особенности:

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

Управлять ссылками удобно в окне «Ссылки» над списком файлов: там видно, сколько раз файл скачали, когда истекает срок, и можно отключить или отозвать ссылку.

Список публичных ссылок123
Окно «Ссылки».
  1. Описание. Название, наличие пароля, использовано скачиваний, срок. У истёкших и исчерпанных ссылок появляется отметка.
  2. Отключить. Временно закрывает ссылку, не удаляя её.
  3. Отозвать. Удаляет ссылку насовсем.

7.4. Защита от хотлинка

Хотлинк — это когда чужой сайт встраивает вашу картинку или видео прямо с вашего CDN и тем самым расходует ваш трафик. Правило в Apache разрешает такие файлы только со страниц самого домена-владельца и сайтов *.denchikp.com и *.denchikp.is. Запросы без заголовка Referer (прямое открытие ссылки, мессенджеры, большинство скриптов) пропускаются, домен public исключён.

Примечание
Referer — не настоящая защита: его легко подделать вне браузера. Для файлов, которые действительно нельзя отдавать посторонним, используйте приватный доступ и подписанные ссылки.

8. Автоматизация

8.1. Ключи и токены

Для скриптов и сторонних сервисов не отдавайте основной ключ. Вместо этого создайте токен доступа с минимально нужными правами. Токен используется вместо ключа в том же заголовке X-Api-Key (начинается с dpt_).

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

Типы ключей

Каждому ключу администратор назначает тип. Тип виден в кабинете, в админ-панели и в ботах.

ТипДля чегоСвоих доменовПривязка к аккаунтам
ЛичныйОдин человек: кабинет, боты, ShareX, личные проектыдо 10да
РабочийКоманда или проект: общие файлы и больше собственных доменовдо 25да
СервисныйАвтоматизация и интеграции: CI, серверы, скриптыдо 10нет

Сервисный ключ нельзя привязать к Google, Discord, GitHub или Telegram и нельзя использовать для входа в кабинет: он только для API. Остальные возможности у всех типов одинаковы; различаются назначение и лимит собственных доменов.

8.2. ShareX

ShareX — популярная программа для скриншотов и записи экрана. В кабинете можно скачать готовый конфиг .sxcu, и снимки будут загружаться в CDN по горячей клавише.

Конфигурация ShareX123
Генератор конфигурации ShareX.
  1. Ключ. Попадает в файл конфигурации — не публикуйте его. Для ShareX лучше выдать отдельный токен.
  2. Домен. Куда будут загружаться снимки.
  3. Скачать .sxcu. Откройте файл двойным щелчком, и ShareX предложит его установить.
  1. В кабинете введите ключ (лучше токен с правом upload) и домен.
  2. При желании включите «Сохранять исходные имена».
  3. Нажмите «Скачать .sxcu» и откройте файл двойным щелчком: ShareX предложит установить настройки.
  4. В 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.zip
curl -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 что-то происходит: загрузка, удаление, перемещение, изменение файла и другие события. Это способ синхронизироваться с другими системами без постоянных опросов.

Webhooks1234
Webhooks в личном кабинете: создание, тест и история доставок.
  1. Адрес. Только https. Адреса во внутренних сетях запрещены.
  2. Secret. Нужен для подписи запросов (HMAC-SHA256).
  3. События. Через запятую, либо * для всех событий.
  4. Тест и история. Тест отправляет событие 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);
}
Важно
Подписывайте и проверяйте именно сырое тело запроса (байты), а не повторно сериализованный JSON.

Если ваш сервер ответил кодом 408, 425, 429 или 5xx либо не ответил, доставка повторяется до трёх попыток с паузами 2 и 10 секунд. Все попытки записываются в историю: кнопка «История» показывает последние 50. Ответьте кодом 2xx как можно быстрее, а тяжёлую обработку выполняйте асинхронно.

8.5. Боты Discord и Telegram

Те же возможности доступны из мессенджеров: Discord-бот (слеш-команды) и Telegram-бот. Бот работает от имени вашего API ключа: привяжите аккаунт командой /bind (ключ вводится в диалоге бота), и все команды выполняются с вашими правами и ограничениями доменов.

Что нужно сделатьDiscordTelegram
Загрузить файл (со сроком жизни и без дубликатов)/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.

  1. Откройте «Аккаунт» → «Деплой из GitHub» и нажмите «Подключить GitHub».
  2. На GitHub выберите репозитории, к которым приложение получит доступ, и подтвердите установку. Вы вернётесь в панель.
  3. Выберите репозиторий, ветку, папку в репозитории (например dist; пусто — весь репозиторий) и домен CDN, нажмите «Добавить деплой».
  4. Сделайте push в ветку или нажмите «Выложить сейчас».
Деплой из GitHub в личном кабинете1234
Подключённые репозитории, итог последнего деплоя и форма нового деплоя.
  1. Подключить GitHub. Откроет GitHub: выберите репозитории для приложения DenchikP CDN и вернитесь в панель.
  2. Аккаунт GitHub. Подключённые аккаунты и организации. Щелчок открывает настройки доступа к репозиториям на GitHub.
  3. Выложить сейчас. Выложить последний коммит ветки, не дожидаясь push.
  4. Новый деплой. Репозиторий, ветка, папка в репозитории (например 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 не подключают.
Примечание
GitHub App создаёт администратор CDN один раз: вкладка «Админ» → «GitHub App» → «Создать GitHub App». Чтобы приложение принадлежало организации, укажите её имя в поле «Организация GitHub» (нужны права владельца организации); пустое поле — личный профиль. GitHub откроется с готовыми настройками, останется подтвердить.

8.7. Коннектор Claude

Коннектор DenchikP CDN подключает хранилище к Claude: ассистент может посмотреть квоты и домены, найти и прочитать файлы, показать статистику, создать временную ссылку и загрузить новый файл. Удобно для автоматизации: «выложи этот HTML на CDN и пришли ссылку», «найди мои CSS за этот месяц».

  1. В Claude (claude.ai) откройте «Настройки» → «Коннекторы» → «Добавить свой коннектор» и вставьте адрес https://cdnapi.denchikp.com/mcp.
  2. Откроется страница согласия DenchikP CDN. Если вы уже вошли в панель, она покажет ваш ключ; иначе введите свой обычный API ключ (не токен dpt_…).
  3. Нажмите «Разрешить». Claude получит собственный токен и сможет вызывать инструменты.
ИнструментЧто делает
Аккаунт и квотыИмя ключа, тариф, квоты, использование, доступные домены
Список файловФайлы, загруженные ключом, с поиском и фильтрами
Содержимое доменаФайлы домена по диску
Сведения о файлеРазмер, тип, наличие на диске
Прочитать текстовый файлСодержимое текстового файла или скрипта до 2 МБ
Статистика ключаЗагрузки, скачивания и просмотры за период
Временная ссылкаПодписанная ссылка с ограниченным сроком
Загрузить текстовый файл / файл в base64Новый файл из текста или base64 (до 8 МБ)
Загрузить по ссылкеСервер сам скачивает файл по адресу http/https
  • Токен коннектора имеет только права «чтение» и «загрузка». Удалить, перезаписать или изменить существующий файл через коннектор нельзя; если имя файла занято, загрузка отклоняется.
  • Ваш API ключ используется один раз для входа и не сохраняется. Коннектору выдаётся отдельный токен «Claude (MCP)» на 90 дней, по одному на ключ. Повторное подключение заменяет предыдущий токен.
  • Отозвать доступ можно в любой момент: удалите токен «Claude (MCP)» в разделе токенов или отключите коннектор в Claude.
  • Действуют обычные квоты ключа, ограничения по доменам, проверка антивирусом и лимит запросов токена (по умолчанию 120 в минуту).
  • Ключи со списком разрешённых IP не подходят: Claude подключается с адресов Anthropic. Для коннектора создайте отдельный ключ без списка IP и, при желании, ограничьте ему домены и квоту.
Примечание
Загруженные коннектором файлы остаются публичными: менять видимость он не может. Для приватных файлов используйте панель или обычный API.

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):

  1. Установите ClamAV и в clamd.conf включите приём по сети: TCPSocket 3310 и TCPAddr 127.0.0.1. Параметр StreamMaxLength задаёт максимальный размер проверяемого потока (по умолчанию 25 МБ).
  2. Настройте обновление баз (freshclam) и запустите clamd как службу.
  3. В .env добавьте CLAMAV_ENABLED=1 (при нестандартном адресе — CLAMAV_HOST, CLAMAV_PORT) и значение CLAMAV_MAX_SCAN_BYTES, равное StreamMaxLength. Перезапустите API.
  4. Проверьте состояние: GET /av/status должен вернуть enabled: true и reachable: true.
  • Файлы больше CLAMAV_MAX_SCAN_BYTES не проверяются.
  • Если clamd недоступен, по умолчанию загрузки принимаются, а ошибка пишется в журнал (CLAMAV_FAIL_MODE=open). Для строгого режима задайте CLAMAV_FAIL_MODE=closed: тогда загрузки будут отклоняться с ответом 503.
Примечание
Встроенный антивирус Windows (Defender) может блокировать запись вредоносных файлов на диск ещё до проверки ClamAV, и тестовый файл EICAR на Windows часто не доходит до ClamAV. Для папки хранилища при необходимости добавьте исключение в Defender.

9.4. Памятка по безопасности

  1. Выдайте скриптам токены вместо основного ключа и ограничьте их домены и сроки.
  2. Закройте в Apache папку /private/ и проверьте это: прямая ссылка на приватный файл должна отвечать 403.
  3. Используйте длинные случайные имена файлов (режим по умолчанию).
  4. Для webhooks всегда проверяйте подпись и метку времени.
  5. Включите ClamAV, если пользователи могут загружать файлы с неизвестным содержимым.
  6. Следите за журналом и метриками: рост числа ответов 401, 403 и 429 — признак подбора ключей.

10. Аналитика и мониторинг

10.1. Статистика ключа

В кабинете показаны загрузки, удаления и скачивания через API за выбранный период, график загрузок по дням, распределение по папкам и доменам и самые большие файлы.

Аналитика ключа123
Аналитика ключа за месяц.
  1. Период. День, неделя, месяц или год.
  2. Показатели. Загрузки, объём, удаления и скачивания через API за период.
  3. График. Загрузки по дням.
Примечание
Скачивания считаются только для запросов через 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 принимает ключ или токен.

Справочник API123
Справочник API: содержание с фильтром слева, карточки методов справа.
  1. Разделы документации. Руководство, справочник API, политика и условия.
  2. Поиск эндпоинта. Фильтрует содержание по методу и пути.
  3. Эндпоинт. Метод и путь. Щелчок открывает описание: параметры, примеры ответов и ошибки, у блоков кода есть кнопка копирования.

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.
OAuthGOOGLE_*, 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_TOKENBearer-токен для скрейпера Prometheus.
Очистка publicCDN_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]
Примечание
В Apache подстановка %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. Типы ключей и домены пользователей

Тип ключа выбирается при создании и меняется в карточке «Редактирование выбранного ключа». Новые ключи по умолчанию личные, существующие после обновления стали личными. В списке ключей тип показан цветной меткой.

Типы ключей в админ-панели123
Список ключей с типами.
  1. Личный. Для одного человека.
  2. Рабочий. Для команды или проекта, больше собственных доменов.
  3. Сервисный. Для интеграций, без привязки к аккаунтам.

Карточка «Домены пользователей» показывает все заявки и закреплённые домены с владельцем и способом подтверждения.

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

12. Диагностика

12.1. Коды ответов

Запросы к файлам и страницам, которые отклоняет веб-сервер (403, 404, 500), показывают страницу ошибки в дизайне сайта:

Страница ошибки 404
Страница ошибки 404. Кнопки возвращают назад или на главную.

Ответы самого 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. Частые вопросы

Файл не открывается по ссылке

  1. Проверьте адрес: домен, папка и имя должны совпадать символ в символ (регистр важен).
  2. Откройте файловый менеджер и найдите файл. Если его нет — возможно, он в корзине, удалён по сроку жизни или находился в домене public (чистится 1-го числа каждого месяца).
  3. Если это приватный файл — пользуйтесь подписанной или публичной ссылкой.
  4. Если вы только что заменили файл, а видите старый — сбросьте кеш браузера и 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)
Очистка public1-го числа каждого месяца в 03:00 UTC

13.2. Типы файлов и папки

ПапкаРасширения
imgjpg, jpeg, jfif, pjpeg, png, apng, webp, avif, svg, gif, ico, cur, bmp, tif, tiff, heic, heif, jxl
videomp4, m4v, webm, mov, mkv, avi, ogv, wmv, flv, 3gp, mpg, mpeg, ts, m2ts
audiomp3, wav, ogg, oga, opus, flac, m4a, aac, weba, wma, aif, aiff, mid, midi
docspdf, doc, docx, xls, xlsx, ppt, pptx, odt, ods, odp, rtf, txt, csv, md, epub
csscss
jsjs, mjs, cjs
fontswoff, 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.

© 2024 – 2026 DenchikP. Все права защищены.