Files
file-transfer-go/deploy.sh
MatrixSeven 70ad644a71 第一版本
2025-07-28 16:33:10 +08:00

257 lines
5.8 KiB
Bash
Executable File
Raw 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
# 文件传输系统部署脚本
# 使用方法: ./deploy.sh [环境]
# 环境选项: dev, staging, production
set -e
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# 日志函数
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# 环境变量
ENV=${1:-dev}
APP_NAME="chuan"
DOCKER_IMAGE="${APP_NAME}:${ENV}"
COMPOSE_FILE="docker-compose.yml"
# 检查Docker和Docker Compose
check_dependencies() {
log_info "检查依赖..."
if ! command -v docker &> /dev/null; then
log_error "Docker未安装请先安装Docker"
exit 1
fi
if ! command -v docker-compose &> /dev/null; then
log_error "Docker Compose未安装请先安装Docker Compose"
exit 1
fi
log_info "依赖检查完成"
}
# 构建应用
build_app() {
log_info "构建应用..."
# 清理旧的构建
docker-compose down --remove-orphans
docker system prune -f
# 构建新镜像
docker-compose build --no-cache
log_info "应用构建完成"
}
# 生成SSL证书开发环境
generate_ssl_cert() {
if [ "$ENV" = "dev" ]; then
log_info "生成开发环境SSL证书..."
mkdir -p ssl
if [ ! -f ssl/cert.pem ] || [ ! -f ssl/key.pem ]; then
openssl req -x509 -newkey rsa:4096 -keyout ssl/key.pem -out ssl/cert.pem -days 365 -nodes \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Chuan/OU=Dev/CN=localhost"
log_info "SSL证书生成完成"
else
log_info "SSL证书已存在跳过生成"
fi
fi
}
# 部署应用
deploy_app() {
log_info "部署应用到${ENV}环境..."
# 根据环境选择不同的配置
case $ENV in
"dev")
export COMPOSE_FILE="docker-compose.yml"
;;
"staging")
export COMPOSE_FILE="docker-compose.staging.yml"
;;
"production")
export COMPOSE_FILE="docker-compose.prod.yml"
;;
*)
log_error "未知环境: $ENV"
exit 1
;;
esac
# 启动服务
docker-compose up -d
# 等待服务启动
log_info "等待服务启动..."
sleep 10
# 健康检查
if curl -f http://localhost:8080/health > /dev/null 2>&1; then
log_info "应用健康检查通过"
else
log_warn "应用健康检查失败,请检查日志"
fi
log_info "部署完成"
}
# 显示服务状态
show_status() {
log_info "服务状态:"
docker-compose ps
log_info "服务日志最近20行:"
docker-compose logs --tail=20
}
# 备份数据
backup_data() {
log_info "备份数据..."
BACKUP_DIR="backup/$(date +%Y%m%d_%H%M%S)"
mkdir -p "$BACKUP_DIR"
# 备份上传文件
if [ -d "uploads" ]; then
cp -r uploads "$BACKUP_DIR/"
log_info "上传文件已备份到 $BACKUP_DIR/uploads"
fi
# 备份Redis数据
docker-compose exec -T redis redis-cli BGSAVE
docker cp $(docker-compose ps -q redis):/data/dump.rdb "$BACKUP_DIR/"
log_info "Redis数据已备份到 $BACKUP_DIR/dump.rdb"
log_info "数据备份完成: $BACKUP_DIR"
}
# 恢复数据
restore_data() {
BACKUP_DIR=$2
if [ -z "$BACKUP_DIR" ]; then
log_error "请指定备份目录"
exit 1
fi
if [ ! -d "$BACKUP_DIR" ]; then
log_error "备份目录不存在: $BACKUP_DIR"
exit 1
fi
log_info "$BACKUP_DIR 恢复数据..."
# 恢复上传文件
if [ -d "$BACKUP_DIR/uploads" ]; then
rm -rf uploads/*
cp -r "$BACKUP_DIR/uploads/"* uploads/
log_info "上传文件已恢复"
fi
# 恢复Redis数据
if [ -f "$BACKUP_DIR/dump.rdb" ]; then
docker-compose stop redis
docker cp "$BACKUP_DIR/dump.rdb" $(docker-compose ps -q redis):/data/
docker-compose start redis
log_info "Redis数据已恢复"
fi
log_info "数据恢复完成"
}
# 清理资源
cleanup() {
log_info "清理资源..."
docker-compose down --volumes --remove-orphans
docker system prune -af
docker volume prune -f
log_info "清理完成"
}
# 显示帮助信息
show_help() {
echo "文件传输系统部署脚本"
echo ""
echo "使用方法:"
echo " $0 [命令] [环境/参数]"
echo ""
echo "命令:"
echo " deploy [env] - 部署应用 (环境: dev, staging, production)"
echo " build - 构建应用"
echo " status - 显示服务状态"
echo " backup - 备份数据"
echo " restore [dir] - 恢复数据"
echo " cleanup - 清理资源"
echo " help - 显示帮助信息"
echo ""
echo "示例:"
echo " $0 deploy dev # 部署到开发环境"
echo " $0 deploy production # 部署到生产环境"
echo " $0 backup # 备份数据"
echo " $0 restore backup/20241128_120000 # 恢复数据"
}
# 主函数
main() {
case ${1:-deploy} in
"deploy")
check_dependencies
generate_ssl_cert
build_app
deploy_app
show_status
;;
"build")
check_dependencies
build_app
;;
"status")
show_status
;;
"backup")
backup_data
;;
"restore")
restore_data $@
;;
"cleanup")
cleanup
;;
"help"|"-h"|"--help")
show_help
;;
*)
log_error "未知命令: $1"
show_help
exit 1
;;
esac
}
# 执行主函数
main $@