diff --git a/data.tar.gz b/data.tar.gz new file mode 100644 index 0000000..1f1fb36 --- /dev/null +++ b/data.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:426094074782cddb169694ab2ffef841a6fb7ec3a42ab9e508fd021a197cc4dd +size 23118 diff --git a/init-debian.sh b/init-debian.sh new file mode 100644 index 0000000..0b5f6f2 --- /dev/null +++ b/init-debian.sh @@ -0,0 +1,330 @@ +#!/bin/bash + +set -e + +# 颜色定义 +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# 日志函数 +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" +} + +# 检查是否为 root +if [[ $EUID -ne 0 ]]; then + log_error "此脚本必须以 root 权限运行" + exit 1 +fi + +# 提示输入 kairee 用户密码 +echo "========================================" +echo "Debian 系统初始化脚本" +echo "========================================" +echo +echo "请输入要为用户 'kairee' 设置的密码:" +read -s -p "密码: " USER_PASSWORD +echo +read -s -p "确认密码: " USER_PASSWORD_CONFIRM +echo + +# 验证密码 +if [ -z "$USER_PASSWORD" ]; then + log_error "密码不能为空" + exit 1 +fi + +if [ "$USER_PASSWORD" != "$USER_PASSWORD_CONFIRM" ]; then + log_error "两次输入的密码不匹配" + exit 1 +fi + +log_success "密码验证通过" +echo + +# 1. 创建用户 kairee +log_info "创建用户 'kairee'..." +if id "kairee" &>/dev/null; then + log_warning "用户 'kairee' 已存在,跳过创建" +else + # 创建 /data/home 目录 + mkdir -p /data/home + + # 创建用户,指定家目录为 /data/home/kairee + useradd -m -d /data/home/kairee -s /bin/bash -u 1000 -U kairee + echo "kairee:$USER_PASSWORD" | chpasswd + log_success "用户 'kairee' 创建成功 (uid=1000, 家目录: /data/home/kairee)" +fi + +# 2. 下载并解压数据包 +log_info "从远程下载 data 压缩包..." +# 这里需要指定实际的下载 URL +# TODO: 请替换为实际的下载地址 +DATA_URL="https://example.com/path/to/data.tar.gz" + +# 检查是否有 URL 参数 +if [ -n "$1" ]; then + DATA_URL="$1" + log_info "使用提供的 URL: $DATA_URL" +fi + +if [ "$DATA_URL" = "https://example.com/path/to/data.tar.gz" ]; then + log_warning "未设置 DATA_URL,跳过下载步骤" + log_warning "你可以手动将 data 目录复制到 /data" +else + # 创建临时文件 + TEMP_FILE=$(mktemp) + + # 下载 + log_info "正在下载..." + if ! curl -L -o "$TEMP_FILE" "$DATA_URL"; then + log_error "下载失败" + rm -f "$TEMP_FILE" + exit 1 + fi + + # 解压到 /data + log_info "解压到 /data..." + mkdir -p /data + if ! tar -xzf "$TEMP_FILE" -C /; then + log_error "解压失败" + rm -f "$TEMP_FILE" + exit 1 + fi + + # 清理 + rm -f "$TEMP_FILE" + log_success "数据包下载并解压完成" +fi + +# 3. 安装软件包 +log_info "更新 apt 并安装软件包..." +apt-get update +apt-get install -y sudo vim rsync curl sshpass +log_success "基础软件包安装完成" + +# 4. 安装 Docker +log_info "安装 Docker CE..." +if command -v docker &> /dev/null; then + log_warning "Docker 已安装,跳过安装步骤" +else + curl -Lo- https://get.docker.com | bash + log_success "Docker CE 安装完成" +fi + +# 5. 配置 apt 源 +log_info "配置 apt 源..." +if [ -d /data/etc/apt/sources.list.d ]; then + # 备份旧的源 + if [ -f /etc/apt/sources.list ]; then + mv /etc/apt/sources.list /etc/apt/sources.list.bak + log_info "备份 /etc/apt/sources.list -> /etc/apt/sources.list.bak" + fi + + if [ -f /etc/apt/sources.list.d/docker.list ]; then + mv /etc/apt/sources.list.d/docker.list /etc/apt/sources.list.d/docker.list.bak + log_info "备份 /etc/apt/sources.list.d/docker.list -> docker.list.bak" + fi + + # 创建目录 + mkdir -p /etc/apt/sources.list.d + + # 创建软链接 + for src_file in /data/etc/apt/sources.list.d/*; do + if [ -f "$src_file" ]; then + filename=$(basename "$src_file") + target_file="/etc/apt/sources.list.d/$filename" + + if [ -L "$target_file" ]; then + rm -f "$target_file" + fi + + ln -s "$src_file" "$target_file" + log_success "创建软链接: $src_file -> $target_file" + fi + done +else + log_warning "未找到 /data/etc/apt/sources.list.d 目录,跳过 apt 源配置" +fi + +# 6. 配置 Docker daemon +log_info "配置 Docker daemon..." +if [ -f /data/etc/docker/daemon.json ]; then + mkdir -p /etc/docker + + if [ -f /etc/docker/daemon.json ]; then + cp /etc/docker/daemon.json /etc/docker/daemon.json.bak + log_info "备份 /etc/docker/daemon.json -> daemon.json.bak" + fi + + ln -sf /data/etc/docker/daemon.json /etc/docker/daemon.json + log_success "创建 Docker daemon 配置软链接" +else + log_warning "未找到 /data/etc/docker/daemon.json,跳过 Docker 配置" +fi + +# 7. 配置 SSH +log_info "配置 SSH..." +if [ -f /data/etc/ssh/sshd_config ]; then + if [ -f /etc/ssh/sshd_config ]; then + cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak + log_info "备份 /etc/ssh/sshd_config -> sshd_config.bak" + fi + + ln -sf /data/etc/ssh/sshd_config /etc/ssh/sshd_config + log_success "创建 SSH 配置软链接" + + # 重启 ssh 服务 + systemctl restart sshd || systemctl restart ssh + log_success "SSH 服务已重启" +else + log_warning "未找到 /data/etc/ssh/sshd_config,跳过 SSH 配置" +fi + +# 8. 配置 sudoers +echo "kairee ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/kairee +chmod 0440 /etc/sudoers.d/kairee +log_success "创建 /etc/sudoers.d/kairee" + +# 9. 添加 kairee 到 docker 组 +if getent group docker > /dev/null; then + usermod -aG docker kairee + log_success "已将 kairee 添加到 docker 组" +else + log_warning "docker 组不存在,请检查 Docker 是否正确安装" +fi + +# 10. 创建家目录软链接 +log_info "配置家目录..." +if [ -d /data/home/kairee ]; then + # 如果 /home/kairee 已存在但不是软链接,则删除 + if [ -e "/home/kairee" ] && [ ! -L "/home/kairee" ]; then + log_warning "/home/kairee 已存在但不是软链接,将被删除并重新创建" + rm -rf /home/kairee + fi + + # 如果 /home/kairee 是软链接但指向错误的位置,也删除 + if [ -L "/home/kairee" ] && [ "$(readlink /home/kairee)" != "/data/home/kairee" ]; then + log_warning "/home/kairee 软链接指向错误的位置,将被重新创建" + rm -f /home/kairee + fi + + # 创建软链接 + if [ ! -e "/home/kairee" ]; then + ln -s /data/home/kairee /home/kairee + log_success "创建家目录软链接: /data/home/kairee -> /home/kairee" + else + log_success "家目录软链接已存在且正确" + fi +else + log_warning "未找到 /data/home/kairee,无法创建软链接" +fi + +# 11. 生成 SSH 密钥对 +log_info "生成 SSH 密钥对..." +SSH_KEY_DIR="/root/.ssh" +SSH_PRIVATE_KEY="$SSH_KEY_DIR/id_ed25519" +SSH_PUBLIC_KEY="$SSH_KEY_DIR/id_ed25519.pub" + +mkdir -p "$SSH_KEY_DIR" +chmod 700 "$SSH_KEY_DIR" + +if [ -f "$SSH_PRIVATE_KEY" ]; then + log_warning "SSH 私钥已存在,跳过生成: $SSH_PRIVATE_KEY" +else + # 生成 ed25519 密钥对 + ssh-keygen -m PEM -t ed25519 -f "$SSH_PRIVATE_KEY" -N "" + log_success "生成 SSH 密钥对完成" + log_info "私钥: $SSH_PRIVATE_KEY" + log_info "公钥: $SSH_PUBLIC_KEY" +fi + +# 12. 复制公钥到远程服务器 +log_info "复制公钥到远程服务器..." +REMOTE_HOST="qc5.ofcdn.cn" +REMOTE_PORT="46571" +REMOTE_USER="kairee" +REMOTE_SSH_COPY_ID_USER="kairee" + +# 检查公钥是否存在 +if [ ! -f "$SSH_PUBLIC_KEY" ]; then + log_error "公钥文件不存在: $SSH_PUBLIC_KEY" + log_error "无法执行 ssh-copy-id" +else + # 提示用户输入远程 SSH 密码 + echo + echo "========================================" + echo "输入远程服务器 SSH 密码" + echo "========================================" + echo "目标: $REMOTE_SSH_COPY_ID_USER@${REMOTE_HOST}:${REMOTE_PORT}" + echo + echo "请输入 $REMOTE_SSH_COPY_ID_USER 在 $REMOTE_HOST 上的 SSH 密码:" + read -s -p "SSH 密码: " REMOTE_SSH_PASSWORD + echo + + if [ -z "$REMOTE_SSH_PASSWORD" ]; then + log_warning "未输入 SSH 密码,跳过 ssh-copy-id" + else + # 使用 sshpass 执行 ssh-copy-id + log_info "使用 sshpass 执行 ssh-copy-id..." + sshpass -p "$REMOTE_SSH_PASSWORD" ssh-copy-id -p "$REMOTE_PORT" "$REMOTE_SSH_COPY_ID_USER@$REMOTE_HOST" + log_success "公钥已复制到远程服务器" + fi +fi + +# 13. 添加定时任务 +log_info "配置定时任务..." +if [ -f /data/scripts/certs.sh ]; then + # 创建日志目录 + mkdir -p /data/certs + + # 生成随机时间(1点到7点之间) + RANDOM_HOUR=$((1 + RANDOM % 7)) + RANDOM_MINUTE=$((RANDOM % 60)) + + # 创建 crontab 条目 + CRON_CMD="$RANDOM_MINUTE $RANDOM_HOUR * * * /data/scripts/certs.sh >> /data/certs/sync.log 2>&1" + + # 将定时任务添加到 root 用户的 crontab + (crontab -l 2>/dev/null; echo "$CRON_CMD") | crontab - + + log_success "定时任务已添加" + log_info "执行时间: 每天 $RANDOM_HOUR:$RANDOM_MINUTE" + log_info "命令: /data/scripts/certs.sh >> /data/certs/sync.log 2>&1" +else + log_warning "未找到 /data/scripts/certs.sh,跳过定时任务配置" +fi + +echo +echo "========================================" +echo -e "${GREEN}初始化完成!${NC}" +echo "========================================" +echo +echo "重要提示:" +echo "1. 请重新登录或执行 'su - kairee' 以使 Docker 组权限生效" +echo "2. 如果下载了数据包,请检查 /data 目录内容是否正确" +echo "3. SSH 配置已更新,请测试远程连接是否正常" +echo "4. 可以使用 'sudo -u kairee -i' 切换到 kairee 用户" +echo "5. SSH 密钥已生成: /root/.ssh/id_ed25519" +echo "6. 定时任务: 每天 $RANDOM_HOUR:$RANDOM_MINUTE 执行 certs.sh" +echo + +# 清理密码变量 +unset USER_PASSWORD +unset USER_PASSWORD_CONFIRM +unset REMOTE_SSH_PASSWORD