Files
astro-jiao77.cn/deploy-nginx.sh
2026-01-26 18:53:21 +08:00

278 lines
7.4 KiB
Bash
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 一键部署脚本 (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