109 lines
3.1 KiB
Bash
109 lines
3.1 KiB
Bash
#!/bin/bash
|
||
|
||
# WebSSH 部署脚本
|
||
set -e
|
||
|
||
echo "🚀 开始部署 WebSSH..."
|
||
|
||
# 检查Docker是否安装
|
||
if ! command -v docker &> /dev/null; then
|
||
echo "❌ Docker 未安装,请先安装 Docker"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查Docker Compose是否安装(新版Docker内置compose)
|
||
if ! docker compose version &> /dev/null; then
|
||
echo "❌ Docker Compose 未安装,请先安装 Docker Compose"
|
||
exit 1
|
||
fi
|
||
|
||
# 清理现有环境
|
||
echo "🧹 清理现有环境..."
|
||
echo " 停止并删除现有容器..."
|
||
docker compose down --remove-orphans --volumes --rmi local 2>/dev/null || true
|
||
|
||
echo " 清理未使用的镜像、容器和网络..."
|
||
docker system prune -f 2>/dev/null || true
|
||
|
||
# 删除旧的镜像
|
||
echo " 删除旧的WebSSH镜像..."
|
||
docker images | grep "webssh" | awk '{print $3}' | xargs -r docker rmi -f 2>/dev/null || true
|
||
|
||
# 删除旧的容器
|
||
echo " 删除旧的WebSSH容器..."
|
||
docker ps -a | grep "webssh" | awk '{print $1}' | xargs -r docker rm -f 2>/dev/null || true
|
||
|
||
# 创建/校验生产环境配置文件
|
||
echo "📝 创建/校验环境配置文件..."
|
||
if [ ! -f .env.production ]; then
|
||
NEW_KEY=$(openssl rand -hex 16)
|
||
cat > .env.production << EOF
|
||
# 数据库配置
|
||
DB_HOST=mysql
|
||
DB_PORT=3306
|
||
DB_USER=webssh_user
|
||
DB_PASSWORD=webssh_password
|
||
DB_NAME=webssh
|
||
|
||
# JWT配置
|
||
JWT_SECRET=$(openssl rand -base64 32)
|
||
|
||
# 服务器配置
|
||
PORT=3000
|
||
NODE_ENV=production
|
||
|
||
# 加密密钥(长度必须为32字符)
|
||
ENCRYPTION_KEY=${NEW_KEY}
|
||
EOF
|
||
echo "✅ 环境配置文件已创建"
|
||
else
|
||
# 读取并校验现有KEY长度
|
||
CURRENT_KEY=$(grep -E '^ENCRYPTION_KEY=' .env.production | cut -d= -f2 | tr -d '\r\n')
|
||
if [ -z "$CURRENT_KEY" ] || [ ${#CURRENT_KEY} -ne 32 ]; then
|
||
echo "⚠️ ENCRYPTION_KEY 无效或缺失,正在重新生成..."
|
||
NEW_KEY=$(openssl rand -hex 16)
|
||
if grep -q '^ENCRYPTION_KEY=' .env.production; then
|
||
awk -v k="$NEW_KEY" 'BEGIN{FS=OFS="="} /^ENCRYPTION_KEY=/ {$2=k} {print}' .env.production > .env.production.tmp && mv .env.production.tmp .env.production
|
||
else
|
||
echo "ENCRYPTION_KEY=$NEW_KEY" >> .env.production
|
||
fi
|
||
echo "✅ ENCRYPTION_KEY 已修复为有效的32字符值"
|
||
else
|
||
echo "✅ ENCRYPTION_KEY 已有效(长度32)"
|
||
fi
|
||
fi
|
||
|
||
# 构建镜像
|
||
echo "🔨 构建 Docker 镜像..."
|
||
docker compose build --no-cache
|
||
|
||
# 启动服务
|
||
echo "🚀 启动服务..."
|
||
docker compose up -d
|
||
|
||
# 等待服务启动
|
||
echo "⏳ 等待服务启动..."
|
||
sleep 30
|
||
|
||
# 检查服务状态
|
||
echo "🔍 检查服务状态..."
|
||
if docker compose ps | grep -q "Up"; then
|
||
echo "✅ 服务启动成功!"
|
||
echo ""
|
||
echo "📊 服务信息:"
|
||
echo " - WebSSH 应用: http://localhost:3000"
|
||
echo " - MySQL 数据库: localhost:3306"
|
||
echo ""
|
||
echo "🔧 常用命令:"
|
||
echo " - 查看日志: docker compose logs -f"
|
||
echo " - 停止服务: docker compose down"
|
||
echo " - 重启服务: docker compose restart"
|
||
echo " - 查看状态: docker compose ps"
|
||
else
|
||
echo "❌ 服务启动失败,请检查日志"
|
||
docker compose logs
|
||
exit 1
|
||
fi
|
||
|
||
echo "🎉 部署完成!"
|