278 lines
7.4 KiB
Bash
278 lines
7.4 KiB
Bash
#!/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
|