#!/bin/bash # ============================================ # Forge Admin 服务器环境安装脚本 # 安装 JRE 17 + MySQL 8.0 + Redis 7 + Nginx # 前提:安装包已放在 /mnt/rar/ 目录 # ============================================ set -e PKG_DIR="/mnt/rar" INSTALL_DIR="/opt/forge-env" # 颜色输出 GREEN='\033[0;32m' RED='\033[0;31m' YELLOW='\033[1;33m' NC='\033[0m' info() { echo -e "${GREEN}[INFO]${NC} $1"; } warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } error() { echo -e "${RED}[ERROR]${NC} $1"; } echo "==========================================" echo " Forge Admin 环境安装" echo " 安装包目录: ${PKG_DIR}" echo " 安装目标: ${INSTALL_DIR}" echo "==========================================" # 检查安装包 for f in \ "OpenJDK17U-jre_x64_linux_hotspot_17.0.20.1_1.tar.gz" \ "mysql-8.0.46-linux-glibc2.28-x86_64.tar.xz" \ "redis-7.0.15.tar.gz" \ "nginx-1.25.4.tar.gz"; do if [ ! -f "${PKG_DIR}/${f}" ]; then error "缺少安装包: ${f}" exit 1 fi done info "所有安装包已就绪" # 安装编译工具(Redis 和 Nginx 需要) info "安装编译工具 gcc/make/pcre-devel/zlib-devel/openssl-devel..." yum install -y gcc make pcre-devel zlib-devel openssl-devel xz 2>/dev/null || { error "yum 安装编译工具失败,请检查网络或 yum 源" exit 1 } mkdir -p ${INSTALL_DIR} # ============================================ # 1. 安装 JRE 17 # ============================================ echo "" echo "==========================================" echo " [1/4] 安装 JRE 17" echo "==========================================" JRE_DIR="${INSTALL_DIR}/jre-17" if [ -d "${JRE_DIR}" ] && [ -x "${JRE_DIR}/bin/java" ]; then info "JRE 17 已安装: $(${JRE_DIR}/bin/java -version 2>&1 | head -1)" else info "解压 JRE 17..." tar -xzf "${PKG_DIR}/OpenJDK17U-jre_x64_linux_hotspot_17.0.20.1_1.tar.gz" -C ${INSTALL_DIR} # 找到解压后的目录并重命名 EXTRACTED=$(find ${INSTALL_DIR} -maxdepth 1 -name "jdk-17*" -o -name "jre-17*" | head -1) if [ -z "${EXTRACTED}" ]; then # 可能解压到了 jdk-17.0.20.1+1-jre 之类的目录 EXTRACTED=$(find ${INSTALL_DIR} -maxdepth 1 -type d | grep -i "17" | head -1) fi if [ -n "${EXTRACTED}" ] && [ "${EXTRACTED}" != "${JRE_DIR}" ]; then mv "${EXTRACTED}" "${JRE_DIR}" fi # 配置环境变量 if ! grep -q "JAVA_HOME=${JRE_DIR}" /etc/profile; then echo "" >> /etc/profile echo "# JRE 17 for Forge Admin" >> /etc/profile echo "export JAVA_HOME=${JRE_DIR}" >> /etc/profile echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile fi export JAVA_HOME=${JRE_DIR} export PATH=${JRE_DIR}/bin:$PATH info "JRE 17 安装完成: $(java -version 2>&1 | head -1)" fi # ============================================ # 2. 安装 MySQL 8.0(二进制包方式) # ============================================ echo "" echo "==========================================" echo " [2/4] 安装 MySQL 8.0" echo "==========================================" MYSQL_DIR="${INSTALL_DIR}/mysql" MYSQL_DATA="${INSTALL_DIR}/mysql-data" MYSQL_PORT="${MYSQL_PORT:-3306}" if [ -d "${MYSQL_DIR}/bin/mysqld" ]; then info "MySQL 8.0 已安装: $(${MYSQL_DIR}/bin/mysqld --version)" else info "解压 MySQL 8.0(约 850MB,请耐心等待)..." tar -xJf "${PKG_DIR}/mysql-8.0.46-linux-glibc2.28-x86_64.tar.xz" -C ${INSTALL_DIR} EXTRACTED=$(find ${INSTALL_DIR} -maxdepth 1 -type d -name "mysql-8*" | head -1) if [ -n "${EXTRACTED}" ] && [ "${EXTRACTED}" != "${MYSQL_DIR}" ]; then mv "${EXTRACTED}" "${MYSQL_DIR}" fi # 创建 mysql 用户 if ! id mysql &>/dev/null; then useradd -r -s /sbin/nologin mysql info "创建 mysql 用户" fi # 创建数据目录 mkdir -p ${MYSQL_DATA} chown -R mysql:mysql ${MYSQL_DIR} ${MYSQL_DATA} # 初始化数据库 info "初始化 MySQL 数据库..." ${MYSQL_DIR}/bin/mysqld --initialize-insecure \ --user=mysql \ --basedir=${MYSQL_DIR} \ --datadir=${MYSQL_DATA} 2>&1 | tail -3 # 创建 my.cnf 配置 cat > /etc/my.cnf << EOF [mysqld] basedir=${MYSQL_DIR} datadir=${MYSQL_DATA} port=${MYSQL_PORT} socket=/tmp/mysql.sock character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci default-authentication-plugin=mysql_native_password innodb_buffer_pool_size=256M max_connections=100 symbolic-links=0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid [client] port=${MYSQL_PORT} socket=/tmp/mysql.sock default-character-set=utf8mb4 EOF # 创建 systemd 服务 cat > /etc/systemd/system/mysqld.service << EOF [Unit] Description=MySQL 8.0 Server After=network.target [Service] Type=forking User=mysql Group=mysql ExecStart=${MYSQL_DIR}/bin/mysqld_safe --defaults-file=/etc/my.cnf ExecStop=${MYSQL_DIR}/bin/mysqladmin -u root shutdown Restart=on-failure LimitNOFILE=65535 [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable mysqld systemctl start mysqld sleep 3 # 设置 root 密码 + 创建数据库 info "配置 MySQL root 密码和数据库..." ${MYSQL_DIR}/bin/mysql -u root --socket=/tmp/mysql.sock -e " ALTER USER 'root'@'localhost' IDENTIFIED BY 'forge123456'; CREATE DATABASE IF NOT EXISTS forge_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; FLUSH PRIVILEGES; " 2>/dev/null || { # 如果上面失败,尝试无密码方式 ${MYSQL_DIR}/bin/mysql -u root --socket=/tmp/mysql.sock -e " CREATE DATABASE IF NOT EXISTS forge_admin DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; " } # 创建软链接方便使用 ln -sf ${MYSQL_DIR}/bin/mysql /usr/local/bin/mysql 2>/dev/null || true ln -sf ${MYSQL_DIR}/bin/mysqld /usr/local/bin/mysqld 2>/dev/null || true info "MySQL 8.0 安装完成: $(${MYSQL_DIR}/bin/mysqld --version)" info "root 密码: forge123456" info "数据库: forge_admin" fi # ============================================ # 3. 安装 Redis 7(源码编译) # ============================================ echo "" echo "==========================================" echo " [3/4] 安装 Redis 7" echo "==========================================" REDIS_DIR="${INSTALL_DIR}/redis" if [ -d "${REDIS_DIR}/bin/redis-server" ]; then info "Redis 已安装: $(${REDIS_DIR}/bin/redis-server --version)" else info "解压并编译 Redis 7..." cd /tmp tar -xzf "${PKG_DIR}/redis-7.0.15.tar.gz" cd redis-7.0.15 make -j$(nproc) 2>&1 | tail -5 make PREFIX=${REDIS_DIR} install 2>&1 | tail -3 # 清理编译临时文件 cd /tmp && rm -rf redis-7.0.15 # 创建 redis 用户 if ! id redis &>/dev/null; then useradd -r -s /sbin/nologin redis fi # 创建配置和数据目录 mkdir -p ${REDIS_DIR}/etc ${REDIS_DIR}/data chown -R redis:redis ${REDIS_DIR} # 生成 redis.conf cat > ${REDIS_DIR}/etc/redis.conf << EOF bind 127.0.0.1 port 6379 requirepass forge123456 daemonize yes pidfile /var/run/redis/redis.pid logfile /var/log/redis/redis.log dir ${REDIS_DIR}/data appendonly yes appendfilename "appendonly.aof" maxmemory 256mb maxmemory-policy allkeys-lru tcp-keepalive 300 timeout 300 EOF mkdir -p /var/run/redis /var/log/redis chown -R redis:redis /var/run/redis /var/log/redis # 创建 systemd 服务 cat > /etc/systemd/system/redis.service << EOF [Unit] Description=Redis 7.0 After=network.target [Service] Type=forking User=redis Group=redis ExecStart=${REDIS_DIR}/bin/redis-server ${REDIS_DIR}/etc/redis.conf ExecStop=${REDIS_DIR}/bin/redis-cli -a forge123456 shutdown Restart=on-failure [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable redis systemctl start redis info "Redis 7 安装完成: $(${REDIS_DIR}/bin/redis-server --version)" info "密码: forge123456" fi # ============================================ # 4. 安装 Nginx(源码编译) # ============================================ echo "" echo "==========================================" echo " [4/4] 安装 Nginx" echo "==========================================" NGINX_DIR="${INSTALL_DIR}/nginx" if [ -d "${NGINX_DIR}/sbin/nginx" ]; then info "Nginx 已安装: $(${NGINX_DIR}/sbin/nginx -v 2>&1)" else info "解压并编译 Nginx..." cd /tmp tar -xzf "${PKG_DIR}/nginx-1.25.4.tar.gz" cd nginx-1.25.4 ./configure \ --prefix=${NGINX_DIR} \ --with-http_ssl_module \ --with-http_gzip_static_module \ --with-http_realip_module \ 2>&1 | tail -3 make -j$(nproc) 2>&1 | tail -3 make install 2>&1 | tail -3 # 清理编译临时文件 cd /tmp && rm -rf nginx-1.25.4 # 创建 nginx 用户 if ! id nginx &>/dev/null; then useradd -r -s /sbin/nologin nginx fi # 备份默认配置,写入 Forge 配置 mv ${NGINX_DIR}/conf/nginx.conf ${NGINX_DIR}/conf/nginx.conf.bak 2>/dev/null || true cat > ${NGINX_DIR}/conf/nginx.conf << 'NGINXEOF' worker_processes auto; error_log logs/error.log warn; pid logs/nginx.pid; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; client_max_body_size 20m; gzip on; gzip_types text/plain application/json application/javascript text/css; gzip_min_length 1000; server { listen 80; server_name _; # 前端静态资源 location /forge/ { alias /opt/forge/frontend/; index index.html index.htm; try_files $uri $uri/ /forge/index.html; } # 根路径重定向 location = / { return 302 /forge; } # 流程服务 API location /forge-api/api/flow/ { proxy_send_timeout 3000; proxy_read_timeout 3000; proxy_connect_timeout 3000; proxy_pass http://127.0.0.1:8081/api/flow/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 后端主服务 API location /forge-api/ { proxy_send_timeout 3000; proxy_read_timeout 3000; proxy_connect_timeout 3000; proxy_pass http://127.0.0.1:8580/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } } NGINXEOF # 创建 systemd 服务 cat > /etc/systemd/system/nginx.service << EOF [Unit] Description=Nginx HTTP Server After=network.target [Service] Type=forking ExecStart=${NGINX_DIR}/sbin/nginx ExecStop=${NGINX_DIR}/sbin/nginx -s quit ExecReload=${NGINX_DIR}/sbin/nginx -s reload Restart=on-failure [Install] WantedBy=multi-user.target EOF systemctl daemon-reload systemctl enable nginx systemctl start nginx info "Nginx 安装完成: $(${NGINX_DIR}/sbin/nginx -v 2>&1)" fi # ============================================ # 安装完成总结 # ============================================ echo "" echo "==========================================" echo " ✅ 全部安装完成!" echo "==========================================" echo "" echo " 安装目录: ${INSTALL_DIR}" echo "" echo " JRE 17: ${JRE_DIR}/bin/java" echo " 版本: $(java -version 2>&1 | head -1)" echo "" echo " MySQL: ${MYSQL_DIR}/bin/mysqld" echo " 版本: $(${MYSQL_DIR}/bin/mysqld --version)" echo " 数据: ${MYSQL_DATA}" echo " root密码: forge123456" echo " 数据库: forge_admin" echo "" echo " Redis: ${REDIS_DIR}/bin/redis-server" echo " 版本: $(${REDIS_DIR}/bin/redis-server --version)" echo " 密码: forge123456" echo "" echo " Nginx: ${NGINX_DIR}/sbin/nginx" echo " 版本: $(${NGINX_DIR}/sbin/nginx -v 2>&1)" echo "" echo " 服务管理命令:" echo " systemctl status mysqld" echo " systemctl status redis" echo " systemctl status nginx" echo "" echo " 下一步:" echo " 1. 将 Windows 构建好的 jar 和 dist 上传到 /opt/forge/" echo " 2. 启动后端服务" echo "=========================================="