docker-seaweedfs/init

260 lines
8.3 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
# 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