Правила разработки миниапов (обязательно к прочтению)¶
← Home · Это первый документ. Прочитать до начала работы.
Миниап — HTML/JS/CSS-приложение в изолированном iframe внутри Korfix CRM. Эти правила — про безопасность, корректность и портируемость.
Безопасность¶
Токены и секреты держи в env, не в коде.
KORFIX_TOKEN— в переменных окружения разработчика. Никогда не коммить в git миниапа, никогда не класть в zip, никогда не показывать в UI.- Если токен попал в коммит — сразу отзови его в
/db/apiи выпусти новый. - Для прода и теста — разные токены.
- Токен должен иметь минимум прав: только каталоги, которые реально нужны миниапу, только нужные методы (read/write).
- Секреты в
config.json(API-ключи внешних сервисов и т.п.) хранить вApp.storage, а не в файлах приложения.
Работа с API — только правильные каналы¶
Внутри iframe: используй App.fetch('/db/...').
Снаружи (webhook, n8n, скрипты): Authorization: Bearer <token> с /api/....
- Никогда не делай
window.fetch()напрямую из миниапа — CORS его заблокирует. - Никогда не используй куки/сессии браузера в обход
App.fetch— iframe изолирован, эти механизмы недоступны и могут дать неверный результат. - Никогда не захардкоживай URL инстанса (
panel.korfix.ruи т.п.) — пиши относительные пути, чтобы приложение работало на любом инстансе.
Что можно положить в zip¶
Разрешено: .html, .js, .css, .svg, .png, .jpg, .webp, .ico, .gif, .json, .md, .woff, .woff2, .ttf, .eot.
Запрещено: любые исполняемые/серверные расширения — .php, .exe, .sh, .py, .rb и т.п. При попытке загрузить zip с такими файлами платформа откажет.
Серверная логика — только через «удалённое приложение» (install_url вместо urls в config.json). Тогда серверный код живёт на твоём сервере, а миниап получает данные по HTTP от платформы через afterSave-вебхуки.
Портируемость¶
urlsв config.json — относительные пути ("main": "index.html"), если приложение упаковано в zip. Платформа сама подставит путь.- Не ссылайся на конкретный домен ни в коде миниапа, ни в
config.json, если это локальное приложение. Миниап должен работать наpanel.korfix.ru,acme.korfix.ruи любом другом инстансе без правок. - Не хардкодь ID статей, каталогов, групп — получай их через
App.fetch('/db/{catalog}/sheme.json')илиcatalog_schema().
Владение записей¶
При создании любой записи через API:
alias— генерировать явно:Date.now().toString(36) + Math.random().toString(36).substr(2, 8). Не полагаться на автогенерацию, особенно при массовой вставке.from_auth— ID создающего пользователя. Получать черезcatalog_schema().from_auth.arr— берёшь ключ отличный от0.from_group— тенант (группа). Обычно равенfrom_authдля персональных записей или ID группы для общих.
Без from_auth/from_group запись создаётся на суперадмина и не видна обычным пользователям. Это ошибка, не фича.
Принцип: не искать обходные пути¶
Если что-то не получается через App.fetch или документированные API — не ищи workaround. Остановись, задай вопрос: либо проблема в документации (раздел не покрыт), либо это действительно не должно делаться.
Примеры чего не надо:
- Встраивать <script> с внешнего домена чтобы обойти CORS (вместо этого — App.fetch через postMessage)
- Вызывать parent.postMessage напрямую с захардкоженным target origin (пиши через App-методы, они знают откуда пришли)
- Сохранять состояние в localStorage iframe'а (изолирован; вместо этого — App.storage)
- Использовать <iframe src="/db/..."> для обхода API (интерфейс платформы не гарантирован для встраивания)
Если не хватает API — создай issue в korfixdev/docs или спроси в коммьюнити. Не пиши код, который зависит от неописанного поведения платформы.
См. также¶
- getting-started.md — первое приложение с нуля
- data-api.md — форматы запросов и фильтры
- js-api.md — VMCRMUserApp: методы и события
- deploy.md — упаковка и деплой
- checklist.md — проверка перед релизом
Дальше: getting-started.md · ← Home