起因
- 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,点击同步,测试同步握手成功,但是同步处理一会儿提示失败