docker-redis/init

194 lines
5.8 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
# Redis初始化脚本
# 用于初始化或重新初始化Redis配置环境
# 获取脚本所在目录的绝对路径
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
}
# 创建必要的目录结构
create_directories() {
echo "创建必要的目录结构..."
mkdir -p ./data
mkdir -p ./conf
echo "目录结构创建完成"
}
# 初始化配置文件
initialize_files() {
# 提示用户输入Redis密码步骤1
read -s -p "请输入Redis密码: " redis_password
echo
read -s -p "请再次输入密码确认: " redis_password_confirm
echo
# 验证密码一致性
if [ "$redis_password" != "$redis_password_confirm" ]; then
echo "错误: 两次输入的密码不一致"
return 1
fi
# 验证密码强度(可选)
if [ ${#redis_password} -lt 6 ]; then
echo "警告: 密码长度少于6个字符建议使用强密码"
read -p "是否继续使用此密码?(y/n): " continue
if [ "$continue" != "y" ]; then
return 1
fi
fi
# 创建加密文件步骤2
echo "创建加密的密码文件..."
read -s -p "请为加密文件设置一个密码(主密钥): " encryption_key
echo
read -s -p "请再次输入加密文件密码确认: " encryption_key_confirm
echo
# 验证加密密钥一致性
if [ "$encryption_key" != "$encryption_key_confirm" ]; then
echo "错误: 两次输入的加密文件密码不一致"
return 1
fi
# 加密密码并保存到文件
echo -n "$redis_password" | openssl enc -aes-256-cbc -salt -pbkdf2 -iter 10000 -out redis_password.enc -k "$encryption_key"
# 提示用户输入Redis版本步骤3
default_version="8.2"
read -p "请输入Redis版本 [$default_version]: " redis_version
# 如果用户直接回车,使用默认值
if [ -z "$redis_version" ]; then
redis_version="$default_version"
fi
echo "Redis版本设置为: $redis_version"
# 提示用户输入Redis映射端口号步骤4
default_port="6379"
read -p "请输入Redis映射端口号 [$default_port]: " redis_port
# 如果用户直接回车,使用默认值
if [ -z "$redis_port" ]; then
redis_port="$default_port"
fi
echo "映射端口号设置为: $redis_port"
# 提示用户输入容器名称步骤5
default_container_name="redis"
read -p "请输入Redis容器名称 [$default_container_name]: " redis_container_name
# 如果用户直接回车,使用默认值
if [ -z "$redis_container_name" ]; then
redis_container_name="$default_container_name"
fi
echo "容器名称设置为: $redis_container_name"
# 检查加密是否成功
if [ $? -ne 0 ]; then
echo "错误: 创建加密文件失败"
return 1
fi
# 设置加密文件权限
chmod 600 redis_password.enc
echo "加密文件创建成功权限设置为600"
# 创建.envrc文件
echo "创建.envrc配置文件..."
cat > .envrc << EOF
# Redis配置环境变量
export REDIS_VERSION=$redis_version
export REDIS_PASSWORD=\$(openssl enc -aes-256-cbc -d -pbkdf2 -iter 10000 -in redis_password.enc)
export REDIS_PORT=$redis_port
export REDIS_BIND=0.0.0.0
export REDIS_PROTECTED_MODE=yes
export REDIS_TCP_BACKLOG=511
export REDIS_CONTAINER_NAME=$redis_container_name
EOF
# 设置.envrc文件权限
chmod 600 .envrc
echo ".envrc文件创建成功权限设置为600"
# 自动执行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
}
# 主函数
main() {
echo "Redis环境初始化脚本"
echo "==================================="
# 检查必要的命令
check_commands
# 检查文件是否存在
if [ -f "redis_password.enc" ] && [ -f ".envrc" ]; then
echo ""
echo "检测到redis_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 redis_password.enc "redis_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
echo ""
echo "==================================="
echo "初始化成功!"
echo "使用说明:"
echo "1. 使用 './service start' 启动服务"
echo "2. 使用 './service stop' 停止服务"
echo "3. 使用 './service status' 查看服务状态"
echo "4. 使用 './service restart' 重启服务"
}
# 执行主函数
main