#!/bin/bash # 🚀 Jiao77.cn 一键部署脚本 (Nginx 版本) # 自动构建并部署 Astro 网站到 10.126.126.31 服务器 # # 用法: # ./deploy-nginx.sh # 交互模式(需确认) # ./deploy-nginx.sh --skip # 跳过确认直接部署 # ./deploy-nginx.sh --build-only # 仅构建 # ./deploy-nginx.sh --config-only # 仅上传配置 set -e # 服务器配置 SERVER_IP="10.126.126.31" USERNAME="root" PASSWORD="20160406-Jts" WEB_ROOT="/var/www/jiao77.cn" # 解析参数 SKIP_CONFIRM=false BUILD_ONLY=false CONFIG_ONLY=false while [[ $# -gt 0 ]]; do case $1 in --skip) SKIP_CONFIRM=true shift ;; --build-only) BUILD_ONLY=true shift ;; --config-only) CONFIG_ONLY=true shift ;; *) echo "未知参数: $1" exit 1 ;; esac done echo "🌟 ==================================" echo "🌟 Jiao77.cn 网站部署工具 (Nginx)" echo "🌟 ==================================" echo "" echo "📋 部署信息:" echo " 服务器: ${SERVER_IP}" echo " 用户名: ${USERNAME}" echo " 网站目录: ${WEB_ROOT}" echo "" # 检查是否安装了 sshpass check_sshpass() { if ! command -v sshpass &> /dev/null; then echo "⚠️ sshpass 未安装,正在安装..." if command -v apt-get &> /dev/null; then sudo apt-get update && sudo apt-get install -y sshpass elif command -v yum &> /dev/null; then sudo yum install -y sshpass else echo "❌ 无法自动安装 sshpass,请手动安装后重试" exit 1 fi fi echo "✅ sshpass 已就绪" } # 构建项目 build_project() { echo "" echo "📦 构建生产版本..." if [ ! -f "package.json" ]; then echo "❌ 错误: 当前目录不是 Astro 项目根目录" exit 1 fi # 清理之前的构建 if [ -d "dist" ]; then rm -rf dist fi # 构建项目 npm run build if [ ! -d "dist" ]; then echo "❌ 错误: 构建失败,dist 目录不存在" exit 1 fi echo "✅ 构建完成" } # 部署到服务器 deploy_to_server() { echo "" echo "🚀 开始部署到服务器..." # 检查 SSH 连接 echo "🔍 测试 SSH 连接..." if sshpass -p "${PASSWORD}" ssh -o StrictHostKeyChecking=no ${USERNAME}@${SERVER_IP} "echo 'SSH 连接成功'" 2>/dev/null; then echo "✅ SSH 连接成功" else echo "❌ SSH 连接失败" exit 1 fi # 创建网站目录 echo "📁 创建网站目录..." sshpass -p "${PASSWORD}" ssh -o StrictHostKeyChecking=no ${USERNAME}@${SERVER_IP} " sudo mkdir -p ${WEB_ROOT} sudo chown -R ${USERNAME}:${USERNAME} ${WEB_ROOT} echo '✅ 目录创建完成' " # 上传文件 echo "📡 上传网站文件..." if command -v rsync &> /dev/null; then sshpass -p "${PASSWORD}" rsync -avz --delete --progress \ -e "ssh -o StrictHostKeyChecking=no" \ dist/ ${USERNAME}@${SERVER_IP}:${WEB_ROOT}/ else # 使用 scp 上传 cd dist tar -czf ../deploy-temp.tar.gz * cd .. sshpass -p "${PASSWORD}" scp -o StrictHostKeyChecking=no deploy-temp.tar.gz ${USERNAME}@${SERVER_IP}:/tmp/ sshpass -p "${PASSWORD}" ssh -o StrictHostKeyChecking=no ${USERNAME}@${SERVER_IP} " cd ${WEB_ROOT} && tar -xzf /tmp/deploy-temp.tar.gz && rm /tmp/deploy-temp.tar.gz " rm -f deploy-temp.tar.gz fi echo "✅ 文件上传完成" } # 配置 Nginx config_nginx() { echo "" echo "⚙️ 配置 Nginx..." # 检查配置文件是否存在 if [ ! -f "jiao77.cn.nginx.conf" ]; then echo "❌ 错误: jiao77.cn.nginx.conf 文件不存在" exit 1 fi # 上传 nginx 配置文件 sshpass -p "${PASSWORD}" scp -o StrictHostKeyChecking=no jiao77.cn.nginx.conf ${USERNAME}@${SERVER_IP}:/tmp/jiao77.cn.conf # 在服务器上配置 nginx sshpass -p "${PASSWORD}" ssh -o StrictHostKeyChecking=no ${USERNAME}@${SERVER_IP} ' # 备份原有配置 if [ -f /etc/nginx/sites-available/jiao77.cn.conf ]; then cp /etc/nginx/sites-available/jiao77.cn.conf /etc/nginx/sites-available/jiao77.cn.conf.backup.$(date +%Y%m%d_%H%M%S) echo "✅ 原配置已备份" fi # 移动新配置文件 mv /tmp/jiao77.cn.conf /etc/nginx/sites-available/jiao77.cn.conf # 创建软链接 if [ ! -L /etc/nginx/sites-enabled/jiao77.cn.conf ]; then ln -s /etc/nginx/sites-available/jiao77.cn.conf /etc/nginx/sites-enabled/ fi # 移除默认配置(可选) if [ -L /etc/nginx/sites-enabled/default ]; then rm /etc/nginx/sites-enabled/default fi # 测试 nginx 配置 if nginx -t; then echo "✅ Nginx 配置测试通过" else echo "❌ Nginx 配置测试失败" exit 1 fi # 重新加载 nginx systemctl reload nginx echo "✅ Nginx 已重新加载" # 设置文件权限 chown -R www-data:www-data /var/www/jiao77.cn find /var/www/jiao77.cn -type d -exec chmod 755 {} \; find /var/www/jiao77.cn -type f -exec chmod 644 {} \; echo "✅ 文件权限已设置" ' echo "✅ Nginx 配置完成" } # 测试部署 test_deployment() { echo "" echo "🧪 测试部署结果..." # 测试 HTTP HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://${SERVER_IP}/ 2>/dev/null || echo "000") if [ "$HTTP_CODE" = "200" ]; then echo "✅ 网站访问正常 (HTTP $HTTP_CODE)" else echo "⚠️ 网站可能存在问题 (HTTP $HTTP_CODE)" fi # 测试 HTTPS HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" https://${SERVER_IP}/ 2>/dev/null || echo "000") echo "🌐 HTTPS 测试: HTTP $HTTP_CODE" } # 显示结果 show_results() { echo "" echo "🎉 ==================================" echo "🎉 部署完成!" echo "🎉 ==================================" echo "" echo "🌐 网站地址:" echo " https://${SERVER_IP}" echo " https://jiao77.cn" echo "" echo "📋 服务器管理命令:" echo " 查看 nginx 状态: systemctl status nginx" echo " 重启 nginx: systemctl restart nginx" echo " 查看日志: tail -f /var/log/nginx/jiao77-error.log" echo " 测试配置: nginx -t" echo "" echo "🔧 后续步骤:" echo " 1. 访问网站确认页面正常显示" echo " 2. 测试各子域名是否正常" } # 确认部署 confirm_deploy() { echo "" read -p "❓ 确认开始部署到 ${SERVER_IP}? (y/N): " CONFIRM if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then echo "❌ 部署已取消" exit 0 fi } # 主函数 main() { check_sshpass if [ "$BUILD_ONLY" = true ]; then build_project exit 0 fi if [ "$CONFIG_ONLY" = true ]; then config_nginx exit 0 fi if [ "$SKIP_CONFIRM" = false ]; then confirm_deploy fi build_project deploy_to_server config_nginx test_deployment show_results } # 错误处理 trap 'echo "❌ 部署过程中出现错误,请检查输出信息"; exit 1' ERR # 执行部署 main