{
  "version": 1,
  "article": {
    "url": "https://neosimvolist.team-wiki.ru/posts/demo-deploy-40x",
    "title": "Как мы ускорили деплой в 40 раз",
    "publishedAt": "2026-10-22T21:57:01.082Z",
    "modifiedAt": "2026-10-22T21:57:01.082Z"
  },
  "text": "Коротко\nПайплайн 14:12 → 0:21. Кэш зависимостей дал -5 мин, параллельные тесты -3 мин, кэш артефактов -5 мин.\n\nОбычный деплой занимал 14 минут 12 секунд. Из них 11 уходит на сборку и прогон тестов,\nи всё это - время, когда продакшен живёт старой версией.\n\n \n Главное правило\nПрежде чем оптимизировать, измерьте. У нас был дашборд с временем каждого этапа -\nи он показал, что 43% времени уходит на установку зависимостей, которые не менялись месяцами.\n\nЗамеры до\n\nОбычный пайплайн выглядел так:\n\n \n stages:\n - build # 6 мин 12 с\n - test # 4 мин 30 с\n - publish # 3 мин\n\n \n\nЭтап\nВремя\nДоля\n\nУстановка зависимостей\n5 мин 48 с\n42%\n\nКомпиляция\n22 с\n3%\n\nТесты\n4 мин 30 с\n32%\n\nСборка образа\n38 с\n5%\n\nВыкладка\n3 мин\n18%\n\n \n Главный подвох\nНикто не считал эти цифры три года. Ощущение \"деплой медленный\" не даёт понять,\nчто именно медленно - и оптимизация превращается в гадание.\n\nШаг 1: кэш зависимостей\n\nМонорепозиторий на Node.js. Ключ кэша - хеш файлов блокировки:\n\n \n LOCK_HASH=$(sha256sum package-lock.json | cut -d' ' -f1)\necho \"cache key: $LOCK_HASH\"\n\n \nTypeScript тоже кэшируется инкрементально:\n\n \n export default defineConfig({\n cacheDir: './node_modules/.cache/astro',\n vite: {\n build: { rollupOptions: { cache: true } },\n },\n});\n\n \nРезультат: 5 мин 48 с → 6 с.\n\nШаг 2: параллельные тесты\n\nТесты шли последовательно, хотя 90% из них независимы. Разбили на три группы:\n\n \n jobs:\n test:\n strategy:\n matrix:\n shard: [1, 2, 3]\n steps:\n - run: npm ci\n - run: npm test -- --shard=${SHARD}/3\n\n \n4 мин 30 с → 1 мин 05 с.\n\nШаг 3: кэш артефактов\n\nСборка образа повторялась с нуля. Перенесли build в отдельную стадию,\nа на publish отдаём готовый артефакт:\n\n \n # было\ndocker build -t app . &#x26;&#x26; docker push app &#x26;&#x26; ssh prod 'docker pull app'\n\n# стало\ndocker buildx build --cache-from=registry/app:build -t app --push .\nssh prod 'docker pull app &#x26;&#x26; docker restart app'\n\n \n3 мин → 22 с.\n\n \n\nИтог\n\nЭтап\nБыло\nСтало\nЭкономия\n\nСборка\n6 мин 12 с\n48 с\n-92%\n\nТесты\n4 мин 30 с\n1 мин 05 с\n-76%\n\nДеплой\n3 мин\n22 с\n-88%\n\nВсего\n14 мин 12 с\n2 мин 15 с\n-84%\n\n \n Три уровня кэша: зависимости, компиляция, образ\n\nЧто дало в деньгах\n\nПри 40 деплоях в неделю экономия - 11 часов в месяц. Плюс главный эффект:\nчастота выкладки выросла с 8 до 35 раз в неделю, потому что стало не страшно катить часто.\n\n \n Побочный эффект\nЧастые деплои дали 14 инцидентов в месяц против 3. Частота выкладки - не самоцель,\nи метрику надо смотреть вместе с MTTR.\n\nЧто бы я сделал иначе\n\nПоставить замеры до оптимизации, а не после. Это заняло бы час и сэкономило недели.\n\nНачать с кэша зависимостей - самый большой выигрыш при минимальном риске.\n\nНе трогать последовательность тестов на этапе, когда можно было добавить кэш.",
  "textB64": "0JrQvtGA0L7RgtC60L4K0J/QsNC50L/Qu9Cw0LnQvSAxNDoxMiDihpIgMDoyMS4g0JrRjdGIINC30LDQstC40YHQuNC80L7RgdGC0LXQuSDQtNCw0LsgLTUg0LzQuNC9LCDQv9Cw0YDQsNC70LvQtdC70YzQvdGL0LUg0YLQtdGB0YLRiyAtMyDQvNC40L0sINC60Y3RiCDQsNGA0YLQtdGE0LDQutGC0L7QsiAtNSDQvNC40L0uCgrQntCx0YvRh9C90YvQuSDQtNC10L/Qu9C+0Lkg0LfQsNC90LjQvNCw0LsgMTQg0LzQuNC90YPRgiAxMiDRgdC10LrRg9C90LQuINCY0Lcg0L3QuNGFIDExINGD0YXQvtC00LjRgiDQvdCwINGB0LHQvtGA0LrRgyDQuCDQv9GA0L7Qs9C+0L0g0YLQtdGB0YLQvtCyLArQuCDQstGB0ZEg0Y3RgtC+IC0g0LLRgNC10LzRjywg0LrQvtCz0LTQsCDQv9GA0L7QtNCw0LrRiNC10L0g0LbQuNCy0ZHRgiDRgdGC0LDRgNC+0Lkg0LLQtdGA0YHQuNC10LkuCgogCiDQk9C70LDQstC90L7QtSDQv9GA0LDQstC40LvQvgrQn9GA0LXQttC00LUg0YfQtdC8INC+0L/RgtC40LzQuNC30LjRgNC+0LLQsNGC0YwsINC40LfQvNC10YDRjNGC0LUuINCjINC90LDRgSDQsdGL0Lsg0LTQsNGI0LHQvtGA0LQg0YEg0LLRgNC10LzQtdC90LXQvCDQutCw0LbQtNC+0LPQviDRjdGC0LDQv9CwIC0K0Lgg0L7QvSDQv9C+0LrQsNC30LDQuywg0YfRgtC+IDQzJSDQstGA0LXQvNC10L3QuCDRg9GF0L7QtNC40YIg0L3QsCDRg9GB0YLQsNC90L7QstC60YMg0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5LCDQutC+0YLQvtGA0YvQtSDQvdC1INC80LXQvdGP0LvQuNGB0Ywg0LzQtdGB0Y/RhtCw0LzQuC4KCtCX0LDQvNC10YDRiyDQtNC+CgrQntCx0YvRh9C90YvQuSDQv9Cw0LnQv9C70LDQudC9INCy0YvQs9C70Y/QtNC10Lsg0YLQsNC6OgoKIAogc3RhZ2VzOgogLSBidWlsZCAjIDYg0LzQuNC9IDEyINGBCiAtIHRlc3QgIyA0INC80LjQvSAzMCDRgQogLSBwdWJsaXNoICMgMyDQvNC40L0KCiAKCtCt0YLQsNC/CtCS0YDQtdC80Y8K0JTQvtC70Y8KCtCj0YHRgtCw0L3QvtCy0LrQsCDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC10LkKNSDQvNC40L0gNDgg0YEKNDIlCgrQmtC+0LzQv9C40LvRj9GG0LjRjwoyMiDRgQozJQoK0KLQtdGB0YLRiwo0INC80LjQvSAzMCDRgQozMiUKCtCh0LHQvtGA0LrQsCDQvtCx0YDQsNC30LAKMzgg0YEKNSUKCtCS0YvQutC70LDQtNC60LAKMyDQvNC40L0KMTglCgogCiDQk9C70LDQstC90YvQuSDQv9C+0LTQstC+0YUK0J3QuNC60YLQviDQvdC1INGB0YfQuNGC0LDQuyDRjdGC0Lgg0YbQuNGE0YDRiyDRgtGA0Lgg0LPQvtC00LAuINCe0YnRg9GJ0LXQvdC40LUgItC00LXQv9C70L7QuSDQvNC10LTQu9C10L3QvdGL0LkiINC90LUg0LTQsNGR0YIg0L/QvtC90Y/RgtGMLArRh9GC0L4g0LjQvNC10L3QvdC+INC80LXQtNC70LXQvdC90L4gLSDQuCDQvtC/0YLQuNC80LjQt9Cw0YbQuNGPINC/0YDQtdCy0YDQsNGJ0LDQtdGC0YHRjyDQsiDQs9Cw0LTQsNC90LjQtS4KCtCo0LDQsyAxOiDQutGN0Ygg0LfQsNCy0LjRgdC40LzQvtGB0YLQtdC5CgrQnNC+0L3QvtGA0LXQv9C+0LfQuNGC0L7RgNC40Lkg0L3QsCBOb2RlLmpzLiDQmtC70Y7RhyDQutGN0YjQsCAtINGF0LXRiCDRhNCw0LnQu9C+0LIg0LHQu9C+0LrQuNGA0L7QstC60Lg6CgogCiBMT0NLX0hBU0g9JChzaGEyNTZzdW0gcGFja2FnZS1sb2NrLmpzb24gfCBjdXQgLWQnICcgLWYxKQplY2hvICJjYWNoZSBrZXk6ICRMT0NLX0hBU0giCgogClR5cGVTY3JpcHQg0YLQvtC20LUg0LrRjdGI0LjRgNGD0LXRgtGB0Y8g0LjQvdC60YDQtdC80LXQvdGC0LDQu9GM0L3QvjoKCiAKIGV4cG9ydCBkZWZhdWx0IGRlZmluZUNvbmZpZyh7CiBjYWNoZURpcjogJy4vbm9kZV9tb2R1bGVzLy5jYWNoZS9hc3RybycsCiB2aXRlOiB7CiBidWlsZDogeyByb2xsdXBPcHRpb25zOiB7IGNhY2hlOiB0cnVlIH0gfSwKIH0sCn0pOwoKIArQoNC10LfRg9C70YzRgtCw0YI6IDUg0LzQuNC9IDQ4INGBIOKGkiA2INGBLgoK0KjQsNCzIDI6INC/0LDRgNCw0LvQu9C10LvRjNC90YvQtSDRgtC10YHRgtGLCgrQotC10YHRgtGLINGI0LvQuCDQv9C+0YHQu9C10LTQvtCy0LDRgtC10LvRjNC90L4sINGF0L7RgtGPIDkwJSDQuNC3INC90LjRhSDQvdC10LfQsNCy0LjRgdC40LzRiy4g0KDQsNC30LHQuNC70Lgg0L3QsCDRgtGA0Lgg0LPRgNGD0L/Qv9GLOgoKIAogam9iczoKIHRlc3Q6CiBzdHJhdGVneToKIG1hdHJpeDoKIHNoYXJkOiBbMSwgMiwgM10KIHN0ZXBzOgogLSBydW46IG5wbSBjaQogLSBydW46IG5wbSB0ZXN0IC0tIC0tc2hhcmQ9JHtTSEFSRH0vMwoKIAo0INC80LjQvSAzMCDRgSDihpIgMSDQvNC40L0gMDUg0YEuCgrQqNCw0LMgMzog0LrRjdGIINCw0YDRgtC10YTQsNC60YLQvtCyCgrQodCx0L7RgNC60LAg0L7QsdGA0LDQt9CwINC/0L7QstGC0L7RgNGP0LvQsNGB0Ywg0YEg0L3Rg9C70Y8uINCf0LXRgNC10L3QtdGB0LvQuCBidWlsZCDQsiDQvtGC0LTQtdC70YzQvdGD0Y4g0YHRgtCw0LTQuNGOLArQsCDQvdCwIHB1Ymxpc2gg0L7RgtC00LDRkdC8INCz0L7RgtC+0LLRi9C5INCw0YDRgtC10YTQsNC60YI6CgogCiAjINCx0YvQu9C+CmRvY2tlciBidWlsZCAtdCBhcHAgLiAmI3gyNjsmI3gyNjsgZG9ja2VyIHB1c2ggYXBwICYjeDI2OyYjeDI2OyBzc2ggcHJvZCAnZG9ja2VyIHB1bGwgYXBwJwoKIyDRgdGC0LDQu9C+CmRvY2tlciBidWlsZHggYnVpbGQgLS1jYWNoZS1mcm9tPXJlZ2lzdHJ5L2FwcDpidWlsZCAtdCBhcHAgLS1wdXNoIC4Kc3NoIHByb2QgJ2RvY2tlciBwdWxsIGFwcCAmI3gyNjsmI3gyNjsgZG9ja2VyIHJlc3RhcnQgYXBwJwoKIAozINC80LjQvSDihpIgMjIg0YEuCgogCgrQmNGC0L7QswoK0K3RgtCw0L8K0JHRi9C70L4K0KHRgtCw0LvQvgrQrdC60L7QvdC+0LzQuNGPCgrQodCx0L7RgNC60LAKNiDQvNC40L0gMTIg0YEKNDgg0YEKLTkyJQoK0KLQtdGB0YLRiwo0INC80LjQvSAzMCDRgQoxINC80LjQvSAwNSDRgQotNzYlCgrQlNC10L/Qu9C+0LkKMyDQvNC40L0KMjIg0YEKLTg4JQoK0JLRgdC10LPQvgoxNCDQvNC40L0gMTIg0YEKMiDQvNC40L0gMTUg0YEKLTg0JQoKIAog0KLRgNC4INGD0YDQvtCy0L3RjyDQutGN0YjQsDog0LfQsNCy0LjRgdC40LzQvtGB0YLQuCwg0LrQvtC80L/QuNC70Y/RhtC40Y8sINC+0LHRgNCw0LcKCtCn0YLQviDQtNCw0LvQviDQsiDQtNC10L3RjNCz0LDRhQoK0J/RgNC4IDQwINC00LXQv9C70L7Rj9GFINCyINC90LXQtNC10LvRjiDRjdC60L7QvdC+0LzQuNGPIC0gMTEg0YfQsNGB0L7QsiDQsiDQvNC10YHRj9GGLiDQn9C70Y7RgSDQs9C70LDQstC90YvQuSDRjdGE0YTQtdC60YI6CtGH0LDRgdGC0L7RgtCwINCy0YvQutC70LDQtNC60Lgg0LLRi9GA0L7RgdC70LAg0YEgOCDQtNC+IDM1INGA0LDQtyDQsiDQvdC10LTQtdC70Y4sINC/0L7RgtC+0LzRgyDRh9GC0L4g0YHRgtCw0LvQviDQvdC1INGB0YLRgNCw0YjQvdC+INC60LDRgtC40YLRjCDRh9Cw0YHRgtC+LgoKIAog0J/QvtCx0L7Rh9C90YvQuSDRjdGE0YTQtdC60YIK0KfQsNGB0YLRi9C1INC00LXQv9C70L7QuCDQtNCw0LvQuCAxNCDQuNC90YbQuNC00LXQvdGC0L7QsiDQsiDQvNC10YHRj9GGINC/0YDQvtGC0LjQsiAzLiDQp9Cw0YHRgtC+0YLQsCDQstGL0LrQu9Cw0LTQutC4IC0g0L3QtSDRgdCw0LzQvtGG0LXQu9GMLArQuCDQvNC10YLRgNC40LrRgyDQvdCw0LTQviDRgdC80L7RgtGA0LXRgtGMINCy0LzQtdGB0YLQtSDRgSBNVFRSLgoK0KfRgtC+INCx0Ysg0Y8g0YHQtNC10LvQsNC7INC40L3QsNGH0LUKCtCf0L7RgdGC0LDQstC40YLRjCDQt9Cw0LzQtdGA0Ysg0LTQviDQvtC/0YLQuNC80LjQt9Cw0YbQuNC4LCDQsCDQvdC1INC/0L7RgdC70LUuINCt0YLQviDQt9Cw0L3Rj9C70L4g0LHRiyDRh9Cw0YEg0Lgg0YHRjdC60L7QvdC+0LzQuNC70L4g0L3QtdC00LXQu9C4LgoK0J3QsNGH0LDRgtGMINGBINC60Y3RiNCwINC30LDQstC40YHQuNC80L7RgdGC0LXQuSAtINGB0LDQvNGL0Lkg0LHQvtC70YzRiNC+0Lkg0LLRi9C40LPRgNGL0Ygg0L/RgNC4INC80LjQvdC40LzQsNC70YzQvdC+0Lwg0YDQuNGB0LrQtS4KCtCd0LUg0YLRgNC+0LPQsNGC0Ywg0L/QvtGB0LvQtdC00L7QstCw0YLQtdC70YzQvdC+0YHRgtGMINGC0LXRgdGC0L7QsiDQvdCwINGN0YLQsNC/0LUsINC60L7Qs9C00LAg0LzQvtC20L3QviDQsdGL0LvQviDQtNC+0LHQsNCy0LjRgtGMINC60Y3RiC4=",
  "textHash": "sha256:bd729decfbc6a2615c82f97c9651e86733f25cf93b7cc6402287caef04c5d9bc",
  "record": "https://neosimvolist.team-wiki.ru/posts/demo-deploy-40x\n2026-10-22T21:57:01.082Z\nsha256:bd729decfbc6a2615c82f97c9651e86733f25cf93b7cc6402287caef04c5d9bc",
  "recordB64": "aHR0cHM6Ly9uZW9zaW12b2xpc3QudGVhbS13aWtpLnJ1L3Bvc3RzL2RlbW8tZGVwbG95LTQweAoyMDI2LTEwLTIyVDIxOjU3OjAxLjA4MloKc2hhMjU2OmJkNzI5ZGVjZmJjNmEyNjE1YzgyZjk3Yzk2NTFlODY3MzNmMjVjZjkzYjdjYzY0MDIyODdjYWVmMDRjNWQ5YmM=",
  "recordHash": "sha256:fbe041ff5d40a976d662ca81225e34bb4549c713c9d07cc23eeeda381d70a178",
  "timestamp": {
    "service": "freetsa.org",
    "issuedAt": "2026-10-23T05:59:33.000Z",
    "token": "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",
    "query": "MDkCAQEwMTANBglghkgBZQMEAgEFAAQg7vV6JC2k4VU0mk3jyFQTl04OlLJdeSxPguiHMng3yhwBAf8=",
    "certificates": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUdZRENDQkVpZ0F3SUJBZ0lKQU1McGhoWU5xT25OTUEwR0NTcUdTSWIzRFFFQkRRVUFNSUdWTVJFd0R3WUQKVlFRS0V3aEdjbVZsSUZSVFFURVFNQTRHQTFVRUN4TUhVbTl2ZENCRFFURVlNQllHQTFVRUF4TVBkM2QzTG1aeQpaV1YwYzJFdWIzSm5NU0l3SUFZSktvWklodmNOQVFrQkZoTmlkWE5wYkdWNllYTkFaMjFoYVd3dVkyOXRNUkl3CkVBWURWUVFIRXdsWGRXVnllbUoxY21jeER6QU5CZ05WQkFnVEJrSmhlV1Z5YmpFTE1Ba0dBMVVFQmhNQ1JFVXcKSGhjTk1qWXdNakUxTVRrME5ESXlXaGNOTkRBd01qQXlNVGswTkRJeVdqQ0NBUXN4RVRBUEJnTlZCQW9NQ0VaeQpaV1VnVkZOQk1Rd3dDZ1lEVlFRTERBTlVVMEV4ZGpCMEJnTlZCQTBNYlZSb2FYTWdZMlZ5ZEdsbWFXTmhkR1VnClpHbG5hWFJoYkd4NUlITnBaMjV6SUdSdlkzVnRaVzUwY3lCaGJtUWdkR2x0WlNCemRHRnRjQ0J5WlhGMVpYTjAKY3lCdFlXUmxJSFZ6YVc1bklIUm9aU0JtY21WbGRITmhMbTl5WnlCdmJteHBibVVnYzJWeWRtbGpaWE14R0RBVwpCZ05WQkFNTUQzZDNkeTVtY21WbGRITmhMbTl5WnpFa01DSUdDU3FHU0liM0RRRUpBUllWWW5WemFXeGxlbUZ6ClFHMWhhV3hpYjNndWIzSm5NUkl3RUFZRFZRUUhEQWxYZFdWeWVtSjFjbWN4Q3pBSkJnTlZCQVlUQWtSRk1ROHcKRFFZRFZRUUlEQVpDWVhsbGNtNHdkakFRQmdjcWhrak9QUUlCQmdVcmdRUUFJZ05pQUFTaUZlR2hzdGJMaHhpeAowbzRVQXVtTlN3SFVVbE9lM0RCdnM4ZllzNTgwd0FEVzU5b3FHU0N4MTVicDYxVFNtWGt3TG0xSlc0OFhuYkxMCml6UDZadGpjdnNoVjNIOXV6MmJTNTNzZ0RYaGcxd0xiSWhBdHJhQytmSEN5dEhldVZhdWpnZ0htTUlJQjRqQUoKQmdOVkhSTUVBakFBTUIwR0ExVWREZ1FXQkJRVndMMG02OVJkZ3RGZGt5WXhMKzl3c290R1hqQWZCZ05WSFNNRQpHREFXZ0JUNlZRMk1OR1pSUTB6MzU3T25iSld2ZXVha2x6QUxCZ05WSFE4RUJBTUNCc0F3RmdZRFZSMGxBUUgvCkJBd3dDZ1lJS3dZQkJRVUhBd2d3YkFZSUt3WUJCUVVIQVFFRVlEQmVNRE1HQ0NzR0FRVUZCekFDaGlkb2RIUncKT2k4dmQzZDNMbVp5WldWMGMyRXViM0puTDJacGJHVnpMMk5oWTJWeWRDNXdaVzB3SndZSUt3WUJCUVVITUFHRwpHMmgwZEhBNkx5OTNkM2N1Wm5KbFpYUnpZUzV2Y21jNk1qVTJNREEzQmdOVkhSOEVNREF1TUN5Z0txQW9oaVpvCmRIUndPaTh2ZDNkM0xtWnlaV1YwYzJFdWIzSm5MMk55YkM5eWIyOTBYMk5oTG1OeWJEQ0J5QVlEVlIwZ0JJSEEKTUlHOU1JRzZCZ01yQlFnd2diSXdNd1lJS3dZQkJRVUhBZ0VXSjJoMGRIQTZMeTkzZDNjdVpuSmxaWFJ6WVM1dgpjbWN2Wm5KbFpYUnpZVjlqY0hNdWFIUnRiREF5QmdnckJnRUZCUWNDQVJZbWFIUjBjRG92TDNkM2R5NW1jbVZsCmRITmhMbTl5Wnk5bWNtVmxkSE5oWDJOd2N5NXdaR1l3UndZSUt3WUJCUVVIQWdJd094bzVSbkpsWlZSVFFTQjAKY25WemRHVmtJSFJwYldWemRHRnRjR2x1WnlCVGIyWjBkMkZ5WlNCaGN5QmhJRk5sY25acFkyVWdLRk5oWVZNcApNQTBHQ1NxR1NJYjNEUUVCRFFVQUE0SUNBUUJyTVZTL1lmbmZNcjB6aVpuZXNCVU9yRE5Sck5OZ3QzSWdNTkR3Ck5od2w2b0tXSFZJaGxZbk0vNWJvbGpmYnBaVEFicXZ4SEkzenRUMC9zd3hRT3FUYXQ1cUJKUkFZL1ZIMW4vVDQKTTl1RGpTdXUzcWZoMFpINVBMOUVOcW9WVzQ0aTVOVC96blFldjJNR1hPQUh3ejlrWnd3eno5TUZYNmhiR2hCcQpXYStubEFxYjdZNzJLRnpqMzNtMU9WSHhWMldsNFlEOWY5MWJaVEZwVUVHVzRLdGJrbXhwZi9pR0lQYWY0V0hwCm9CVy9PNkV6b2ZNS1lsejR5WHlFQmgwd1JSVnlYbHRMcmorTUZIcWhlK1BzTUJsbHEvZENhTzRXL0YrQXVIRWwKdTdhVVlXTUFTZWxwaFdBSmlVc05NcjVIQW9lQ1NTZ2lscWYxQ1NvV0MrazZlNDMzNEZ5bStJeTRjc01leCtQRwo0clNkcVhKVlErQVdFZFJhalNQS2g3eURmcE5rZG5PNnlxUUovdFNkMTFYUTVjTDBNOWpXdUNEMXpIbGdBK3UrClIyY3J5M3lvMjNqRDdxVEdMaFpxVXZYQ3lXaWdIMzAvUS9SWGpqRHdyYzRESmlRK2dSWTBGaGRUWXFsdmdNQlAKcjRMY0pLbk5rc2l2ZGora2J6N2JWU2JyQkF6Umlheks5bDg0MS81WE10UDlCdkQwaEtDcFFGdlA5UFNnQ0M4RQpRbktxZ1NlMjZGU0pCYUFRY0E1VG5LOE5GNGprYkVsQnhmL3p5aDdQM0lqSHNvMzVqdGdVV0QxL2l0ZzlCSldiCllVd0o0dGZJTHBCMkYwd2JrMUdjWkRDRFpveVczWGYzdHJBcHovWmQ5M2dGM2pvYzlIaDlSRnZlS1J6V1E3ZGQKVXQzZWdRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQoKLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUgvekNDQmVlZ0F3SUJBZ0lKQU1IcGhoWU5xT21BTUEwR0NTcUdTSWIzRFFFQkRRVUFNSUdWTVJFd0R3WUQKVlFRS0V3aEdjbVZsSUZSVFFURVFNQTRHQTFVRUN4TUhVbTl2ZENCRFFURVlNQllHQTFVRUF4TVBkM2QzTG1aeQpaV1YwYzJFdWIzSm5NU0l3SUFZSktvWklodmNOQVFrQkZoTmlkWE5wYkdWNllYTkFaMjFoYVd3dVkyOXRNUkl3CkVBWURWUVFIRXdsWGRXVnllbUoxY21jeER6QU5CZ05WQkFnVEJrSmhlV1Z5YmpFTE1Ba0dBMVVFQmhNQ1JFVXcKSGhjTk1UWXdNekV6TURFMU1qRXpXaGNOTkRFd016QTNNREUxTWpFeldqQ0JsVEVSTUE4R0ExVUVDaE1JUm5KbApaU0JVVTBFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEdEQVdCZ05WQkFNVEQzZDNkeTVtY21WbGRITmhMbTl5Clp6RWlNQ0FHQ1NxR1NJYjNEUUVKQVJZVFluVnphV3hsZW1GelFHZHRZV2xzTG1OdmJURVNNQkFHQTFVRUJ4TUoKVjNWbGNucGlkWEpuTVE4d0RRWURWUVFJRXdaQ1lYbGxjbTR4Q3pBSkJnTlZCQVlUQWtSRk1JSUNJakFOQmdrcQpoa2lHOXcwQkFRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQXRnS09EakF5OFJFUTJXVE5xVXVkQW5qaGxDcnBFNnFsCm1RZk5wcGVUbVZ2WnJINHp1dG4rTndUYUhBR3BqU0d2NC9XUnBaMXdaM0JSWjVtUFVCWnlMZ3EwWXJJZlE1RngKMHMvTVJaUHpjMXIzbEtXck1SOXNBUXg0bU40ejExeEZFTzUyOUwwZEZKalBGOU1EOEdwZDJmZVd6R3lwdGxlbApiK1BxVCsrK2ZPYTJvWTArTmFNTTdsL3hjTkhQT2FNejAvMm9sazBpMjJoYktlVmh2b2tQQ3FoRmh6c3VoS3NtCnE0T2Yvbyt0NmRJN3N4NWgwblBNbTRnR1NSaGZxK3o2QlRSZ0NycVFHMkZPTG9WRmd0NmlJbS9Cbk5mZlVyN1YKRFlkM3pabUl3Rk9qL0gzREtIb0dpay94SzNFODJZQTJadWxWT0ZSVy96ajRBcGpQYTVPRmJwSWtkMHBtenh6ZApFY0w0NzloU0E5ZEZpeVZtU3hQdFk1emUxUCtCRTliTVUxUFNjcFJ6dzhNSEZYeHlLcVcxM1F2N0xXdzRzYmszClNjaUI3R0FDYlFpVkd6Z2t2WEc2eTg1SE91dldOdkM1R0xTaXlQOUdsUEIwVjY4dGJ4ejRKVlRSZHcvWG4vWFQKRk56UkJNM2NxOGxCT0FWdC9QQVg1K3VGY3YxUzl3RkU4WWphQmZXQ1AxamRCaWwrYzRlKzB0ZHl3VDJvSm1ZQgpCRi9rRXQxd21Hd01tSHVuTkV1UU56aDFGdEpZNTRoYlVmaVdpMzhtQVNFN3hNdE1oZmovQzRTdmFwaUROODM3CmdZYVBmczh4M0taeGJYN0MzWUFzRm5KaW5sd0FVc3MxZmRLYXI4US9ZVnM3SC9uVTRjNEl4eHh6NGY2N2ZjVnEKTTJJVEtlbnRiQ01DQXdFQUFhT0NBazR3Z2dKS01Bd0dBMVVkRXdRRk1BTUJBZjh3RGdZRFZSMFBBUUgvQkFRRApBZ0hHTUIwR0ExVWREZ1FXQkJUNlZRMk1OR1pSUTB6MzU3T25iSld2ZXVha2x6Q0J5Z1lEVlIwakJJSENNSUcvCmdCVDZWUTJNTkdaUlEwejM1N09uYkpXdmV1YWtsNkdCbTZTQm1EQ0JsVEVSTUE4R0ExVUVDaE1JUm5KbFpTQlUKVTBFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEdEQVdCZ05WQkFNVEQzZDNkeTVtY21WbGRITmhMbTl5WnpFaQpNQ0FHQ1NxR1NJYjNEUUVKQVJZVFluVnphV3hsZW1GelFHZHRZV2xzTG1OdmJURVNNQkFHQTFVRUJ4TUpWM1ZsCmNucGlkWEpuTVE4d0RRWURWUVFJRXdaQ1lYbGxjbTR4Q3pBSkJnTlZCQVlUQWtSRmdna0F3ZW1HRmcybzZZQXcKTXdZRFZSMGZCQ3d3S2pBb29DYWdKSVlpYUhSMGNEb3ZMM2QzZHk1bWNtVmxkSE5oTG05eVp5OXliMjkwWDJOaApMbU55YkRDQnp3WURWUjBnQklISE1JSEVNSUhCQmdvckJnRUVBWUh5SkFFQk1JR3lNRE1HQ0NzR0FRVUZCd0lCCkZpZG9kSFJ3T2k4dmQzZDNMbVp5WldWMGMyRXViM0puTDJaeVpXVjBjMkZmWTNCekxtaDBiV3d3TWdZSUt3WUIKQlFVSEFnRVdKbWgwZEhBNkx5OTNkM2N1Wm5KbFpYUnpZUzV2Y21jdlpuSmxaWFJ6WVY5amNITXVjR1JtTUVjRwpDQ3NHQVFVRkJ3SUNNRHNhT1VaeVpXVlVVMEVnZEhKMWMzUmxaQ0IwYVcxbGMzUmhiWEJwYm1jZ1UyOW1kSGRoCmNtVWdZWE1nWVNCVFpYSjJhV05sSUNoVFlXRlRLVEEzQmdnckJnRUZCUWNCQVFRck1Da3dKd1lJS3dZQkJRVUgKTUFHR0cyaDBkSEE2THk5M2QzY3VabkpsWlhSellTNXZjbWM2TWpVMk1EQU5CZ2txaGtpRzl3MEJBUTBGQUFPQwpBZ0VBYUs5K3Y1T0ZZdTlNNnp0WUMrTDY5c3cxb21keWxpODlsWkFmcFdNTWg5Q1JtSmhNNktCcU0vaXB3b0x0Cm54eXhHc2JDUGhjUWp1VHZ6bSt5bE42VndUTW1JbFZ5VlNMS1laY2RTanQvZUNVTis0MUs3c0Q3R1ZteFpCQUYKSUxuQkRtVEdKbUxrclUwS3V1SXBqOGxJL0U2WjZObm11UDIrUkFRU0hzZkJRaTZzc3NuWE1vNEhPVzVndFBPNwpnRHJVcFZYSUQrKzFQNFhuZGtvS243U3Z3NW4welM5ZnYxaHhCY1lJSFBQUVV6ZTJ1MzBiQVF0MG4waUl5Ukx6CmFXdWh0cEF0ZDdmZndFYkFTZ3pCN0UrTkdGNHRwVjM3ZThLaUEyeGlHU1JxVDVuZHUyOGZncE9ZODdnRDNBcloKRGN0WnZ2VENmSGRBUzVrRU8zZ25HR2VaRVZMRG1mRXN2OFRHSmEzQWxqVmE1RTQwSVFEc1VYcFFMaThHK1VDNAoxRFdadThFVlQ0cm5ZYUN3MVZYN1NoT1IxUE5DQ3ZqYjhTOHRmZHVkZDl6aFUzZ0VCMHJ4ZGVUeTF0VmJOTFhXCjk5eTkweGN3cjFaSURVd00veFEvbm9POEZSaG0wTG9QQzczRWYrSjRaQmRydld3YXVGM3pKZTMzZDRpYnhFY2IKOC9wejVXekZrZWl4WU0ybnNIaHFIc0JLdzdKUG91S05YUm5sNUlBRTFlRm1xRHlDN0cvVlQ3T0Y2Njl4TTZoYgpVdDVHMjFKRTRjTks2Tk51Y1MrZnpnMUpQWDArM1Zoc1laamo3RDV1bGpSdlFYcko4aUhnci9NNmoyb0xIdlRBCkkyTUxkcTJxalpGRE9DWHN4QnhKcGJtTEdCeDlvdzZaZXJsVXh6d3MyQVd2MnBrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg=="
  },
  "howToVerify": [
    "1. sha256 от text должен совпадать с textHash:",
    "     jq -r .textB64 proof.json | base64 -d | sha256sum",
    "2. sha256 от record должен совпадать с recordHash:",
    "     jq -r .recordB64 proof.json | base64 -d | sha256sum",
    "3. подпись времени:",
    "     jq -r .timestamp.token        proof.json | base64 -d > token.tsr",
    "     jq -r .timestamp.query        proof.json | base64 -d > query.tsq",
    "     jq -r .timestamp.certificates proof.json | base64 -d > certs.pem",
    "     openssl ts -verify -in token.tsr -queryfile query.tsq -CAfile certs.pem",
    "   Ожидается: Verification: OK",
    "",
    "Хешировать нужно поля textB64 и recordB64, а не text и record:",
    "те печатаются текстом и теряют байты при разборе."
  ]
}