mirror of
https://github.com/MatrixSeven/file-transfer-go.git
synced 2026-02-04 03:25:03 +08:00
257 lines
5.8 KiB
Bash
Executable File
257 lines
5.8 KiB
Bash
Executable File
#!/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 $@
|