commit ef49b68e0bbbaf9d32a8036a5d60f3a75bf3ab8d Author: Сергей Маринкевич Date: Mon May 18 15:49:47 2026 +0700 init diff --git a/README.md b/README.md new file mode 100644 index 0000000..4bb3de7 --- /dev/null +++ b/README.md @@ -0,0 +1,49 @@ +# Offline Node.js 22 setup for Ubuntu 20.04 + +This folder contains scripts to prepare and install fresh Node.js 22 without internet on target host. + +## Files + +- `prepare-online.sh` - run on internet-connected Linux machine +- `install-offline.sh` - run on offline Ubuntu 20.04 machine + +## 1) On online machine + +```bash +cd nodejs-offline-ubuntu2004 +chmod +x prepare-online.sh install-offline.sh + +# x64, latest v22 +./prepare-online.sh x64 + +# OR arm64, latest v22 +./prepare-online.sh arm64 + +# Optional: pin exact version +./prepare-online.sh x64 22.15.0 +``` + +You will get directory like: +- `bundle-node-v22.15.0-linux-x64` + +Copy this directory **and** `install-offline.sh` to offline machine. + +## 2) On offline Ubuntu 20.04 + +```bash +chmod +x install-offline.sh +sudo ./install-offline.sh ./bundle-node-v22.15.0-linux-x64 +source /etc/profile.d/nodejs.sh +node -v +npm -v +``` + +## Notes + +- Default install path: `/opt/nodejs` +- Active symlink: `/opt/nodejs/current` +- To install into custom path: + +```bash +sudo INSTALL_PREFIX=/srv/nodejs ./install-offline.sh ./bundle-node-v22.15.0-linux-x64 +``` diff --git a/bundle-node-v22.22.2-linux-x64.tar.gz b/bundle-node-v22.22.2-linux-x64.tar.gz new file mode 100644 index 0000000..2cf817a Binary files /dev/null and b/bundle-node-v22.22.2-linux-x64.tar.gz differ diff --git a/bundle-node-v22.22.2-linux-x64/INSTALL_ARGS.txt b/bundle-node-v22.22.2-linux-x64/INSTALL_ARGS.txt new file mode 100644 index 0000000..c95adeb --- /dev/null +++ b/bundle-node-v22.22.2-linux-x64/INSTALL_ARGS.txt @@ -0,0 +1,3 @@ +ARCH=x64 +VERSION=22.22.2 +ARCHIVE=node-v22.22.2-linux-x64.tar.xz diff --git a/bundle-node-v22.22.2-linux-x64/SHASUMS256.txt b/bundle-node-v22.22.2-linux-x64/SHASUMS256.txt new file mode 100644 index 0000000..9d32835 --- /dev/null +++ b/bundle-node-v22.22.2-linux-x64/SHASUMS256.txt @@ -0,0 +1,41 @@ +31e8cdaf9921589c2978fd224aa5ae51e470577df63435ebfff16b715ed8d4d3 node-v22.22.2-aix-ppc64.tar.gz +1ec02aeb76d716ce15915bed10c0a4dcf9a6224e9a4f4d1645ddca4985a7bc06 node-v22.22.2-arm64.msi +db4b275b83736df67533529a18cc55de2549a8329ace6c7bcc68f8d22d3c9000 node-v22.22.2-darwin-arm64.tar.gz +f8655beb4b86ff6588ed7e02c37f8574b58557bd3e880012814b1a4956fd9d88 node-v22.22.2-darwin-arm64.tar.xz +12a6abb9c2902cf48a21120da13f87fde1ed1b71a13330712949e8db818708ba node-v22.22.2-darwin-x64.tar.gz +b6a384bba1a7ec585e5a91a452b63f676b940584ff57b5c9cf0541c8db60023e node-v22.22.2-darwin-x64.tar.xz +90e5ef0fdf02f88487f904a798836b35bd44896046d502873bc625ac2baeded2 node-v22.22.2-headers.tar.gz +b4dde76c01769ae141de9228cc47dd53853cde2fd94f7d40192273ec79dd405b node-v22.22.2-headers.tar.xz +b2f3a96f31486bfc365192ad65ced14833ad2a3c2e1bcefec4846902f264fa28 node-v22.22.2-linux-arm64.tar.gz +e9e1930fd321a470e29bb68f30318bf58e3ecb4acb4f1533fb19c58328a091fe node-v22.22.2-linux-arm64.tar.xz +465162c9e1821b2168b2740351ae8f191b24b58313f0cf9873a7ccd200a66e12 node-v22.22.2-linux-armv7l.tar.gz +2ebc6746e517f345da340ec76a108203eb6c2365391eb525c0e0dd6135b0b9df node-v22.22.2-linux-armv7l.tar.xz +f661dd525231faf113bd484129169d222b84ef40c091b5dca04a104d43e25d07 node-v22.22.2-linux-ppc64le.tar.gz +14045b5a5030d35ca0030fb7e870bd11a651eb9b57323ebc0021e8d78ac6bac9 node-v22.22.2-linux-ppc64le.tar.xz +4c28684a4c75683c491464f7fa168cd37752ed343fc27fb85b75806517e340cb node-v22.22.2-linux-s390x.tar.gz +9e4a07c291b8949289c6ea8ee61b1d14666a4810feae776a8d1eb1f57e03a2fb node-v22.22.2-linux-s390x.tar.xz +978978a635eef872fa68beae09f0aad0bbbae6757e444da80b570964a97e62a3 node-v22.22.2-linux-x64.tar.gz +88fd1ce767091fd8d4a99fdb2356e98c819f93f3b1f8663853a2dee9b438068a node-v22.22.2-linux-x64.tar.xz +ed1b73ffb642978e669786f9115d2579e890a3f9bf3dcd7c73272047b4895a17 node-v22.22.2-win-arm64.7z +380d375cf650c5a7f2ef3ce29ac6ea9a1c9d2ec8ea8e8391e1a34fd543886ab3 node-v22.22.2-win-arm64.zip +c87622c838f312d1fcc635e09034013e983ebe8df039a62ab46c22b34b9b8a0c node-v22.22.2-win-x64.7z +7c93e9d92bf68c07182b471aa187e35ee6cd08ef0f24ab060dfff605fcc1c57c node-v22.22.2-win-x64.zip +d73718f162d286d1deaf911d8bf224ba823a877cd0ed23c0d09b43923f6bd699 node-v22.22.2-win-x86.7z +ca892f829a733109e341c43585fd2094177e9d2f2c45f97c7ed3cf329d5427c5 node-v22.22.2-win-x86.zip +57456aa33fcd6fb6a9418e09227de0b0ca604f7b2123566acc66b555cb2f42e5 node-v22.22.2-x64.msi +e43cf42f461cbfea23a079925cfdd132a18cf66d4e30f64ec5ab4ec31dbb41f3 node-v22.22.2-x86.msi +ff08ad19678de4ca2af34b58b73b272c555449c6f2d91487ca6fe0a697f9eabe node-v22.22.2.pkg +f4b9606f33aef725a77b6292460102b48b80902571a8bb94cd769837ee0577df node-v22.22.2.tar.gz +b6bedd3a8cacd5df7df015a5088264b12c74a277ba60684cb9642ae8eb743132 node-v22.22.2.tar.xz +1a338f2467a566197ed8b309240a3a372f5d72458f9c7e5c9613ad6ccae1e0c0 win-arm64/node.exe +9b75bbc3be72c84f1d41cd6abb6e5ecc333836015e40a6267ce755554874a13a win-arm64/node.lib +d8439627dd1081c37267c77a79cf7f21c0a7cfd85c582fc3d6361d4b6a720388 win-arm64/node_pdb.7z +76a309aae5afd000b87359a4d26c2392dfc231ef626c1a77ec103452677edad4 win-arm64/node_pdb.zip +ae1a50511be58e987483fdbc12125407443926d2d394669ade2352776e920dd3 win-x64/node.exe +0d8d8bcc11daea60f5dd4da414e72ccb785718345ec8fbec52cfc7d1a2326293 win-x64/node.lib +0431a2383c9ceec6bd46d5d96fec1342c0adf7bd57528312fe4812e32e1d2e5c win-x64/node_pdb.7z +7a5071732adc414638f4a8e06926820410dfd6421badbe0221dfa594ec2a766f win-x64/node_pdb.zip +ed2aff66c21ea111e517b3c8a6857c35d222cc83e12ff66d9c03b61e2e0558e7 win-x86/node.exe +a07e94777fb491c1a59103b6987417df35a1dd0a9682220bba43d3c602b8b414 win-x86/node.lib +0f43bd6b98aa25bc7067cf374de59ec853035778ff4b6ce2fb118dc67f5eaee9 win-x86/node_pdb.7z +ffd472e223a8dbde11867016e51744dadb3e55af8dc3d663fb605a1560a63017 win-x86/node_pdb.zip diff --git a/bundle-node-v22.22.2-linux-x64/node-v22.22.2-linux-x64.tar.xz b/bundle-node-v22.22.2-linux-x64/node-v22.22.2-linux-x64.tar.xz new file mode 100644 index 0000000..58487e0 Binary files /dev/null and b/bundle-node-v22.22.2-linux-x64/node-v22.22.2-linux-x64.tar.xz differ diff --git a/install-offline.sh b/install-offline.sh new file mode 100755 index 0000000..b6a4886 --- /dev/null +++ b/install-offline.sh @@ -0,0 +1,73 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Usage on offline machine: +# sudo ./install-offline.sh /path/to/bundle-node-v22.x.y-linux-x64 +# +# Optional: +# INSTALL_PREFIX=/opt/nodejs sudo ./install-offline.sh /path/to/bundle + +BUNDLE_DIR="${1:-}" +INSTALL_PREFIX="${INSTALL_PREFIX:-/opt/nodejs}" + +if [[ -z "${BUNDLE_DIR}" ]]; then + echo "Usage: sudo ./install-offline.sh /path/to/bundle-node-v22.x.y-linux-{x64|arm64}" + exit 1 +fi + +if [[ ! -d "${BUNDLE_DIR}" ]]; then + echo "Bundle directory not found: ${BUNDLE_DIR}" + exit 1 +fi + +if [[ ! -f "${BUNDLE_DIR}/INSTALL_ARGS.txt" ]]; then + echo "Missing INSTALL_ARGS.txt in bundle." + exit 1 +fi + +# shellcheck disable=SC1091 +source "${BUNDLE_DIR}/INSTALL_ARGS.txt" + +if [[ -z "${ARCHIVE:-}" || -z "${VERSION:-}" ]]; then + echo "INSTALL_ARGS.txt is invalid." + exit 1 +fi + +if [[ ! -f "${BUNDLE_DIR}/${ARCHIVE}" ]]; then + echo "Archive not found: ${BUNDLE_DIR}/${ARCHIVE}" + exit 1 +fi + +if [[ ! -f "${BUNDLE_DIR}/SHASUMS256.txt" ]]; then + echo "SHASUMS256.txt not found in bundle." + exit 1 +fi + +echo "Verifying checksum..." +( + cd "${BUNDLE_DIR}" + sha256sum -c SHASUMS256.txt --ignore-missing | awk "/${ARCHIVE}: OK/" +) + +echo "Installing to ${INSTALL_PREFIX}..." +sudo mkdir -p "${INSTALL_PREFIX}" +sudo tar -xJf "${BUNDLE_DIR}/${ARCHIVE}" -C "${INSTALL_PREFIX}" +sudo ln -sfn "${INSTALL_PREFIX}/node-v${VERSION}-linux-${ARCH}" "${INSTALL_PREFIX}/current" + +PROFILE_FILE="/etc/profile.d/nodejs.sh" +LINE='export PATH=/opt/nodejs/current/bin:$PATH' + +if [[ "${INSTALL_PREFIX}" != "/opt/nodejs" ]]; then + LINE="export PATH=${INSTALL_PREFIX}/current/bin:\$PATH" +fi + +echo "Writing ${PROFILE_FILE}..." +echo "${LINE}" | sudo tee "${PROFILE_FILE}" >/dev/null +sudo chmod 0644 "${PROFILE_FILE}" + +echo +echo "Done. Re-login or run:" +echo " source ${PROFILE_FILE}" +echo "Check:" +echo " node -v" +echo " npm -v" diff --git a/prepare-online.sh b/prepare-online.sh new file mode 100755 index 0000000..b1b8ebe --- /dev/null +++ b/prepare-online.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Usage: +# ./prepare-online.sh [x64|arm64] [22.15.0] +# +# If version is omitted, script resolves the latest v22 release. + +ARCH="${1:-x64}" +VERSION="${2:-}" + +case "${ARCH}" in + x64) NODE_ARCH="x64" ;; + arm64) NODE_ARCH="arm64" ;; + *) + echo "Unsupported arch: ${ARCH}. Use x64 or arm64." + exit 1 + ;; +esac + +if [[ -z "${VERSION}" ]]; then + # Pick latest v22 from official index without triggering pipefail/SIGPIPE. + INDEX_FILE="$(mktemp)" + curl -fsSL "https://nodejs.org/dist/index.tab" -o "${INDEX_FILE}" + VERSION="$(awk 'NR>1 && $1 ~ /^v22\./ {print substr($1,2); exit}' "${INDEX_FILE}")" + rm -f "${INDEX_FILE}" +fi + +if [[ -z "${VERSION}" ]]; then + echo "Unable to resolve Node.js v22 version." + exit 1 +fi + +NODE_DIR="node-v${VERSION}-linux-${NODE_ARCH}" +ARCHIVE="${NODE_DIR}.tar.xz" +BASE_URL="https://nodejs.org/dist/v${VERSION}" +OUT_DIR="bundle-node-v${VERSION}-linux-${NODE_ARCH}" + +mkdir -p "${OUT_DIR}" + +echo "Downloading Node.js v${VERSION} (${NODE_ARCH})..." +curl -fL "${BASE_URL}/${ARCHIVE}" -o "${OUT_DIR}/${ARCHIVE}" +curl -fL "${BASE_URL}/SHASUMS256.txt" -o "${OUT_DIR}/SHASUMS256.txt" + +echo "Verifying checksum..." +( + cd "${OUT_DIR}" + sha256sum -c SHASUMS256.txt --ignore-missing | awk "/${ARCHIVE}: OK/" +) + +cat > "${OUT_DIR}/INSTALL_ARGS.txt" <