К содержанию
ActionPulse

Раздача файлов со своего домена

Как скопировать версионные файлы трекера на свой origin, проверить контрольные суммы, настроить кэширование и политику безопасности и не сломать загрузку дополнительных модулей.

Кому
Командам со строгой политикой безопасности и своей раздачей статики
Проверено
На этой странице

В этом режиме весь исполняемый код отдаёте вы со своего домена. Наружу уходят только данные событий.

Кому это нужно

  • Политика безопасности запрещает сторонние origin в script-src.
  • Требуется контролировать момент обновления версии трекера самостоятельно.
  • Внутренние правила требуют, чтобы весь исполняемый код проходил вашу проверку перед выкладкой.

Если ничего из этого не про вас — обычный тег скрипта проще в сопровождении.

Шаг 1. Скопируйте файлы версии

Нужны пять файлов: манифест и все четыре модуля одной версии.

VERSION=0.6.0
SRC=https://YOUR_ACTIONPULSE_HOST/v1/sdk/browser/$VERSION
DST=public/vendor/actionpulse/v1/sdk/browser/$VERSION

mkdir -p "$DST"
curl --fail --silent --show-error "$SRC/manifest.json"    -o "$DST/manifest.json"
curl --fail --silent --show-error "$SRC/tracker.js"       -o "$DST/tracker.js"
curl --fail --silent --show-error "$SRC/replay.js"        -o "$DST/replay.js"
curl --fail --silent --show-error "$SRC/diagnostics.js"   -o "$DST/diagnostics.js"
curl --fail --silent --show-error "$SRC/picker.js"        -o "$DST/picker.js"

Шаг 2. Сверьте контрольные суммы

До выкладки сверьте SHA-384 каждого файла со значением assets.*.sha384 из манифеста:

DST=public/vendor/actionpulse/v1/sdk/browser/0.6.0

for name in tracker replay diagnostics picker; do
  key=$name
  [ "$name" = "tracker" ] && key=core
  expected=$(python3 -c "import json,sys;print(json.load(open('$DST/manifest.json'))['assets']['$key']['sha384'])")
  actual=$(openssl dgst -sha384 "$DST/$name.js" | awk '{print $NF}')
  [ "$expected" = "$actual" ] && echo "ok   $name" || echo "FAIL $name"
done

Любое FAIL — повод остановить выкладку, а не «перекачать и посмотреть».

Шаг 3. Сохраните структуру каталогов

Имена файлов и путь v1/sdk/browser/<версия>/ менять нельзя. Префикс перед ними выбираете вы, но внутри структура фиксирована.

Ядро ищет свои модули относительно собственного адреса и делает это только тогда, когда путь заканчивается на /sdk/browser/<версия>/tracker.js. Стоит переименовать файл или «уплостить» каталог — и модули начнут запрашиваться с корня вашего домена, где их нет.

Шаг 4. Подключите тег

<script
  src="/vendor/actionpulse/v1/sdk/browser/0.6.0/tracker.js"
  integrity="SRI_FROM_MANIFEST"
  crossorigin="anonymous"
  data-api-host="https://YOUR_ACTIONPULSE_HOST"
  data-token="YOUR_BROWSER_TOKEN"
  data-consent="required"
></script>

data-api-host здесь обязателен: файл отдаёте вы, а события должны уходить в ActionPulse. Значение integrity возьмите из скопированного манифеста (assets.core.integrity) — приведённое выше значение является плейсхолдером.

При загрузке с того же origin, что и страница, crossorigin не обязателен, но и не мешает.

Шаг 5. Настройте раздачу

  • Отдавайте байты без изменений. Минификация, перепаковка или преобразования на стороне CDN ломают проверку целостности.
  • Кэшируйте версионный каталог надолго: Cache-Control: public, max-age=31536000, immutable.
  • Не перезаписывайте содержимое внутри уже опубликованной версии. Обновление — это новый каталог с новым номером версии.
  • Оставляйте предыдущую версию доступной, чтобы можно было откатиться.

Политика безопасности контента

script-src 'self';
connect-src 'self' https://YOUR_ACTIONPULSE_HOST;
worker-src 'self' blob:;

worker-src blob: нужен только для записи сессий. Без него записи не работают, а всё остальное продолжает собираться — симптом будет частичным.

Директиву unsafe-eval добавлять не нужно ни при каких условиях.

Обновление версии

  1. Скачайте новый манифест и все четыре файла новой версии в новый каталог.
  2. Сверьте суммы.
  3. Обновите в теге путь и значение integrity одной правкой.
  4. Убедитесь, что события идут, и только потом убирайте старый каталог.