Logo迷失博客
返回文章列表
常用工具阅读时长:33 分钟

SkerrySSH:开源跨平台 SSH 客户端,一站式掌控远程连接、安全密钥与常用片段

发布时间:2026年08月11日 08:00最后修改:2026年09月02日 09:33

SkerrySSH 是一款开源跨平台 SSH 客户端,支持 SSH/Mosh/Telnet/串口/VNC/RDP/容器,内置加密保险库、片段库动态变量、运行手册、主机监控与自建同步。本文全面介绍所有核心功能与实战用法。

项目信息


SkerrySSH 是一款开源的跨平台 SSH 客户端,基于 Kotlin Multiplatform 与 Compose Multiplatform 开发,Linux、Windows、macOS、Android 四个平台共享同一套原生核心架构。它把终端、SFTP、端口转发、远程桌面、加密保险库、片段库、运行手册、主机监控、团队协作、AI 助手、自建同步全部集成在一个轻量应用里,无需注册、不依赖厂商云、没有付费订阅

如果你每天需要管理多台服务器、频繁输入重复命令、维护众多密码与私钥,这篇文章将带你全面了解 SkerrySSH 的各项核心设计与使用技巧。

一、支持的连接协议与架构

SkerrySSH 覆盖了几乎所有主流的远程连接与运维管理协议。

桌面终端主界面

支持的连接协议(8 种)

协议说明
SSH主力连接协议,支持跳板机(ProxyJump 多级链)、证书认证、CA 签名主机密钥、2FA/键盘交互认证、自动重连
Mosh移动网络下不断线的远程终端,从 SSH 跳板无缝切换启动
Telnet传统网络设备、交换机、路由器常用连接协议
串口 (Serial)串口直连(桌面端 + Android USB-OTG),方便调试路由器与嵌入式硬件
VNC远程桌面,纯 Kotlin 原生 RFB/Tight 实现(零第三方依赖、Tight 编码优先),天然免疫环境兼容问题
RDPWindows 远程桌面,支持 H.264 硬解、远程截图、Ctrl+Alt+Del 快捷键与剪贴板双向互通
容器直接从主机列表进入 Docker 容器或 Kubernetes Pod 执行交互式命令
本地 Shell无需连接网络,直接在应用内新建本地终端标签页

支持直接从 ~/.ssh/config 导入已有配置,支持主机分组、色彩标签管理与拖拽自定义排序。

几种连接方式的工作过程

SSH:标准 TCP 长连接,认证通过后分配 PTY 会话。

客户端(SkerrySSH)                    服务器
      │                                 │
      │──── ① TCP 连接 (端口 22) ──────▶│
      │                                 │
      │──── ② SSH 密钥交换 (KEX) ──────▶│
      │                                 │
      │──── ③ 认证 (密码/密钥/2FA) ─────▶│
      │                                 │
      │◀─── ④ 打开 PTY shell ───────────│
      │                                 │
      │──── ⑤ 断线 → 自动重连 ──────────▶│
      │                                 │

Mosh:通过 SSH 完成握手与密钥分发后启动 mosh-server,后续所有终端流量全部转由 UDP 承载。即使网络切换或休眠,连接也能无感自动恢复。

客户端(SkerrySSH)                    服务器
      │                                 │
      │──── ① SSH 连接 (认证) ─────────▶│
      │◀─── ② 启动 mosh-server ─────────│
      │◀─── ③ 返回 UDP 端口 + 密钥 ─────│
      │                                 │
      │──── ④ 断开 SSH (握手完成) ──────▶│
      │                                 │
      │════ ⑤ UDP 60000-61000 传输 ════▶│  ← 会话在此通道保持
      │════ ⑥ 网络切换/切后台 → 自动恢复 ═│
      │                                 │

二、终端与多窗格平铺

SkerrySSH 采用自研网格渲染终端,告别传统套壳架构:

多窗格平铺终端

  • 多窗格分屏:单标签页支持最多 4 个平铺分屏,支持同步输入(在一个窗格键入,所有窗格同时批量执行);
  • 会话广播:将实时指令同时广播至选中的多个独立主机;
  • 智能搜索与高亮:完整回滚缓冲区实时搜索,支持命令与输出语法高亮;
  • 命令调色板:基于历史执行记录与模糊匹配快速补全常用指令;
  • 智能路径直达:终端输出中打印的文件路径可直接单击跳转至 SFTP 对应目录;
  • 会话录制与回放:支持 asciinema v2 标准格式录制,可在软件内随时复盘操作流程;
  • 移动端自适应:在手机窄屏上遇长行折行时支持自动缩小字号,防止排版错乱。

三、加密保险库与安全管理

所有敏感信息(服务器密码、私钥、证书、身份)均在本地通过 Argon2id 密钥派生与 XChaCha20-Poly1305 高强度算法加密,仅在输入主密码后方可解密。

保险库界面(SSH 密钥)

  • 主密码与密钥:主密码和解密密钥不会发送到服务器;支持中文主密码;
  • 条目管理:密码、SSH 密钥(私钥+公钥+指纹)、TLS 证书、登录身份;
  • 内置密钥生成器:一键生成 Ed25519 或 RSA 密钥对,卡片清晰展示指纹、算法与关联主机;
  • 生物识别:移动端支持指纹与面部识别快速解锁;
  • 30 天回收站:误删条目自动移入回收站,支持在任意同步设备上一键还原;
  • 双模式备份导出
    • 加密导出.skerryvault):采用主密码强加密,适合日常云盘或冷备份;
    • 明文导出.json):方便跨工具迁移与人工校对,导出前带有明确安全警示。

四、片段库:动态变量与模板展开

把高频使用的命令保存为片段,输入关键字即可实时调用。

常用片段库

8 种动态变量支持

变量格式作用运行时示例
${{date:格式}}当前日期${{date:YYYY-MM-DD}} → 2026-08-17
${{time:格式}}当前时间${{time:HH:mm:ss}} → 15:30:00
${{timestamp}}Unix 时间戳1723880000
${{uuid}}随机生成 UUID8f2a1c3e-…
${{random:长度}}随机字符串${{random:16}}
${{clipboard}}读取系统剪贴板自动填入刚复制的文本
${{vault:条目名}}保险库安全取值自动提取密码或公钥
${{param:默认值}}执行前弹窗询问参数${{param:目标IP}}

保险库变量:${{vault:条目名}} 流程

K="${{vault:我的密钥}}"; echo "$K" >> ~/.ssh/authorized_keys

运行时,SkerrySSH 会从保险库读取对应条目、替换占位符并弹出安全确认预览后才发送执行:

片段模板 (输入)                SkerrySSH 变量引擎                终端执行 (输出)
┌───────────────────────┐      ┌─────────────────────────┐      ┌─────────────────────────┐
│ K="${{vault:我的密钥}}"│ ───▶ │ 1. 保险库检索 "我的密钥" │ ───▶ │ K="ssh-ed25519 AAAAC3…" │
│ echo "$K" >> auth_keys│      │ 2. 提取公钥 (私钥安全屏蔽)│      │ echo "$K" >> auth_keys  │
└───────────────────────┘      │ 3. 弹出确认预览对话框   │      └─────────────────────────┘
                               └─────────────────────────┘

安全机制:当条目类型为 SSH 密钥时,注入到命令中的永远是公钥,私钥绝不会注入到终端命令文本中。

多变量混合排版实战

一个命令模板中可自由混用多个变量与常规文本,直接复制即可使用:

常用变量映射参考:
  ${{vault:服务器密码}}   ──▶ 从本地加密保险库动态提取登录密码
  ${{vault:生产服务器IP}} ──▶ 从本地加密保险库动态提取目标 IP 地址
  ${{vault:部署密钥}}     ──▶ 从本地加密保险库动态提取对应 SSH 公钥
  ${{date:YYYYMMDD}}      ──▶ 运行时自动注入当前年月日 (如 20260817)
  ${{param:备份目录}}     ──▶ 执行前弹出输入框由用户指定临时参数

可直接复制的实战示例:

# 示例 1:多变量组合自动化分发
PASS="${{vault:服务器密码}}"
HOST="${{vault:生产服务器IP}}"
KEY="${{vault:部署密钥}}"

sshpass -p "$PASS" ssh root@"$HOST" -i "$KEY" 'bash -s' < deploy.sh

# 示例 2:动态日期与交互参数混合备份
BACKUP_DIR="${{param:/data/backup}}"
DATE_TAG="${{date:YYYYMMDD}}-${{time:HHmmss}}"

tar -czf "$BACKUP_DIR/app-$DATE_TAG.tar.gz" /var/www/html

同名条目智能点选

如果保险库中存在同名条目,执行前会自动弹出候选列表供精准选择:

当执行 ${{vault:生产密钥}} 遇到同名条目时:

┌─────────────────────────────────────────────────────────────┐
│ 🔍 发现 2 个同名条目,请选择本次要注入的项:                 │
├─────────────────────────────────────────────────────────────┤
│ [SSH密钥] 生产密钥 (ed25519) · 备注: 韩国首尔节点 (主力)     │ ◀── 单击选中
│ [SSH密钥] 生产密钥 (rsa4096) · 备注: 日本东京冷备节点        │
└─────────────────────────────────────────────────────────────┘
  ↓ 选中后自动替换为选定条目的公钥内容并执行

五、运行手册 (Runbooks):流程自动化编排

将多步运维操作(如“备份数据库 → 检查状态 → 同步至冷备机”)固化为标准化工作流:

运行手册

  • 步骤支持 shell 命令与 SFTP 传输混排;
  • 支持在关键节点设置“暂停等待人工确认”;
  • 任一步骤返回非零退出码即刻熔断中止;
  • 全流程记录耗时与详细输出日志。

六、主机实时监控

专为服务器运维打造的图形化监控看板:

主机监控

  • 系统核心指标:CPU 利用率、物理内存与 Swap、网络上下行(含历史平滑走势图)、磁盘挂载;
  • 进程与服务:实时 TOP 进程榜单、systemd 单元运行状态、容器列表;
  • 本地阈值告警:指标超标时在客户端即时提醒。

七、端口转发与 SFTP

端口转发(隧道)

支持本地转发(Local)、远程转发(Remote)与动态 SOCKS 代理转发:

端口转发界面

  • 保险库解锁后自动拉起已配置的后台隧道;
  • 服务发现:自动扫描并列出目标主机当前监听的端口,支持一键建立映射。

SFTP 双栏文件管理器

SFTP 文件传输

  • 本地与远程双栏并列视图,支持快速拖拽、批量队列传输与断点管理;
  • 内置文件查看与编辑,全程复用现有 SSH 安全会话。

八、远程桌面与团队协作

VNC / RDP 远程桌面

远程桌面连接

  • VNC:纯 Kotlin 原生手写 RFB/Tight 栈,零第三方依赖,连接轻快;
  • RDP:全功能 Windows 远程桌面,支持显示优化与剪贴板联动。

Teams 团队空间

团队协作空间

  • 端到端加密共享主机、片段库与运行手册;
  • 细粒度成员角色与权限控制;
  • 实时活动动态记录团队操作轨迹。

九、自建同步服务器

SkerrySSH 支持免费、完全自建的云同步服务

安全机制

  • 数据加密上传:同步过程中所有主机与保险库数据均以高强度密文形式存储与传输;
  • 密码不外发:认证过程采用 SRP-6a 协议,服务器无法解密你的任何存储数据
  • 开源自由:服务端基于 AGPL-3.0 开源,支持 SQLite / PostgreSQL。

一键部署服务端

官方提供轻量 Docker 镜像,只需一条命令即可拉起:

docker run -d --name skerry-sync -p 8080:8080 \
  -e SKERRY_JWT_SECRET="$(openssl rand -base64 48)" \
  -e SKERRY_ADMIN_TOKEN="$(openssl rand -hex 16)" \
  -v skerry-data:/data \
  onepve/skerry-sync:latest

服务端自带 Web 管理端点:

  • Web 账户区https://app.example.com/account(管理已关联设备与远程吊销)
  • 管理控制台https://app.example.com/console(查看服务端节点状态与邀请码管理)

配对与多设备同步说明

设备一 (已有数据)                        设备二 (新设备)
      │                                       │
      │── 1. 设置 → 同步 → 展示配对码 ───▶│
      │                                       │
      │◀── 2. 扫码 / 填入 9 位配对码 ────────│
      │                                       │
      │    3. 设备二设置本机主密码            │
      │    4. 完成关联,云端数据同步至设备二  │

十、AI 运维助手

AI 助手支持灵活的安全策略配置,避免敏感信息泄露:

AI 助手设置

  • 每主机独立策略:支持严格模式(纯本地离线推理)、平衡模式(云端自动脱敏)与宽松模式;
  • 本地模型推理:支持通过 llama.cpp 直接在设备本地运行 GGUF 模型(如 Qwen、Phi 等),零网络流量外发
  • 自带 API 密钥 (BYOK):支持配置自定义 OpenAI 兼容接口,客户端直连目标 API;
  • 输出不可信原则:模型生成的任何指令均须人工显式确认后方可执行。

十一、移动端:全功能 Android 体验

Android 端拥有与桌面端完全一致的底层核心,绝非简化的移动包装:

手机主机列表手机终端
手机主机列表手机终端
  • 原生会话保活:内置前台保活服务与独立通知栏,多任务切后台或锁屏不掉线;
  • 指纹快速解锁:支持调用系统生物认证秒级解锁保险库;
  • 终端自动缩放:遇到超长输出行时动态微调字号,保证排版整齐清晰。

十二、全平台版本获取与下载

SkerrySSH 现已全面覆盖主流操作系统与国产信创环境,所有安装包与便携版均提供固定标准直链下载:

官方下载站https://ssh.onepve.com/#download

5 大平台版本矩阵

  1. 国产信创系统(统信 UOS / 银河麒麟 V10 / 南瑞 NARI)
    • 统一 DEB 安装包:支持 x86_64 与 ARM64(鲲鹏/飞腾),内置 Skiko 0.9.17 完美兼容旧版 glibc
    • 免安装便携版 ZIP:解压即用,无需 root 权限,配置随身携带
  2. 🐧 通用 Linux(Ubuntu / Debian / Fedora / RHEL / openSUSE)
    • 提供标准 .deb.rpm 双格式包,均支持 x86_64 与 ARM64 架构
  3. 🪟 Windows(Win 10 / 11 / Server)
    • Inno Setup 中文安装包(EXE):支持平滑覆盖与自动卸载
    • 绿色便携免安装版(ZIP):配置保存在同级 config 目录
    • MSI 安装包:适合企业批量策略部署
  4. 🤖 Android
    • 官方签名 APK 直链:内置前台保活、多会话通知与指纹解锁
  5. 🍎 macOS
    • 提供 Apple Silicon (M系列)Intel 芯片 专属 DMG 安装镜像


十三、实战指南:Cloudflare + Docker 生产级自建同步部署与安全加固

SkerrySSH 官方提供了轻量级服务端镜像,采用 Cloudflare 边缘网关 + 生产后端 Docker Compose 是目前兼顾高可用、全球加速与安全性的最佳实践方案。

1. 整体网络拓扑架构

  客户端 (Desktop / Android App / 浏览器)
               │
               ▼  HTTPS / WSS (Anycast 全球加速)
┌───────────────────────────────────────────────────────────┐
│ Cloudflare 边缘网关 (CDN / WAF / Worker 代理)              │
│ • SSL 证书全自动托管与强制 HTTPS                          │
│ • 隐藏源站真实 IP (DDoS 防护与流量清洗)                   │
│ • WebSocket 协议全双工透传                                │
│ • 边缘白名单网关:精确分发公开路由与受保护路由              │
└───────────────────────────────────────────────────────────┘
               │
               ▼  源站反向代理 (Nginx / OpenResty)
┌───────────────────────────────────────────────────────────┐
│ 生产服务器 (Linux VPS / 云主机)                            │
│ ├── Nginx: 真实 IP 头部重写 & SSL 回源                     │
│ └── Docker 容器: skerry-sync (Ktor 引擎, 监听 127.0.0.1:8080) │
│       ├── SRP-6a 零知识安全认证                           │
│       ├── WebSocket 实时数据推送                          │
│       └── SQLite WAL / PostgreSQL (挂载至 /data 卷)        │
└───────────────────────────────────────────────────────────┘

2. 深入理解容器运行权限与 UID 999 机制

部署自建同步服务时,经常会遇到 SQLite 报 SQLITE_READONLY(数据库只读无法写入)的问题,这与 Docker 的安全机制密切相关:

① 为什么是 UID 999?

  • 行业安全标准:PostgreSQL、Redis、MySQL、MongoDB、RabbitMQ 等几乎所有主流 Docker 官方镜像,均将内部运行账号固定为 UID 999:999(非 root 系统用户)。
  • 最小权限原则:容器内禁止使用 root 运行 Java/Kotlin 进程,避免进程发生潜在漏洞时被利用逃逸提权。
  • 防止 UID 漂移:如果不显式固定 UID,基础系统镜像升级时用户分配序号可能变化,导致原本挂载的数据卷被意外锁死。

② 为什么宿主机目录需要权限校准?

当我们在宿主机上使用 root 账户执行 mkdir 创建挂载目录时,目录的所有者是 root:root (0:0),默认权限为 755。容器内的 skerry (999) 用户对此目录没有写权限,创建 SQLite 文件或生成 WAL 临时日志时就会被系统拦截。

③ 两种持久化挂载方案对比:

  • 方案 A:Docker 具名卷(最省心,全自动) 使用 volumes: - skerry-data:/data,Docker daemon 会自动将具名卷的初始权限分配为容器内的 999:999无需手动执行 chown
  • 方案 B:宿主机绝对路径绑定挂载(方便备份与迁移) 使用 volumes: - /opt/skerry-sync/data:/data,创建目录后手动执行一次属主校准:
    mkdir -p /opt/skerry-sync/data /opt/skerry-sync/backups
    chown -R 999:999 /opt/skerry-sync/data
    

3. 服务端 Docker Compose 生产配置

/opt/skerry-sync/docker-compose.yml 中写入:

version: "3.8"

services:
  sync:
    image: onepve/skerry-sync:latest
    container_name: skerry-sync
    restart: unless-stopped
    ports:
      # 仅绑定本地回环地址;宿主机端口可按需调整(若 8080 被其他面板占用可改为 28080:8080)
      - "127.0.0.1:8080:8080"
    env_file:
      - .env
    volumes:
      # 方式 A:宿主机绝对路径挂载(需预先 chown 999:999)
      - /opt/skerry-sync/data:/data
      # 方式 B:Docker 具名卷(免手动赋权)
      # - skerry-data:/data

# 若选用方式 B 具名卷,取消下方注释:
# volumes:
#   skerry-data:

/opt/skerry-sync/.env 中配置核心环境变量:

# 1. 核心安全密钥 (必须使用强随机串)
SKERRY_JWT_SECRET="YOUR_RANDOM_BASE64_SECRET_KEY_HERE"
SKERRY_ADMIN_PASSWORD="YOUR_ADMIN_PASSWORD_HERE"

# 2. 注册模式控制
# open: 开放注册 | invite: 仅允许邀请码注册 | closed: 关闭新注册
SKERRY_REGISTRATION="open"
SKERRY_MAX_ACCOUNTS=0

# 3. 受信任反向代理与真实 IP 白名单 (重要!)
# 必须包含 127.0.0.1 及 Docker 网桥网关 IP (如 172.17.0.1, 172.22.0.1),防止全站共享同一个限流桶触发 429
SKERRY_TRUSTED_PROXIES="127.0.0.1,172.17.0.1,172.22.0.1"

启动并验证容器状态:

cd /opt/skerry-sync
docker compose up -d
docker compose logs -f

4. 源站 Nginx / OpenResty 反向代理配置

Nginx 负责接收 Cloudflare 的回源请求,正确透传 WebSocket 协议头并传递真实客户端 IP:

server {
    listen 80;
    server_name app.example.com;
    # 强制重定向至 HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name app.example.com;

    # SSL 证书配置 (可使用 Cloudflare Origin CA 15年免费证书)
    ssl_certificate     /etc/nginx/ssl/app.example.com.pem;
    ssl_certificate_key /etc/nginx/ssl/app.example.com.key;
    ssl_protocols       TLSv1.2 TLSv1.3;

    # 反向代理至本地 Skerry Sync 容器
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;

        # 开启 WebSocket 长连接全双工支持
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 传递请求主机名与真实客户端 IP 链路
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # 长连接保活超时 (防止 WebSocket 空闲被中间件掐断)
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

5. Cloudflare 边缘端详细配置与白名单网关

通过 Cloudflare 进行边缘接入,不仅能获得 DDoS 防护与全球 CDN 加速,还能通过精确的路由白名单保护管理后台与后端接口。

① Cloudflare 面板核心基础设置

  1. DNS 记录:在 DNS 中添加 A 记录 app.example.com 指向源站 IP,并点亮橙色小云朵 (Proxied)
  2. SSL/TLS 模式:进入 SSL/TLS 页面,将加密模式设置为 FullFull (strict)
  3. 开启 WebSocket 全双工:进入 Network (网络) 页面,确保 WebSockets 开关处于 ON 开启状态;
  4. 真实客户端 IP 保持:在 Network 页面确认启用了 True-Client-IP Header 或直接使用标准 CF-Connecting-IP

② 边缘反代路由白名单规则矩阵

路由路径访问权限处理动作说明
/ 与静态资源公开直连或 R2 / CDN 托管官网首页、下载中心与图标资产
/account*公开反代至后端 :8080/account浏览器端 Web 账户区(管理关联设备、解绑)
/auth/*客户端反代至后端 :8080/auth/*SRP 零知识注册、登录挑战与 JWT 刷新
/sync客户端反代至后端 :8080/sync (WSS)WebSocket 增量实时双向同步管道
/vault/*, /devices/*客户端反代至后端对应端点保险库密文 CRUD 与设备元数据上报
/console*仅管理员拦截或 Cloudflare Zero Trust 鉴权服务端后台控制台(严禁对全网裸露)
/metrics仅探针内部白名单 / Bearer Token 鉴权Prometheus 运维指标拉取

③ Cloudflare Worker 边缘网关完整代码范例

如果你希望在 Cloudflare 边缘端通过 Worker 统一管理前端静态落地页、反代白名单与管理后台防护,可直接使用以下 Worker 脚本:

/**
 * Cloudflare Worker 边缘反代网关范例 (worker.js)
 */
const BACKEND_ORIGIN = "https://backend.example.com"; // 源站真实回源地址

// 允许反代到后端的 API / 路径白名单
const PROXY_WHITELIST_PREFIXES = [
  "/auth/",
  "/sync",
  "/vault/",
  "/devices/",
  "/pairing/",
  "/teams/",
  "/account",
  "/invite-codes/public"
];

export default {
  async fetch(request, env, ctx) {
    const url = new URL(request.url);
    const pathname = url.pathname;

    // 1. WebSocket 实时同步长连接直接放行透传
    if (pathname === "/sync" && request.headers.get("Upgrade") === "websocket") {
      return forwardToBackend(request, pathname, url);
    }

    // 2. 检查是否命中白名单反代路径
    const isWhitelisted = PROXY_WHITELIST_PREFIXES.some(prefix => 
      pathname === prefix || pathname.startsWith(prefix)
    );

    if (isWhitelisted) {
      return forwardToBackend(request, pathname, url);
    }

    // 3. 管理后台安全拦截 (/console):可结合 CF Access 或 Token 鉴权
    if (pathname.startsWith("/console")) {
      const adminToken = request.headers.get("X-Admin-Token");
      if (!adminToken) {
        return new Response("Unauthorized Console Access", { status: 401 });
      }
      return forwardToBackend(request, pathname, url);
    }

    // 4. 其余请求默认返回 404 或重定向至官网首页
    return new Response("Not Found", { status: 404 });
  }
};

async function forwardToBackend(request, pathname, url) {
  const targetUrl = new URL(pathname + url.search, BACKEND_ORIGIN);
  const newHeaders = new Headers(request.headers);
  
  // 透传客户端真实 IP
  const clientIp = request.headers.get("CF-Connecting-IP");
  if (clientIp) {
    newHeaders.set("X-Forwarded-For", clientIp);
    newHeaders.set("X-Real-IP", clientIp);
  }

  return fetch(targetUrl.toString(), {
    method: request.method,
    headers: newHeaders,
    body: request.body,
    redirect: "manual"
  });
}

④ 开启全球 CDN 边缘强缓存与国内优选分流

为了让官网静态资源与客户端安装包在国内外均能获得秒级下载体验,同时避免频繁回源:

  1. Smart Tiered Cache 与 30 天边缘强缓存
    • 在 Cloudflare 面板开启 Tiered Cache(分层缓存,优先使用亚太区域中心边缘缓存);
    • Cache Rules 中配置规则:对安装包与静态文件(.exe, .apk, .dmg, .deb, .zip, .css, .js)下发 30 天 Edge 强缓存;对版本比对文件(version.json)配置 Bypass Cache,确保新版本发布后秒级生效。
  2. Cloudflare for SaaS 国内优选分流
    • 对于国内用户,可配置 SaaS 优选通道(如 fast-dl.example.com),解析到电信/联通/移动优化 Anycast IP,大幅降低跨国握手延迟,下载速度拉满。

6. 数据在线热备份与灾备恢复

由于生产数据库采用 SQLite WAL 模式,严禁在容器运行期间直接使用 cp 命令复制数据库文件,否则可能导致 WAL 未合并而损坏。

一键安全热备份脚本

#!/usr/bin/env bash
set -euo pipefail

BACKUP_DIR="/opt/skerry-sync/backups"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
TARGET_DB="/opt/skerry-sync/data/skerry.db"
BACKUP_FILE="${BACKUP_DIR}/skerry-sync-${TIMESTAMP}.db"

mkdir -p "${BACKUP_DIR}"

# 使用 sqlite3 在线热备份锁机制
python3 - <<PY
import sqlite3
src = sqlite3.connect("${TARGET_DB}")
dst = sqlite3.connect("${BACKUP_FILE}")
with dst:
    src.backup(dst)
dst.close()
src.close()
print("Safe hot backup completed -> ${BACKUP_FILE}")
PY

# 打包配置文件与环境
tar -czf "${BACKUP_DIR}/skerry-config-${TIMESTAMP}.tar.gz" -C /opt/skerry-sync docker-compose.yml .env

# 保留最近 7 天的备份
find "${BACKUP_DIR}" -name "skerry-*" -mtime +7 -exec rm -f {} \;

灾备还原流程

  1. 停止当前服务:docker compose down
  2. 将备份的 .db 文件恢复至 /opt/skerry-sync/data/skerry.db
  3. 重新校准文件属主权限:chown -R 999:999 /opt/skerry-sync/data
  4. 启动服务并检查完整性:docker compose up -d && docker compose logs

十四、实战指南二:纯容器 + 1Panel 运维面板反向代理极简部署

对于在个人 VPS 或云服务器上使用 1Panel 服务器面板 的用户,配合内置的 OpenResty(Nginx)反向代理与 ACME 证书管理器,可以在几分钟内完成免命令行折腾的图形化生产部署。

1. 架构示意图

       公网访客 / Skerry 客户端 (HTTPS / WSS)
                         │
                         ▼ (443 端口)
┌─────────────────────────────────────────────────────────────┐
│ 1Panel 面板托管层 (OpenResty 反向代理)                        │
│ • ACME 免费证书全自动申请与续期 (Let's Encrypt / ZeroSSL)     │
│ • HTTP 自动强制跳转 HTTPS                                   │
│ • WebSocket 协议透传与 3600s 长连接保活                      │
│ • 客户端真实 IP ($remote_addr) 透传                          │
└─────────────────────────────────────────────────────────────┘
                         │
                         ▼ (127.0.0.1:8080 本地转发)
┌─────────────────────────────────────────────────────────────┐
│ Skerry Sync 容器 (Docker 后台静默运行)                      │
│ └── 挂载目录: /opt/skerry-sync/data (UID 999:999)            │
└─────────────────────────────────────────────────────────────┘

2. 第一步:创建容器与数据目录

在服务器终端中创建目录并配置权限(容器内部运行用户为 UID 999):

mkdir -p /opt/skerry-sync/data
chown -R 999:999 /opt/skerry-sync/data

/opt/skerry-sync/docker-compose.yml 写入配置:

version: "3.8"

services:
  sync:
    image: onepve/skerry-sync:latest
    container_name: skerry-sync
    restart: unless-stopped
    ports:
      # 仅绑定 127.0.0.1,避免直接暴露给公网
      - "127.0.0.1:8080:8080"
    environment:
      - SKERRY_JWT_SECRET="YOUR_RANDOM_BASE64_SECRET_KEY_HERE"
      - SKERRY_ADMIN_PASSWORD="YOUR_ADMIN_PASSWORD_HERE"
      - SKERRY_REGISTRATION="open"
      - SKERRY_TRUSTED_PROXIES="127.0.0.1,172.17.0.1,172.22.0.1"
    volumes:
      - /opt/skerry-sync/data:/data

拉起容器:

cd /opt/skerry-sync && docker compose up -d

3. 第二步:在 1Panel 中创建反向代理网站

  1. 登录 1Panel 管理面板,进入 「网站」「创建网站」
  2. 网站类型选择 「反向代理」
  3. 主域名:填写你的同步域名(例如 app.example.com);
  4. 代理地址:填写 http://127.0.0.1:8080(若容器改为了 28080:8080,此处填 http://127.0.0.1:28080);
  5. 点击 「确认」 完成创建。

4. 第三步:配置 WebSocket 支持与长连接超时

SkerrySSH 客户端依赖 WebSocket(/sync)与服务端保持实时数据推送通道,因此必须调整反向代理的超时参数,避免长连接被 OpenResty 默认的 60 秒超时强制切断:

  1. 在 1Panel 网站列表中,点击刚创建的网站进入 「配置」
  2. 点击 「反向代理」 标签页,点击编辑默认代理规则:
    • 开启 WebSocket:确保勾选 「开启 WebSocket」 支持;
    • 发送/读取超时:将 连接超时发送超时读取超时 均调整为 3600 秒;
  3. 点击保存。

其对应的底层 OpenResty 核心配置文件如下(供参考):

location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_http_version 1.1;

    # 关键:WebSocket 双向协议升级
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    # 真实 IP 与 Host 透传
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;

    # 长连接保活超时 (避免客户端频繁重连)
    proxy_connect_timeout 60s;
    proxy_send_timeout 3600s;
    proxy_read_timeout 3600s;
}

5. 第四步:一键申请 SSL 证书与 HTTPS 强制跳转

  1. 在网站配置中,点击 「HTTPS」 标签页;
  2. 选择 「ACME 账户」(若未添加,可在 1Panel「证书」功能中添加 Let's Encrypt 或 ZeroSSL 账户);
  3. 勾选 「自动续签」
  4. 申请成功后,勾选 「启用 HTTPS」 并开启 「HTTP 强制跳转 HTTPS」

6. 第五步:连通性验证与客户端连接

  1. 浏览器验证:在浏览器中访问 https://app.example.com/account,若能正常打开 Web 账户管理页面,说明反代与 SSL 均配置成功;
  2. 客户端配对连接
    • 打开 SkerrySSH(桌面端或 Android 手机端);
    • 进入 「设置」「同步」
    • 服务器地址填入:https://app.example.com
    • 输入注册邮箱与主密码,点击 「连接」 即可体验跨设备实时秒级同步。

结语

SkerrySSH 将“多协议连接、凭据保管、命令模板化、主机监控与跨端安全同步”深度整合,兼具现代化的交互质感与高标准的安全性。如果你也在寻找一款顺手、纯粹且功能全面的开源远程连接工具,不妨前往 ssh.onepve.com 体验。