当前位置: 首页 > news >正文

多系统 Node.js 环境自动化部署脚本:从 Ubuntu 到 CentOS,再到版本自由定制

前言:在前后端开发以及服务端部署场景中,Node.js 是极为关键的技术栈,而 pm2 作为 Node.js 应用的进程管理工具,能实现应用的守护、自动重启等功能,pnpm 则是高效的包管理器,提升依赖安装与管理的效率。不同的 Linux 发行版(如 Ubuntu、CentOS)在软件安装与环境配置上存在差异,同时我们也常常需要根据项目需求,灵活指定 Node.js 的版本。因此,本文将提供针对不同系统的 Node.js 环境自动化部署脚本,还会打造一个可自由指定 Node.js 版本的通用自动化脚本,助力开发者快速搭建所需的 Node.js 开发与运行环境。

章节 1:Ubuntu 系统 Node.js 环境自动化安装脚本

以下是适用于 Ubuntu 系统,自动安装指定版本 Node.js、pm2、pnpm 等工具的脚本:

#!/bin/bash# 1. 安装必要的依赖
sudo apt update
sudo apt install -y curl wget# 2. 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash# 检查~/.bashrc中是否已有nvm相关配置,没有则添加
if ! grep -q "NVM_DIR=\"\$HOME/.nvm\"" ~/.bashrc; thencat >> ~/.bashrc << EOF# NVM configuration added by install script
export NVM_DIR="$HOME/.nvm"
[ -s "\$NVM_DIR/nvm.sh" ] && \. "\$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "\$NVM_DIR/bash_completion" ] && \. "\$NVM_DIR/bash_completion"  # This loads nvm bash_completion
EOFecho "已向~/.bashrc添加nvm配置,未覆盖原有内容"
elseecho "~/.bashrc中已存在nvm相关配置,无需重复添加"
fi# 加载nvm(使当前会话生效)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"# 3. 安装并激活 Node.js v20.15.0
nvm install 20.15.0
nvm use 20.15.0# 验证 Node.js 和 npm 版本
echo "Node.js 版本: $(node -v)"
echo "npm 版本: $(npm -v)"# 4. 安装 pm2
npm install -g pm2
echo "pm2 版本: $(pm2 -v)"# 5. 自动执行 pm2 startup 生成的命令
echo "正在配置 pm2 开机自启..."
pm2 startup | grep -oP 'sudo .*' | bash# 6. 安装 pnpm
npm install -g pnpm
echo "pnpm 版本: $(pnpm -v)"# 提示用户保存 pm2 进程列表(如需开机自启进程)
echo "请执行以下命令保存当前 pm2 进程列表(如需开机自启这些进程):"
echo "pm2 save"

脚本首先更新系统并安装必要依赖,接着安装 nvm(Node 版本管理器),并将 nvm 相关配置添加到 ~/.bashrc 以实现永久生效。之后利用 nvm 安装指定版本的 Node.js,再通过 npm 全局安装 pm2 和 pnpm,同时配置 pm2 开机自启,最后提示用户保存 pm2 进程列表。
在这里插入图片描述

章节 2:CentOS 系统 Node.js 环境自动化安装脚本

CentOS 系统的脚本如下,与 Ubuntu 版本在依赖安装和部分配置上有所不同:

#!/bin/bash# 1. 安装必要的依赖
sudo yum install -y curl wget# 2. 安装nvm
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash# 检查~/.bashrc中是否已有nvm相关配置,没有则添加
if ! grep -q "NVM_DIR=\"\$HOME/.nvm\"" ~/.bashrc; thencat >> ~/.bashrc << EOF# NVM configuration added by install script
export NVM_DIR="$HOME/.nvm"
[ -s "\$NVM_DIR/nvm.sh" ] && \. "\$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "\$NVM_DIR/bash_completion" ] && \. "\$NVM_DIR/bash_completion"  # This loads nvm bash_completion
EOFecho "已向~/.bashrc添加nvm配置,未覆盖原有内容"
elseecho "~/.bashrc中已存在nvm相关配置,无需重复添加"
fi# 加载nvm(使当前会话生效)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"# 3. 安装并激活 Node.js(此处以v20.15.0为例,可根据需求修改)
nvm install 20.15.0
nvm use 20.15.0# 验证 Node.js 和 npm 版本
echo "Node.js 版本: $(node -v)"
echo "npm 版本: $(npm -v)"# 4. 安装 pm2
npm install -g pm2
echo "pm2 版本: $(pm2 -v)"# 5. 自动执行 pm2 startup 生成的命令
echo "正在配置 pm2 开机自启..."
pm2 startup | grep -oP 'sudo .*' | bash# 6. 安装 pnpm
npm install -g pnpm
echo "pnpm 版本: $(pnpm -v)"# 提示用户保存 pm2 进程列表(如需开机自启进程)
echo "请执行以下命令保存当前 pm2 进程列表(如需开机自启这些进程):"
echo "pm2 save"

CentOS 系统使用 yum 包管理器安装依赖,其余流程与 Ubuntu 类似,同样借助 nvm 管理 Node.js 版本,安装相关工具并配置 pm2 开机自启。

章节 3:版本自由定制的 Node.js 环境自动化安装脚本(多系统兼容版)

下面是支持多Linux发行版(包括Ubuntu、Debian、CentOS、RHEL、Fedora、Arch Linux、Alpine等)的通用脚本,可根据用户输入的Node.js版本自动安装对应环境及配套工具:

#!/bin/bash# 提示用户输入需要安装的Node.js版本
read -p "请输入要安装的Node.js版本(例如:20.15.0):" NODE_VERSION# 从系统文件读取发行版信息(适配多系统识别)
. /etc/os-release# 1. 安装必要的依赖(根据不同系统自动适配包管理器)
install_dependencies() {echo "检测到系统:$PRETTY_NAME,开始安装依赖..."case $ID inubuntu|debian)# Debian系(Ubuntu、Debian)sudo apt updatesudo apt install -y curl wget;;centos|rhel)# RedHat系(CentOS、RHEL)sudo yum install -y curl wget;;fedora)# Fedora(使用dnf包管理器)sudo dnf install -y curl wget;;arch|manjaro)# Arch系(Arch Linux、Manjaro)sudo pacman -Syu --noconfirm curl wget;;alpine)# Alpine Linuxsudo apk add curl wget;;*)# 不支持的系统echo "错误:不支持的Linux发行版(ID: $ID)"exit 1;;esac
}# 2. 安装nvm(Node版本管理器)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash# 3. 配置nvm永久生效(兼容bash和zsh)
configure_nvm() {# 定义nvm配置内容nvm_config=$(cat << 'EOF'# NVM configuration added by install script
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # Load nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # Load nvm bash_completion
EOF)# 写入bash配置文件(~/.bashrc)if [ -f ~/.bashrc ] && ! grep -q "NVM_DIR=\"\$HOME/.nvm\"" ~/.bashrc; thenecho "$nvm_config" >> ~/.bashrcecho "已向~/.bashrc添加nvm配置"fi# 写入zsh配置文件(~/.zshrc,若存在)if [ -f ~/.zshrc ] && ! grep -q "NVM_DIR=\"\$HOME/.nvm\"" ~/.zshrc; thenecho "$nvm_config" >> ~/.zshrcecho "已向~/.zshrc添加nvm配置"fi
}# 4. 加载nvm(使当前会话生效)
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"# 5. 安装并激活指定版本的Node.js
nvm install "$NODE_VERSION"
nvm use "$NODE_VERSION"# 验证Node.js和npm版本
echo "Node.js 版本: $(node -v)"
echo "npm 版本: $(npm -v)"# 6. 安装pm2(进程管理工具)和pnpm(包管理器)
npm install -g pm2 pnpm
echo "pm2 版本: $(pm2 -v)"
echo "pnpm 版本: $(pnpm -v)"# 7. 自动配置pm2开机自启
echo "正在配置pm2开机自启..."
pm2_startup_cmd=$(pm2 startup | grep -oP 'sudo .*')
if [ -n "$pm2_startup_cmd" ]; thenecho "执行自启命令: $pm2_startup_cmd"$pm2_startup_cmd
elseecho "未捕获到pm2 startup生成的命令,请手动执行pm2 startup并复制输出的命令运行"
fi# 提示保存pm2进程列表
echo "===== 提示 ====="
echo "若需开机自动启动当前pm2管理的进程,请执行:pm2 save"# 执行依赖安装函数
install_dependencies

脚本说明

  1. 多系统适配逻辑
    通过读取/etc/os-release文件中的系统标识($ID),自动识别不同Linux发行版,并适配对应的包管理器(如Ubuntu/Debian用apt、CentOS用yum、Fedora用dnf、Arch用pacman、Alpine用apk),解决了不同系统依赖安装命令差异的问题。

  2. Shell兼容性优化
    同时支持bash(配置文件~/.bashrc)和zsh(配置文件~/.zshrc),自动检测并向对应配置文件添加nvm永久生效配置,避免因默认Shell不同导致的环境变量失效问题。

  3. 流程模块化
    将依赖安装等步骤拆分为独立逻辑块,通过case分支和函数调用使代码结构更清晰,便于后续扩展更多系统支持。

  4. 容错处理
    对不支持的Linux发行版会主动报错并退出,避免无效执行;同时增加了pm2自启命令捕获的判断逻辑,若自动执行失败会提示手动操作。

适用系统范围

  • 完全兼容:Ubuntu、Debian、CentOS、RHEL、Fedora、Arch Linux、Manjaro、Alpine Linux。
  • 注意事项:Alpine Linux需确保已安装sudo并配置权限(部分精简版本默认无sudo)。

通过该脚本,可在主流Linux系统上一键部署指定版本的Node.js环境,无需手动适配系统差异,大幅提升环境搭建效率。
在这里插入图片描述

http://www.dtcms.com/a/340457.html

相关文章:

  • 云原生俱乐部-k8s知识点归纳(5)
  • 自动化测试用例生成:基于Python的参数化测试框架设计与实现
  • MeterSphere断言操作
  • 多肽修饰——胆固醇(chol)
  • B站 XMCVE Pwn入门课程学习笔记(7)
  • sigmastar设备树引脚复用研究
  • 《GPT-OSS 模型全解析:OpenAI 回归开源的 Mixture-of-Experts 之路》
  • sqlalchemy 是怎么进行sql表结构管理的,怎么进行数据处理的
  • 【Svelte】load 函数中如何获取 url 信息?
  • 从基础到本质:文件 IO 操作全解析
  • 医学统计学常用方法汇总,差异性/相关回归/生存分析/一致性检验
  • windows electron-builder打包后应用图标更新问题
  • RabbitMQ:SpringAMQP 声明队列和交换机
  • 数据湖学习
  • 安装electron报错的解决方法
  • 换根DP(P3478 [POI 2008] STA-StationP3574 [POI 2014] FAR-FarmCraft)
  • 智慧冷库物联网解决方案——实现降本增效与风险可控的冷库管理新范式
  • 算法学习----Python数据结构--kmp字符串
  • gcc 与 g++ 的区别:本身不是编译器而是编译器驱动
  • Day23 双向链表
  • STL模板库——string容器
  • DPO,PPO,GRPO
  • 【Linux基础知识系列:第一百零四篇】使用apt-cache管理软件包信息
  • 【数据结构】直接选择排序
  • 跨域问题解决方法
  • 链表-24.两两交换链表中的结点-力扣(LeetCode)
  • Spring Boot 3整合Nacos,配置namespace
  • 云计算学习100天-第26天
  • linux的sysctl系统以及systemd系统。
  • Linux + arm 内存属性