[{"data":1,"prerenderedAt":240},["ShallowReactive",2],{"article-82-hi":3,"related-82":75,"ArticleBody_gDavXBneGOHeO2AbhFS0B0oPLMxM9PIJKUHWrdawjw":235},{"id":4,"title":5,"slug":6,"content":7,"metaTitle":5,"metaDescription":8,"coverUrl":9,"views":10,"likes":11,"createdAt":12,"updatedAt":13,"category":14,"tags":23,"author":9,"tableOfContents":40,"locale":9,"translated":73,"indexable":74},82,"TLS-фингерпринтинг: как сервер узнаёт твой клиент (JA3/JA4, uTLS)","tls-fingerprinting-kak-server-uznaet-tvoy-klient-ja3ja4-utls","# TLS-фингерпринтинг: как сервер узнаёт твой клиент (JA3/JA4, uTLS)\n\n**Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему**\n\n**Сторонний мой проект: [Zapret2UI.](https://github.com/Asterlike/zapret2UI)**\n\n---\n\nВсе привыкли, что HTTPS - это про «никто не видит, что я делаю». Но есть штука, которая происходит **до** того, как включится шифрование, и она сдаёт про вас больше, чем кажется. Первый же пакет TLS-рукопожатия уходит открытым текстом, и по нему сервер (а заодно и любой, кто смотрит трафик по пути) с хорошей точностью говорит: это Chrome 133 на Windows. Или: это Firefox. Или: а вот это вообще не браузер, это чья-то программа на Go.\n\nПри этом User-Agent тут вообще ни при чём - его можно написать любой, отпечаток от этого не поменяется. И наоборот: подделали отпечаток, а User-Agent забыли - получили нестыковку, по которой вас палят ещё вернее, чем без всякой подделки.\n\nРазберём, как это устроено технически, зачем оно нужно антифроду и антиботам, и - отдельным большим куском - **зачем всё это знать именно вам, если вы сидите из России**. Потому что там оно всплывает буквально в двух местах сразу: и когда ваш прокси-клиент палится по отпечатку, и когда вас ни с того ни с сего выкидывает из банковского приложения.\n\n**Кому пригодится:** если гоняете Xray/VLESS и не понимаете, что за поле `fingerprint` в конфиге и почему от него что-то зависит; если ловите непонятные баны и капчи там, где их быть не должно; или если просто интересно, по каким мелочам вас на самом деле опознают в сети.\n\n> Тема дуальная по своей природе: одни и те же методы работают и на защиту (антибот, антифрод, поиск малвари), и на приватность. Разбираю механику, а не «как кого-то обмануть».\n\n---\n\n## Содержание\n\n1. [Что улетает открытым текстом до шифрования](#что-улетает-открытым-текстом-до-шифрования)\n2. [JA3: первая попытка сосчитать отпечаток](#ja3-первая-попытка-сосчитать-отпечаток)\n3. [Почему JA3 сломался](#почему-ja3-сломался)\n4. [JA4: тот же смысл, но человекочитаемо](#ja4-тот-же-смысл-но-человекочитаемо)\n5. [Семейство JA4 плюс: TLS тут лишь один слой](#семейство-ja4-плюс-tls-тут-лишь-один-слой)\n6. [Кто и зачем этим пользуется](#кто-и-зачем-этим-пользуется)\n7. [uTLS: как клиент подделывает отпечаток](#utls-как-клиент-подделывает-отпечаток)\n8. [Зачем это знать, если вы из России](#зачем-это-знать-если-вы-из-россии)\n9. [Разбор поля fingerprint в конфиге Xray](#разбор-поля-fingerprint-в-конфиге-xray)\n10. [Грабли, на которые тут наступают](#грабли-на-которые-тут-наступают)\n11. [Постквантовый ClientHello и почему он теперь в двух пакетах](#постквантовый-clienthello-и-почему-он-теперь-в-двух-пакетах)\n12. [Как посмотреть свой отпечаток](#как-посмотреть-свой-отпечаток)\n13. [Короткий итог](#короткий-итог)\n\n[Источники](#источники)\n\n---\n\n## Что улетает открытым текстом до шифрования\n\nНачнём с базы, иначе дальше будет каша.\n\nКогда клиент устанавливает TLS-соединение, первым делом он шлёт пакет **ClientHello**. Шифрования ещё нет - его же и договариваются установить, - поэтому пакет идёт открытым текстом. Внутри лежит примерно такое:\n\n- версия TLS, которую клиент готов тянуть;\n- список поддерживаемых шифров (cipher suites) - **в том порядке, в каком клиент их предпочитает**;\n- список расширений (extensions) - тоже в своём порядке;\n- поддерживаемые эллиптические кривые и их форматы;\n- ALPN - какой протокол поверх пойдёт (`h2`, `http/1.1`);\n- SNI - к какому домену вообще идём (про это была [отдельная статья](domain-fronting-obhod-sni-i-pochemu-umer.md)).\n\nИ вот тут начинается самое главное: **этот набор у каждой TLS-библиотеки свой.** Chrome собирает свой список шифров в своём порядке, Firefox - в другом, Safari - в третьем, а библиотека `crypto/tls` из стандартной поставки Go - в четвёртом, совсем не похожем ни на один браузер. Никто это специально не задумывал как опознавательный знак, просто так вышло: разные команды писали разный код с разными приоритетами.\n\nОтсюда простая идея: возьмём эти поля, сложим в одну строку по фиксированным правилам, посчитаем хеш - и получим короткий идентификатор, по которому клиента можно узнавать. Вот с этого всё и началось.\n\n---\n\n## JA3: первая попытка сосчитать отпечаток\n\n**JA3** придумали в Salesforce в 2017 году, и работает он ровно так, как я описал выше. Берутся пять полей из ClientHello, строго в этом порядке:\n\n```\nTLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats\n```\n\nВсе значения переводятся в десятичные числа, поля разделяются запятой, значения внутри поля - дефисом. Получается длинная строка вида `771,4865-4866-4867-49195...,0-23-65281-10-11...,29-23-24,0`. От неё считают **MD5**, и вот эти 32 шестнадцатеричных символа и есть JA3.\n\nMD5 тут не ради криптографии (её тут никакой и нет), а чисто ради компактности - строка бывает длинной, а хеш всегда одного размера, его удобно хранить в базе и сравнивать.\n\nОтдельно есть **JA3S** - то же самое, но для ответа сервера (ServerHello). Пара «JA3 клиента + JA3S сервера» уже говорит «кто с кем и как договорился», а не только «кто пришёл», и по такой паре ловили, например, малварь, которая ходит на свои командные серверы.\n\nОдну важную мелочь в JA3 предусмотрели с самого начала: **GREASE-значения выбрасываются**. GREASE - это специально придуманный механизм, когда клиент подмешивает в списки заведомо мусорные значения, чтобы серверы не окостеневали и умели переваривать незнакомое. Если бы их считали как есть, отпечаток менялся бы при каждом соединении и был бы бесполезен.\n\n---\n\n## Почему JA3 сломался\n\nА теперь самое интересное в этой истории. В начале 2023 года Google в Chromium **включил перемешивание порядка расширений** в ClientHello - с каждым запуском порядок разный.\n\nЗадумано это было не против JA3, а против того самого окостенения: слишком много железок в интернете начали полагаться на конкретный порядок и ломались, если он менялся. Google решил проблему радикально - раз все привыкли к фиксированному порядку, пусть его не будет вообще.\n\nПобочный эффект оказался нокаутирующим. JA3 считает расширения **в том порядке, в каком они лежат** - а порядок теперь случайный. Значит, у одного и того же Chrome на одной и той же машине JA3 разный от сессии к сессии. Как идентификатор он превратился в тыкву практически за одно обновление браузера.\n\n> Забавно, кстати, что это ровно та же логика, по которой Chrome в своё время добил и другие способы себя опознавать. Не со зла, просто «пусть на нас ничего не завязывают».\n\n---\n\n## JA4: тот же смысл, но человекочитаемо\n\nНа замену пришёл **JA4** от FoxIO, и там учли и рандомизацию, и опыт предыдущих лет. Два принципиальных отличия:\n\n1. **Расширения и шифры сортируются** перед хешированием. Chrome может тасовать их как хочет - после сортировки результат один и тот же.\n2. **Отпечаток частично читается глазами**, вместо одного непрозрачного хеша.\n\nВыглядит он так:\n\n```\nt13d1516h2_8daaf6152771_e5627efa2ab1\n```\n\nРазбираем по кускам - и вот это, на мой взгляд, реально красиво сделано:\n\n| Кусок | Что значит |\n|---|---|\n| `t` | Транспорт: `t` - TLS поверх TCP, `q` - QUIC, `d` - DTLS |\n| `13` | Версия TLS - тут 1.3 |\n| `d` | SNI есть, идём по доменному имени (`i` было бы «идём на голый IP») |\n| `15` | Количество шифров - 15 штук |\n| `16` | Количество расширений - 16 штук |\n| `h2` | Первый и последний символ первого значения ALPN, тут `h2` |\n| `8daaf6152771` | Обрезанный SHA256 от отсортированного списка шифров |\n| `e5627efa2ab1` | Обрезанный SHA256 от расширений плюс алгоритмы подписи |\n\nТо есть даже не зная хешей, по первым десяти символам уже видно: пришёл клиент по TCP, TLS 1.3, с доменом в SNI, с 15 шифрами, 16 расширениями и HTTP/2 сверху. Аналитик читает это как строчку в логе, а не как «случайные 32 символа, ищи по базе».\n\nGREASE тут тоже выкидывается, как и в JA3.\n\n---\n\n## Семейство JA4 плюс: TLS тут лишь один слой\n\nJA4 - это не один отпечаток, а набор, который у FoxIO называется **JA4+**. Логика простая: TLS не единственное место, где клиент себя выдаёт своей манерой.\n\n- **JA4** - клиентский TLS, тот самый.\n- **JA4S** - ответ сервера, наследник JA3S.\n- **JA4H** - отпечаток на уровне **HTTP**: набор и порядок заголовков, куки, язык. Штука неприятная тем, что работает даже когда TLS-слой вы аккуратно подделали, - там своя манера, которую надо подделывать отдельно.\n- **JA4X** - отпечаток по X.509-сертификату, помогает связывать инфраструктуру, выпущенную одними руками.\n- **JA4L**, **JA4SSH** и прочие - по задержкам, по SSH-трафику и так далее.\n\nТенденция понятная: одного слоя мало, ловят по совокупности. Подделали TLS, но забыли про HTTP - вас всё равно видно, просто на этаж выше.\n\n---\n\n## Кто и зачем этим пользуется\n\nТут стоит сказать прямо, что это в первую очередь оборонительная технология, а не инструмент слежки за вами лично:\n\n- **Антибот и антифрод.** Самое массовое применение. Скрипт на Python с библиотекой `requests` имеет отпечаток, который не совпадает ни с одним браузером на планете. Никакой User-Agent «Mozilla/5.0...» его не спасёт - отпечаток считается ниже, на уровне самого TLS, и подделке из скрипта поддаётся тяжело.\n- **Защита от парсинга.** Cloudflare и подобные сервисы гоняют это в проде постоянно, и именно поэтому «просто подставить заголовки браузера» в парсере давно не работает.\n- **Поиск малвари в SOC.** Троян, который стучится на командный сервер, обычно использует какую-то одну библиотеку - и палится стабильным отпечатком даже в зашифрованном трафике, содержимое расшифровывать не надо.\n- **Классификация трафика на сетевом оборудовании.** А вот это уже ближе к нашей теме, к этому вернёмся отдельно.\n\n---\n\n## uTLS: как клиент подделывает отпечаток\n\nРаз отпечаток берётся из того, что клиент сам кладёт в ClientHello - значит, клиент может положить туда что-то другое. Проблема только в том, что обычные TLS-библиотеки такого не умеют: они собирают пакет так, как в них зашито, и снаружи это не поменять.\n\nОтсюда родился **uTLS** - форк стандартной TLS-библиотеки Go от команды refraction-networking, который даёт низкоуровневый доступ к ClientHello. В нём заготовлены **готовые слепки настоящих браузеров**, и библиотека собирает пакет байт в байт как выбранный браузер: тот же порядок, те же шифры, те же расширения.\n\nСлепков там прилично: Chrome разных версий вплоть до 133, Firefox, Safari, iOS, Edge, плюс китайские 360 и QQ. Библиотека живая, обновляется - последний релиз на момент написания статьи был в январе 2026-го, что важно, потому что браузеры меняются и слепки надо догонять.\n\nИменно на uTLS и стоит вся история с маскировкой у современных прокси. Собственно, поле `fingerprint` в конфиге Xray - это ровно выбор слепка из этого списка, ничего больше.\n\n---\n\n## Зачем это знать, если вы из России\n\nВот теперь к практике, потому что тут это всплывает не в теории, а в двух совершенно бытовых местах.\n\n**Первое: ваш прокси-клиент опознаётся по отпечатку.** ClientHello, напомню, идёт открытым текстом, расшифровывать ничего не надо. Если ваш клиент ходит с отпечатком, который не похож ни на один живой браузер, - он выделяется на общем фоне просто по факту своей непохожести, безо всякого анализа содержимого. Вот ровно поэтому в конфигах и стоит `fingerprint: \"chrome\"`, а не потому, что кто-то любит Chrome.\n\n**Второе, куда более бытовое: антифрод.** Тут смешная штука получается. Вы сидите через прокси, который честно подделывает отпечаток Chrome, а браузер у вас Firefox и User-Agent говорит «Firefox». Для банка, маркетплейса или любой площадки с нормальным антифродом это **рассинхрон**: на уровне TLS пришёл Chrome, на уровне HTTP - Firefox. Такого сочетания в природе не бывает, и реакция предсказуемая - капча, дополнительная проверка, а то и блок сессии. Люди потом ходят и гадают, чего это их вдруг стало выкидывать.\n\nМораль отсюда простая и невесёлая: **отпечаток должен быть согласован со всем остальным**, а «поставил что-то, лишь бы не дефолт» - это не работа, это самообман. Одна подделанная деталь при десяти неподделанных делает вас заметнее, а не незаметнее.\n\n---\n\n## Разбор поля fingerprint в конфиге Xray\n\nРаз уж мы [разбирали конфиги Xray построчно](https://serv.host/articles/74), давайте закроем это поле по-нормальному - оно того стоит, там несколько неочевидных вещей.\n\nЧто принимается (смотрел прямо в исходниках Xray, а не в чужих гайдах):\n\n| Значение | Что реально происходит |\n|---|---|\n| `chrome`, `firefox`, `safari`, `ios`, `android`, `edge`, `360`, `qq` | Косплеим конкретный браузер, слепок берётся из uTLS. Обычный, вменяемый выбор |\n| пусто (поля нет вообще) | Не «без маскировки», как многие думают, а тихо подставляется Chrome. uTLS всё равно включается |\n| `random` | Один слепок выбирается **случайно при старте процесса** и держится до перезапуска |\n| `randomized` | Собирается синтетический случайный ClientHello, который не соответствует **никакому** реальному браузеру |\n| несуществующее значение (опечатка) | Зависит от `security`. На обычном TLS - молча падаем на родной стек Go, ошибки в логе нет, просто отпечаток теперь как у Go-программы. На Reality - жёсткая ошибка `REALITY: failed to get fingerprint`, соединение не встанет вообще |\n\nОтдельно про `random` - тут прям массовое заблуждение, и я сам его в своё время повторял. Это **не** «новый отпечаток на каждое соединение». Xray выбирает один слепок из своего списка современных при инициализации и дальше живёт с ним, пока процесс не перезапустят. Смысл в том, чтобы разные пользователи выглядели по-разному, а не в том, чтобы мельтешить внутри одной сессии.\n\nИ ещё нюанс, который прямо следует из кода: в списке, откуда тянется `random`, лежат вперемешку свежие слепки и заметно пожилые - iOS 13, iOS 14, Edge 106. Выпадет вам такой - и вы косплеите браузер из позапрошлой эпохи, а это само по себе аномалия: живых клиентов с таким отпечатком в 2026 году почти не осталось. Вот отсюда и растёт мнение, что `random` не так хорош, как звучит.\n\n---\n\n## Грабли, на которые тут наступают\n\n- **Ставят `randomized`, думая, что это самый скрытный вариант.** На деле наоборот: получается отпечаток, не совпадающий ни с одним реальным браузером, то есть уникальный. Спрятаться в толпе - это быть **как все**, а не быть неповторимым.\n- **Опечатка в названии слепка.** `chrome131` вместо `chrome` - и вы молча уехали на голый Go-стек. Ошибки не будет, работать всё будет, а отпечаток при этом самый палевный из возможных.\n- **Подделали TLS, забыли про всё остальное.** JA4H на уровне HTTP, порядок заголовков, набор шрифтов в браузере, разрешение экрана - слоёв много, а согласовывать надо все.\n- **Взяли слепок и забыли на два года.** Chrome обновляется каждые несколько недель, реальные отпечатки уезжают. Слепок Chrome 96 сегодня - это как прийти в костюме десятилетней давности: вроде костюм, а всё равно оборачиваются.\n- **Считают, что отпечаток шифруется.** Не шифруется. ClientHello открытым текстом - в этом весь фокус.\n\n---\n\n## Постквантовый ClientHello и почему он теперь в двух пакетах\n\nСвежая история, про которую мало кто в курсе, а она уже поменяла картину.\n\nChrome с августа 2024 года по умолчанию включил постквантовый обмен ключами - гибрид **X25519MLKEM768**. Практическое следствие: доля с ключом в ClientHello раздулась до 1216 байт (32 байта от X25519 плюс 1184 от ML-KEM-768), и весь ClientHello перестал влезать в один TCP-сегмент. Теперь он **штатно разъезжается на два пакета**.\n\nОтсюда два следствия, оба интересных:\n\n- **Отпечатки поехали.** Слепки браузеров, снятые до постквантовой эпохи, перестали совпадать с живым Chrome - оттого в uTLS и появились отдельные слепки с пометкой `PQ`.\n- **Железки, которые не умеют собирать ClientHello из двух пакетов, начали ломаться.** Всякий анализатор трафика, который привык, что рукопожатие приходит одним куском, столкнулся с новой реальностью. Тут прямая связка с фрагментацией, [про которую я писал в статье про Xray](https://serv.host/articles/74): раньше разрыв ClientHello на куски был экзотикой, а теперь это штатное поведение самого популярного браузера планеты.\n\nИрония момента в том, что Google, добавляя постквантовую криптографию, попутно сделал раздельный ClientHello нормой - а норму уже нельзя считать признаком чего-то подозрительного.\n\n---\n\n## Как посмотреть свой отпечаток\n\nПроще всего просто открыть и посмотреть - это бесплатно и занимает секунд десять:\n\n- **[browserleaks.com/tls](https://browserleaks.com/tls)** - показывает ваши JA3 и JA4 по-человечески, плюс полный список шифров и расширений.\n- **[tls.peet.ws](https://tls.peet.ws/)** - подробнее и ближе к железу: сырой разбор ClientHello, порядок расширений, отдельно отпечаток HTTP/2.\n\nПолезное упражнение: откройте один и тот же сервис из обычного браузера и из-под своего клиента, а потом сравните. Сразу станет видно, что ваш конфиг реально показывает наружу, - а это куда убедительнее любых рассуждений о том, как оно должно работать в теории.\n\n---\n\n## Короткий итог\n\n- **ClientHello идёт открытым текстом** до всякого шифрования, и набор с порядком шифров и расширений выдаёт конкретную TLS-библиотеку.\n- **JA3** (Salesforce, 2017) - это MD5 от пяти полей ClientHello. Простой, массово внедрённый и уже почти нерабочий.\n- **Сломала его рандомизация порядка расширений в Chromium** с начала 2023-го: отпечаток стал плавать от сессии к сессии.\n- **JA4** решает это сортировкой и заодно делает отпечаток частично читаемым глазами: `t13d1516h2_...` разбирается без всякой базы.\n- **JA4+ ловит по совокупности слоёв** - TLS, HTTP, сертификаты, тайминги. Подделали один - остаются остальные.\n- **uTLS** - библиотека, которая собирает ClientHello байт в байт как выбранный браузер. Поле `fingerprint` в Xray - это ровно выбор слепка из неё.\n- **`random` выбирается один раз при старте процесса**, а не на каждое соединение, и может выпасть на устаревший слепок. `randomized` вообще не похож ни на один реальный браузер, что хуже, а не лучше.\n- **Главное практическое правило:** отпечаток должен быть согласован со всем остальным. Chrome на уровне TLS плюс Firefox в User-Agent - это не маскировка, а флаг.\n\n---\n\n**Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему**\n\n**Сторонний мой проект: [Zapret2UI.](https://github.com/Asterlike/zapret2UI)**\n\n---\n\n## Источники\n\n- [JA4+ - репозиторий FoxIO с полной спецификацией](https://github.com/FoxIO-LLC/ja4)\n- [JA4 - технические детали формата](https://github.com/FoxIO-LLC/ja4/blob/main/technical_details/JA4.md)\n- [Salesforce Engineering: TLS Fingerprinting with JA3 and JA3S](https://engineering.salesforce.com/tls-fingerprinting-with-ja3-and-ja3s-247362855967/)\n- [uTLS - репозиторий refraction-networking](https://github.com/refraction-networking/utls)\n- [Stamus Networks: как рандомизация расширений добила JA3](https://www.stamus-networks.com/blog/ja3-fingerprints-fade-browsers-embrace-tls-extension-randomization)\n- [BrowserLeaks TLS - посмотреть свой отпечаток](https://browserleaks.com/tls)\n- [TrackMe (tls.peet.ws) - подробный разбор ClientHello](https://tls.peet.ws/)\n","TLS-фингерпринтинг: как сервер узнаёт твой клиент (JA3/JA4, uTLS) Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему Сторонний мой",null,66,1,"2026-08-07T21:34:46.778Z","2026-09-01T19:52:01.000Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":19},24,"gaydy","Гайды",0,{"id":20,"value":21,"content":22,"sortOrder":18},23,"obshchee","Общее",[24,28,32,36],{"id":25,"value":26,"content":27},18,"gayd","гайд",{"id":29,"value":30,"content":31},19,"pravila","правила",{"id":33,"value":34,"content":35},115,"rukovodstvo","Руководство",{"id":37,"value":38,"content":39},120,"sovety","Советы",[41,42,45,47,49,51,53,55,57,59,61,63,65,67,69,71],{"level":11,"text":5},{"level":43,"text":44},2,"Содержание",{"level":43,"text":46},"Что улетает открытым текстом до шифрования",{"level":43,"text":48},"JA3: первая попытка сосчитать отпечаток",{"level":43,"text":50},"Почему JA3 сломался",{"level":43,"text":52},"JA4: тот же смысл, но человекочитаемо",{"level":43,"text":54},"Семейство JA4 плюс: TLS тут лишь один слой",{"level":43,"text":56},"Кто и зачем этим пользуется",{"level":43,"text":58},"uTLS: как клиент подделывает отпечаток",{"level":43,"text":60},"Зачем это знать, если вы из России",{"level":43,"text":62},"Разбор поля fingerprint в конфиге Xray",{"level":43,"text":64},"Грабли, на которые тут наступают",{"level":43,"text":66},"Постквантовый ClientHello и почему он теперь в двух пакетах",{"level":43,"text":68},"Как посмотреть свой отпечаток",{"level":43,"text":70},"Короткий итог",{"level":43,"text":72},"Источники",false,true,[76,109,122,136,148,165,187,196,209,221],{"id":77,"title":78,"slug":79,"content":80,"description":80,"coverUrl":9,"views":81,"likes":18,"createdAt":82,"category":83,"tags":85,"author":106},89,"Что такое uptime VPS и почему 99,9% - это не 100%","chto-takoe-uptime-vps","Что такое uptime VPS и почему 99,9% - это не 100% == Когда выбирают VPS, одним из первых показателей, на который обращают внимание, становится uptime. Провайдер",92,"2026-08-17T14:22:17.023Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":84},{"id":20,"value":21,"content":22,"sortOrder":18},[86,87,88,92,93,97,101,105],{"id":25,"value":26,"content":27},{"id":29,"value":30,"content":31},{"id":89,"value":90,"content":91},114,"bezopasnost","Безопасность",{"id":33,"value":34,"content":35},{"id":94,"value":95,"content":96},116,"instrukciya","Инструкция",{"id":98,"value":99,"content":100},117,"tutorial","Туториал",{"id":102,"value":103,"content":104},119,"ustanovka","Установка",{"id":37,"value":38,"content":39},{"id":107,"name":108,"slug":9},109,"serv.host",{"id":110,"title":111,"slug":112,"content":113,"description":113,"coverUrl":9,"views":114,"likes":11,"createdAt":115,"category":116,"tags":118,"author":121},87,"Хостинг API и бэкенд-приложений на VPS","hosting-api-i-bekend-prilojeniy-na-vps","Хостинг API и бэкенд-приложений на VPS == Если вы разрабатываете сайт, мобильное приложение или собственный сервис, рано или поздно возникает вопрос - где разме",94,"2026-08-17T13:52:11.777Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":117},{"id":20,"value":21,"content":22,"sortOrder":18},[119,120],{"id":25,"value":26,"content":27},{"id":98,"value":99,"content":100},{"id":107,"name":108,"slug":9},{"id":123,"title":124,"slug":125,"content":126,"description":126,"coverUrl":9,"views":127,"likes":11,"createdAt":128,"category":129,"tags":131,"author":9},86,"ИИ в технической работе: где помогает, а где нельзя доверять","ii-v-tehnicheskoy-rabote-gde-pomogaet-a-gde-nelzya-doveryat","ИИ в технической работе: где помогает, а где нельзя доверять Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему Сторонний мой прое",99,"2026-08-09T09:26:13.317Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":130},{"id":20,"value":21,"content":22,"sortOrder":18},[132,133,134,135],{"id":25,"value":26,"content":27},{"id":29,"value":30,"content":31},{"id":33,"value":34,"content":35},{"id":37,"value":38,"content":39},{"id":137,"title":138,"slug":139,"content":140,"description":140,"coverUrl":9,"views":114,"likes":18,"createdAt":141,"category":142,"tags":144,"author":9},85,"Почему ИИ делает не то, что просили, и врёт слишком правдоподобно.","pochemu-ii-delaet-ne-to-chto-prosili-i-vret-slishkom-pravdopodobno","Почему ИИ делает не то, что просили, и врёт слишком правдоподобно. Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему Сторонний мо","2026-08-09T08:51:02.943Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":143},{"id":20,"value":21,"content":22,"sortOrder":18},[145,146,147],{"id":29,"value":30,"content":31},{"id":33,"value":34,"content":35},{"id":37,"value":38,"content":39},{"id":149,"title":150,"slug":151,"content":152,"description":152,"coverUrl":9,"views":123,"likes":18,"createdAt":153,"category":154,"tags":156,"author":9},84,"Почему пинг ничего не говорит: jitter, потери пакетов и bufferbloat","pochemu-ping-nichego-ne-govorit-jitter-poteri-paketov-i-bufferbloat","Почему пинг ничего не говорит: jitter, потери пакетов и bufferbloat Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему Сторонний м","2026-08-09T05:55:28.579Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":155},{"id":20,"value":21,"content":22,"sortOrder":18},[157,158,162,163,164],{"id":29,"value":30,"content":31},{"id":159,"value":160,"content":161},113,"monitoring","Мониторинг",{"id":89,"value":90,"content":91},{"id":33,"value":34,"content":35},{"id":94,"value":95,"content":96},{"id":166,"title":167,"slug":168,"content":169,"description":169,"coverUrl":9,"views":170,"likes":11,"createdAt":171,"category":172,"tags":174,"author":9},83,"Свой мониторинг: Uptime Kuma или Prometheus с Grafana, и почему он обязан жить на отдельном сервере","svoy-monitoring-uptime-kuma-ili-prometheus-s-grafana-i-pochemu-on-obyazan-jit-na-otdelnom-servere","Свой мониторинг: Uptime Kuma или Prometheus с Grafana, и почему он обязан жить на отдельном сервере Вообще я микроразработчик, со мной можно связаться как угодн",90,"2026-08-09T05:54:48.670Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":173},{"id":20,"value":21,"content":22,"sortOrder":18},[175,176,177,178,179,180,181,182,186],{"id":25,"value":26,"content":27},{"id":29,"value":30,"content":31},{"id":159,"value":160,"content":161},{"id":89,"value":90,"content":91},{"id":33,"value":34,"content":35},{"id":94,"value":95,"content":96},{"id":98,"value":99,"content":100},{"id":183,"value":184,"content":185},118,"nastroyka","Настройка",{"id":37,"value":38,"content":39},{"id":4,"title":5,"slug":6,"content":8,"description":8,"coverUrl":9,"views":188,"likes":11,"createdAt":12,"category":189,"tags":191,"author":9},63,{"id":15,"value":16,"content":17,"sortOrder":18,"parent":190},{"id":20,"value":21,"content":22,"sortOrder":18},[192,193,194,195],{"id":25,"value":26,"content":27},{"id":29,"value":30,"content":31},{"id":33,"value":34,"content":35},{"id":37,"value":38,"content":39},{"id":197,"title":198,"slug":199,"content":200,"description":200,"coverUrl":9,"views":201,"likes":11,"createdAt":202,"category":203,"tags":205,"author":9},81,"Whois-приватность: кто на самом деле видит твои данные при регистрации домена","whois-privatnost-kto-na-samom-dele-vidit-tvoi-dannye-pri-registracii-domena","Whois-приватность: кто на самом деле видит твои данные при регистрации домена Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему С",56,"2026-08-07T21:03:10.184Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":204},{"id":20,"value":21,"content":22,"sortOrder":18},[206,207,208],{"id":29,"value":30,"content":31},{"id":89,"value":90,"content":91},{"id":33,"value":34,"content":35},{"id":210,"title":211,"slug":212,"content":213,"description":213,"coverUrl":9,"views":214,"likes":11,"createdAt":215,"category":216,"tags":218,"author":9},80,"Domain fronting: как работал обход SNI-фильтрации и почему умер","domain-fronting-kak-rabotal-obhod-sni-filtracii-i-pochemu-umer","Domain fronting: как работал обход SNI-фильтрации и почему умер Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему Сторонний мой п",60,"2026-08-07T20:39:32.556Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":217},{"id":20,"value":21,"content":22,"sortOrder":18},[219,220],{"id":89,"value":90,"content":91},{"id":33,"value":34,"content":35},{"id":222,"title":223,"slug":224,"content":225,"description":225,"coverUrl":9,"views":226,"likes":11,"createdAt":227,"category":228,"tags":230,"author":9},78,"Как находят настоящий IP сайта за Cloudflare и как его спрятать по-настоящему","kak-nahodyat-nastoyashchiy-ip-sayta-za-cloudflare-i-kak-ego-spryatat-po-nastoyashchemu","Как находят настоящий IP сайта за Cloudflare - и как его спрятать по-настоящему Вообще я микроразработчик, со мной можно связаться как угодно, я открыт ко всему",62,"2026-08-07T20:37:51.437Z",{"id":15,"value":16,"content":17,"sortOrder":18,"parent":229},{"id":20,"value":21,"content":22,"sortOrder":18},[231,232,233,234],{"id":89,"value":90,"content":91},{"id":33,"value":34,"content":35},{"id":94,"value":95,"content":96},{"id":37,"value":38,"content":39},["Island",236],{"key":237,"result":238},"ArticleBody_gDavXBneGOHeO2AbhFS0B0oPLMxM9PIJKUHWrdawjw",{"head":239},{},1788480053937]