Docs/ 基础设施/ 多服务器

多服务器

从单一 sh0 控制台使用安全的 SSH 隧道管理和部署到多台服务器。

概述

sh0 支持自带服务器(BYOS)模式,你可以将多台远程服务器(节点)连接到主 sh0 实例。主服务器充当控制平面,管理所有已连接节点上的部署和路由。

此架构让你能够:

  • 在多台服务器间分配工作负载以获得更好的性能
  • 将应用放置在更靠近不同地理区域用户的位置
  • 隔离工作负载(例如在专用硬件上运行数据库)
  • 扩展到超出单台服务器的资源
Multi-server architecture diagram showing primary node and remote nodes
Note
远程节点只需安装 Docker 和 SSH 访问。sh0 处理其余一切——你不需要在远程节点上安装 sh0 二进制文件。

添加远程节点

要将远程服务器添加为节点:

  1. 在控制台中导航到 设置 → 节点
  2. 点击 添加节点
  3. 输入节点详情:主机名或 IP、SSH 端口和 SSH 用户。
  4. 提供 SSH 私钥或从密钥管理器中选择现有密钥。
  5. 点击 连接。sh0 将验证连接并注册节点。
Add node form with hostname, SSH port, and authentication fields

通过 API:

Terminal
curl -X POST https://your-server:9000/api/nodes \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "eu-node-1",
    "hostname": "10.0.1.50",
    "ssh_port": 22,
    "ssh_user": "deploy",
    "ssh_key_id": "key_abc123"
  }'
Warning
SSH 用户必须有权限在远程节点上运行 Docker 命令。可以将用户添加到 docker 组或为 Docker 配置免密 sudo。

SSH 隧道设置

sh0 通过 SSH 隧道与远程节点通信。隧道将 Docker API 请求从主服务器转发到远程节点的 Docker socket,保持所有流量加密。

添加节点时隧道自动建立。sh0 使用 SSH TOFU(首次信任)进行主机密钥验证——首次连接时会显示服务器指纹并要求你确认。

SSH Tunnel Architecture
Primary Server (sh0)
  |
  |-- SSH Tunnel (encrypted) --> Remote Node 1
  |                                 |-- Docker Socket
  |                                 |-- Container A
  |                                 |-- Container B
  |
  |-- SSH Tunnel (encrypted) --> Remote Node 2
                                    |-- Docker Socket
                                    |-- Container C
SSH tunnel status showing connected nodes and latency
Tip
sh0 会在隧道断开时自动重新连接。重新连接在几秒内完成,远程节点上运行的容器不受影响——仅管理操作会短暂不可用。

节点健康监控

sh0 持续监控所有已连接节点的健康状况。监控内容包括:

  • SSH 连接:检查隧道是否活跃且响应正常。
  • Docker 状态:验证远程节点上的 Docker 守护进程是否正在运行。
  • 资源使用:跟踪每个节点的 CPU、内存和磁盘使用情况。
  • 容器健康:监控节点上运行的所有容器。
Node health dashboard showing CPU, memory, disk, and container status for each node

当节点变为不健康时,sh0 通过配置的通知渠道(邮件、Slack、Discord 或 webhooks)发送告警。你可以在节点设置中为每个节点配置告警阈值。

部署到指定节点

创建或配置应用时,你可以指定应在哪个节点上运行。这在应用的部署设置中配置。

Node selection dropdown in the app deployment settings

选项:

  • 主节点(默认):在主 sh0 服务器上部署。
  • 指定节点:将应用固定到指定的远程节点。
  • 任意节点:让 sh0 选择可用资源最多的节点。
Terminal
curl -X PUT https://your-server:9000/api/apps/my-app \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"node_id": "node_eu1"}'
Note
部署到远程节点时,sh0 通过 SSH 隧道将构建好的 Docker 镜像从主服务器传输到远程节点。这一过程自动完成——无需容器镜像仓库。

节点感知路由

主服务器的 Caddy 反向代理处理到所有节点上容器的路由。当请求到达某个域名时,Caddy 会将其路由到正确的节点和容器,无论容器在哪里运行。

对于副本分布在多个节点上的应用,Caddy 在所有节点上的所有健康副本之间进行负载均衡。在规划架构时应考虑主代理和远程节点之间的延迟。

Tip
为获得最低延迟,请将反向代理(主 sh0 服务器)放在大多数用户所在的区域,使用远程节点处理后台任务或区域部署。

管理多台服务器

控制台中的节点面板提供所有服务器的集中视图:

Nodes management panel showing all connected servers with their status and resource usage

在此面板中你可以:

  • 查看节点指标:每个节点的 CPU、内存、磁盘和网络使用情况。
  • 列出容器:查看特定节点上运行的所有容器。
  • 排空节点:在维护前将所有容器优雅地迁移出节点。
  • 移除节点:断开远程节点(容器必须先迁移或停止)。
  • 终端访问:直接从控制台打开到任意节点的 SSH 终端。
Danger
移除仍有运行中容器的节点会导致这些容器不可达。在移除之前请先排空节点,确保所有应用已迁移到其他节点。