Files
astro-jiao77.cn/deploy-full.sh
2025-11-10 01:50:34 +08:00

324 lines
8.8 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"