【Linux】离线安装部署环境jdk、nginx、mysql、redis、minio

发布时间 2023-07-26 16:55:20作者: 尽
#!/bin/bash

#fonts color
yellow(){
    echo -e "\033[33m\033[01m$1\033[0m"
}
green(){
    echo -e "\033[32m\033[01m$1\033[0m"
}
red(){
    echo -e "\033[31m\033[01m$1\033[0m"
}
blue(){
    echo -e "\033[34m\033[01m$1\033[0m"
}

#java home
_JAVA_HOME=/usr/local/jdk
_JDK8_FILE=jdk-8u351-linux-x64.rpm
_JDK11_FILE=jdk-11.0.17_linux-x64_bin.rpm
#mysql rpm
_MYSQL_PATH=mysql/*.rpm
#gcc path
_GCC_PATH=depend/gcc-12.2.0.tar.gz
#make path
_MAKE_PATH=depend/make-3.82-24.el7.x86_64.rpm
#redis path
_REDIS_PATH=redis/redis-7.0.7.tar.gz
#rpm_redis path
_RPM_REDIS_PATH=redis/*.rpm
#depend path
_DEPEND_PATH=depend/*.rpm
#nginx path
_NGINX_PATH=nginx/nginx-1.22.1.tar.gz
#rpm nginx path
_RPM_NGINX_PATH=nginx/*.rpm
#minio path
_MINIO_PATH=minio/minio


#安装jdk 1.8 | 11
function install_jdk() { 
    #要安装的jdk版本
    jdk_verson=$1

    #检测是否安装了jdk
    which java &> /dev/null
    if [ $? -eq 0 ]; then
        echo "Found java executable in PATH"
        _java=`which java`


    elif [[ -n "$JAVA_HOME" ]] && [[ -x "$JAVA_HOME/bin/java" ]];  then
        echo "检测到安装了JDK 脚本继续"
        _java="$JAVA_HOME/bin/java"

    else
        echo "检测到您没有安装JDK 即将为您安装JDK"$jdk_verson
        jdk $jdk_verson
    fi

    #校验jdk版本是否正确
    if [ ! -z "$_java" ]; then
        #获取jdk版本
        version=$("$_java" -version 2>&1 | awk -F '"' '/version/ {print $2}')
        
        echo "当前环境安装的jdk版本为"$version

        #校验版本
        if [[ $version =~ $jdk_verson ]]; then
            echo
        else
            echo "检测到您安装了"$version"的JDK 即将卸载为您重新安装JDK"$jdk_verson
            #卸载jdk其他版本
            remove_jdk $_java $version

            sleep 1
            #安装所需版本jdk
            jdk $jdk_verson
        fi
    else
        exit 1
    fi

}

#安装jdk
function jdk(){
    #要安装的jdk版本
    jdk_verson=$1
  
    if [ "$jdk_verson" = "1.8" ]; then
        echo "开始安装JDK1.8"
        rpm -ivh jdk/$_JDK8_FILE
        echo

        echo "JDK1.8安装完成!"
    elif [ "$jdk_verson" = "11" ]; then
        echo "开始安装JDK11"
        rpm -ivh jdk/$_JDK11_FILE
        echo

        echo "JDK11安装完成!"
    else
        echo "不支持的版本"$1
        exit 1
    fi

    java -version
}

#卸载jdk
function remove_jdk(){
    #卸载已经安装的jdk包
    echo "开始卸载已经安装的JDK"$2

    if [[ $2 =~ "1.8" ]]; then
        rpm -e `rpm -qa | grep jdk1.8`
        echo "已卸载完JDK1.8包"
    elif [[ $2 =~ "11" ]]; then
        rpm -e `rpm -qa | grep jdk-11`
        echo "已卸载完JDK11包"
    else
        #删除java可执行文件
        if [ -n "$1" ] ; then
            rm -rf $1
        else
            which java &> /dev/null
            if [ $? -eq 0 ]; then
                rm -rf `which java`
            fi
        fi

        #删除java home
        rm -rf $JAVA_HOME
        rm -rf $_JAVA_HOME

        #删除export PATH=$PATH:${JAVA_PATH}中的:${JAVA_PATH}
        sed -i "s:\:\${JAVA_PATH}::g" /etc/profile

        #删除/etc/profile中的变量声明
        sed -i '/JAVA_HOME\|JRE_HOME\|CLASSPATH\|JAVA_PATH/d' /etc/profile

        #生效/etc/profile
        source /etc/profile >> /dev/null

        #检查是否还存在java可执行文件
        which java &> /dev/null

        if [ $? -eq 0 ]; then
            echo "JDK卸载失败,请手动删除/etc/profile中的变量声明及jdk文件"
            exit 1
        else
            echo "JDK卸载完成"
        fi
    fi
}

#版本对比
function version_gt() { test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1"; }

#安装mysql
function install_mysql(){
    echo "开始安装mysql"
    which mysql &> /dev/null

    if [ $? -eq 0 ]; then
        mysql --version
        echo "mysql已安装, 如需重新安装请先卸载"
        exit 1
    fi

    echo "开始卸载原有的mariadb"
    rpm -e `rpm -qa | grep mariadb` --nodeps

    echo "开始安装mysql8.0"
    rpm -ivh $_MYSQL_PATH

    echo
    systemctl status mysqld
    echo "mysql8.0安装完成"

    systemctl enable mysqld
    echo "mysql8.0已开机自启"

    echo "初始化数据库" 
    mysqld --initialize --console

    echo "开始授权目录"
    chown -R mysql:mysql /var/lib/mysql/

    echo "开始启动服务"
    systemctl start mysqld
    systemctl status mysqld

    #获取临时密码
    mysql_log=`cat /var/log/mysqld.log`
    pwd_cnt=`cat /var/log/mysqld.log | grep -n "root@localhost:" | awk -F ":" '{print $1}'`

    pwd_line=`sed -n "$pwd_cnt"p /var/log/mysqld.log`
    mysql_pwd=${pwd_line#*localhost: }
    echo "mysql临时密码是"$mysql_pwd

    read -p "请输入mysql密码:" pwd
    mysqladmin -uroot -p$mysql_pwd password $pwd

    if [ $? -eq 0 ]; then
        echo "mysql密码修改完成"
    else
        echo 'mysql密码修改失败,请手动执行
        mysqladmin -uroot -p$mysql_pwd password $pwd'
    fi

    #修改8.0密码规则
    echo "修改密码策略为mysql_native_password"
    echo 'default_authentication_plugin=mysql_native_password' >> /etc/my.cnf

    echo "正在重启服务"
    systemctl restart mysqld
    echo "重启服务成功"

    echo "正在开放远程访问"

    mysql -uroot -p$pwd -e "
    use mysql; 
    update user set host = '%' where user='root';
    select host, user from user where user='root';
    flush privileges;"

    if [ $? -eq 0 ]; then
        echo "开发远程访问成功"
    else
        echo "开发远程访问失败,请登录mysql手动执行 
        use mysql; 
        update user set host = '%' where user='root';
        select host, user from user where user='root';
        flush privileges;"
    fi

    echo 
    echo "mysql8.0安装成功,已开放远程访问,密码是"$pwd
}

#修改mysql密码
function change_mysql_pwd(){
    which mysql &> /dev/null

    if [ $? -eq 1 ]; then
        echo "mysql未安装, 请先安装"
        exit 1
    fi

    read -p "请输入mysql原密码:" old_pwd
    read -p "请输入mysql新密码:" new_pwd
    mysqladmin -uroot -p$old_pwd password $new_pwd

    if [ $? -eq 0 ]; then
        echo "mysql密码修改完成,新密码是"$new_pwd
    else
        echo 'mysql密码修改失败,请手动执行
        mysqladmin -uroot -p$old_pwd password $new_pwd'
    fi
}

#开放mysql远程访问
function open_mysql(){
    which mysql &> /dev/null

    if [ $? -eq 1 ]; then
        echo "mysql未安装, 请先安装"
        exit 1
    fi

    echo "正在开放远程访问"

    read -p "请输入mysql密码:" pwd

    mysql -uroot -p$pwd -e "
    use mysql; 
    update user set host = '%' where user='root';
    select host, user from user where user='root';
    flush privileges;"

    if [ $? -eq 0 ]; then
        echo "开发远程访问成功"
    else
        echo "开发远程访问失败,请登录mysql手动执行 
        use mysql; 
        update user set host = '%' where user='root';
        select host, user from user where user='root';
        flush privileges;"
    fi
}

#开放防火墙端口
function open_firewalld_port(){
    read -p "请输入要开放的端口号及协议[ 例如: 80/tcp | 3306/tcp | 8080/udp | 3000-4000/tcp ]:" port

    echo "正在开放端口"$port
    firewall-cmd --zone=public --add-port=$port --permanent

    if [ $? -eq 0 ]; then
        echo "开放端口"$port"成功"
    else
        echo "开放端口"$port"失败,请手动执行如下命令
        firewall-cmd --zone=public --add-port=$port --permanent"
    fi

    firewall-cmd --reload
    echo "防火墙重启成功"

    echo
    query_firewalld_port
}

#关闭防火墙端口
function close_firewalld_port(){
    read -p "请输入要关闭的端口号及协议[ 例如: 80/tcp | 3306/tcp | 8080/udp | 3000-4000/tcp ]:" port

    echo "正在关闭端口"$port
    firewall-cmd --zone=public --remove-port=$port --permanent

    if [ $? -eq 0 ]; then
        echo "关闭端口"$port"成功"
    else
        echo "关闭端口"$port"失败,请手动执行如下命令
        firewall-cmd --zone=public --remove-port=$port --permanent"
    fi

    firewall-cmd --reload
    echo "防火墙重启成功"

    echo
    query_firewalld_port
}

#查看防火墙端口
function query_firewalld_port(){
    echo "已经开放的端口如下:"
    firewall-cmd --permanent --list-port
}

#rpm安装redis
function rpm_install_redis(){
    echo "开始安装redis"
    rpm -ivh $_RPM_REDIS_PATH
    echo "启动redis"
    systemctl start redis

    echo "redis设置为开机自启"
    systemctl enable redis

    systemctl status redis
    if [ $? -eq 0 ]; then
        echo
        echo "redis安装成功"
        
        #修改redis密码
        change_redis_pwd

        #开放redis远程访问
        open_redis
    fi
}

#安装redis
function install_redis(){
    echo "开始安装redis"
    echo "解压缩redis"
    tar -zxvf $_REDIS_PATH

    sleep 1

    echo "进入redis目录"
    cd redis-7.0.7

    echo "开始编译 make && make install"
    make && make install

    echo "创建redis conf目录"
    mv redis.conf /etc/
    echo "redis conf目录是 /etc/redis.conf"

    #删除解压目录
    cd ..
    rm -rf redis-7.0.7

    #修改redis密码
    change_redis_pwd

    #开放redis远程访问
    open_redis

    #更改pid文件路径
    sed -i "s/pidfile/#pidfile/g" /etc/redis.conf
    echo 'pidfile /etc/redis.pid' >> /etc/redis.conf

    echo "开始写入service服务文件"
    touch /usr/lib/systemd/system/redis.service

    echo '[Unit]
    Description=Redis
    After=syslog.target network.target remote-fs.target nss-lookup.target
     
    [Service]
    PIDFile=/etc/redis.pid
    ExecStart=/usr/local/bin/redis-server /etc/redis.conf
    ExecReload=/bin/kill -s HUP $MAINPID 
    ExecStop=/bin/kill -s QUIT $MAINPID 
    PrivateTmp=true
     
    [Install]
    WantedBy=multi-user.target' > /usr/lib/systemd/system/redis.service

    echo "重载系统服务"
    systemctl daemon-reload

    echo "启动redis"
    systemctl start redis

    echo "redis设置为开机自启"
    systemctl enable redis

    systemctl status redis
    if [ $? -eq 0 ]; then
        echo
        echo "redis安装成功"
    fi
}

#修改redis服务密码
function change_redis_pwd(){
    read -p "请输入redis密码:" redis_pwd

    #requirepass注释
    sed -i "s/requirepass/#requirepass/g" /etc/redis.conf
    #重新写入新密码
    echo "requirepass $redis_pwd" >> /etc/redis.conf
    echo "redis密码修改成功,新密码是"$redis_pwd

    systemctl restart redis
    echo "服务重启成功"
    echo
    systemctl status redis 
}

#开放redis远程访问
function open_redis(){
    echo "开启远程访问"
    sed -i "s/bind 127.0.0.1/#bind 127.0.0.1/g" /etc/redis.conf
    sed -i "s/protected-mode/#protected-mode/g" /etc/redis.conf
    echo "开启远程访问成功"

    systemctl restart redis
    echo "服务重启成功"
    echo
    systemctl status redis 
}

#安装nginx
function rpm_install_nginx(){
    echo "开始安装nginx"
    rpm -ivh $_RPM_NGINX_PATH
    echo "nginx"
    systemctl start nginx

    echo "nginx设置为开机自启"
    systemctl enable nginx

    systemctl status nginx
    if [ $? -eq 0 ]; then
        echo
        echo "nginx安装成功,配置文件路径为/usr/local/nginx/conf/nginx.conf"
    fi
}

#安装nginx
function install_nginx(){
    echo "开始安装nginx"
    echo "开始解压nginx"
    sleep 1
    tar -zxvf $_NGINX_PATH

    echo "nginx目录移动到/usr/local/目录下"
    mv nginx-1.22.1 /usr/local/

    echo "进入nginx目录"
    cd /usr/local/nginx-1.22.1

    echo "指定安装目录"
    ./configure --prefix="/usr/local/nginx" 

    sleep 1

    echo "开始编译安装"
    make && make install

    echo "创建日志路径"
    cd ..
    rm -rf nginx-1.22.1

    echo "开始写入service服务文件"
    touch /usr/lib/systemd/system/nginx.service

    echo '[Unit]
    Description=nginx
    After=network.target remote-fs.target nss-lookup.target

    [Service]
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/usr/local/nginx/sbin/nginx -s reload
    ExecStop=/usr/local/nginx/sbin/nginx -s stop
    PrivateTmp=true

    [Install]
    WantedBy=multi-user.target' > /usr/lib/systemd/system/nginx.service

    echo "重载系统服务"
    systemctl daemon-reload

    echo "启动 nginx"
    systemctl start nginx

    echo "nginx设置为开机自启"
    systemctl enable nginx

    systemctl status nginx
    if [ $? -eq 0 ]; then
        echo
        echo "nginx安装成功,配置文件路径为/usr/local/nginx/conf/nginx.conf"
    fi
}

#安装minio
function install_minio(){
    echo "设置可执行权限"
    chmod +x $_MINIO_PATH
    mkdir -p /usr/local/minio
    echo "移动可执行程序 到/usr/local/minio/"
    mv $_MINIO_PATH /usr/local/minio
    
    read -p "请输入minio用户名:" minio_user
    read -p "请输入minio密码:" minio_pwd
    
    echo "写入配置文件"
    mkdir -p /usr/local/minio/conf/
    echo "
    #数据存放目录
    MINIO_VOLUMES='/home/minio'
    #端口号设置
    MINIO_OPTS='--console-address :9001 --address :9000'

    #用户名
    MINIO_ROOT_USER=$minio_user
    #密码
    MINIO_ROOT_PASSWORD=$minio_pwd
    " > /usr/local/minio/conf/minio.conf
    
    echo "新建minio存储路径 /home/minio"
    mkdir -p /home/minio
    
    echo "开始写入service服务文件"
    touch /usr/lib/systemd/system/minio.service

    echo '[Unit]
    Description=MinIO
    Documentation=https://docs.min.io
    Wants=network-online.target
    After=network-online.target
    #minio文件具体位置
    AssertFileIsExecutable=/usr/local/minio/minio
    [Service]
    # User and group 用户 组
    User=root
    Group=root
    #创建的配置文件 minio.conf
    EnvironmentFile=/usr/local/minio/conf/minio.conf
    ExecStart=/usr/local/minio/minio server $MINIO_OPTS $MINIO_VOLUMES
    # Let systemd restart this service always
    Restart=always
    # Specifies the maximum file descriptor number that can be opened by this process
    LimitNOFILE=65536
    # Disable timeout logic and wait until process is stopped
    TimeoutStopSec=infinity
    SendSIGKILL=no
    [Install]
    WantedBy=multi-user.target
    ' > /usr/lib/systemd/system/minio.service

    echo "重载系统服务"
    systemctl daemon-reload

    echo "启动 minio"
    systemctl start minio

    echo "minio设置为开机自启"
    systemctl enable minio

    systemctl status minio
    if [ $? -eq 0 ]; then
        echo
        echo "minio安装成功,配置文件路径为/usr/local/minio/conf/minio.conf"
    fi
}

#检查selinux是否关闭
function check_selinux(){
    CHECK=$(grep SELINUX= /etc/selinux/config | grep -v "#")
    if [ "$CHECK" == "SELINUX=enforcing" ]; then
        red "======================================================================="
        red "检测到SELinux为开启状态,先临时设置为关闭状态,下次重启后会永久关闭"
        red "======================================================================="
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
        setenforce 0
    fi
    if [ "$CHECK" == "SELINUX=permissive" ]; then
        red "======================================================================="
        red "检测到SELinux为开启状态,先临时设置为关闭状态,下次重启后会永久关闭"
        red "======================================================================="
        sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
        setenforce 0
    fi
}

# #检查redis、nginx编译依赖
# function check_depend(){
#     #检查gcc依赖
#     echo "开始检查gcc依赖"
#     which gcc &> /dev/null

#     if [ $? -eq 1 ]; then
#         echo "gcc未安装,即将安装"
#         tar -zxvf $_GCC_PATH

#         sleep 1

#         echo "进入gcc目录"
#         cd gcc

#         echo "开始安装"
#         rpm -Uvh *.rpm --nodeps --force

#         echo "gcc安装完成"
#         echo
#         gcc -v

#         #删除gcc目录
#         cd ..
#         rm -rf gcc
#     else
#         echo "gcc依赖已存在,无需安装"
#         echo 
#         gcc -v
#     fi

#     echo

#     echo "开始检查make依赖"
#     #检查make依赖
#     which make &> /dev/null

#     if [ $? -eq 1 ]; then
#         echo "make未安装,即将安装"

#         echo "开始安装"
#         rpm -Uvh $_MAKE_PATH --nodeps --force

#         echo "make安装完成"
#         echo
#         make -v
#     else
#         echo "make依赖已存在,无需安装"
#         echo
#         make -v
#     fi
# }

#安装nginx编译依赖
function check_depends(){
    echo "开始安装编译依赖"
    sleep 3
    rpm -Uvh $_DEPEND_PATH --nodeps --force

    echo
    echo "编译依赖安装完成"
}

#开始菜单
start_menu(){
    clear
    green " =================================================="
    green " 生产环境 一键离线安装脚本 Centos7 x64 By thsrite"
    green " 可选安装JDK1.8、JDK11、卸载JDK"
    green " 可选安装mysql8.0、修改mysql密码、开放mysql远程访问"
    green " 可选安装redis7.0、修改redis密码、开放redis远程访问"
    green " 可选安装nginx1.22.1 "
    green " 可选安装minio "
    green " 可组合安装jdk、mysql、redis、nginx"
    green " 可开放、关闭、查看防火墙端口"
    green " 为防止出现其他问题,请在未安装上述服务的环境中安装 "
    green " tomcat、minio等后续会增加 "
    green " =================================================="

    echo
    blue " =====================服务安装====================="
    red " =================================================="
    yellow " 1.  安装JDK1.8"
    red " =================================================="
    yellow " 2.  安装JDK11"
    red " =================================================="
    yellow " 3.  安装mysql8.0"
    red " =================================================="
    yellow " 4.  安装redis7.0"
    red " =================================================="
    yellow " 5.  安装nginx1.22.1"
    red " =================================================="
    yellow " 6.  安装minio"
    red " =================================================="
    yellow " 7.  安装JDK1.8、mysql8.0、redis7.0、nginx1.22.1"
    red " =================================================="
    yellow " 8.  安装JDK11、mysql8.0、redis7.0、nginx1.22.1"
    red " =================================================="
    # blue " =============================================="

    echo
    blue " =====================服务治理====================="
    red " =================================================="
    yellow " 10. 修改mysql8.0密码"
    red " =================================================="
    yellow " 11. 开放mysql8.0远程访问"
    red " =================================================="
    yellow " 12. 修改redis7.0密码"
    red " =================================================="
    yellow " 13. 开放redis7.0远程访问"
    red " =================================================="
    yellow " 14. 卸载JDK"
    red " =================================================="
    # blue " =============================================="

    echo
    blue " =====================端口管理====================="
    red " =================================================="
    yellow " 20. 开放防火墙端口"
    red " =================================================="
    yellow " 21. 关闭防火墙端口"
    red " =================================================="
    yellow " 22. 查看已开放防火墙端口"
    red " =================================================="
    # blue " =============================================="

    echo
    blue " =====================退出脚本====================="
    red " =================================================="
    yellow " 0.  退出脚本"
    red " =================================================="
    echo
    read -p "请输入数字:" num
    case "$num" in
    #########服务安装#########
    1)
    #安装jdk1.8
    install_jdk 1.8
    ;;
    2)
    #安装jdk11
    install_jdk 11
    ;;
    3)
    #安装mysql
    install_mysql
    ;;
    4)
    #安装redis
    #检查编译依赖
    check_depends

    #检查selinux是否关闭
    check_selinux

    sleep 3
    rpm_install_redis
    ;;
    5)
    #安装nginx
    #检查编译依赖
    check_depends

    #检查selinux是否关闭
    check_selinux

    sleep 3
    rpm_install_nginx
    ;;
    6)
    #安装minio
    #检查编译依赖
    check_depends
    #检查selinux是否关闭
    check_selinux

    sleep 3
    install_minio
    ;;
    7)
    #安装jdk1.8
    install_jdk 1.8
    #安装mysql
    install_mysql
    #安装redis
    #检查编译依赖
    check_depends

    #检查selinux是否关闭
    check_selinux

    sleep 3
    
    rpm_install_redis   
    #安装nginx
    sleep 3
    rpm_install_nginx
    ;;
    8)
    #安装jdk11
    install_jdk 11
    #安装mysql
    install_mysql
    #安装redis
    #检查编译依赖
    check_depends

    #检查selinux是否关闭
    check_selinux

    sleep 3
    
    rpm_install_redis   
    #安装nginx
    sleep 3
    rpm_install_nginx
    ;;


    #########服务治理#########
    10)
    #修改mysql8.0密码
    change_mysql_pwd
    ;;
    11)
    #开放mysql远程访问
    open_mysql
    ;;
    12)
    #修改redis密码
    change_redis_pwd
    ;;
    13)
    #开放redis远程访问
    open_redis
    ;;
    14)
    #删除jdk
    remove_jdk
    ;;


    #########端口管理#########
    20)
    #开放端口
    open_firewalld_port
    ;;
    21)
    #关闭端口
    close_firewalld_port
    ;;
    22)
    #查询端口
    query_firewalld_port
    ;;


    0)
    exit 1
    ;;

    *)
    clear
    red "请输入正确数字"
    sleep 1s
    start_menu
    ;;
    esac
}

#启动命令
start_menu