324 lines
8.8 KiB
Bash
Executable File
324 lines
8.8 KiB
Bash
Executable File
#!/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 "🔍 检查静态资源..."
|
||
|
||
# 检查是否有图片资源
|
||
if [ -d "public/report" ]; then
|
||
echo "✅ 找到报告图片资源"
|
||
else
|
||
echo "⚠️ 未找到 public/report 目录"
|
||
fi
|
||
|
||
# 检查 SEO 相关文件
|
||
if [ -f "public/robots.txt" ]; then
|
||
echo "✅ robots.txt 存在"
|
||
else
|
||
echo "⚠️ 建议添加 robots.txt 文件"
|
||
fi
|
||
|
||
if [ -f "public/sitemap.xml" ]; then
|
||
echo "✅ sitemap.xml 存在"
|
||
else
|
||
echo "⚠️ 建议添加 sitemap.xml 文件"
|
||
fi
|
||
|
||
if [ -f "public/favicon.ico" ]; then
|
||
echo "✅ favicon.ico 存在"
|
||
else
|
||
echo "⚠️ 建议添加 favicon.ico 文件"
|
||
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
|
||
}
|
||
|
||
# 上传 Apache 配置文件
|
||
upload_apache_config() {
|
||
echo "📤 上传 Apache 配置文件..."
|
||
if [ -f "jiao77.cn.conf" ]; then
|
||
# 备份原有配置文件
|
||
echo "📋 备份原有 Apache 配置..."
|
||
ssh ${USERNAME}@${SERVER_IP} "
|
||
if [ -f '/etc/apache2/sites-available/jiao77.cn.conf' ]; then
|
||
sudo cp /etc/apache2/sites-available/jiao77.cn.conf /etc/apache2/sites-available/jiao77.cn.conf.backup.\$(date +%Y%m%d_%H%M%S)
|
||
echo '✅ 原配置文件已备份'
|
||
else
|
||
echo '⚠️ 原配置文件不存在,跳过备份'
|
||
fi
|
||
"
|
||
|
||
# 上传新配置文件
|
||
scp jiao77.cn.conf ${USERNAME}@${SERVER_IP}:/tmp/jiao77.cn.conf
|
||
ssh ${USERNAME}@${SERVER_IP} "
|
||
sudo mv /tmp/jiao77.cn.conf /etc/apache2/sites-available/jiao77.cn.conf
|
||
echo '✅ Apache 配置文件已上传'
|
||
"
|
||
|
||
# 重新加载 Apache 配置
|
||
echo "🔄 重新加载 Apache 配置..."
|
||
ssh ${USERNAME}@${SERVER_IP} "
|
||
if sudo apache2ctl configtest; then
|
||
sudo systemctl reload apache2
|
||
echo '✅ Apache 配置已重新加载'
|
||
else
|
||
echo '❌ Apache 配置测试失败,请检查配置文件'
|
||
exit 1
|
||
fi
|
||
"
|
||
else
|
||
echo "⚠️ jiao77.cn.conf 文件不存在,跳过上传"
|
||
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 "🚀 开始部署文件..."
|
||
|
||
# 先上传 Apache 配置文件
|
||
upload_apache_config
|
||
|
||
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 " • 查看 Apache 状态: systemctl status apache2"
|
||
echo " • 配置文件备份位置: /etc/apache2/sites-available/jiao77.cn.conf.backup.*"
|
||
echo ""
|
||
}
|
||
|
||
# 部署前最终检查
|
||
pre_deploy_check() {
|
||
echo ""
|
||
echo "🔎 部署前最终检查..."
|
||
|
||
# 检查构建产物
|
||
if [ ! -f "dist/index.html" ]; then
|
||
echo "❌ 错误: 构建产物不完整,缺少 index.html"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查报告页面是否存在
|
||
if [ ! -f "dist/reports/index.html" ]; then
|
||
echo "⚠️ 警告: reports 页面可能不存在"
|
||
fi
|
||
|
||
# 检查重要静态资源
|
||
MISSING_FILES=()
|
||
|
||
if [ ! -f "dist/robots.txt" ]; then
|
||
MISSING_FILES+=("robots.txt")
|
||
fi
|
||
|
||
if [ ! -f "dist/sitemap.xml" ]; then
|
||
MISSING_FILES+=("sitemap.xml")
|
||
fi
|
||
|
||
if [ ${#MISSING_FILES[@]} -gt 0 ]; then
|
||
echo "⚠️ 以下 SEO 文件缺失: ${MISSING_FILES[*]}"
|
||
else
|
||
echo "✅ SEO 文件检查通过"
|
||
fi
|
||
|
||
echo "✅ 部署前检查完成"
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
check_requirements
|
||
build_project
|
||
pre_deploy_check
|
||
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" |