原创

微服务blog传统部署文档

微服务blog传统部署文档

一、环境准备

1.服务器准备
序号ip系统版本硬件配置
1192.168.17.xcentos72CPU/4G内存/30G存储
2.初始化系统

如果系统未做初始化请做初始化vim init.sh 将以下脚本写入到init.sh里面

#!/bin/bash

# 交互式网络配置脚本
echo "======================= 系统初始化配置 ======================="

# 函数:获取用户输入
get_input() {
    local prompt="$1"
    local default_value="$2"
    local user_input
    
    if [ -n "$default_value" ]; then
        read -p "$prompt (默认: $default_value): " user_input
        if [ -z "$user_input" ]; then
            user_input="$default_value"
        fi
    else
        read -p "$prompt: " user_input
    fi
    
    echo "$user_input"
}

# 函数:验证IP地址格式
validate_ip() {
    local ip="$1"
    local regex="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
    
    if [[ $ip =~ $regex ]]; then
        IFS='.' read -r -a octets <<< "$ip"
        for octet in "${octets[@]}"; do
            if (( octet < 0 || octet > 255 )); then
                return 1
            fi
        done
        return 0
    else
        return 1
    fi
}

# 函数:验证子网掩码格式
validate_netmask() {
    local mask="$1"
    local regex="^255\.255\.255\.[0-9]+$"
    
    if [[ $mask =~ $regex ]] || [[ "$mask" =~ ^[0-9]{1,2}$ ]]; then
        return 0
    else
        return 1
    fi
}

# 显示当前网络接口信息
echo "当前网络接口信息:"
echo "---------------------------------------------------"
ip addr show | grep -E "^[0-9]+:|inet " | grep -v "127.0.0.1"
echo "---------------------------------------------------"

# 设置要分配的IP地址、子网掩码和默认网关
echo "正在配置网络参数..."
echo ""

# 获取网卡名称
interface_list=$(ls /etc/sysconfig/network-scripts/ifcfg-* 2>/dev/null | xargs -n1 basename | sed 's/ifcfg-//' | tr '\n' ' ')
default_interface=""
if [ -n "$interface_list" ]; then
    default_interface=$(echo "$interface_list" | awk '{print $1}')
fi

# 交互式输入网络参数
while true; do
    network_interface=$(get_input "请输入网卡名称" "$default_interface")
    if [ -n "$network_interface" ]; then
        break
    fi
    echo "错误: 网卡名称不能为空!"
done

# 检查是否有现有配置
networkfile="/etc/sysconfig/network-scripts/ifcfg-$network_interface"
if [ -f "$networkfile" ]; then
    echo ""
    echo "发现现有网络配置:"
    echo "---------------------------------------------------"
    grep -E "^(IPADDR|NETMASK|GATEWAY|DNS|BOOTPROTO)=" "$networkfile" 2>/dev/null || echo "(无配置)"
    echo "---------------------------------------------------"
    
    read -p "是否覆盖现有配置? (y/n, 默认: n): " overwrite
    if [[ ! "$overwrite" =~ ^[Yy]$ ]]; then
        echo "已取消配置,使用现有配置。"
    else
        # 备份原配置文件
        backup_file="${networkfile}.backup.$(date +%Y%m%d%H%M%S)"
        cp "$networkfile" "$backup_file"
        echo "已备份原配置文件到: $backup_file"
    fi
fi

# 获取IP地址
while true; do
    ip_address=$(get_input "请输入IP地址" "192.168.137.140")
    if validate_ip "$ip_address"; then
        break
    else
        echo "错误: IP地址格式不正确! 请重新输入。"
    fi
done

# 获取子网掩码
while true; do
    subnet_mask=$(get_input "请输入子网掩码 (格式: 255.255.255.0 或 CIDR如 24)" "255.255.255.0")
    if validate_netmask "$subnet_mask"; then
        break
    else
        echo "错误: 子网掩码格式不正确! 请重新输入。"
    fi
done

# 获取默认网关
while true; do
    # 自动生成默认网关建议(通常是IP地址的第一个可用地址)
    suggested_gateway=$(echo "$ip_address" | sed 's/[0-9]*$/2/')
    default_gateway=$(get_input "请输入默认网关" "$suggested_gateway")
    if validate_ip "$default_gateway"; then
        break
    else
        echo "错误: 网关地址格式不正确! 请重新输入。"
    fi
done

# 获取DNS服务器
dns1=$(get_input "请输入主DNS服务器" "114.114.114.114")
dns2=$(get_input "请输入备DNS服务器" "223.5.5.5")

# 确认配置
echo ""
echo "=============== 请确认以下网络配置 ==============="
echo "网卡名称:     $network_interface"
echo "IP地址:       $ip_address"
echo "子网掩码:     $subnet_mask"
echo "默认网关:     $default_gateway"
echo "主DNS:        $dns1"
echo "备DNS:        $dns2"
echo "=================================================="
echo ""

read -p "确认应用以上配置? (y/n, 默认: n): " confirm
if [[ ! "$confirm" =~ ^[Yy]$ ]]; then
    echo "配置已取消!"
    exit 1
fi

# 关闭防火墙
echo "正在关闭防火墙..."
systemctl stop firewalld 2>/dev/null && systemctl disable firewalld 2>/dev/null && echo "防火墙已关闭" || echo "警告: 防火墙关闭失败或未安装"

# 关闭NetworkManager
echo "正在关闭NetworkManager..."
systemctl stop NetworkManager 2>/dev/null && systemctl disable NetworkManager 2>/dev/null && echo "NetworkManager已关闭" || echo "警告: NetworkManager关闭失败或未安装"

# 关闭SELinux
echo "正在关闭SELinux..."
setenforce 0 2>/dev/null
if [ -f /etc/selinux/config ]; then
    sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
    sed -i 's/^SELINUX=permissive/SELINUX=disabled/g' /etc/selinux/config
    echo "SELinux已禁用"
else
    echo "SELinux配置文件不存在,跳过"
fi

# 关闭SSHD的DNS验证
echo "正在关闭SSHD的DNS验证..."
if [ -f /etc/ssh/sshd_config ]; then
    # 备份原配置文件
    cp /etc/ssh/sshd_config /etc/ssh/sshd_config.backup.$(date +%Y%m%d%H%M%S)
    
    # 修改配置
    sed -i 's/^#UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
    sed -i 's/^UseDNS yes/UseDNS no/' /etc/ssh/sshd_config
    
    # 添加配置项(如果不存在)
    if ! grep -q '^UseDNS' /etc/ssh/sshd_config; then
        echo "UseDNS no" >> /etc/ssh/sshd_config
    fi
    
    # 重启服务
    systemctl restart sshd 2>/dev/null && echo "SSHD配置已更新" || echo "警告: SSHD服务重启失败"
else
    echo "警告: SSH配置文件不存在,跳过配置"
fi

# 配置Yum源
echo "正在配置Yum源..."
# 备份原有源
mkdir -p /etc/yum.repos.d/backup
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/backup/ 2>/dev/null

# 下载阿里云CentOS源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 2>/dev/null
if [ $? -eq 0 ]; then
    echo "CentOS-Base.repo下载成功"
else
    echo "警告: CentOS-Base.repo下载失败,请检查网络连接"
fi

# 下载阿里云EPEL源
curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo 2>/dev/null
if [ $? -eq 0 ]; then
    echo "epel.repo下载成功"
else
    echo "警告: epel.repo下载失败,请检查网络连接"
fi

# 清理缓存并生成新缓存
yum clean all 2>/dev/null
yum makecache 2>/dev/null && echo "Yum缓存已更新" || echo "警告: Yum缓存更新失败"

# 配置网卡
echo "正在配置网卡 $network_interface ..."

# 检查并获取UUID
uuid_line=""
if [ -f "$networkfile" ]; then
    uuid_line=$(grep '^UUID=' "$networkfile")
fi

# 如果没有找到UUID,则生成一个新的
if [ -z "$uuid_line" ]; then
    uuid_line="UUID=\"$(uuidgen)\""
fi

# 清空现有配置文件
> "$networkfile"

# 编写ifcfg文件
cat >> "$networkfile" <<EOF
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="yes"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="$network_interface"
$uuid_line
DEVICE="$network_interface"
ONBOOT="yes"
IPADDR=$ip_address
NETMASK=$subnet_mask
GATEWAY=$default_gateway
DNS1=$dns1
DNS2=$dns2
EOF

echo "网络配置文件已生成: $networkfile"
echo ""

# 安装基础软件包
echo "正在安装基础软件包..."
yum -y install wget lrzsz unzip gzip telnet vim 2>/dev/null || echo "警告: 软件包安装失败,请检查yum源配置"

# 配置基础环境变量
echo "配置基础环境变量..."

# 备份原配置文件
cp /etc/profile /etc/profile.backup.$(date +%Y%m%d%H%M%S) 2>/dev/null
cp ~/.vimrc ~/.vimrc.backup.$(date +%Y%m%d%H%M%S) 2>/dev/null 2>/dev/null

# 追加环境变量配置
if ! grep -q "if \[ \$(id -u) == 0 \]; then" /etc/profile; then
    cat >> /etc/profile <<EOF

if [ \$(id -u) == 0 ]; then
export PS1='[\033[31;1m\]\u\[\033[m\]@\h \w]# '
else
export PS1='[\033[34;1m\]\u\[\033[m\]@\h \w]\$ '
fi
alias ll='ls -lh --color=auto'
alias grep='grep --color'
alias free='free -m'
alias df='df -h'
alias du='du -h'
alias vi='vim'
EOF
fi

# 配置vimrc
cat > ~/.vimrc <<EOF
"设置高亮
syntax on
"显示行号
set number
"自动缩进功能
set autoindent
"启用鼠标支持
"set mouse=a
"vim新打开.sh文件自动添加一下内容
autocmd BufNewFile *.sh exec ":call SetComment()"
func SetComment()
     if expand("%:e")=='sh'
         call setline(1,'#!/bin/bash')
         call setline(2,'#Author:     xxx')
         call setline(3,'#Create time:'.strftime("%Y-%m-%d"))
     endif
endfunc
EOF

# 应用环境变量
source /etc/profile 2>/dev/null

# 重启网络服务
echo "正在重启网络服务..."
if systemctl restart network 2>/dev/null; then
    echo "网络服务重启成功!"
else
    echo "尝试使用其他方式重启网络..."
    ifdown "$network_interface" 2>/dev/null && ifup "$network_interface" 2>/dev/null || echo "网络重启失败,请手动检查"
fi

echo ""
echo "======================= 配置完成 ======================="
echo "网络配置摘要:"
echo "IP地址:       $ip_address"
echo "子网掩码:     $subnet_mask"
echo "默认网关:     $default_gateway"
echo "DNS服务器:    $dns1, $dns2"
echo "配置文件:     $networkfile"
echo ""
echo "当前网络状态:"
echo "---------------------------------------------------"
ip addr show "$network_interface" 2>/dev/null | grep "inet " || echo "警告: 无法获取IP地址,请检查配置"
echo "---------------------------------------------------"
echo ""
echo "请使用以下命令测试网络连接:"
echo "1. ping $default_gateway"
echo "2. ping 114.114.114.114"
echo "3. ping www.baidu.com"
echo ""
echo "脚本执行完毕!"

给脚本执行权限

chmod +x init.sh
#运行脚本
./init.sh

二、项目解析

blog项目是使用Java开发,使用了前后端分离,前端使用vue,后端使用springcloud微服务框架进行开发

项目部署环境:jdk8+mysql5.7+redis5.0+nacos。注意:如果部署项目中,需要mysql数据库或者其他数据如redis等中间件时,我们应该优先运行中间件

三、数据库的部署

1.下载rpm包

手动下载包或者上传已经下载好的包:此处我直接上传下载好的包

mkdir /opt/soft/mysql -p && cd /opt/soft/mysql
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-client-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-common-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-devel-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-libs-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-libs-compat-5.7.36-1.el7.x86_64.rpm
wget https://mirrors.aliyun.com/mysql/MySQL-5.7/mysql-community-server-5.7.36-1.el7.x86_64.rpm
2.执行自动化安装脚本

将以下脚本写入到install-mysql.sh中

#!/bin/bash

# MySQL手动安装配置脚本
# 用法:sudo ./install_mysql.sh
# 注意:需要先将MySQL RPM包上传到/opt/soft/mysql目录
# 此版本不包含自动密码修改功能

set -e  # 遇到错误时退出脚本

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 变量定义
MYSQL_DIR="/opt/soft/mysql"
MYSQL_PORT="3306"

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 检查是否以root用户运行
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本必须以root权限运行"
        exit 1
    fi
}

# 检查MySQL包是否存在
check_mysql_packages() {
    log_step "检查MySQL安装包..."
    
    if [[ ! -d "$MYSQL_DIR" ]]; then
        log_error "MySQL安装包目录不存在: $MYSQL_DIR"
        echo "请执行以下步骤:"
        echo "1. mkdir -p /opt/soft/mysql"
        echo "2. cd /opt/soft/mysql"
        echo "3. 上传MySQL RPM包到该目录"
        exit 1
    fi
    
    cd "$MYSQL_DIR"
    
    # 检查目录中是否有RPM文件
    if ls *.rpm 1>/dev/null 2>&1; then
        log_info "找到以下RPM包:"
        ls -la *.rpm
        echo ""
    else
        log_error "在 $MYSQL_DIR 目录中未找到RPM包"
        echo "请将MySQL RPM包上传到该目录,然后重新运行脚本"
        exit 1
    fi
}

# 检查是否已安装MySQL
check_existing_mysql() {
    log_step "检查已安装的MySQL组件..."
    
    if rpm -qa | grep -q mysql; then
        log_warn "检测到已安装的MySQL组件:"
        rpm -qa | grep mysql
        
        read -p "是否继续安装?(y/n): " -n 1 -r
        echo
        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
            log_info "安装已取消"
            exit 0
        fi
    else
        log_info "未检测到已安装的MySQL组件"
    fi
}

# 安装MySQL依赖
install_dependencies() {
    log_step "安装必要的依赖包..."
    
    yum -y install perl net-tools libaio numactl
    if [[ $? -ne 0 ]]; then
        log_warn "部分依赖包安装失败,但将继续尝试安装MySQL"
    else
        log_info "依赖包安装完成"
    fi
}

# 安装MySQL RPM包
install_mysql_rpms() {
    log_step "安装MySQL RPM包..."
    
    cd "$MYSQL_DIR"
    
    # 先安装common和libs包
    for package_pattern in "*common*" "*libs*" "*client*" "*server*"; do
        for rpm_file in $package_pattern; do
            if [[ -f "$rpm_file" ]]; then
                log_info "安装: $rpm_file"
                rpm -ivh "$rpm_file" 2>/dev/null || {
                    # 如果安装失败,尝试使用--force选项
                    log_warn "尝试强制安装: $rpm_file"
                    rpm -ivh --force --nodeps "$rpm_file" 2>/dev/null || true
                }
            fi
        done
    done
    
    # 安装剩余的所有RPM包
    for rpm_file in *.rpm; do
        if [[ -f "$rpm_file" ]] && ! rpm -q $(rpm -qp --queryformat '%{NAME}' "$rpm_file" 2>/dev/null) >/dev/null 2>&1; then
            log_info "安装: $rpm_file"
            rpm -ivh "$rpm_file" 2>/dev/null || {
                log_warn "尝试强制安装: $rpm_file"
                rpm -ivh --force --nodeps "$rpm_file" 2>/dev/null || true
            }
        fi
    done
    
    # 验证安装
    if rpm -qa | grep -q mysql-community-server; then
        log_info "MySQL安装成功"
    else
        log_error "MySQL安装失败,请检查RPM包是否正确"
        exit 1
    fi
}

# 配置MySQL
configure_mysql() {
    log_step "配置MySQL..."
    
    # 备份原始配置文件
    if [[ -f /etc/my.cnf ]]; then
        mv /etc/my.cnf /etc/my.cnf.bak
        log_info "已备份原始配置文件: /etc/my.cnf.bak"
    fi
    
    # 创建新的配置文件
    cat > /etc/my.cnf << EOF
[client]
port=$MYSQL_PORT
socket=/var/lib/mysql/mysql.sock

[mysqld]
port=$MYSQL_PORT
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
server-id=1
log-bin=mysql-bin
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
character_set_server=utf8mb4
collation_server=utf8mb4_general_ci
max_connections=1000
query_cache_size=64M
slow_query_log=1
slow_query_log_file=/var/log/mysql-slow.log
long_query_time=2
binlog_format=ROW
default-storage-engine=INNODB
innodb_buffer_pool_size=256M
innodb_log_file_size=128M
innodb_flush_log_at_trx_commit=1
innodb_lock_wait_timeout=50

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
EOF
    
    log_info "MySQL配置文件已创建"
}

# 初始化数据目录
initialize_mysql() {
    log_step "初始化MySQL数据目录..."
    
    # 检查数据目录是否已存在
    if [[ -d /var/lib/mysql ]] && [[ "$(ls -A /var/lib/mysql 2>/dev/null)" ]]; then
        log_warn "MySQL数据目录已存在且不为空"
        read -p "是否删除现有数据并重新初始化?(y/n): " -n 1 -r
        echo
        if [[ $REPLY =~ ^[Yy]$ ]]; then
            systemctl stop mysqld 2>/dev/null || true
            rm -rf /var/lib/mysql/*
            log_info "已清空数据目录"
        fi
    fi
}

# 启动MySQL服务
start_mysql_service() {
    log_step "启动MySQL服务..."
    
    # 设置开机自启
    systemctl enable mysqld
    if [[ $? -ne 0 ]]; then
        log_warn "设置开机自启失败,但将继续尝试启动"
    fi
    
    # 启动服务
    systemctl start mysqld
    
    # 检查服务状态
    local max_retries=10
    local retry_count=0
    
    while [[ $retry_count -lt $max_retries ]]; do
        if systemctl is-active --quiet mysqld; then
            log_info "MySQL服务启动成功"
            return 0
        fi
        
        log_info "等待MySQL服务启动... ($((retry_count+1))/$max_retries)"
        sleep 3
        ((retry_count++))
    done
    
    log_error "MySQL服务启动失败"
    systemctl status mysqld
    journalctl -xe --no-pager | tail -50
    return 1
}

# 获取临时密码
get_temp_password() {
    log_step "获取MySQL临时密码..."
    
    # 等待MySQL日志文件生成
    local max_retries=20
    local retry_count=0
    
    while [[ $retry_count -lt $max_retries ]]; do
        if [[ -f /var/log/mysqld.log ]] && [[ -s /var/log/mysqld.log ]]; then
            # 从日志中查找临时密码
            local temp_password=$(grep 'temporary password' /var/log/mysqld.log | tail -1 | awk -F': ' '{print $NF}')
            
            if [[ -n "$temp_password" ]]; then
                echo "$temp_password"
                return 0
            fi
        fi
        
        if [[ $retry_count -eq 5 ]]; then
            log_info "等待MySQL生成临时密码..."
        fi
        
        sleep 2
        ((retry_count++))
    done
    
    log_warn "在日志中未找到临时密码"
    return 1
}

# 显示安装摘要
show_summary() {
    log_step "=== MySQL安装完成 ==="
    echo ""
    echo "安装信息摘要:"
    echo "├─ MySQL状态: $(systemctl is-active mysqld 2>/dev/null || echo '未知')"
    echo "├─ 服务端口: ${MYSQL_PORT}"
    echo "├─ 数据目录: /var/lib/mysql"
    echo "├─ 配置文件: /etc/my.cnf (原始配置备份: /etc/my.cnf.bak)"
    echo "├─ 日志文件: /var/log/mysqld.log"
    echo "├─ 字符集: utf8mb4"
    echo "└─ 安装目录: ${MYSQL_DIR}"
    echo ""
    echo "=== 重要: 请手动完成以下步骤 ==="
    echo ""
    echo "1. 获取临时密码:"
    echo "   grep 'temporary password' /var/log/mysqld.log"
    echo ""
    echo "2. 使用临时密码登录MySQL:"
    echo "   mysql -uroot -p'临时密码'"
    echo ""
    echo "3. 修改root密码:"
    echo "   ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';"
    echo ""
    echo "5. 启用远程访问(可选):"
    echo "   CREATE USER '用户名'@'%' IDENTIFIED BY '密码';"
    echo "   GRANT ALL PRIVILEGES ON *.* TO '用户名'@'%';"
    echo "   FLUSH PRIVILEGES;"
    echo ""
    echo "6. 如果忘记临时密码,可重置密码:"
    echo "   a. 停止MySQL: systemctl stop mysqld"
    echo "   b. 编辑配置文件: vi /etc/my.cnf"
    echo "   c. 在[mysqld]段添加: skip-grant-tables"
    echo "   d. 启动MySQL: systemctl start mysqld"
    echo "   e. 无密码登录: mysql -uroot"
    echo "   f. 执行: UPDATE mysql.user SET authentication_string=PASSWORD('新密码') WHERE User='root';"
    echo "   g. 执行: FLUSH PRIVILEGES;"
    echo "   h. 退出MySQL并编辑配置文件删除skip-grant-tables"
    echo "   i. 重启MySQL: systemctl restart mysqld"
    echo ""
    echo "常用命令:"
    echo "├─ 启动服务: systemctl start mysqld"
    echo "├─ 停止服务: systemctl stop mysqld"
    echo "├─ 重启服务: systemctl restart mysqld"
    echo "├─ 查看状态: systemctl status mysqld"
    echo "├─ 查看日志: tail -f /var/log/mysqld.log"
    echo "└─ 设置开机启动: systemctl enable mysqld"
    echo ""
    
    # 显示当前MySQL版本
    if command -v mysql &> /dev/null; then
        echo "MySQL版本信息:"
        mysql --version
    fi
    
    # 获取并显示临时密码
    TEMP_PASSWORD=$(get_temp_password)
    if [[ -n "$TEMP_PASSWORD" ]]; then
        echo ""
        echo "检测到的临时密码: $TEMP_PASSWORD"
        echo "登录命令: mysql -uroot -p'$TEMP_PASSWORD'"
    else
        echo ""
        echo "未找到临时密码,请检查日志文件: /var/log/mysqld.log"
    fi
    
    echo ""
    echo "安全建议:"
    echo "1. 安装后立即修改root密码"
    echo "2. 为应用创建专用用户,避免使用root用户"
    echo "3. 定期备份数据库"
    echo "4. 配置适当的防火墙规则"
    echo ""
}

# 主函数
main() {
    log_step "开始MySQL手动安装配置"
    echo "========================================"
    echo "MySQL安装目录: ${MYSQL_DIR}"
    echo "MySQL 端口: ${MYSQL_PORT}"
    echo "========================================"
    echo "注意: 此脚本不包含自动修改密码功能"
    echo "安装后请手动修改MySQL root密码"
    echo "========================================"
    echo ""
    
    # 检查root权限
    check_root
    
    # 检查MySQL包
    check_mysql_packages
    
    # 检查已安装的MySQL
    check_existing_mysql
    
    # 安装依赖
    install_dependencies
    
    # 安装MySQL RPM包
    install_mysql_rpms
    
    # 初始化数据目录
    initialize_mysql
    
    # 配置MySQL
    configure_mysql
    
    # 启动MySQL服务
    if ! start_mysql_service; then
        log_error "MySQL服务启动失败,请检查以上错误信息"
        exit 1
    fi
    
    # 等待MySQL完全启动
    sleep 5
    
    # 显示摘要
    show_summary
    
    log_info "脚本执行完成!"
    echo ""
    echo "下一步操作:"
    echo "1. 获取临时密码: grep 'temporary password' /var/log/mysqld.log"
    echo "2. 使用临时密码登录MySQL"
    echo "3. 修改root密码"
    echo "4. 配置其他用户和权限"
    echo ""
}

# 执行主函数
main "$@"
3.修改密码和授权

密码修改

#查看临时密码
grep 'password' /var/log/mysqld.log
#修改mysql密码
mysqladmin -uroot -p'临时密码' password '需要修改的密码'
mysqladmin -uroot -p'o?=RfHasu7Cg' password 'Admin123.'

授权

mysql -uroot -p
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'Admin123.' WITH GRANT OPTION;
-- 最后刷新
FLUSH PRIVILEGES;

四、jdk部署

创建文件夹,上传jdk

mkdir /opt/soft/jdk && cd /opt/soft/jdk
#上传jdk后解压
unzip jdk1.8.0_121.zip

执行以下脚本,vim install-jdk.sh

#!/bin/bash

# JDK 自动化安装脚本
# 使用说明:以root用户运行此脚本

set -e  # 遇到错误时退出脚本

# 定义颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # 恢复默认颜色

echo -e "${GREEN}开始安装JDK 1.8.0_121...${NC}"

# 检查当前目录
CURRENT_DIR=$(pwd)
echo -e "${YELLOW}当前目录: ${CURRENT_DIR}${NC}"

# 检查JDK目录是否存在
if [ ! -d "jdk1.8.0_121" ]; then
    echo -e "${RED}错误: 在当前目录未找到 jdk1.8.0_121 目录${NC}"
    echo "请确保在 /opt/soft/jdk 目录下存在解压后的 jdk1.8.0_121 目录"
    exit 1
fi

# 创建目标目录
echo -e "${YELLOW}创建 /usr/local/java 目录...${NC}"
mkdir -p /usr/local/java

# 移动JDK
echo -e "${YELLOW}移动JDK到 /usr/local/java...${NC}"
mv jdk1.8.0_121 /usr/local/java/

# 设置权限
echo -e "${YELLOW}设置可执行权限...${NC}"
chmod +x /usr/local/java/jdk1.8.0_121/bin/*
chmod +x /usr/local/java/jdk1.8.0_121/jre/bin/*

# 备份原有的环境变量文件
echo -e "${YELLOW}备份 /etc/profile 文件...${NC}"
cp /etc/profile /etc/profile.bak.$(date +%Y%m%d%H%M%S)

# 追加环境变量配置
echo -e "${YELLOW}配置环境变量...${NC}"

# 检查是否已配置JAVA_HOME
if grep -q "JAVA_HOME=/usr/local/java/jdk1.8.0_121" /etc/profile; then
    echo -e "${YELLOW}环境变量已存在,跳过配置${NC}"
else
    cat >> /etc/profile << 'EOF'

# Java Environment Variables
export JAVA_HOME=/usr/local/java/jdk1.8.0_121
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=$JAVA_HOME/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
EOF
    echo -e "${GREEN}环境变量配置完成${NC}"
fi

# 创建符号链接(可选,兼容某些应用)
echo -e "${YELLOW}创建Java符号链接...${NC}"
ln -sf /usr/local/java/jdk1.8.0_121 /usr/local/java/default

# 刷新环境变量
echo -e "${YELLOW}刷新环境变量...${NC}"
source /etc/profile

# 验证安装
echo -e "${YELLOW}验证Java安装...${NC}"
java -version

if [ $? -eq 0 ]; then
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}JDK 安装成功!${NC}"
    echo -e "${GREEN}Java 已安装到: /usr/local/java/jdk1.8.0_121${NC}"
    echo -e "${GREEN}========================================${NC}"
    
    # 显示Java信息
    echo -e "${YELLOW}Java 详细信息:${NC}"
    /usr/local/java/jdk1.8.0_121/bin/java -version
else
    echo -e "${RED}JDK 安装失败,请检查错误信息${NC}"
    exit 1
fi

# 设置用户级别的环境变量(可选)
echo -e "${YELLOW}是否要为当前用户设置环境变量?(y/n)${NC}"
read -r response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
    USER_HOME=$HOME
    if [ -f "$USER_HOME/.bashrc" ]; then
        echo -e "${YELLOW}在 ~/.bashrc 中添加环境变量...${NC}"
        cat >> $USER_HOME/.bashrc << 'EOF'

# Java Environment Variables
export JAVA_HOME=/usr/local/java/jdk1.8.0_121
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=$JAVA_HOME/lib:${JRE_HOME}/lib:$CLASSPATH
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
export PATH=$PATH:$HOME/bin:$JAVA_HOME/bin
EOF
        source $USER_HOME/.bashrc
        echo -e "${GREEN}用户环境变量已设置${NC}"
    fi
fi

echo -e "${GREEN}安装完成!${NC}"

五、nacos部署

Nacos 是一个动态服务发现、配置管理和服务管理平台,由阿里巴巴开源并贡献给 Apache 基金会,现在是 Apache 顶级项目。

1.下载nacos
#创建目录
mkdir -p /opt/soft/nacos && cd /opt/soft/nacos
#下载
wget https://github.com/alibaba/nacos/releases/download/2.0.2/nacos-server-2.0.2.tar.gz
#解压
tar -zxf nacos-server-2.0.2.tar.gz
#移动包
mv /opt/soft/nacos/nacos /usr/local/

2.修改配置文件
vim /usr/local/nacos/conf/application.properties

#找到数据库连接,取消注释修改为自己的
# db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
# db.user.0=nacos
# db.password.0=nacos

3.创建数据库导入数据

创建nacos数据库,将解压的包里面的conf目录中nacos-mysql.sql导入到数据库中

4.启动nacos
cd /usr/local/nacos/bin
./startup.sh -m standalone

#打开浏览器
http://ip:8848/nacos/
默认用户名密码:nacos/nacos

六、前端部署

1.nginx安装
mkdir -p /opt/soft/nginx
vim install-nginx.sh

执行以下脚本

#!/bin/bash

# Nginx 安装脚本
# 版本: 1.0
# 描述: 自动安装 Nginx 1.18.0 版本

set -e  # 遇到错误时退出脚本
set -u  # 使用未初始化的变量时报错

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}

# 检查是否以root用户运行
check_root() {
    if [[ $EUID -ne 0 ]]; then
        log_error "此脚本必须以root权限运行"
        exit 1
    fi
    log_info "root权限检查通过"
}

# 安装依赖
install_dependencies() {
    log_info "开始安装系统依赖..."
    
    # 更新yum缓存
    yum makecache fast
    
    # 安装依赖包
    yum -y install gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel wget tar
    
    if [[ $? -eq 0 ]]; then
        log_info "系统依赖安装完成"
    else
        log_error "系统依赖安装失败"
        exit 1
    fi
}

# 创建目录
create_directories() {
    log_info "创建Nginx安装目录..."
    
    # 创建安装目录
    mkdir -p /usr/local/nginx
    
    # 创建软件包存放目录
    mkdir -p /opt/soft/nginx
    
    log_info "目录创建完成"
}

# 下载Nginx源码
download_nginx() {
    log_info "开始下载Nginx源码包..."
    
    cd /opt/soft/nginx || exit 1
    
    local nginx_version="1.18.0"
    local nginx_file="nginx-${nginx_version}.tar.gz"
    local nginx_url="https://nginx.org/download/nginx-${nginx_version}.tar.gz"
    
    # 检查是否已存在源码包
    if [[ -f "$nginx_file" ]]; then
        log_warn "Nginx源码包已存在,跳过下载"
    else
        wget "$nginx_url"
        if [[ $? -ne 0 ]]; then
            log_error "下载Nginx源码包失败"
            exit 1
        fi
        log_info "Nginx源码包下载完成"
    fi
}

# 解压源码包
extract_nginx() {
    log_info "解压Nginx源码包..."
    
    cd /opt/soft/nginx || exit 1
    local nginx_version="1.18.0"
    local nginx_file="nginx-${nginx_version}.tar.gz"
    
    if [[ ! -f "$nginx_file" ]]; then
        log_error "Nginx源码包不存在: $nginx_file"
        exit 1
    fi
    
    tar -zxvf "$nginx_file"
    
    if [[ $? -eq 0 ]]; then
        log_info "Nginx源码包解压完成"
    else
        log_error "Nginx源码包解压失败"
        exit 1
    fi
}

# 编译安装Nginx
compile_install_nginx() {
    log_info "开始编译安装Nginx..."
    
    cd "/opt/soft/nginx/nginx-1.18.0" || exit 1
    
    # 配置编译参数
    log_info "配置编译参数..."
    ./configure --user=root \
                --group=root \
                --prefix=/usr/local/nginx \
                --with-http_ssl_module \
                --with-http_v2_module \
                --with-http_stub_status_module \
                --with-http_gzip_static_module \
                --with-http_sub_module \
                --with-stream \
                --with-stream_ssl_module \
                --with-openssl-opt=enable-weak-ssl-ciphers
    
    if [[ $? -ne 0 ]]; then
        log_error "配置阶段失败"
        exit 1
    fi
    
    # 编译
    log_info "开始编译..."
    make
    
    if [[ $? -ne 0 ]]; then
        log_error "编译失败"
        exit 1
    fi
    
    # 安装
    log_info "开始安装..."
    make install
    
    if [[ $? -eq 0 ]]; then
        log_info "Nginx安装完成"
    else
        log_error "安装失败"
        exit 1
    fi
}

# 显示安装信息
show_installation_info() {
    log_info "========== Nginx 安装完成 =========="
    log_info "安装目录: /usr/local/nginx"
    log_info "配置文件: /usr/local/nginx/conf/nginx.conf"
    log_info "启动命令: /usr/local/nginx/sbin/nginx"
    log_info "停止命令: /usr/local/nginx/sbin/nginx -s stop"
    log_info "重启命令: /usr/local/nginx/sbin/nginx -s reload"
    log_info "测试配置: /usr/local/nginx/sbin/nginx -t"
    log_info "版本检查: /usr/local/nginx/sbin/nginx -v"
    log_info "===================================="
    
    echo ""
    echo -e "${GREEN}安装完成!请执行以下命令启动Nginx:${NC}"
    echo -e "${YELLOW}/usr/local/nginx/sbin/nginx${NC}"
    echo ""
    echo -e "${GREEN}验证安装:${NC}"
    echo -e "${YELLOW}/usr/local/nginx/sbin/nginx -v${NC}"
    echo ""
    echo -e "${GREEN}测试配置文件:${NC}"
    echo -e "${YELLOW}/usr/local/nginx/sbin/nginx -t${NC}"
}

# 主函数
main() {
    clear
    echo "=========================================="
    echo "          Nginx 自动安装脚本             "
    echo "=========================================="
    echo ""
    
    # 检查root权限
    check_root
    
    # 执行安装步骤
    install_dependencies
    create_directories
    download_nginx
    extract_nginx
    compile_install_nginx
    show_installation_info
}

# 执行主函数
main "$@"

2.上传前端项目

直接删除nginx默认的页面或者备份

rm  -f /usr/local/nginx/html/*
#上传前端到
/usr/local/nginx/html/

3.nginx配置文件

将原来的配置文件替换成下面的

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
    listen 80;
    server_name localhost;

    # 前端静态资源
    location / {
        root /usr/local/nginx/html;
        index index.html;
        try_files $uri $uri/ /index.html;
    }

    # API反向代理到后端网关
    location /api/ {
        proxy_pass http://localhost:8080/api/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # 跨域配置
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods 'GET, POST, PUT, DELETE, OPTIONS';
        add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization';
        add_header Access-Control-Expose-Headers 'Authorization';
        
        if ($request_method = 'OPTIONS') {
            return 204;
        }
    }

    # 文件上传路径代理
    location /uploads/ {
        proxy_pass http://localhost:8080/uploads/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # Gzip压缩
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 6;
    gzip_types text/plain text/css text/javascript application/json application/javascript application/x-javascript application/xml;
    gzip_vary on;
    }
}

4.启动nginx
#启动nginx后浏览器访问,此时前端部署好了,但是没有数据
http://ip

七、redis部署

1.创建目录上传包
mkdir -p /opt/soft/redis && cd /opt/soft/redis

执行以下脚本vim install-redis.sh

#!/bin/bash

# Redis安装脚本
# 版本:5.0.13
# 安装路径:/usr/local/redis

set -e  # 遇到错误立即退出

# 定义变量
REDIS_VERSION="5.0.13"
REDIS_SOURCE_DIR="/opt/soft/redis"
REDIS_TARBALL="redis-${REDIS_VERSION}.tar.gz"
REDIS_SOURCE_PATH="${REDIS_SOURCE_DIR}/${REDIS_TARBALL}"
REDIS_EXTRACT_DIR="${REDIS_SOURCE_DIR}/redis-${REDIS_VERSION}"
REDIS_INSTALL_DIR="/usr/local/redis"
REDIS_CONF_DIR="${REDIS_INSTALL_DIR}/conf"
REDIS_CONF_FILE="${REDIS_CONF_DIR}/redis.conf"

# 检查源码包是否存在
if [ ! -f "${REDIS_SOURCE_PATH}" ]; then
    echo "错误: Redis源码包 ${REDIS_TARBALL} 不存在于 ${REDIS_SOURCE_DIR}"
    exit 1
fi

# 步骤1: 安装编译依赖
echo "正在安装编译依赖..."
if yum -y install gcc-c++; then
    echo "编译依赖安装成功"
else
    echo "错误: 编译依赖安装失败"
    exit 1
fi

# 步骤2: 解压源码包
echo "正在解压Redis源码包..."
cd "${REDIS_SOURCE_DIR}"
if [ -d "${REDIS_EXTRACT_DIR}" ]; then
    echo "检测到已存在的源码目录,跳过解压"
else
    tar -zxvf "${REDIS_TARBALL}"
    echo "Redis源码解压完成"
fi

# 步骤3: 创建安装目录
echo "正在创建安装目录..."
mkdir -p "${REDIS_INSTALL_DIR}/conf"
echo "安装目录创建完成: ${REDIS_INSTALL_DIR}"

# 步骤4: 编译安装
echo "正在编译安装Redis..."
cd "${REDIS_EXTRACT_DIR}"
make PREFIX="${REDIS_INSTALL_DIR}" install
if [ $? -eq 0 ]; then
    echo "Redis编译安装成功"
else
    echo "错误: Redis编译安装失败"
    exit 1
fi

# 步骤5: 复制配置文件
echo "正在复制配置文件..."
cp "${REDIS_EXTRACT_DIR}/redis.conf" "${REDIS_CONF_FILE}"
echo "配置文件已复制到: ${REDIS_CONF_FILE}"

# 步骤6: 配置Redis
echo "正在配置Redis..."
# 备份原始配置文件
cp "${REDIS_CONF_FILE}" "${REDIS_CONF_FILE}.bak"

# 使用sed修改配置文件
sed -i 's/^bind.*/bind 0.0.0.0/' "${REDIS_CONF_FILE}"  # 允许所有IP连接
sed -i 's/^protected-mode.*/protected-mode yes/' "${REDIS_CONF_FILE}"
sed -i 's/^port.*/port 6379/' "${REDIS_CONF_FILE}"
sed -i 's/^daemonize.*/daemonize yes/' "${REDIS_CONF_FILE}"  # 后台运行
sed -i 's/^pidfile.*/pidfile \/var\/run\/redis_6379.pid/' "${REDIS_CONF_FILE}"
sed -i 's/^dir.*/dir .\//' "${REDIS_CONF_FILE}"  # 数据保存路径
sed -i 's/^appendonly.*/appendonly no/' "${REDIS_CONF_FILE}"

echo "Redis配置完成"

# 步骤7: 显示安装信息
echo -e "\n==================== Redis安装完成 ===================="
echo "安装目录: ${REDIS_INSTALL_DIR}"
echo "配置文件: ${REDIS_CONF_FILE}"
echo "二进制文件位置: ${REDIS_INSTALL_DIR}/bin/"
echo "数据目录: ${REDIS_INSTALL_DIR}"
echo "======================================================"
echo -e "\n启动Redis命令:"
echo "${REDIS_INSTALL_DIR}/bin/redis-server ${REDIS_CONF_FILE}"
echo -e "\n连接Redis命令:"
echo "${REDIS_INSTALL_DIR}/bin/redis-cli -h 127.0.0.1 -p 6379"

八、后端部署

1.创建数据库导入数据

创建blog数据库,把数据导入到数据库中

2.项目上传
mkdir -p /opt/web/{blog-gateway,blog-home,blog-admin}
#切换到对应目录上传对应的包

3.修改配置文件

1.修改gateway配置文件

#vim bootstrap.yml
spring:
  application:
    name: blog-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #修改
        username: nacos #修改
        password: nacos #修改
        namespace: public
        group: DEFAULT_GROUP
        service: ${spring.application.name}
      config:
        server-addr: localhost:8848 #修改
        username: nacos #修改
        password: nacos #修改
        namespace: public
        group: DEFAULT_GROUP
        file-extension: yml 
        shared-configs:
          - data-id: common.yml
            group: DEFAULT_GROUP
            refresh: true
#vim application.yml
server:
  port: 8080

spring:
  application:
    name: blog-gateway
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848  #修改
        username: nacos  #修改
        password: nacos  #修改
        group: DEFAULT_GROUP
        namespace: public
        cluster-name: DEFAULT
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOriginPatterns: "*"
            allowedMethods:
              - GET
              - POST
              - PUT
              - DELETE
              - OPTIONS
            allowedHeaders: "*"
            allowCredentials: true
            maxAge: 3600
      routes:
        # Blog Home 路由配置
        - id: blog-home
          uri: lb://blog-home
          predicates:
            - Path=/api/home/**
          filters:
            - StripPrefix=2  # 去掉 /api/home 两层路径

        # Blog Admin 路由配置
        - id: blog-admin
          uri: lb://blog-admin
          predicates:
            - Path=/api/admin/**
          filters:
            - StripPrefix=2  # 去掉 /api/admin 两层路径

# 日志配置
logging:
  level:
    root: INFO
    org.springframework.cloud.gateway: DEBUG

# Actuator 配置
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

2.修改blog-home

#vim application.yml
server:
  port: 8081

spring:
  application:
    name: blog-home
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai #修改
    username: root #修改
    password: Admin123. #修改
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #修改
        username: nacos #修改
        password: nacos #修改
        group: DEFAULT_GROUP
        namespace: public
        cluster-name: DEFAULT
  redis:
    host: localhost #修改
    port: 6379
    password:
    database: 0

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  type-aliases-package: com.homeservice.entity
  global-config:
    db-config:
      id-type: auto
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

# JWT配置
jwt:
  secret: blog-secret-key-for-jwt-token-generation-must-be-at-least-256-bits
  expiration: 86400000
  header: Authorization

# 日志配置
logging:
  level:
    root: INFO
    com.homeservice: DEBUG
    com.baomidou: DEBUG
    org.springframework.jdbc: DEBUG
    java.sql: DEBUG
    org.springframework.boot.autoconfigure.jdbc: DEBUG
    com.zaxxer.hikari: DEBUG

# Actuator配置
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

3.修改blog-admin

#vim application.yml
server:
  port: 8082

spring:
  application:
    name: blog-admin
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai #修改
    username: root #修改
    password: Admin123. #修改
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #修改
        username: nacos #修改
        password: nacos #修改
        group: DEFAULT_GROUP
        namespace: public
        cluster-name: DEFAULT
  redis:
    host: localhost #修改
    port: 6379
    password:
    database: 0
  servlet:
    multipart:
      enabled: true
      max-file-size: 20MB
      max-request-size: 20MB

mybatis-plus:
  mapper-locations: classpath*:/mapper/**/*.xml
  type-aliases-package: com.adminservice.entity
  global-config:
    db-config:
      id-type: auto
      logic-delete-field: deleted
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

# JWT配置
jwt:
  secret: blog-secret-key-for-jwt-token-generation-must-be-at-least-256-bits
  expiration: 86400000
  header: Authorization

# 文件上传配置
upload:
  path: D:/blog-uploads
  url-prefix: http://localhost:8080/uploads

# 日志配置
logging:
  level:
    root: INFO
    com.adminservice: DEBUG
    com.baomidou: DEBUG
    org.springframework.jdbc: DEBUG
    java.sql: DEBUG
    org.springframework.boot.autoconfigure.jdbc: DEBUG
    com.zaxxer.hikari: DEBUG

# Actuator配置
management:
  endpoints:
    web:
      exposure:
        include: '*'
  endpoint:
    health:
      show-details: always

4.启动项目
java -jar xxx.jar
#或脚本

5.接口验证

1.前台页面blog数据

#get方法
http://ip:8080/api/home/articles