#!/bin/bash # 🚀 Jiao77.cn 一键部署脚本 # 自动构建并部署 Astro 网站到生产服务器 set -e # 遇到错误立即停止 SERVER_IP="110.42.70.70" DEFAULT_USER="root" DEFAULT_WEB_ROOT="/var/www/jiao77.cn" echo "🌟 ==================================" echo "🌟 Jiao77.cn 网站部署工具" echo "🌟 ==================================" echo "" # 检查必要的工具 check_requirements() { echo "🔍 检查部署环境..." if ! command -v npm &> /dev/null; then echo "❌ 错误: npm 未安装" exit 1 fi if ! command -v rsync &> /dev/null; then echo "⚠️ 警告: rsync 未安装,将使用 scp" USE_RSYNC=false else USE_RSYNC=true fi echo "✅ 环境检查完成" } # 构建项目 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 "✅ 构建完成" } # 获取用户输入 get_deploy_config() { echo "" echo "⚙️ 部署配置" read -p "📝 服务器用户名 (默认: ${DEFAULT_USER}): " USERNAME USERNAME=${USERNAME:-$DEFAULT_USER} read -p "📁 网站根目录 (默认: ${DEFAULT_WEB_ROOT}): " WEB_ROOT WEB_ROOT=${WEB_ROOT:-$DEFAULT_WEB_ROOT} echo "" echo "📋 部署信息确认:" echo " 服务器: ${SERVER_IP}" echo " 用户名: ${USERNAME}" echo " 目录: ${WEB_ROOT}" echo "" read -p "❓ 确认部署? (y/N): " CONFIRM if [[ ! $CONFIRM =~ ^[Yy]$ ]]; then echo "❌ 部署已取消" exit 0 fi } # 上传 .htaccess 文件 upload_htaccess() { echo "📤 上传 .htaccess 文件..." if [ -f ".htaccess" ]; then scp .htaccess ${USERNAME}@${SERVER_IP}:${WEB_ROOT}/.htaccess echo "✅ .htaccess 文件已上传" else echo "⚠️ .htaccess 文件不存在,跳过上传" fi } # 部署文件 deploy_files() { echo "" echo "🚀 开始部署文件..." if [ "$USE_RSYNC" = true ]; then echo "📡 使用 rsync 同步文件..." rsync -avz --delete --progress \ --exclude='.htaccess' \ dist/ ${USERNAME}@${SERVER_IP}:${WEB_ROOT}/ else echo "📡 使用 scp 上传文件..." # 创建临时压缩包 cd dist tar -czf ../deploy-temp.tar.gz * cd .. # 上传并解压 scp deploy-temp.tar.gz ${USERNAME}@${SERVER_IP}:/tmp/ ssh ${USERNAME}@${SERVER_IP} "cd ${WEB_ROOT} && sudo tar -xzf /tmp/deploy-temp.tar.gz && sudo rm /tmp/deploy-temp.tar.gz" # 清理本地临时文件 rm -f deploy-temp.tar.gz fi # 上传 .htaccess upload_htaccess echo "✅ 文件部署完成" } # 设置文件权限 set_permissions() { echo "" echo "🔐 设置文件权限..." ssh ${USERNAME}@${SERVER_IP} " sudo chown -R www-data:www-data ${WEB_ROOT}/ && sudo find ${WEB_ROOT}/ -type d -exec chmod 755 {} \; && sudo find ${WEB_ROOT}/ -type f -exec chmod 644 {} \; " if [ $? -eq 0 ]; then echo "✅ 权限设置完成" else echo "⚠️ 权限设置失败,可能需要手动调整" fi } # 部署后测试 post_deploy_test() { echo "" echo "🧪 部署后测试..." # 测试网站是否可访问 HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://${SERVER_IP}/ || echo "000") if [ "$HTTP_CODE" = "200" ]; then echo "✅ 网站访问正常 (HTTP $HTTP_CODE)" else echo "⚠️ 网站可能存在问题 (HTTP $HTTP_CODE)" fi # 检测压缩是否启用 GZIP_TEST=$(curl -H "Accept-Encoding: gzip" -s -I http://${SERVER_IP}/ | grep -i "content-encoding: gzip" || echo "") if [ -n "$GZIP_TEST" ]; then echo "✅ Gzip 压缩已启用" else echo "⚠️ Gzip 压缩未启用,建议检查 Apache 配置" fi } # 显示部署结果 show_results() { echo "" echo "🎉 ==================================" echo "🎉 部署完成!" echo "🎉 ==================================" echo "" echo "🌐 网站地址:" echo " 主域名: http://jiao77.cn" echo " IP访问: http://${SERVER_IP}" echo "" echo "📋 建议检查事项:" echo " ✓ 访问网站确认页面正常显示" echo " ✓ 测试导航卡片点击功能" echo " ✓ 检查 /reports 页面" echo " ✓ 验证页眉展开/收缩功能" echo " ✓ 测试移动端响应式设计" echo " ✓ 检查动画效果是否正常" echo "" echo "🔧 如果遇到问题:" echo " • 查看部署日志: tail -f /var/log/apache2/error.log" echo " • 检查文件权限: ls -la ${WEB_ROOT}/" echo " • 验证 Apache 配置: apache2ctl configtest" echo "" } # 主函数 main() { check_requirements build_project get_deploy_config deploy_files set_permissions post_deploy_test show_results } # 错误处理 trap 'echo "❌ 部署过程中出现错误,请检查输出信息"; exit 1' ERR # 执行部署 main echo "🎯 如需 SSL/HTTPS,请参考 DEPLOYMENT.md 中的 SSL 配置章节" echo "📚 完整部署文档: https://github.com/你的仓库/blob/main/DEPLOYMENT.md"