起因
- oracle实例的应用突然无法访问,发现opc和ghost用户丢失,/www目录丢失,应该是被偷偷重置了,邮件没有任何信息
- 一定要定期备份,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的规则即可
- 从附加卷操作,创建块卷150G,附加到实例CID,单对单挂载即可
用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 # 生成ssh证书(一路回车即可,不要输密码) ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa # 授权:把刚生成的公钥加入允许列表 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys # 私钥保存到本地,复制内容: 选中屏幕上从 -----BEGIN RSA PRIVATE KEY----- 开始,到 -----END RSA PRIVATE KEY----- 结束的所有文字。保存本地文件名为 opc_rsa.key cat ~/.ssh/id_rsa # 重启ssh服务,生效 sudo systemctl restart sshd- 用这个私钥在本地开ssh连接
- xshell使用无密码的key,有时候反复提示输入密码
- 用moba则很顺利登录
恢复docker应用
- 系统初始化设置
centos7官方源已经停止支持了,换源
# ============ 阿里云源 ================ # 1. 备份现有的 repo 文件(防止操作失误) sudo mkdir -p /etc/yum.repos.d/bak sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ # 2. 下载阿里云的 CentOS 7 存档源(它是目前最稳定的) sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo # 3. 关键修正:由于官方已停服,需要把 baseurl 指向 vault 存档 # 这一步会将配置文件中失效的地址全部替换为可用的 vault 地址 sudo sed -i -e 's/http:\/\/mirrors.cloud.aliyuncs.com/http:\/\/mirrors.aliyun.com/g' /etc/yum.repos.d/CentOS-Base.repo sudo sed -i -e 's/http:\/\/mirrors.aliyuncs.com/http:\/\/mirrors.aliyun.com/g' /etc/yum.repos.d/CentOS-Base.repo # ============ 全球通用源 ================ # 1. 备份并清理旧源 sudo mkdir -p /etc/yum.repos.d/bak sudo mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ # 2. 创建新的官方 Vault 源配置文件 sudo 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 # 3. 刷新缓存 sudo yum clean all # 强制删除所有缓存目录 sudo rm -rf /var/cache/yum/* # 重新生成 sudo yum makecache # 更新安装工具 sudo yum update -y解除系统内部限制,打通网络
# 1. 彻底关闭并禁用内部防火墙,既然云端已经有了更强大的外层防护,关闭内层可以极大简化运维逻辑。另外在 Docker 社区中,许多资深运维倾向于关闭 firewalld,让 Docker 直接掌管它需要的 iptables 链。 sudo systemctl stop firewalld sudo systemctl disable firewalld # 2. 临时并永久关闭 SELinux,SELinux 会严格限制 Docker 容器对宿主机目录(如你的 /www)的挂载权限。如果不关闭或不配置极其复杂的 Label,你会频繁遇到 Permission Denied 错误 sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 3. 安装基础工具 sudo yum install -y curl wget vim git htop epel-release # 4. 修改时区 sudo timedatectl set-timezone Asia/Shanghai创建生产环境用户并配置权限
# 创建 ghost 用户 sudo useradd -m -s /bin/bash ghost echo "ghost:xxxxxxxxx1111" | sudo chpasswd # 加入 sudo 组 (CentOS 7 默认为 wheel) sudo usermod -aG wheel ghost # 创建目录并赋权 sudo mkdir -p /www sudo chown -R ghost:ghost /www sudo chmod 755 /www # iSCSI - 注册 sudo iscsiadm -m node -o new -T iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 -p 169.254.2.2:3260、 # iSCSI - 自启动 sudo iscsiadm -m node -o update -T iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 -n node.startup -v automatic # iSCSI - 登录拉取 sudo iscsiadm -m node -T iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 -p 169.254.2.2:3260 -l # iSCSI - 断开 # sudo iscsiadm -m node -T iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 -p 169.254.2.2:3260 -u # iSCSI - 删除 # sudo iscsiadm -m node -o delete -T iqn.2015-12.com.oracleiaas:06448145-768e-4b6e-86fc-959b5d566b55 -p 169.254.2.2:3260 # 挂载附加卷 - 查看挂载设备号 lsblk # 挂载附加卷 - 新卷需要格式化 # sudo mkfs.xfs /dev/sdb # 挂载附加卷 - 挂载 sudo mount /dev/sdb /www sudo chown -R ghost:ghost /www sudo chmod 755 /www # 挂载附加卷 - 挂载后的效果 df -h | grep /www[opc@trilium20251227 ~]$ df -h Filesystem Size Used Avail Use% Mounted on devtmpfs 456M 0 456M 0% /dev tmpfs 493M 0 493M 0% /dev/shm tmpfs 493M 6.9M 486M 2% /run tmpfs 493M 0 493M 0% /sys/fs/cgroup /dev/sda3 39G 3.1G 35G 9% / /dev/sda1 512M 12M 501M 3% /boot/efi tmpfs 99M 0 99M 0% /run/user/994 tmpfs 99M 0 99M 0% /run/user/0 tmpfs 99M 0 99M 0% /run/user/1000 /dev/sdb 150G 33M 150G 1% /www [opc@trilium20251227 ~]$ ll / |grep www drwxr-xr-x. 2 ghost ghost 6 Dec 27 15:09 www安装最新的 Docker 引擎及其插件
# 卸载旧版本(如果有) sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 使用官方一键脚本 - 已不支持centos7 # curl -fsSL https://get.docker.com | bash -s docker # 直接用 Docker 官方源(推荐) sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # docekr安装 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 sudo yum install -y docker-ce docker-ce-cli containerd.io # docker-compose安装 sudo mkdir -p /usr/local/lib/docker/cli-plugins sudo curl -SL https://github.com/docker/compose/releases/latest/download/docker-compose-linux-x86_64 -o /usr/local/lib/docker/cli-plugins/docker-compose sudo chmod +x /usr/local/lib/docker/cli-plugins/docker-compose sudo ln -s /usr/local/lib/docker/cli-plugins/docker-compose /usr/bin/docker-compose # 启动并开机自启 sudo systemctl enable --now docker # 用户加入 docker 组 sudo usermod -aG docker opc sudo usermod -aG docker ghost # docker 验证,可以重启centos+切换到ghost来验证 docker ps docker compose version # 测试插件形式 docker-compose --version # 测试独立命令形式 ls -ld /www # 创建docker-net docker network create ghost_net
给新用户增加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- 服务恢复
- 恢复备份文件
- tar -zxvf ghost20250701090751备份脚本增加解压命令.tar.gz -C /www
- 恢复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 docker compose -f /www/certbot/docker-compose.yml up -d- renew证书 Certbot https证书维护
- 验证 https://ghost.atibm.com 访问正常
- 恢复备份文件
- 客户端笔记
- windows客户端trilium,点击同步,测试同步握手成功,但是同步处理一会儿提示失败