oracle-centos7-维护手册

起因

  • oracle实例的应用突然无法访问
  • 一定要定期备份,trilium最好的是本机客户端还有一份数据!

重建VPS实例

  • 创建实例
    • 系统  Oracle-Linux-9.6-2025.11.20-0 很卡很卡,换Centos 7吧
    • 有初始化脚本 cloud-init 最小化
    • #cloud-config
      runcmd:
        - echo "opc:********" | chpasswd
        - sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/' /etc/ssh/sshd_config
        - systemctl restart sshd
    • 按操作步骤,opc不加ssh密钥
    • 引导卷50G(实例终止后,引导卷会残留,需要终止掉)
    • 提交创建成功
  • 管理实例
    • 修改网络VNIC的IP管理为预留的公网IP
    • 开放ping:实例-网络-点开一个vcn-安全-Security List-安全规则列表-添加ICMP 8类型 0.0.0.0/0的规则即可

用cloud shell连接维护

  • 打开右上角的cloud shell
    • 这是一个独立的小型机终端,不是你的实例
    • 查看你的实例:oci compute instance list --compartment-id 你的租户OCID --query "data [*].{Name:\"display-name\", State:\"lifecycle-state\", IP:\"public-ip\"}" --output table
  • 实例详情页-操作系统管理-启动cloud shell连接
    • 这是直接连接你的实例终端
    • 默认到trilium-20251227 login: 提示符,输入用户名密码即可,密码输入时光标不动,实际有效
    • 进行用户一些管理操作

用本地ssh连接维护

  • 实例安装完成,第一次物理连接(cloud shell),完成ssh权限初始化

    # 使用实例详情页-操作系统管理-启动cloud shell连接登录opc
    trilium-20251227 login: opc
    Password: 
    
    # 查看之前init脚本的结果
    [opc@trilium-20251227 ~]$ tail -n 20 /var/log/cloud-init-output.log
    
    # 服务器opc及其它用户用户,直接修改写入公钥  交互时记得复制公钥内容并粘贴
    mkdir -p ~/.ssh && vi ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys
  • 用这个私钥在本地开ssh连接
    • xshell使用无密码的key,有时候反复提示输入密码
    • 用moba则很顺利登录

服务器设置

  • 切换为root用户运行sh脚本:sudo -i

    #!/bin/bash
    
    # =================================================================
    # CentOS 7 自动化初始化脚本 (含 Docker & 1C1G 优化)
    # =================================================================
    
    # 确保以 root 权限运行
    if [ "$EUID" -ne 0 ]; then 
      echo "错误: 请使用 root 用户或 sudo 运行此脚本"
      exit 1
    fi
    
    # 遇到错误立即退出
    set -e
    
    # 定义打印函数,增加可读性
    log_info() {
        echo -e "\n\033[32m[INFO]\033[0m $1"
    }
    
    log_warn() {
        echo -e "\n\033[33m[WARN]\033[0m $1"
    }
    
    log_info "开始系统初始化流程..."
    
    
    mkdir -p /etc/yum.repos.d/bak
    # 使用 || true 防止因为目录为空导致 mv 报错退出
    mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ || true
    
    # --------- 步骤 1: 配置 Vault 源 ---------
    
    log_info "步骤 1: 配置全球通用 Vault 源 (CentOS 7 EOL 解决方案)..."
    tee /etc/yum.repos.d/CentOS-Base.repo <<-'EOF'
    [base]
    name=CentOS-7 - Base
    baseurl=https://archive.kernel.org/centos-vault/7.9.2009/os/x86_64/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    [updates]
    name=CentOS-7 - Updates
    baseurl=https://archive.kernel.org/centos-vault/7.9.2009/updates/x86_64/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    
    [extras]
    name=CentOS-7 - Extras
    baseurl=https://archive.kernel.org/centos-vault/7.9.2009/extras/x86_64/
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
    EOF
    
    log_info "清理并重新生成 YUM 缓存..."
    yum clean all
    rm -rf /var/cache/yum/*
    yum makecache
    log_info "执行系统更新 (可能需要较长时间)..."
    yum update -y
    
    # --------- 步骤 2: 安全与基础环境 ---------
    log_info "步骤 2: 禁用防火墙与 SELinux..."
    systemctl stop firewalld || true
    systemctl disable firewalld || true
    systemctl mask firewalld || true
    
    setenforce 0 || true
    sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
    
    log_info "设置时区为 Asia/Shanghai 并安装基础工具..."
    timedatectl set-timezone Asia/Shanghai
    yum install -y git yum-utils device-mapper-persistent-data lvm2 curl
    
    # --------- 步骤 3: 内核优化 ---------
    log_info "步骤 3: 针对 1C1G 低配服务器进行内核优化..."
    # 物理内存不足时积极使用 Swap,并减少文件缓存压力
    sed -i '/vm.swappiness/d' /etc/sysctl.conf
    sed -i '/vm.vfs_cache_pressure/d' /etc/sysctl.conf
    echo "vm.swappiness=90" >> /etc/sysctl.conf
    echo "vm.vfs_cache_pressure=50" >> /etc/sysctl.conf
    sysctl -p
    
    # --------- 步骤 4: 用户与目录 ---------
    log_info "步骤 4: 创建业务用户 ghost 并配置权限..."
    if id "ghost" &>/dev/null; then
        log_warn "用户 ghost 已存在,跳过创建"
    else
        useradd -m -s /bin/bash ghost
        echo "ghost:xxxxxxxxx1111" | chpasswd
        usermod -aG wheel ghost
        log_info "用户 ghost 创建成功"
    fi
    
    log_info "创建业务目录 /www 并赋权..."
    mkdir -p /www
    chown -R ghost:ghost /www
    chmod 755 /www
    
    # 备份脚本的sudo权限免密
    echo "ghost ALL=(ALL) NOPASSWD: /home/ghost/backupGhost.sh" | sudo tee /etc/sudoers.d/ghost-backup
    echo 'ghost ALL=(ALL) NOPASSWD: /bin/rm -rf /home/ghost/*, /bin/rm -f /home/ghost/*', /bin/rm /home/ghost/*, /bin/rm -rf /www/*, /bin/rm /www/*' | sudo tee -a /etc/sudoers
    
    
    # --------- 步骤 5: Docker 安装 ---------
    log_info "步骤 5: 清理旧版并安装 Docker Engine..."
    yum remove -y docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine || true
    
    log_info "添加 Docker 官方 YUM 源..."
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    
    log_info "安装 Docker CE 组件..."
    yum install -y docker-ce docker-ce-cli containerd.io
    
    log_info "安装 Docker Compose V2 (最新插件版)..."
    DOCKER_CONFIG=${DOCKER_CONFIG:-/usr/local/lib/docker/cli-plugins}
    mkdir -p $DOCKER_CONFIG
    curl -SL "https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64" -o $DOCKER_CONFIG/docker-compose
    chmod +x $DOCKER_CONFIG/docker-compose
    
    log_info "创建 docker-compose 兼容性软链接..."
    ln -sf $DOCKER_CONFIG/docker-compose /usr/bin/docker-compose
    
    log_info "启动 Docker 并设置开机自启..."
    systemctl enable --now docker
    usermod -aG docker ghost
    
    # --------- 步骤 6: 网络与验证 ---------
    log_info "步骤 6: 初始化 Docker 网络与环境验证..."
    if docker network inspect ghost_net >/dev/null 2>&1; then
        log_warn "Docker 网络 ghost_net 已存在"
    else
        docker network create ghost_net
        log_info "Docker 网络 ghost_net 创建成功"
    fi
    
    echo -e "\n\033[32m=================================================================\033[0m"
    echo -e "\033[32m                     所有安装步骤执行完毕!                       \033[0m"
    echo -e "\033[32m=================================================================\033[0m"
    echo -e "Docker 版本: $(docker --version)"
    echo -e "Compose 版本: $(docker-compose version)"
    echo -e "目录状态: $(ls -ld /www)"
    echo -e "当前时间: $(date)"
    log_warn "提示: 为了确保用户组(docker/wheel)权限和内核参数完全生效,建议运行: reboot"
  • 备用yum阿里云源

    # 或者也可以配置阿里云的源
    tee /etc/yum.repos.d/CentOS-Base.repo <<-'EOF'
    [base]
    name=CentOS-7 - Base - mirrors.aliyun.com
    baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/os/x86_64/
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
    
    [updates]
    name=CentOS-7 - Updates - mirrors.aliyun.com
    baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/updates/x86_64/
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
    
    [extras]
    name=CentOS-7 - Extras - mirrors.aliyun.com
    baseurl=http://mirrors.aliyun.com/centos-vault/7.9.2009/extras/x86_64/
    gpgcheck=1
    gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
    EOF
  • 给新用户增加ssh - cmd终端命令

    type "D:\fileJob\1606atibm\2105oracle\instance-20210526-1342\ssh.key.20250215.oracle.ghost\oracle-rsa-ghost-nopsw.pub" | ssh ghost@ssh.atibm.com "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
    # 验证
    ssh -i "D:\fileJob\1606atibm\2105oracle\instance-20210526-1342\ssh.key.20250215.oracle.ghost\oracle-rsa-ghost-nopsw" ghost@ssh.atibm.com

应用恢复

  • 恢复备份文件:sudo tar -xzvpf ghost20250701090751.tar.gz -C /

    # 递归修改 ghost 数据目录权限
    # 官方 Ghost 镜像内部 UID 通常是 1000
    sudo chown -R 1000:1000 /www/ghost/data
    sudo chown -R 1000:1000 /www/nginx/data
    sudo chown -R 1000:1000 /www/trilium/data
  • 恢复trilium笔记数据
    • sudo cp -f backup-now.db /www/trilium/data/document.db
    • sudo rm /www/trilium/data/document.db-wal:存放尚未写入主文件的临时事务数据。需要删除
    • sudo rm /www/trilium/data/document.db-shm:共享内存文件,用于协调多个进程访问。需要删除
    • 风险点:SQLite 数据库的 WAL (Write-Ahead Logging) 模式, 如果你只覆盖了 document.db,但保留了旧的 db-wal 文件,Trilium 启动时会尝试将旧的日志合并到新的数据库中。由于两者的数据结构(快照 ID)不匹配,会导致 数据库损坏(Database Corrupt) 或数据回滚失败。
    • 确认拉起来的trilium是server还是client:docker exec -it trilium curl http://localhost:8080/api/setup/status
    • 如果客户端和服务端之间同步完成,再docker restart trilium重启一下应用
  • 恢复docker应用

    docker compose -f /www/trilium/docker-compose.yml up -d
    docker compose -f /www/ghost/docker-compose.yml up -d
    docker compose -f /www/nginx/docker-compose.yml up -d
    (crontab -l 2>/dev/null; echo '0 3 * * 0 cd /www/certbot && echo "$(date '\''+%Y-%m-%d %H:%M:%S'\'') - [Start]" && docker-compose up certbot && echo "$(date '\''+%Y-%m-%d %H:%M:%S'\'') - [Nginx Reloading]" && docker exec nginx nginx -s reload && echo "$(date '\''+%Y-%m-%d %H:%M:%S'\'') - [Done]" >> /home/ghost/cron_certbot.log 2>&1') | crontab -
  • renew证书 Certbot SSL证书维护
  • 验证 https://ghost.atibm.com 访问正常
  • 客户端笔记
    • windows客户端trilium,点击同步,测试同步握手成功,但是同步处理一会儿提示失败