Spaces:
Paused
Paused
feat: sshd + reverse SSH for local SSH into HF Ubuntu; docs/SSH_ACCESS.md
Browse files- Dockerfile +2 -1
- README.md +1 -1
- docs/SSH_ACCESS.md +67 -0
- ubuntu-desktop/Dockerfile +2 -1
- ubuntu-desktop/start-desktop.sh +27 -0
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"
|