第一版本

This commit is contained in:
MatrixSeven
2025-07-28 16:33:10 +08:00
commit 70ad644a71
26 changed files with 4676 additions and 0 deletions

256
deploy.sh Executable file
View File

@@ -0,0 +1,256 @@
#!/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 $@