rwadurian/backend/infrastructure/minio/deploy.sh

368 lines
9.3 KiB
Bash

#!/bin/bash
# =============================================================================
# MinIO Object Storage - 部署脚本
# =============================================================================
#
# 用法:
# ./deploy.sh up 启动 MinIO
# ./deploy.sh down 停止 MinIO
# ./deploy.sh restart 重启 MinIO
# ./deploy.sh logs 查看日志
# ./deploy.sh status 查看状态
# ./deploy.sh health 健康检查
# ./deploy.sh create-bucket <name> 创建存储桶
# ./deploy.sh list-buckets 列出所有存储桶
# ./deploy.sh info 查看服务器信息
# ./deploy.sh backup 备份配置
#
# 示例:
# ./deploy.sh up # 启动 MinIO
# ./deploy.sh create-bucket uploads # 创建 uploads 存储桶
# ./deploy.sh logs -f # 实时查看日志
#
# =============================================================================
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# 配置
COMPOSE_FILE="docker-compose.yml"
ENV_FILE=".env"
ENV_EXAMPLE=".env.example"
# =============================================================================
# 工具函数
# =============================================================================
log_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_step() {
echo -e "${CYAN}[STEP]${NC} $1"
}
# 检查 .env 文件
check_env() {
if [ ! -f "$ENV_FILE" ]; then
if [ -f "$ENV_EXAMPLE" ]; then
log_info "创建 .env 文件..."
cp "$ENV_EXAMPLE" "$ENV_FILE"
log_warning "请检查 .env 文件并配置必要的环境变量"
log_warning "特别注意: MINIO_ROOT_PASSWORD 必须修改为安全密码"
else
log_error ".env.example 文件不存在"
exit 1
fi
fi
# 加载环境变量
if [ -f "$ENV_FILE" ]; then
export $(grep -v '^#' "$ENV_FILE" | xargs)
fi
}
# 检查数据目录
check_data_dir() {
local data_path="${MINIO_DATA_PATH:-/data/minio}"
if [ ! -d "$data_path" ]; then
log_info "创建数据目录: $data_path"
sudo mkdir -p "$data_path"
sudo chown -R 1000:1000 "$data_path"
log_success "数据目录已创建"
fi
}
# 获取 MinIO 连接信息
get_minio_endpoint() {
echo "http://localhost:${MINIO_API_PORT:-9000}"
}
# 配置 mc 客户端
setup_mc() {
local endpoint=$(get_minio_endpoint)
local user="${MINIO_ROOT_USER:-admin}"
local password="${MINIO_ROOT_PASSWORD:-minio_secret_password}"
if command -v mc &> /dev/null; then
mc alias set rwa "$endpoint" "$user" "$password" --api S3v4 > /dev/null 2>&1
return 0
else
# 使用 docker 中的 mc
docker exec rwa-minio mc alias set local http://localhost:9000 "$user" "$password" --api S3v4 > /dev/null 2>&1
return 0
fi
}
# =============================================================================
# 命令实现
# =============================================================================
cmd_up() {
check_env
check_data_dir
log_info "启动 MinIO 对象存储..."
docker compose -f "$COMPOSE_FILE" up -d
log_info "等待服务启动..."
sleep 5
log_success "MinIO 已启动!"
echo ""
cmd_status
}
cmd_down() {
log_info "停止 MinIO..."
docker compose -f "$COMPOSE_FILE" down
log_success "MinIO 已停止"
}
cmd_restart() {
log_info "重启 MinIO..."
docker compose -f "$COMPOSE_FILE" restart minio
log_success "MinIO 已重启"
}
cmd_logs() {
docker compose -f "$COMPOSE_FILE" logs "$@" minio
}
cmd_status() {
echo ""
echo "=========================================="
echo " MinIO Object Storage 状态"
echo "=========================================="
echo ""
docker compose -f "$COMPOSE_FILE" ps --format "table {{.Name}}\t{{.Status}}\t{{.Ports}}"
echo ""
echo "=========================================="
echo " 访问地址"
echo "=========================================="
echo ""
echo " S3 API: http://localhost:${MINIO_API_PORT:-9000}"
echo " Console: http://localhost:${MINIO_CONSOLE_PORT:-9001}"
echo ""
echo " 默认凭证:"
echo " 用户名: ${MINIO_ROOT_USER:-admin}"
echo " 密码: (见 .env 文件)"
echo ""
}
cmd_health() {
echo ""
echo "=========================================="
echo " MinIO 健康检查"
echo "=========================================="
echo ""
local endpoint=$(get_minio_endpoint)
# 检查 API 端点
if curl -s "${endpoint}/minio/health/live" > /dev/null 2>&1; then
echo -e " API Health: ${GREEN}✓ Live${NC}"
else
echo -e " API Health: ${RED}✗ Not responding${NC}"
fi
# 检查就绪状态
if curl -s "${endpoint}/minio/health/ready" > /dev/null 2>&1; then
echo -e " Ready Status: ${GREEN}✓ Ready${NC}"
else
echo -e " Ready Status: ${RED}✗ Not ready${NC}"
fi
# 检查集群状态
if curl -s "${endpoint}/minio/health/cluster" > /dev/null 2>&1; then
echo -e " Cluster: ${GREEN}✓ Healthy${NC}"
else
echo -e " Cluster: ${YELLOW}○ Standalone mode${NC}"
fi
echo ""
}
cmd_create_bucket() {
local bucket_name="$1"
if [ -z "$bucket_name" ]; then
log_error "请提供存储桶名称"
echo "用法: $0 create-bucket <bucket-name>"
exit 1
fi
check_env
setup_mc
log_info "创建存储桶: $bucket_name"
if command -v mc &> /dev/null; then
mc mb --ignore-existing "rwa/$bucket_name"
else
docker exec rwa-minio mc mb --ignore-existing "local/$bucket_name"
fi
log_success "存储桶 '$bucket_name' 已创建"
}
cmd_list_buckets() {
check_env
setup_mc
echo ""
echo "=========================================="
echo " MinIO 存储桶列表"
echo "=========================================="
echo ""
if command -v mc &> /dev/null; then
mc ls rwa
else
docker exec rwa-minio mc ls local
fi
echo ""
}
cmd_info() {
check_env
setup_mc
echo ""
echo "=========================================="
echo " MinIO 服务器信息"
echo "=========================================="
echo ""
if command -v mc &> /dev/null; then
mc admin info rwa
else
docker exec rwa-minio mc admin info local
fi
echo ""
}
cmd_backup() {
check_env
local backup_dir="${SCRIPT_DIR}/backups"
local timestamp=$(date +"%Y%m%d_%H%M%S")
local backup_file="${backup_dir}/minio_config_${timestamp}.tar.gz"
mkdir -p "$backup_dir"
log_info "备份 MinIO 配置..."
# 备份 .env 和 docker-compose 配置
tar -czf "$backup_file" \
-C "$SCRIPT_DIR" \
.env docker-compose.yml 2>/dev/null || true
log_success "配置已备份到: $backup_file"
}
cmd_help() {
echo ""
echo "MinIO Object Storage 部署工具"
echo ""
echo "用法: $0 <命令> [参数...]"
echo ""
echo "命令:"
echo " up 启动 MinIO"
echo " down 停止 MinIO"
echo " restart 重启 MinIO"
echo " logs [options] 查看日志 (支持 -f 参数)"
echo " status 查看运行状态"
echo " health 健康检查"
echo " create-bucket 创建存储桶"
echo " list-buckets 列出所有存储桶"
echo " info 查看服务器信息"
echo " backup 备份配置"
echo " help 显示帮助"
echo ""
echo "示例:"
echo " $0 up # 启动 MinIO"
echo " $0 logs -f # 实时查看日志"
echo " $0 create-bucket uploads # 创建 uploads 存储桶"
echo " $0 list-buckets # 列出所有存储桶"
echo ""
echo "环境变量 (可在 .env 中配置):"
echo " MINIO_ROOT_USER 管理员用户名 (默认: admin)"
echo " MINIO_ROOT_PASSWORD 管理员密码"
echo " MINIO_API_PORT S3 API 端口 (默认: 9000)"
echo " MINIO_CONSOLE_PORT Web 控制台端口 (默认: 9001)"
echo " MINIO_DATA_PATH 数据存储路径 (默认: /data/minio)"
echo ""
}
# =============================================================================
# 主入口
# =============================================================================
case "${1:-help}" in
up)
cmd_up
;;
down)
cmd_down
;;
restart)
cmd_restart
;;
logs)
shift
cmd_logs "$@"
;;
status)
cmd_status
;;
health)
cmd_health
;;
create-bucket)
shift
cmd_create_bucket "$@"
;;
list-buckets)
cmd_list_buckets
;;
info)
cmd_info
;;
backup)
cmd_backup
;;
help|--help|-h)
cmd_help
;;
*)
log_error "未知命令: $1"
cmd_help
exit 1
;;
esac