RustDesk Server OSS 设备记录审计、旧设备清理与管理实践

自建 RustDesk Server 运行一段时间后,很容易出现一个实际问题: 服务器已经连接过不少客户端,但究竟登记过多少设备?哪些设备仍在使用?哪些只是已经废弃的历史记录? RustDesk Server OSS 并没有像 Pro 版本那样提供完整的设备管理控制台,因此很多信息需要直接从服务端数据库进行审计。 本文以 Docker 部署的 RustDesk Server OSS 为例,介绍如何安全查看设备记录、理解数据库字段、识别旧设备、删除废弃记录,以及如何建立一个长期可用的系统管理命令。 一、先确认 RustDesk Server 的部署方式 RustDesk Server OSS 主要包含两个服务: 如果采用 Docker 部署,可以先检查: 常见部署会看到两个独立容器: 然后检查数据目录挂载: 典型结果类似: 这意味着 RustDesk 的数据库、服务器密钥等持久化数据实际上都保存在宿主机目录: 二、RustDesk OSS 的设备记录保存在哪里 RustDesk Server OSS 默认使用 SQLite 数据库: 数据目录中通常还能看到: 这里有一个值得注意的细节。 如果存在: 说明 SQLite 正在使用 …

从 /nextcloud/ 迁移到独立子域名:一次完整的 Nextcloud URL 架构重构

很多早期部署的 Nextcloud 都采用子目录模式。 例如: 这种部署方式简单,而且可以和其他服务共用同一个主域名。 但随着 Nextcloud 和现代浏览器安全机制不断演进,子目录架构会逐渐暴露一些限制。 这次迁移最终把正式地址从: 迁移为: 也就是独立子域名根路径部署。 整个过程涉及: 并不是简单地修改一个域名字符串。 一、为什么要从子目录迁移到子域名 最直接的原因之一是: 现代浏览器支持: Cookie 前缀。 它要求: 而如果 Nextcloud 长期运行在: 路径下,就很难完全满足: 这一要求。 安全扫描因此一直存在一个: 相关提示。 这意味着即使 HTTPS、HSTS、Content-Security-Policy 等其他配置全部正常,子路径本身仍然会限制部分 Cookie Hardening。 因此最终决定把 Nextcloud 放到独立子域名根目录。 二、DNS:先创建新的正式入口 首先创建: 对应 DNS A 记录: TTL 采用普通值,例如: 在真正修改 Web Server 之前,先确认: 这样后续 TLS 和反向代理才能正常验证。 三、TLS:把新域名加入现有多域名证书 …

从多个大版本一路升级到 Nextcloud 34:数据目录分离、App 兼容性、数据库索引与完整性修复

长期运行的 Nextcloud 实例,升级通常不是简单地执行一次: 就可以结束。 随着运行时间增加,实例会逐渐积累: 因此,一次跨越多个主要版本的升级,本质上更像是一次系统整理。 这次升级最终依次完成: 最终版本为: 一、没有跨主要版本跳跃 整个升级过程采用官方支持的逐版本路线。 例如: 这样做的主要原因不是保守,而是每一个主要版本都可能包含自己的: 如果跳过中间版本,就可能绕过原本应该执行的升级阶段。 二、数据目录分离显著改变了 updater 的行为 在早期升级过程中,一个非常明显的瓶颈出现在: 某次升级中,这一步曾经持续: 后来数据目录从应用程序目录中彻底分离。 原来的结构类似: 调整后变成: Nextcloud 配置中的: 也同步修改。 而且没有通过符号链接伪装旧数据目录。 之后再次进行: 升级时, 几乎变成瞬时完成。 这说明此前 updater 很大一部分时间很可能消耗在庞大的数据目录树检查上。 应用代码和数据目录分离后,更新器只需要处理真正属于程序的文件。 三、升级使用 updater.phar,并明确关闭 updater 自己的备份 其中一次升级命令类似: 这里使用: 并不是表示系统不需要备份。 而是因为该实例已经有独立的备份策略,不需要 updater 再额外生成一份完整程序备份。 更新完成后,继续执行: 最终状态为: 四、第三方 App 是升级中最需要单独处理的部分 Nextcloud Core 与第三方 …

一次持续近一周的 Nextcloud 后台数据库迁移:PreviewMigrationJob 的资源失控、限速执行与最终完成

在一次 Nextcloud 大版本升级之后,系统表面上已经完成版本更新,维护模式也已经解除,但数据库和存储层仍然存在一个持续运行的后台迁移任务: 这个任务最终持续了接近一周。 它并不是传统意义上“数据库 Schema 升级跑了一个星期”,而是 Nextcloud 把一部分历史数据迁移拆成了后台任务,使主版本升级可以提前结束,而大规模历史数据转换则在服务恢复之后继续进行。 这类设计可以缩短维护窗口,但也带来了一个容易被忽略的问题: 升级完成,不代表升级相关的所有数据迁移都已经结束。 一、迁移的实际规模 该实例积累了大量历史 Preview 数据。 当时统计到的迁移规模大致为: 因此,这并不是一个几十秒能够结束的普通后台任务。 Nextcloud 会让 PreviewMigrationJob 分批处理数据,而不是在版本升级过程中一次性完成全部迁移。 这也是为什么: 已经执行成功, 也都已经恢复正常, 但后台仍然持续进行数据迁移。 二、真正的问题不是“慢”,而是普通 cron 调度下出现资源失控 最开始,这项任务完全交给 Nextcloud 正常的 cron 机制运行。 例如: 正常情况下,这种方式没有问题。 但对于一个规模达到十万级数据库记录、百万级历史 Preview 文件的迁移任务来说,问题开始出现。 后台 PHP 任务逐渐堆积,部分进程进入: 也就是 Linux 中的不可中断 I/O 等待状态。 随后系统出现了明显异常: CPU 本身并不是主要瓶颈。 真正的问题更接近: …

让 AI Agent 安全管理 WordPress:一次分类与标签重构中的失败、回滚与最终方法

让 AI Agent 安全管理 WordPress:一次分类与标签重构中的失败、回滚与最终方法 AI Agent 很适合处理重复的 WordPress 管理任务,但“可以调用 API”并不等于“适合自由决定网站结构”。 一次较大规模的分类与标签重构,很容易暴露这个差异。 表面目标可能很简单: 减少过度细分的 Category; 将三级结构压缩为较稳定的两级结构; 清理明显错误的 Tag; 保留真正有检索价值的细粒度主题; 不改变正文、Slug、发布时间和文章状态。 真正困难的部分,却不是 REST API,而是如何把语义决策和机械执行彻底分开。 第一类失败:用字符串代替语义 最早出现的问题,是使用简单字符串规则生成 Tag。 这种方法对长而明确的关键词有时有效,但对短词非常危险。 例如,一个只有几个字母的技术名词,可能恰好出现在: directory operator monitor editor vector 等完全不相关的单词内部。 如果使用: if keyword in body: add_tag() 就会产生大量假阳性。 这类错误的危险之处在于:系统表面上运行成功,API 返回 200,数据库也没有损坏,但网站语义已经被污染。 因此,HTTP 成功不等于任务成功。 第二类失败:过度依赖“语义审计” 发现字符串规则不可靠之后,一个自然的想法是:让模型重新阅读文章,然后判断 Tag 是否应该保留。 …

从二维码登录到安全收尾:一个轻量文件柜系统的设计、审计与加固实践

本文中的项目名称、域名、主机名、账号、目录、Cookie 名称、时间参数、容量限制和命令均为虚构示例,仅用于说明技术方案,不对应任何真实部署环境。 一、项目目标 在家庭服务器或小型内部网络中,经常需要一种比网盘更轻量的文件交换工具: 基于这些需求,设计了一个名为 LanternBox 的示例系统。 它采用 PHP、SQLite 和现有 Web 服务器运行,不新增独立公网端口,不依赖常驻应用服务,也不把用户文件映射成静态下载地址。 整体结构如下: 二维码只负责临时授权。真正的用户身份由已经登记的手机浏览器持有,电脑获得的则是短期会话。 二、示例部署结构 示例环境使用以下虚构信息: 项目目录大致划分为: 这里最重要的设计不是“禁止访问几个敏感目录”,而是: 默认拒绝整个项目,只显式开放 public/。 示例 Apache 配置如下: 这种配置的安全意义是: 安全审计中,公开入口可以正常访问,而核心代码、配置、数据库和工具路径均未发现可用的公网绕过方式;普通用户访问管理入口也会被拒绝。 三、认证设计:手机浏览器作为可信设备 3.1 为什么不使用密码 对于少量家庭成员或内部使用者,账号密码会引入额外负担: 因此,系统采用手机设备登记与二维码批准模式。 3.2 首次登记流程 管理员创建用户后,为该用户生成一次性登记链接,例如: 手机浏览器打开链接后,服务器执行以下操作: 示例 Cookie: 登记令牌必须具备一次性和短时效特征。审计验证表明,一次性登记、令牌到期、使用后清除以及安全 Cookie 属性都能够正常工作。 3.3 电脑端扫码登录 电脑打开登录页后,服务器生成一条短期登录请求。 页面显示二维码,二维码中不直接包含永久设备凭据,而是一个短时、一次性的批准入口。 流程如下: 为了防止登录劫持,系统必须保证: 四、同一浏览器只能绑定一个账号的问题 在实际测试中发现,一个浏览器配置文件先登记管理员,再登记普通用户后,管理员身份会被普通用户覆盖。 原因并不是浏览器只能保存一个 Cookie,而是相同的: 只能对应一个当前值。 …

使用 Mailcow API 批量创建邮箱账号:从手工操作到自动化

在 Mailcow 管理后台中逐个创建邮箱账号并不困难,但当一次需要创建十几个甚至更多账号时,重复填写用户名、密码、配额和启用状态会变得繁琐,也容易出现输入错误。 Mailcow 提供了管理 API,可以通过脚本批量创建邮箱。即使 Mailcow 使用 Docker 部署,调用方也不需要进入容器,只需通过 Mailcow 对外提供的 HTTPS 地址访问 API。 本文介绍一种相对安全、简单且容易检查的批量创建方法。 一、Mailcow API 是什么 Mailcow 的网页管理后台适合人工操作,而 API 适合程序化管理。 例如,创建邮箱通常使用类似下面的接口: 请求中包含: 调用成功后,Mailcow 会像在网页后台手动创建一样,在系统中生成邮箱账号。 API 客户端与 Docker 容器之间没有直接关系,实际通信过程如下: 因此,脚本可以运行在: 不需要进入 Docker 容器,也不需要直接操作数据库。 二、在 Mailcow 后台启用 API 登录 Mailcow 管理后台,进入系统配置中的 API 页面。 通常可以看到两类权限: 创建邮箱属于写操作,因此需要临时启用 Read-Write API。 建议遵循以下原则: API …

Nextcloud Passkey 登录实践:陌生电脑扫码登录为何需要蓝牙

在公司电脑、公共电脑或临时设备上访问自建 Nextcloud 时,传统的账号密码登录并不理想。 一方面,需要在陌生设备上输入密码;另一方面,即使使用浏览器隐私窗口,也仍然可能留下下载文件、剪贴板内容或系统级访问记录。 Passkey 提供了一种更方便的思路: 整个过程中,Nextcloud 密码不需要输入到陌生电脑上。 不过,这种登录方式有一个容易被忽视的前提:电脑通常需要具备蓝牙功能。 Nextcloud 是否支持 Passkey Nextcloud 支持基于 WebAuthn/FIDO2 的身份验证。 根据 Nextcloud 版本、管理员配置和已启用的应用,WebAuthn 可能以两种形式出现: 如果目标是在陌生电脑上不输入密码,应当使用无密码认证或 Passkey 登录,而不是只配置“密码加 WebAuthn 二次验证”。 通常可以在 Nextcloud 的个人安全设置中找到类似以下选项: 不同版本和语言环境下,名称可能略有差异。 注册 Passkey 时,可以将凭据保存在: 配置完成后,建议先使用另一台可信设备实际测试一次,确认二维码登录、用户名识别和二次验证流程都符合预期。 陌生电脑上的典型登录流程 在支持跨设备 Passkey 的浏览器中,登录流程通常如下: 这种模式的优势是,Passkey 私钥不会复制到临时电脑上,Nextcloud 密码也不需要在该设备中输入。 为什么扫码登录还需要蓝牙 很多人会自然地认为: 二维码已经把手机和电脑连接起来了,为什么还要蓝牙? 原因是,二维码只能让手机知道“这次登录请求是什么”,却不能证明手机与发起登录的电脑确实处在同一地点。 跨设备 Passkey 通常采用一种被称为混合传输的机制。它会同时使用: 三者承担的职责并不相同。 第一步:电脑生成一次性二维码 电脑上的浏览器启动 …

让本地 AI 代理接入 WordPress:从后台管理员到受控内容管理接口

在使用本地 AI 代理辅助运维和内容整理时,一个自然的问题会出现:能不能让 AI 代理直接连接到 WordPress 实例,用来管理分类、标签和博客文章? 答案是可以,但更重要的问题不是“能不能连接”,而是“应该以什么方式连接、授予多大权限、允许它做哪些操作”。 对于 WordPress 来说,最稳妥的方式并不是让 AI 代理像真人一样打开浏览器、登录后台、点击菜单完成操作,而是通过 WordPress 提供的 REST API 进行内容管理。这样既更稳定,也更容易控制权限边界。 一、不要把 AI 代理当成人类后台管理员 很多人第一反应是给 AI 代理一个 WordPress 管理员账号,让它登录后台,然后管理文章、分类和标签。 这种方式虽然直观,但并不理想。 后台网页界面是给人使用的,页面结构、按钮位置、插件界面、主题设置都可能变化。AI 代理如果通过浏览器模拟人工操作,稳定性会比较差,也容易误点。更重要的是,如果直接使用高权限管理员账号,一旦代理执行了错误操作,影响范围可能非常大。 更推荐的方式是:把 AI 代理视为一个外部内容管理程序,通过 WordPress REST API 与站点通信。 这样做的好处是: 二、推荐接入方式:REST API + Application Password WordPress 自带 REST API,可以通过接口读取和写入内容。例如: 为了让外部程序安全访问 WordPress,可以使用 WordPress 的 …

在 Linux 桌面环境下使用 Nextcloud News:客户端选择与 RSS Guard 认证问题排查

在使用 Nextcloud News 作为 RSS 同步后端时,桌面端客户端的选择会直接影响使用体验。表面上看,KDE 自带的 Akregator 与第三方的 RSS Guard 都属于传统 RSS 阅读器,但两者在“是否支持与 Nextcloud News 同步”这个关键点上差别很大。实际配置过程中,还可能遇到 RSS Guard 报错,提示禁止使用密码登录、必须改用令牌。本文对这一过程做一次简要整理。 一、客户端选择:本地阅读器与同步客户端不是一回事 如果需求只是“在桌面上看 RSS”,那么很多传统阅读器都可以胜任。但如果需求是“连接 Nextcloud News,同步订阅、分类和已读状态”,就必须优先考虑是否支持 Nextcloud News 接口。 1. RSS Guard RSS Guard 更适合作为 Nextcloud News 的桌面客户端,原因主要有两点: 对于偏向 Qt 界面、长期使用 KDE 的用户来说,它的整体风格也更协调,适合作为主力桌面端阅读器。 2. Akregator Akregator 本身并不是不能用,它依然是一个合格的本地 RSS 阅读器: 但问题在于,它并不适合承担 Nextcloud …