Завтра, 28 октября 2026, Node.js 26 перестаёт быть «Current» и становится Active LTS.[1][2][3] Если вы self-hosted’ите Node на VPS - это ваш естественный триггер для апгрейда. В этот раз у него две дополнительные причины не откладывать. Во-первых, линия, на которой вы, возможно, сидите (v24 «Krypton»), уже потеряла статус Active: она ушла в Maintenance LTS 20 октября 2026.[2][3] Во-вторых, версия, на которую вы в любом случае перейдёте - 26.12.1 - это ровно та, что несёт октябрьский security-релиз, включая фикс Node2Shell (Brotli).[5][6]
То есть апгрейд на 26 и установка security-патча - одна и та же операция. Ниже: что меняется завтра, что ждёт при миграции с 24/22 на реальном VPS и точные команды, чтобы пройти путь от node -v до проверенного пропатченного рантайма.
Что меняется 28 октября 2026
Даты в расписании release-группы стабильны уже несколько месяцев, и их стоит выписать:[2]
| Линия | Релиз | Статус сейчас | Maintenance | End of life |
|---|---|---|---|---|
| v26 | 2026-05-05 | Current → Active LTS 28.10.2026 | 2027-10-20 | 2029-04-30 |
| v24 (Krypton) | 2025-05-06 | Maintenance (с 2026-10-20) | - | 2028-04-30 |
| v22 (Jod) | 2024-04-24 | Maintenance (с 2025-10-21) | - | 2027-04-30 |
Из таблицы вытекают три практических факта.
v24 больше не «текущий LTS». С 20 октября он в Maintenance: security- и критические фиксы он получает (24.22.1 вышел 21-го - об этом ниже), но новых фич нет, а до end-of-life меньше 18 месяцев.[2][3] Если ваш прод на 24.x потому, что это «линия Active LTS», - такая формулировка перестала быть правдой неделю назад.
v22 - самая старая живая линия. Его Maintenance-фаза началась 21 октября 2025, end-of-life - 30 апреля 2027, примерно через полгода.[2][3] Он всё ещё получает security-релизы (22.23.4), но вы уже в зоне, где вынужденная миграция - вопрос «когда», а не «если».
v26 - линия, на которую проект хочет вас перевести. На официальной странице релизов сказано прямо: «Production applications should only use Active LTS or Maintenance LTS releases» - в продакшене следует использовать только релизы Active LTS или Maintenance LTS.[1] С 28 октября v26 - это линия Active LTS, а 26.12.1 - её текущий патч-релиз.
Смена каденции: это последний переход целой эпохи
Внутри этой конкретной даты спрятан более длинный тренд, и он меняет подход к каждому будущему апгрейду Node - а не только к этому.
28 октября 2026 - последний LTS-промоут по старой чётно-нечётной модели. Официальный анонс проекта не оставляет места для разночтений: «Node.js 26 follows the existing schedule. This is the last release line under the current model» - Node 26 идёт по существующему расписанию, это последняя линия текущей модели.[4] В этой модели чётный major (22, 24, 26) выходил в апреле, полгода был Current, в октябре становился LTS и жил около 30 месяцев; нечётный major был одноразовым и умирал через полгода.
Начиная с Node.js 27 расписание меняется на один major в год: Alpha полгода (октябрь–март), Current полгода (апрель–октябрь), затем LTS с 30 месяцами поддержки - и, главное, каждый релиз становится LTS. Чётно-нечётной лотереи больше нет.[1][4] По расписанию релизов, Alpha-фаза v27 стартует в тот же день, когда v26 входит в LTS (28 октября 2026), с 27.0.0 в апреле 2027 и LTS в октябре 2027.[2][4]
Что это значит для выбора версии на вашем VPS:
- Эвристика «жди чётное число» умирает с v27. Больше нельзя по чётности номера судить, безопасно ли тащить линию в прод. Каждый major - кандидат в LTS; вопрос теперь не «станет ли», а «дошёл ли он до LTS».
- Сам LTS-гейт не меняется. Даже в новой модели линия не рекомендуется для прода до выхода из Current в LTS.[1] Ставить свежий major в первый же день по-прежнему плохая идея; прицеливаться в октябрьский промоут - правильный ритм.
- v26 - последняя линия, на которую вы перейдёте «по старым правилам». С 2027 года ваш ритм апгрейдов - один LTS-кандидат в год, и расписание даёт вам эти номера на десять лет вперёд: 27 в 2027, 28 в 2028 и далее.[4] Планируйте ежегодно, в октябре, а не по двухлетнему циклу «большого апгрейда», к которому привыкли self-hosted’еры.
Security-угол: 26.12.1 - это и есть патченная версия
21 октября 2026 Node.js выпустил security-релизы сразу по всем трём поддерживаемым линиям - максимальный уровень серьёзности на каждой линии HIGH.[5] Для линии 26.x этим релизом стала 26.12.1 - та самая версия, которую вы завтра всё равно будете ставить. В октябрьский батч входят, помимо прочего:[6]
- CVE-2026-111497 (High) - out-of-bounds запись в декодере Brotli, она же Node2Shell: удалённый неаутентифицированный атакующий достаёт её по HTTP с любой стороны соединения - злонамеренный клиент бьёт в Express-роут, декодирующий тело с
Content-Encoding: br, или злонамеренный сервер бьёт в ваш встроенныйfetch(), который прозрачно разжимает Brotli-ответ. Imperva продемонстрировала удалённое исполнение кода на официальном непропатченном образе Node 24. Механику и проверки для VPS мы подробно разбираем в гайде про Node2Shell.[7] - CVE-2026-105482 (High) - имена DNS с NUL-байтом молча обрезаются в
dns.resolve*()/dns.reverse()вместо отклонения:dns.resolve("trusted.example\0.evil.example")на самом деле резолвитevil.example. - CVE-2026-105483 и CVE-2026-106069 (High) - два обхода проверки hostname в TLS (IPv4-литералы с fullwidth-цифрами и с ведущим нулём): сертификат для одного IP аутентифицирует соединение к другому.
- Обновления зависимостей на линии 26: Undici 8.12.2, c-ares 1.34.9, корневой CA-набор до NSS 3.131.1.[6]
Для self-hosted’ера всё это схлопывается в одну фразу: октябрьские CVE закрываются только бампом версии, и этот бамп ставит вас на линию, которая завтра станет рекомендованной для прода. Если у вас 26.x - проверьте, что стоит ≥ 26.12.1. Если 24.x или 22.x - переход на 26.12.1 закрывает тот же набор дыр (плюс fullwidth-digit TLS-фикс, которого линия 22.x не получает вообще - подробности в разборе октябрьского security-релиза).[6]
Чего ждать при переезде с 24/22 на 26
Node 26 - это не переименованный Node 24. В релизных заметках v26.0.0 перечислены и главные изменения, и удаления, о которые можно споткнуться:[8]
- V8 14.6 (Chromium 146) - поведение движка меняется на уровне, который ваш код не контролирует.
- Temporal API включён по умолчанию - новый date/time API активен; если какая-то зависимость шимит или полифиллит его части - проверьте пересечение.
- Undici 8.0 - встроенный HTTP-клиент (
fetch, внутренностиhttp.ClientRequest) получил мажорный бамп дважды на линии 26 и в 26.12.1 стоит на 8.12.2.[6][8] - Удалены API, которые может трогать код 2019–2023 годов:
http.Server.prototype.writeHeader()полностью удалён (используйтеwriteHead()); удалены легаси-модули_stream_wrap/_stream_readable/_stream_writable/_stream_duplex/_stream_transform/_stream_passthrough; удалён флаг--experimental-transform-types.[8]
Практическая проверка совместимости для VPS-деплоя короткая:
# Что реально крутится в проде, а не то, что вам кажется:
node -v
# Декларирует ли package.json диапазон Node?
grep '"node"' package.json
# "engines": { "node": ">=22" } - поднимите до проверенного, например ">=26 <27" или "^26"
# Нативные модули (sharp, bcrypt, node-gyp-сборки) нужно пересобрать под новый ABI:
npm rebuild
# или чище:
rm -rf node_modules package-lock.json && npm install
Затем прогоните тесты на новом рантайме до того, как трогать прод. Классические «работает в dev, падает на сервере» сценарии на мажорных версиях Node - это почти всегда одно из: удалённый легаси-API, несовпадение ABI нативного модуля или транзитивная зависимость, запиннившая engines на старый major и отказавшаяся ставиться. Все три всплывают в staging-проверке на 26.12.1 за несколько минут после переключения версии - это сильно дешевле, чем ловить их в три часа ночи на живом сервере.
Сама миграция: проверка, установка, верификация
Если Node управляется через nvm (обычная схема на однопользовательском VPS):
node -v # v24.22.x или v22.23.x - вы в зоне риска
nvm install 26.12.1 # ставит security-исправленную версию Active LTS
nvm use 26.12.1
nvm alias default 26.12.1 # фиксируем default для шелла
node -v # v26.12.1 - подтверждено на новом рантайме
Если деплой идёт через nvmrc или engines - обновите эти файлы до 26.12.1 / >=26 <27, чтобы CI и свежие клоны попадали на ту же линию. Если Node запускается с прямого бинарного тарбола (частый паттерн для минимальных VPS и Dockerfile):
wget https://nodejs.org/dist/v26.12.1/node-v26.12.1-linux-x64.tar.xz
sudo tar -xJf node-v26.12.1-linux-x64.tar.xz -C /usr/local --strip-components=1
node -v # v26.12.1
Затем перезапустите process manager, чтобы обслуживающий процесс реально работал на новом бинарнике - бамп версии засчитывается только после рестарта процесса на него:
pm2 restart <app-name> # именно restart, а не просто reload
pm2 describe <app-name> | grep uptime # убедитесь, что PID свежий после переключения
Для контейнеров - пересоберите образ на новый базовый образ или runtime-тег и передеплойте: важна именно прослойка образа, и контейнер, собранный на старом рантайме месяцы назад, останется на старом бинарнике, пока его не пересоберут.
Три быстрые проверки после переключения:
node -v # v26.12.1
node -p process.versions.brotli # 1.2.1 - пропатченный декодер
npm config get registry # sanity: апгрейд не прошёл через устаревшее зеркало дистрибутива
Честная оговорка: 26.12.1 - текущий патч на линии 26 по данным dist/index.json на сегодня; если к моменту, когда вы читаете это, вышел более новый 26.13.x - берите самый свежий 26.x: переход в LTS 28 октября не сбрасывает патч-поток, а security-минимум - «≥ 26.12.1».[3][9]
На какой линии должно быть ваше приложение?
- Начинаете что-то новое? Ставьте 26.12.1 сразу - это патченная версия линии, которая завтра становится Active LTS.
- Вы на 24.x? Вы в Maintenance с ~18 месяцами запаса. Переходите на 26 сейчас: закрываете октябрьские CVE, слезаете с линии без новых фич и пропускаете ежегодную каденцию миграций со следующего года.
- Вы на 22.x? EOL 30 апреля 2027 - через полгода. Целью делайте 26, а не 24: переезд 24 → 26 в течение года просто удвоит работу.
- Мигрировать только рискованное приложение? Можно разнести: сначала перевести критичные/публичные сервисы на 26.12.1 (им сильнее всего нужны TLS/DNS/Brotli-фиксы), внутренние инструменты ненадолго оставить на 24.22.1. Но зафиксируйте дедлайн до апреля 2027 - после него самая старая поддерживаемая линия исчезает.
Итог
28 октября 2026 - дата, когда Node.js 26 становится Active LTS: последний промоут по старой чётно-нечётной модели и фактическое начало эры ежегодной каденции (по расписанию релизов в тот же день стартует Alpha v27).[2][4] Путь миграции в этот раз необычно чистый: версия, на которую вы переходите (26.12.1), - одновременно security-патченная, так что апгрейд на Active LTS и есть фикс Node2Shell и остальных октябрьских HIGH.[5][6] Проверьте node -v, поставьте 26.12.1 через nvm или тарбол, прогоните тесты, перезапустите process manager, подтвердите через node -p process.versions.brotli. Сделаете один раз - и вы спокойны до следующего октября. А это, при новой каденции, ровно тот ритм, на который и стоит планировать.
Источники
- Node.js - «Node.js Releases» (страница previous releases; «Historically (up to Node.js 26), odd-numbered releases… become unsupported after six months, and even-numbered releases… move to Active LTS status»; «Starting with Node.js 27, the release cycle will be annual and every major version will move to LTS status»; «Production applications should only use Active LTS or Maintenance LTS releases»; v26 first released May 05, 2026). https://nodejs.org/en/about/previous-releases - checked 2026-10-27
- nodejs/Release - расписание релизов, machine-readable
schedule.json(v26: start 2026-05-05, lts 2026-10-28, maintenance 2027-10-20, end 2029-04-30; v24 Krypton: maintenance 2026-10-20, end 2028-04-30; v22 Jod: maintenance 2025-10-21, end 2027-04-30; v27: alpha 2026-10-28, start 2027-04-22, lts 2027-10-20, end 2030-04-30). https://github.com/nodejs/Release/blob/main/schedule.json - checked 2026-10-27 - endoflife.date - Node.js (v26 «Upcoming LTS», latest 26.12.1 released 21 Oct 2026; v24 Active support ended 20 Oct 2026, security support to 30 Apr 2028; v22 security support to 30 Apr 2027). https://endoflife.date/nodejs - checked 2026-10-27
- Node.js - «Evolving the Node.js Release Schedule» (один major в год с 27.x; Alpha окт–мар, Current апр–окт, LTS 30 месяцев; каждый релиз становится LTS; «Node.js 26 follows the existing schedule. This is the last release line under the current model»; «Node.js 27 is the first release line under the new schedule», Alpha begins October 2026, 27.0.0 April 2027, LTS October 2027, EOL April 2030). https://nodejs.org/en/blog/announcements/evolving-the-nodejs-release-schedule - checked 2026-10-27
- Node.js - «Wednesday, October 21, 2026 Security Releases» (новые версии для линий 26.x/24.x/22.x 21 октября 2026 или вскоре после; максимальный уровень серьёзности HIGH на всех трёх линиях). https://nodejs.org/en/blog/vulnerability/october-2026-security-releases - checked 2026-10-27
- Node.js - release notes, v26.12.1 (Current) (security-релиз 2026-10-21; High: CVE-2026-106069/106072 TLS non-canonical IP, CVE-2026-105482 DNS NUL bytes, CVE-2026-105483 TLS IP normalization regression, CVE-2026-111497 Brotli; undici 8.12.2, c-ares 1.34.9, NSS 3.131.1). https://nodejs.org/en/blog/release/v26.12.1/ - checked 2026-10-27
- DeploySmith - «Node2Shell (CVE-2026-111497): The Critical Brotli RCE and What to Patch on Your VPS» (механика декодера Brotli, обе стороны HTTP, проверки на VPS, PoC Imperva на официальном образе Node 24.22.0). https://deploysmith.dev/guides/node2shell-brotli-rce-vps/ - checked 2026-10-27
- Node.js - release notes, v26.0.0 (Current) (2026-05-05; Temporal API включён по умолчанию; V8 14.6.202.33 / Chromium 146; Undici 8.0.2; удалены
writeHeader, легаси-модули_stream_*, флаг--experimental-transform-types; build: GCC ≥ 13.2, Python 3.9 больше не поддерживается). https://nodejs.org/en/blog/release/v26.0.0 - checked 2026-10-27 - Node.js - dist/index.json (последние релизы на момент проверки: v26.12.1 от 2026-10-21, v24.22.1, v22.23.4; у v26.12.1 всё ещё
lts: falseдо перехода 28 октября). https://nodejs.org/dist/index.json - checked 2026-10-27