260 lines
8.3 KiB
Bash
Executable File
260 lines
8.3 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# SeaweedFS初始化脚本
|
||
# 用于初始化或重新初始化SeaweedFS配置环境
|
||
|
||
# 获取脚本所在目录的绝对路径
|
||
SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd)
|
||
|
||
# 切换工作目录到脚本所在目录
|
||
cd $SCRIPT_DIR
|
||
|
||
# 检查必要的命令
|
||
check_commands() {
|
||
if ! command -v openssl &> /dev/null; then
|
||
echo "错误: 未找到openssl命令,请先安装"
|
||
exit 1
|
||
fi
|
||
|
||
if ! command -v direnv &> /dev/null; then
|
||
echo "警告: 未找到direnv命令,建议安装以获得最佳体验"
|
||
fi
|
||
|
||
if ! command -v docker-compose &> /dev/null; then
|
||
echo "错误: 未找到docker-compose命令,请先安装"
|
||
exit 1
|
||
fi
|
||
}
|
||
|
||
# 创建必要的目录结构
|
||
create_directories() {
|
||
echo "创建必要的目录结构..."
|
||
mkdir -p ./master_data
|
||
mkdir -p ./volume_data
|
||
mkdir -p ./filer_data
|
||
echo "目录结构创建完成"
|
||
}
|
||
|
||
# 检查docker-compose.yml文件是否存在
|
||
check_docker_compose() {
|
||
if [ ! -f "docker-compose.yml" ]; then
|
||
echo "警告: 未找到docker-compose.yml文件,请确保该文件已存在"
|
||
echo "提示: 请手动创建或复制正确的docker-compose.yml文件"
|
||
fi
|
||
}
|
||
|
||
# 初始化配置文件
|
||
initialize_files() {
|
||
# 提示用户输入S3访问密钥(步骤1)
|
||
default_access_key="seaweedfs"
|
||
read -p "请输入S3_ACCESS_KEY [$default_access_key]: " s3_access_key
|
||
|
||
# 如果用户直接回车,使用默认值
|
||
if [ -z "$s3_access_key" ]; then
|
||
s3_access_key="$default_access_key"
|
||
fi
|
||
echo "S3_ACCESS_KEY设置为: $s3_access_key"
|
||
|
||
# 提示用户输入S3密钥(步骤2)
|
||
read -s -p "请输入S3_SECRET_KEY: " s3_secret_key
|
||
echo
|
||
read -s -p "请再次输入密码确认: " s3_secret_key_confirm
|
||
echo
|
||
|
||
# 验证密码一致性
|
||
if [ "$s3_secret_key" != "$s3_secret_key_confirm" ]; then
|
||
echo "错误: 两次输入的密码不一致"
|
||
return 1
|
||
fi
|
||
|
||
# 验证密码强度(可选)
|
||
if [ ${#s3_secret_key} -lt 8 ]; then
|
||
echo "警告: 密码长度少于8个字符,建议使用强密码"
|
||
read -p "是否继续使用此密码?(y/n): " continue
|
||
if [ "$continue" != "y" ]; then
|
||
return 1
|
||
fi
|
||
fi
|
||
|
||
# 创建加密文件(步骤3)
|
||
echo "创建加密的密码文件..."
|
||
echo "请为加密文件设置一个密码(主密钥):"
|
||
echo -n "$s3_secret_key" | openssl enc -aes-256-cbc -salt -pbkdf2 -iter 10000 -out seaweedfs_password.enc
|
||
|
||
# 检查加密是否成功
|
||
if [ $? -ne 0 ]; then
|
||
echo "错误: 创建加密文件失败"
|
||
return 1
|
||
fi
|
||
|
||
# 设置加密文件权限
|
||
chmod 600 seaweedfs_password.enc
|
||
echo "加密文件创建成功,权限设置为600"
|
||
|
||
# 提示用户输入SeaweedFS镜像版本(步骤4)
|
||
default_version="4.00"
|
||
read -p "请输入SeaweedFS镜像版本 [$default_version]: " seaweedfs_version
|
||
|
||
# 如果用户直接回车,使用默认值
|
||
if [ -z "$seaweedfs_version" ]; then
|
||
seaweedfs_version="$default_version"
|
||
fi
|
||
echo "SeaweedFS镜像版本设置为: $seaweedfs_version"
|
||
|
||
# 提示用户输入S3服务映射端口号(步骤5)
|
||
default_port="8333"
|
||
read -p "请输入S3服务映射端口号 [$default_port]: " s3_port
|
||
|
||
# 如果用户直接回车,使用默认值
|
||
if [ -z "$s3_port" ]; then
|
||
s3_port="$default_port"
|
||
fi
|
||
echo "S3服务映射端口号设置为: $s3_port"
|
||
|
||
# 提示用户输入各个容器的名称(步骤6)
|
||
default_master_name="seaweedfs-master"
|
||
read -p "请输入master容器名称 [$default_master_name]: " master_container_name
|
||
|
||
# 如果用户直接回车,使用默认值
|
||
if [ -z "$master_container_name" ]; then
|
||
master_container_name="$default_master_name"
|
||
fi
|
||
echo "master容器名称设置为: $master_container_name"
|
||
|
||
default_volume_name="seaweedfs-volume"
|
||
read -p "请输入volume容器名称 [$default_volume_name]: " volume_container_name
|
||
|
||
# 如果用户直接回车,使用默认值
|
||
if [ -z "$volume_container_name" ]; then
|
||
volume_container_name="$default_volume_name"
|
||
fi
|
||
echo "volume容器名称设置为: $volume_container_name"
|
||
|
||
default_filer_name="seaweedfs-filer"
|
||
read -p "请输入filer容器名称 [$default_filer_name]: " filer_container_name
|
||
|
||
# 如果用户直接回车,使用默认值
|
||
if [ -z "$filer_container_name" ]; then
|
||
filer_container_name="$default_filer_name"
|
||
fi
|
||
echo "filer容器名称设置为: $filer_container_name"
|
||
|
||
default_s3_name="seaweedfs-s3"
|
||
read -p "请输入s3容器名称 [$default_s3_name]: " s3_container_name
|
||
|
||
# 如果用户直接回车,使用默认值
|
||
if [ -z "$s3_container_name" ]; then
|
||
s3_container_name="$default_s3_name"
|
||
fi
|
||
echo "s3容器名称设置为: $s3_container_name"
|
||
|
||
# 创建.envrc文件
|
||
echo "创建.envrc配置文件..."
|
||
cat > .envrc << EOF
|
||
# SeaweedFS配置环境变量
|
||
export SEAWEEDFS_VERSION=$seaweedfs_version
|
||
export S3_PORT=$s3_port
|
||
export S3_ACCESS_KEY=$s3_access_key
|
||
export S3_SECRET_KEY=\$(openssl enc -aes-256-cbc -d -pbkdf2 -iter 10000 -in seaweedfs_password.enc)
|
||
export MASTER_CONTAINER_NAME=$master_container_name
|
||
export VOLUME_CONTAINER_NAME=$volume_container_name
|
||
export FILER_CONTAINER_NAME=$filer_container_name
|
||
export S3_CONTAINER_NAME=$s3_container_name
|
||
EOF
|
||
|
||
# 设置.envrc文件权限
|
||
chmod 600 .envrc
|
||
echo ".envrc文件创建成功,权限设置为600"
|
||
|
||
# 检查docker-compose.yml文件是否存在
|
||
check_docker_compose
|
||
|
||
# 自动执行direnv allow并提供状态反馈
|
||
if command -v direnv &> /dev/null; then
|
||
echo ""
|
||
echo "📝 初始化完成!自动配置环境变量..."
|
||
echo "正在执行 direnv allow..."
|
||
if direnv allow > /dev/null 2>&1; then
|
||
echo "✅ direnv allow 执行成功!环境变量已启用"
|
||
else
|
||
echo "❌ direnv allow 执行失败,请手动运行 'direnv allow' 来启用环境变量"
|
||
fi
|
||
else
|
||
echo ""
|
||
echo "初始化完成!建议安装direnv以获得更好的使用体验:"
|
||
echo " macOS: brew install direnv"
|
||
echo " Linux: apt-get install direnv 或 yum install direnv"
|
||
fi
|
||
|
||
return 0
|
||
}
|
||
|
||
# 清理旧的容器(可选)
|
||
clean_old_containers() {
|
||
# 检查是否有旧的容器运行
|
||
echo "检查并清理可能的旧容器..."
|
||
local containers=("seaweedfs-master" "seaweedfs-volume" "seaweedfs-filer" "seaweedfs-s3" "oss-master-1" "oss-volume-1" "oss-filer-1" "oss-s3-1")
|
||
|
||
for container in "${containers[@]}"; do
|
||
if docker ps -a | grep -q "$container"; then
|
||
echo "停止并移除容器: $container"
|
||
docker stop "$container" > /dev/null 2>&1 || true
|
||
docker rm "$container" > /dev/null 2>&1 || true
|
||
fi
|
||
done
|
||
|
||
# 不清理网络配置,保持与外部网络的兼容性
|
||
}
|
||
|
||
# 主函数
|
||
main() {
|
||
echo "SeaweedFS环境初始化脚本"
|
||
echo "==================================="
|
||
|
||
# 检查必要的命令
|
||
check_commands
|
||
|
||
# 检查文件是否存在
|
||
if [ -f "seaweedfs_password.enc" ] && [ -f ".envrc" ]; then
|
||
echo ""
|
||
echo "检测到seaweedfs_password.enc和.envrc文件已存在"
|
||
read -p "是否重新初始化?这将覆盖现有配置!(y/n): " reinitialize
|
||
|
||
if [ "$reinitialize" != "y" ]; then
|
||
echo "初始化取消"
|
||
exit 0
|
||
fi
|
||
|
||
# 备份现有文件
|
||
backup_suffix="_bak_$(date +%Y%m%d%H%M%S)"
|
||
echo "备份现有文件..."
|
||
cp seaweedfs_password.enc "seaweedfs_password.enc$backup_suffix" 2>/dev/null
|
||
cp .envrc ".envrc$backup_suffix" 2>/dev/null
|
||
echo "备份完成"
|
||
fi
|
||
|
||
# 创建目录结构
|
||
create_directories
|
||
|
||
# 初始化配置文件
|
||
while ! initialize_files; do
|
||
echo "请重新输入配置信息..."
|
||
done
|
||
|
||
# 清理旧的容器
|
||
clean_old_containers
|
||
|
||
echo ""
|
||
echo "==================================="
|
||
echo "初始化成功!"
|
||
echo "使用说明:"
|
||
echo "1. 使用 './service start' 启动服务"
|
||
echo "2. 使用 './service stop' 停止服务"
|
||
echo "3. 使用 './service status' 查看服务状态"
|
||
echo "4. 使用 './service restart' 重启服务"
|
||
echo ""
|
||
echo "S3服务访问地址将为: http://localhost:${s3_port:-8333}"
|
||
}
|
||
|
||
# 执行主函数
|
||
main |