tao-shen commited on
Commit
62248a5
·
1 Parent(s): ad11f5c

feat: sshd + reverse SSH for local SSH into HF Ubuntu; docs/SSH_ACCESS.md

Browse files
Dockerfile CHANGED
@@ -9,7 +9,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
9
  && pip3 install --no-cache-dir --break-system-packages huggingface_hub \
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
- # Desktop stack: Xvfb, XFCE, dbus, x11vnc, Firefox
13
  RUN apt-get update && apt-get install -y --no-install-recommends \
14
  xvfb \
15
  xfce4 xfce4-goodies \
@@ -17,6 +17,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
17
  x11vnc \
18
  firefox \
19
  procps \
 
20
  && rm -rf /var/lib/apt/lists/*
21
 
22
  # noVNC (web client on 7860)
 
9
  && pip3 install --no-cache-dir --break-system-packages huggingface_hub \
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
+ # Desktop stack: Xvfb, XFCE, dbus, x11vnc, Firefox; OpenSSH for reverse SSH
13
  RUN apt-get update && apt-get install -y --no-install-recommends \
14
  xvfb \
15
  xfce4 xfce4-goodies \
 
17
  x11vnc \
18
  firefox \
19
  procps \
20
+ openssh-server openssh-client \
21
  && rm -rf /var/lib/apt/lists/*
22
 
23
  # noVNC (web client on 7860)
README.md CHANGED
@@ -46,7 +46,7 @@ HuggingRun 是面向 Hugging Face Spaces 的**通用部署接口**:用同一
46
  - **统一入口**:同一 entrypoint 先做恢复与同步,再 `exec` 你的 `RUN_CMD`,便于任意镜像复用。
47
 
48
  详见 [docs/HF_LIMITATIONS.md](docs/HF_LIMITATIONS.md)。
49
- 远端构建/运行日志:[docs/REMOTE_LOGS.md](docs/REMOTE_LOGS.md)。**Push → 部署 → 监控 → 测试** 循环:[docs/PUSH_DEBUG.md](docs/PUSH_DEBUG.md)。
50
 
51
  ## 示例(最小用法)
52
 
 
46
  - **统一入口**:同一 entrypoint 先做恢复与同步,再 `exec` 你的 `RUN_CMD`,便于任意镜像复用。
47
 
48
  详见 [docs/HF_LIMITATIONS.md](docs/HF_LIMITATIONS.md)。
49
+ 远端构建/运行日志:[docs/REMOTE_LOGS.md](docs/REMOTE_LOGS.md)。**Push → 部署 → 监控 → 测试** 循环:[docs/PUSH_DEBUG.md](docs/PUSH_DEBUG.md)。**本地 SSH 进 HF Ubuntu**(反向 SSH):[docs/SSH_ACCESS.md](docs/SSH_ACCESS.md)。
50
 
51
  ## 示例(最小用法)
52
 
docs/SSH_ACCESS.md ADDED
@@ -0,0 +1,67 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # 本地 SSH 到 HF 上的 Ubuntu(反向 SSH)
2
+
3
+ HF Spaces 只暴露一个端口(默认 7860),**无法从公网直接 SSH 进容器**。通过 **反向 SSH**:容器主动连到你的跳板机,你在本机先 SSH 到跳板机,再通过隧道连到容器。
4
+
5
+ ---
6
+
7
+ ## 1. 在 Space 里配置 Secrets
8
+
9
+ 在 HuggingRun Space 的 **Settings → Repository secrets** 中增加:
10
+
11
+ | Secret | 说明 |
12
+ |--------|------|
13
+ | `SSH_AUTHORIZED_KEYS` | 你的公钥(一行),用于登录容器里的用户。例如 `ssh-rsa AAAA... your@email` |
14
+ | `SSH_REVERSE_TARGET` | 跳板机连接串,容器会用 `ssh -R ... $SSH_REVERSE_TARGET -N` 连出去。HF 出站只允许 80/443/8080,所以跳板机须在 **443** 或 **8080** 提供 SSH。示例:`user@你的跳板机公网IP -p 443` |
15
+
16
+ ---
17
+
18
+ ## 2. 跳板机准备(你本机或一台有公网 IP 的机器)
19
+
20
+ - 跳板机需要 **公网 IP 或域名**,且从 HF 能访问(出站 443 或 8080)。
21
+ - 在跳板机上用 **443** 或 **8080** 跑 SSH(HF 不允许出站 22):
22
+
23
+ ```bash
24
+ # 例如在 443 上跑 sshd(与现有 443 服务二选一)
25
+ sudo sshd -p 443 -d # 调试时
26
+ # 或 /etc/ssh/sshd_config 里加 Port 443,然后 systemctl restart sshd
27
+ ```
28
+
29
+ - 确保你的公钥已加入跳板机的 `~/.ssh/authorized_keys`(容器连跳板机用),并且本机私钥对应 `SSH_AUTHORIZED_KEYS` 里的公钥(用于从跳板机进容器)。
30
+
31
+ ---
32
+
33
+ ## 3. 容器内行为
34
+
35
+ - 启动时若存在 `SSH_AUTHORIZED_KEYS`,会在 `$HOME/.ssh` 下起一个 **非 root sshd**,监听 `127.0.0.1:2222`。
36
+ - 若设置了 `SSH_REVERSE_TARGET`,会执行:
37
+ `ssh -R 0.0.0.0:2222:127.0.0.1:2222 $SSH_REVERSE_TARGET -N`
38
+ - 这样跳板机的 **2222** 端口会转发到容器内的 2222(sshd)。
39
+
40
+ ---
41
+
42
+ ## 4. 本机如何 SSH 进容器
43
+
44
+ 1. 先 SSH 到跳板机(如 443 端口):
45
+ ```bash
46
+ ssh -p 443 user@跳板机公网IP
47
+ ```
48
+
49
+ 2. 在跳板机上连到容器(本机已通过反向隧道把容器 2222 映射到跳板机 2222):
50
+ ```bash
51
+ ssh -p 2222 -o StrictHostKeyChecking=no localhost
52
+ ```
53
+ 登录用户为容器内运行桌面时的用户(与 `$HOME` 一致)。
54
+
55
+ 也可以本机一步到位(ProxyJump):
56
+ ```bash
57
+ ssh -J "ssh -p 443 user@跳板机公网IP" -p 2222 -o StrictHostKeyChecking=no localhost
58
+ ```
59
+ (需跳板机允许 2222 的转发或本机用 LocalForward 等,通常更简单的是先登跳板机再 `ssh -p 2222 localhost`。)
60
+
61
+ ---
62
+
63
+ ## 5. 验收「本地能成功 SSH」
64
+
65
+ - 在 Space 已 RUNNING、且上述 Secrets 与跳板机都配置好后,在跳板机上执行:
66
+ `ssh -p 2222 localhost`
67
+ - 能拿到容器内的 shell,即表示 **本地能成功 SSH**(经跳板机到 HF 上的 Ubuntu)。
ubuntu-desktop/Dockerfile CHANGED
@@ -9,7 +9,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
9
  && pip3 install --no-cache-dir --break-system-packages huggingface_hub \
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
- # Desktop stack: Xvfb, XFCE, dbus, x11vnc, Firefox
13
  RUN apt-get update && apt-get install -y --no-install-recommends \
14
  xvfb \
15
  xfce4 xfce4-goodies \
@@ -17,6 +17,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
17
  x11vnc \
18
  firefox \
19
  procps \
 
20
  && rm -rf /var/lib/apt/lists/*
21
 
22
  # noVNC (web client on 7860)
 
9
  && pip3 install --no-cache-dir --break-system-packages huggingface_hub \
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
+ # Desktop stack: Xvfb, XFCE, dbus, x11vnc, Firefox; OpenSSH for reverse SSH (本地 SSH 进容器)
13
  RUN apt-get update && apt-get install -y --no-install-recommends \
14
  xvfb \
15
  xfce4 xfce4-goodies \
 
17
  x11vnc \
18
  firefox \
19
  procps \
20
+ openssh-server openssh-client \
21
  && rm -rf /var/lib/apt/lists/*
22
 
23
  # noVNC (web client on 7860)
ubuntu-desktop/start-desktop.sh CHANGED
@@ -31,5 +31,32 @@ sleep 3
31
  # x11vnc: share display :99 on port 5901
32
  x11vnc -display "$DISPLAY" -rfbport "$VNC_PORT" -forever -shared -noxdamage -bg
33
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
34
  # noVNC: must run in foreground; listen on 0.0.0.0 so HF proxy can reach it
35
  exec /bin/bash -c "cd /opt/noVNC && exec ./utils/novnc_proxy --listen 0.0.0.0:$NOVNC_PORT --vnc localhost:$VNC_PORT --web /opt/noVNC"
 
31
  # x11vnc: share display :99 on port 5901
32
  x11vnc -display "$DISPLAY" -rfbport "$VNC_PORT" -forever -shared -noxdamage -bg
33
 
34
+ # SSH: non-root sshd on 2222, then reverse tunnel 以便本地 SSH 进容器(HF 不暴露 22)
35
+ SSHD_PORT="${SSH_PORT:-2222}"
36
+ mkdir -p "$HOME/.ssh"
37
+ if [ -n "${SSH_AUTHORIZED_KEYS-}" ]; then
38
+ echo "$SSH_AUTHORIZED_KEYS" > "$HOME/.ssh/authorized_keys"
39
+ chmod 600 "$HOME/.ssh/authorized_keys"
40
+ fi
41
+ if [ ! -f "$HOME/.ssh/ssh_host_ed25519_key" ]; then
42
+ ssh-keygen -t ed25519 -f "$HOME/.ssh/ssh_host_ed25519_key" -N "" -C "" 2>/dev/null || true
43
+ fi
44
+ if [ -f "$HOME/.ssh/authorized_keys" ] && [ -f "$HOME/.ssh/ssh_host_ed25519_key" ]; then
45
+ sshd -o "Port=$SSHD_PORT" \
46
+ -o "HostKey=$HOME/.ssh/ssh_host_ed25519_key" \
47
+ -o "AuthorizedKeysFile=$HOME/.ssh/authorized_keys" \
48
+ -o "PermitEmptyPasswords=no" -o "PasswordAuthentication=no" \
49
+ -o "ListenAddress=127.0.0.1" -o "PidFile=$HOME/.ssh/sshd.pid" \
50
+ -o "UsePAM=no" -o "PermitUserEnvironment=yes" \
51
+ -D -e &
52
+ sleep 1
53
+ if [ -n "${SSH_REVERSE_TARGET-}" ]; then
54
+ # HF 出站仅 80/443/8080,跳板机需在 443 或 8080 接 SSH
55
+ ssh -o StrictHostKeyChecking=no -o ServerAliveInterval=60 \
56
+ -R "0.0.0.0:${SSHD_PORT}:127.0.0.1:${SSHD_PORT}" \
57
+ $SSH_REVERSE_TARGET -N &
58
+ fi
59
+ fi
60
+
61
  # noVNC: must run in foreground; listen on 0.0.0.0 so HF proxy can reach it
62
  exec /bin/bash -c "cd /opt/noVNC && exec ./utils/novnc_proxy --listen 0.0.0.0:$NOVNC_PORT --vnc localhost:$VNC_PORT --web /opt/noVNC"