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

Linux 服务器初始化标准化手册 (Docker + 1Panel + Jpom)

初始化 linux服务器步骤

  1. 安装dockerbash <(curl -sSL https://linuxmirrors.cn/docker.sh)

  2. 修改docker 目录

  3. 安装1panel 直接运行运行安装脚本bash -c "$(curl -sSL https://resource.fit2cloud.com/1panel/package/v2/quick_start.sh)"

  4. 安装jpom 安装前 先下载

  5. 安装jdk 下载jdk后安装

具体步骤

修改docker 目录

修改 vim /usr/lib/systemd/system/docker.service 搜索 ExecStart 在 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock 添加 --data-root=/home/docker/lib/docker

jpom 安装指令

jpom linux 指令安装 需要手动修改下载地址 或者 在即下载tar 解压安装

上传 tar包

# 进入安装目录 cd /xxxxx # 启动服务端 bash ./bin/Server.sh start
# 进入安装目录 cd X:/xxxxx cd bin ./Server.bat start

方式二 使用sh命令

curl -fsSL https://jpom.top/docs/install.sh | bash -s Server default

  1. 下载https://jpom.top/docs/install.sh
    修改install.sh
#!/bin/bash # # Copyright (c) 2019 Of Him Code Technology Studio # Jpom is licensed under Mulan PSL v2. # You can use this software according to the terms and conditions of the Mulan PSL v2. # You may obtain a copy of Mulan PSL v2 at: # http://license.coscl.org.cn/MulanPSL2 # THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. # See the Mulan PSL v2 for more details. # # https://github.com/AdoptOpenJDK/openjdk-docker/blob/master/8/jdk/centos/Dockerfile.hotspot.releases.full # https://github.com/carlossg/docker-maven/blob/master/openjdk-8/Dockerfile function absPath() { dir="$1" case "$(uname)" in Linux) abs_path=$(readlink -f "$dir") ;; *) abs_path=$( cd "$dir" || exit pwd ) ;; esac # echo "$abs_path" } JPOM_TYPE="$1" ARGS="$*" module="$2" offline=$(echo "$module" | grep "offline") authorize=$(echo "$module" | grep "authorize") binAbsPath=$(absPath "$(dirname "$0")") authorizeUrl="" downloadHost="" if [ "$authorize" == "" ]; then authorizeUrl="" downloadHost="d.jpom.download" else token="$3" if [ "$token" == "" ]; then errorExit "请指定授权token参数:./install.sh $JPOM_TYPE ${module} xxxx" fi authorizeUrl="?token=${token}" downloadHost="download.jpom.top" echo "使用授权下载中心:${downloadHost} 授权码:${token}" fi function errorExit() { msg="$1" echo "$msg" 2>&2 if [ "$offline" == "" ]; then # 删除安装命令 rm -f "${binAbsPath}/install.sh" fi rmfile=("jdk.tar.gz" "maven.tar.gz" "node.tar.gz") for element in "${rmfile[@]}"; do rm -f "$element" done exit 1 } function findProfile() { user="$(id -un 2>/dev/null || true)" profileName="" if [ "$user" != 'root' ]; then array=("$HOME/.bash_profile" "$HOME/.bashrc" "$HOME/.bash_login") for element in "${array[@]}"; do if [ -f "$element" ]; then profileName=$element break fi done if [ -z "$profileName" ]; then cat >&2 <<-EOF ERROR: 没有找到可用的环境变量文件 EOF exit 1 fi else profileName="/etc/profile" fi echo "$profileName" } command_exists() { command -v "$@" >/dev/null 2>&1 } function checkCommand() { command=$(which "$1") if [[ ! -x "$command" ]]; then if command_exists "$1"; then echo "$1" else echo "not found" fi else echo "$command" fi } function mustMkdir() { dir="$1" name="$2" mkdir -p "$dir" if [ ! -d "$dir" ]; then cat >&2 <<-EOF ERROR: 目录创建失败: $dir EOF while (true); do cat >&2 <<-EOF INFO: 请手动输入安装 $name 目录 EOF read -r userOption useAbsPath=$(absPath "$userOption") mkdir -p "$useAbsPath" if [ -d "$useAbsPath" ]; then dir=$useAbsPath break fi cat >&2 <<-EOF ERROR: 输入的目录创建失败: $useAbsPath ERROR: 请重新手动输入安装 $name 目录 EOF done fi echo "$dir" } # 安装 jdk function installJdkFn() { javaCommand=$(checkCommand java) if [[ "$javaCommand" == "not found" ]]; then echo "不存在 java 环境,开始尝试安装" ARCH_O=$(uname -m) # 判断系统架构 case "${ARCH_O}" in aarch64 | arm64) ARCH='aarch64' ;; armhf | armv7l) ARCH='arm' ;; ppc64el | ppc64le) ARCH='ppc64le' ;; s390x) ARCH='s390x' ;; amd64 | x86_64) ARCH='x64' ;; *) errorExit "Unsupported arch: ${ARCH_O}" ;; esac useDir=$(mustMkdir /usr/java/ java) userProfileName=$(findProfile) if grep -q "CLASSPATH" "$userProfileName"; then errorExit "系统环境变量中已经存在 CLASSPATH,请检查配置是否正确.或者终端是否重新加载环境变量:source $userProfileName" fi if grep -q "JAVA_HOME" "$userProfileName"; then errorExit "系统环境变量中已经存在 JAVA_HOME,请检查配置是否正确.或者终端是否重新加载环境变量:source $userProfileName" fi download_url=$(curl -s https://${downloadHost}/jdk-url/8/${ARCH}${authorizeUrl}) curl -LfSo jdk.tar.gz "${download_url}" # 检查是否下载成功 if [[ ! -f jdk.tar.gz ]]; then errorExit "JDK下载失败,请检查下载地址 : $download_url" fi # jdk_name=$(tar -tf jdk.tar.gz | grep 'jdk' | head -1) # 检查环境变量 if grep -q "$useDir/${jdk_name}" "$userProfileName"; then errorExit "系统环境变量中已经存在 jdk 路径,请检查配置是否正确.或者终端是否重新加载环境变量:source $userProfileName" fi tar -zxf jdk.tar.gz -C "$useDir" echo "安装jdk,路径 $useDir/${jdk_name}" cat >>"$userProfileName" <<EOF export JAVA_HOME=$useDir/${jdk_name} export CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar export PATH=\$PATH:\$JAVA_HOME/bin EOF echo "use profile $userProfileName" # shellcheck source=.profile source "$userProfileName" # 删除jdk压缩包 rm -f jdk.tar.gz else echo "已经存在java环境${javaCommand}" fi } # 安装 mvn function installMvnFn() { mvnCommand=$(checkCommand mvn) if [[ "$mvnCommand" == "not found" ]]; then echo "不存在 mvn 环境,开始尝试安装" useDir=$(mustMkdir /usr/maven/ maven) userProfileName=$(findProfile) if grep -q "$useDir/apache-maven-3.9.6/" /etc/profile; then errorExit "系统环境变量中已经存在 mvn 路径,请检查配置是否正确.或者终端是否重新加载环境变量:source $userProfileName" fi if grep -q "MAVEN_HOME" /etc/profile; then errorExit "系统环境变量中已经存在 MAVEN_HOME,请检查配置是否正确.或者终端是否重新加载环境变量:source $userProfileName" fi curl -LfSo maven.tar.gz https://archive.apache.org/dist/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.tar.gz # tar -zxf maven.tar.gz -C "$useDir" # echo "安装maven,路径 $useDir/apache-maven-3.9.6/" cat >>"$userProfileName" <<EOF export MAVEN_HOME=$useDir/apache-maven-3.9.6/ export PATH=\$PATH:\$MAVEN_HOME/bin EOF echo "use profile $userProfileName" # shellcheck source=.profile source "$userProfileName" # 删除maven压缩包 rm -f maven.tar.gz else echo "已经存在maven环境${mvnCommand}" fi } function installNodeFn() { nodeCommand=$(checkCommand node) if [[ "$nodeCommand" == "not found" ]]; then echo "不存在 node 环境,开始尝试安装" ARCH_O=$(uname -m) case "${ARCH_O}" in aarch64 | arm64) BINARY_ARCH='arm64' ;; amd64 | x86_64) BINARY_ARCH='x64' ;; *) errorExit "Unsupported arch: ${ARCH_O}" ;; esac NODE_VERSION="16.13.1" useDir=$(mustMkdir /usr/node/ node) userProfileName=$(findProfile) if grep -q "NODE_HOME" "$userProfileName"; then errorExit "系统环境变量中已经存在 NODE_HOME,请检查配置是否正确.或者终端是否重新加载环境变量:source $userProfileName" fi curl -LfSo node.tar.gz https://npmmirror.com/mirrors/node/v${NODE_VERSION}/node-v${NODE_VERSION}-linux-${BINARY_ARCH}.tar.gz # node_name=$(tar -tf node.tar.gz | grep 'node' | head -1) # 检查环境变量 if grep -q "$useDir/${node_name}" "$userProfileName"; then errorExit "系统环境变量中已经存在 node 路径,请检查配置是否正确.或者终端是否重新加载环境变量:source $userProfileName" fi tar -zxf node.tar.gz -C "$useDir" echo "安装node,路径 $useDir/${node_name}" cat >>"$userProfileName" <<EOF export NODE_HOME=$useDir/${node_name} export PATH=\$NODE_HOME/bin:\$PATH EOF echo "use profile $userProfileName" # shellcheck source=.profile source "$userProfileName" npm config set registry https://registry.npmmirror.com/ # 删除 node 压缩包 rm -f node.tar.gz else echo "已经存在node环境${nodeCommand}" fi } function checkModule() { # 判断是否包含jdk if [[ $(echo "$module" | grep "jdk") != "" ]]; then echo "开始检查 jdk" installJdkFn echo "=> jdk 安装完成!" echo "=> 最后您需要重启终端才能正常使用 java 环境" echo fi # 判断是否包含mvn if [[ $(echo "$module" | grep "mvn") != "" ]]; then echo "开始检查 mvn" installMvnFn echo "=> maven 安装完成!" echo "=> 最后您需要重启终端才能正常使用 mvn 环境" echo fi # 判断是否包含 node if [[ $(echo "$module" | grep "node") != "" ]]; then echo "开始检查 node" installNodeFn echo "=> node 安装完成!" echo "=> 最后您需要重启终端才能正常使用 node 环境" echo fi if [[ $(echo "$module" | grep "only-module") != "" ]]; then echo "检查依赖结束" exit 0 fi } command_exists() { command -v "$@" >/dev/null 2>&1 } # 判断是否填写了安装类型 if [[ -z "${JPOM_TYPE}" ]]; then JPOM_TYPE="Server" fi # 截取指定版本 versions="" temp_result=$(echo ${JPOM_TYPE} | grep "-") if [ "${temp_result}" != "" ]; then JPOM_TYPE=$(echo "${temp_result}" | awk -F '-' '{print $1}') versions=$(echo "${temp_result}" | awk -F '-' '{print $2}') fi # 下载类型转小写 url_type=$(echo "${JPOM_TYPE}" | tr '[:upper:]' '[:lower:]') # 判断类型是否合法 if [ "$url_type" == "server" ]; then JPOM_TYPE="Server" elif [ "$url_type" == "agent" ]; then JPOM_TYPE="Agent" else errorExit "不支持的 $url_type 类型,请检查是否填写正确的参数" fi fileName="${JPOM_TYPE}.tar.gz" #判断非 root 用户不能使用默认方式安装 if [[ $(echo "$module" | grep "default") != "" ]]; then user="$(id -un 2>/dev/null || true)" if [ "$user" != 'root' ]; then errorExit "非 root 用户不能使用 default 形式安装,请使用普通安装方式" fi fi #开始准备安装相关依赖、判断是否未离线安装 if [ "$offline" == "" ]; then checkModule else fileName="$3" if [ "$fileName" == "" ]; then errorExit "请指定离线安装包参数:./install.sh $JPOM_TYPE offline $JPOM_TYPE.tar.gz" fi if [[ ! -f "$fileName" ]]; then errorExit "安装包文件不存在" fi fi ## check java path javaCommand=$(checkCommand java) if [[ "$javaCommand" == "not found" ]]; then echo "不能正常安装" errorExit "Cannot find a Java JDK. Please set either set JAVA or put java (>=1.8) in your PATH." fi echo "use java : $javaCommand" jpom_dir=/usr/local/jpom-${url_type} # 提示用户安装目录 echo ">>>>>默认安装目录 ${jpom_dir}<<<<<" function askInstallPath() { echo "是否使用此目录作为安装目录? " echo "需要使用绝对路径 (注意: agent 和 server 不能装到同一个目录!)" while (true); do echo "输入 y 确定使用默认路径, 否则请输入安装目录:" read -r userInstallPath if [ "$userInstallPath" == "" ]; then continue else if [ "$userInstallPath" == "y" ]; then jpom_dir=$jpom_dir if [ -e "$jpom_dir" ]; then echo "$jpom_dir 目录已经被占用请输入其他路径" continue fi break else # 检测安装目录是否为空 while (true); do if [[ -e "$userInstallPath" ]]; then echo "目录已存在, 你确定继续吗? 输入 y 继续(注意:agent 和 server 不能装到同一个目录!), 否则, 请指定一个新的安装路径:" read -r userOption if [[ "$userOption" == "" ]]; then continue fi if [[ "$userOption" == "y" ]]; then jpom_dir=$userInstallPath break else # 继续等待输入 userInstallPath=$userOption fi else # 目录不存在,直接安装 jpom_dir=$userInstallPath break fi done break fi fi done } if [[ $(echo "$module" | grep "default") == "" ]]; then askInstallPath fi use_tag="release" if [[ $(echo "$module" | grep "beta") != "" ]]; then use_tag="beta" fi if [ "$offline" == "" ]; then if [[ -z "${versions}" ]]; then # 获取最新的版本号 versions=$(curl -LfsS https://jpom.top/docs/versions.$use_tag.tag) fi if [[ -z "${versions}" ]]; then errorExit "没有可以的版本号" fi fi jpom_dir=$(absPath "$jpom_dir") jpom_dir=$(mustMkdir "$jpom_dir" "jpom $JPOM_TYPE") echo "开始安装:${JPOM_TYPE} ${versions}, 安装目录 ${jpom_dir}" # 创建指定目录 mkdir -p "${jpom_dir}" && cd "${jpom_dir}" || exit sh_array=("./bin/Agent.sh" "./Agent.sh" "./bin/Server.sh" "./Server.sh") for element in "${sh_array[@]}"; do if [ -f "$element" ] || [ -f "./${JPOM_TYPE}.sh" ]; then errorExit "${jpom_dir} 目录下已经存在管理 $element 命令,请不要重复安装" fi done # 判断是否存在文件 if [[ ! -f "${fileName}" ]]; then echo "================开始下载 $fileName================" curl -LfSo "${fileName}" "https://d2.jpom.download/release/2.11.12/server-2.11.12-release.tar.gz" fi # 解压 tar -zxf "${fileName}" -C "${jpom_dir}" # 删除安装包 rm -f "${fileName}" shName="" sh_array=("./bin/${JPOM_TYPE}.sh" "./${JPOM_TYPE}.sh") for element in "${sh_array[@]}"; do if [ -f "$element" ]; then shName=$element break fi done if [ -z "$shName" ]; then errorExit "没有找到对应的管理命令" fi # 判断是否需要安装服务 if [[ $(echo "$module" | grep "service") != "" ]]; then echo "================开始安装服务================" if [ ! -f "./bin/Service.sh" ]; then cat >&2 <<-EOF ERROR: Service.sh not found . EOF fi # 安装并设置开机自启 bash "./bin/Service.sh" install enable fi if [ "$offline" == "" ]; then # 删除安装命令 rm -f "${binAbsPath}/install.sh" fi echo "================开始启动================" # 启动 bash "$shName" start "$ARGS"

有 JDK

系统中已经有 JDK 并且配置环境变量、使用默认路径安装(注意:需要有 sudo 权限、建议在 root 用户使用)

默认安装路径:/usr/local/jpom-server/

curl -fsSL https://jpom.top/docs/install.sh | bash -s Server default

无 JDK

系统中没有 JDK、期望自动安装 JDK8、使用默认路径安装(注意:服务器需要有公网下使用)

Jpom 服务端默认安装路径:/usr/local/jpom-server/ JDK 默认安装路径:/usr/java/xxxx

curl -fsSL https://jpom.top/docs/install.sh | bash -s Server jdk+default

自动安装服务

期望自动将服务端注册到系统服务中,来达到开机自启动或者用服务的方式来管理

curl -fsSL https://jpom.top/docs/install.sh | bash -s Server jdk+default+service

其他操作

修改redis 文件夹权限

数据目录 请执行 `chmod 777 /docker/redis/data` 赋予读写权限 否则将无法写入数据

nvm安装

mkdir -p /root/.nvm export NVM_DIR="/root/.nvm" curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash vi ~/.bashrc export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" source ~/.bashrc nvm -v

nvm 下载安装

https://github.com/nvm-sh/nvm/archive/refs/tags/v0.40.0.tar.gz

cd /root/soft #解压 tar -zxvf nvm-0.40.6.tar.gz #移动到nvm标准目录 mv nvm-0.40.6 /root/.nvm

解压看看 是不是 两层目录 nvm-0.40.6/nvm-0.40.6

配置环境变量

cat >> ~/.bashrc <<'EOF' export NVM_DIR="/root/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" export NVM_NODEJS_ORG_MIRROR=https://npmmirror.com/mirrors/node export NVM_IOJS_ORG_MIRROR=https://npmmirror.com/mirrors/iojs EOF source ~/.bashrc

验证

nvm --version
http://www.jsqmd.com/news/1400357/

相关文章:

  • Unity TMP_SDF 分析(三)顶点着色器中的屏幕空间缩放
  • KWDB Playground v1.0.0 正式发布:四种安装方式、三种终端与容器环境管理升级
  • 动手写 Linux 内核模块与驱动:从 hello 到 platform 总线(srvD)
  • InvesTool 部署与配置实战:四关点亮一套投资分析工具,附避坑清单
  • 跨省救护车出租怎么预约 北京长途转院车辆收费标准与卧床患者转运指南 - 产品推荐官
  • 旧款 Mac 免费升级 macOS 实测手记:OpenCore Legacy Patcher 让我那台“退休“电脑重新上岗
  • OpenMontage零密钥入门:把AI编码助手变成你的免费视频制作工作室
  • 终极API管理平台DreamFactory完整上手指南:5分钟把数据库变成REST API
  • Vue Query Builder高级技巧:提升查询构建体验的7个方法
  • Canta主题开发指南:如何为GTK应用贡献自定义样式
  • 终极内存管理方案:arena1/arena单文件C库完全指南
  • Taste-Skill 实用指南:让 AI 界面设计彻底告别模板化的终极方案
  • c语言中函数传递二级指针,修改指针指向
  • 如何使用Receptionist实现Swift分布式集群服务发现
  • DeepStream视频分割 pipeline:基于Portrait-Segmentation的多摄像头实时处理方案
  • Unity许可证验证绕过完整指南:用UniHacker快速解锁全平台开发
  • ncmdump 快速上手:3 关解锁网易云 NCM 文件转换
  • CDDIS 天顶总延迟(ZTD)数据下载教程
  • ComfyUI中文工作流快速上手指南:零基础玩转AI绘图不再难
  • 群星全DLC免费解锁实操:Stellaris DLC Unlocker 在 Windows 和 Linux 上的完整记录
  • 如何用Nail-Qwen3.6-35B-A3B-GGUF实现多轮对话?解锁262k tokens超长上下文能力
  • 掌握tumblr.js核心功能:用户信息、博客数据与内容发布全攻略
  • COSMO-RS 实操:从量子力学到热力学性质的“无参”预测之路
  • combo实战:5分钟快速上手模型组合,让你的分类器性能飙升
  • Ghidra逆向工程框架完全指南:从安装到实战,把“看不懂的二进制“变成“读得懂的代码“
  • 从Vim新手到高效开发者:一年Neovim实战配置与效率提升指南
  • C++输入输出、字符串分割
  • SOFARegistry集群部署教程:Docker Compose与Kubernetes方案
  • 30分钟上手Huginn:零基础打造自己的自动化工作流
  • PhotoGIMP实操指南:把免费GIMP 3改造成熟悉的Photoshop界面,告别高价订阅