# Windows Docker GPU Host

Целевой хост: `docker-gpu.cin.su` / `192.168.220.91`.

Назначение: Windows-машина с NVIDIA GPU, Docker Desktop/Engine и контейнерами/моделями на диске `Z:`.

## Что сейчас видно с рабочей машины

- DNS `docker-gpu.cin.su` указывает на `192.168.220.91`.
- Открыты SSH `22` и RDP `3389`.
- Docker API `2375/2376`, WinRM `5985/5986`, Portainer `9000`, inference `8000/8080` снаружи не открыты.
- SSH под `test@docker-gpu.cin.su` ключ не принимает: нужен правильный пользователь или добавление публичного ключа.

## Доступ

Предпочтительный вариант - SSH-ключ, без хранения паролей в репозитории.

Публичный ключ пользователя, который нужно добавить на Windows-хост:

```text
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGS167Ors2oDzveI1iNlRiuGSqdR90x0O05JrcoQ4UBL llm-docker-gpu
```

Для обычного Windows-пользователя ключ добавляется в:

```powershell
C:\Users\<USER>\.ssh\authorized_keys
```

Для пользователей из группы Administrators OpenSSH Server обычно читает:

```powershell
C:\ProgramData\ssh\administrators_authorized_keys
```

После добавления ключа права на файл администраторского ключа должны быть строгими:

```powershell
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r
icacls C:\ProgramData\ssh\administrators_authorized_keys /grant "Administrators:F" /grant "SYSTEM:F"
```

Проверка:

```powershell
ssh <USER>@docker-gpu.cin.su "whoami; hostname"
```

Для Codex настроен локальный SSH alias:

```powershell
ssh docker-gpu "whoami & hostname"
docker -H ssh://docker-gpu info
```

## Проверка Windows GPU/Docker

На самом Windows-хосте:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/check_windows_gpu_host.ps1
```

Через SSH, когда ключ уже добавлен:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/check_windows_gpu_host.ps1 -SshTarget <USER>@docker-gpu.cin.su
```

Скрипт проверяет:

- `nvidia-smi`;
- Docker Engine;
- Docker Compose;
- наличие/создание `Z:\LLM\models`;
- запуск CUDA-контейнера с `--gpus all`.

## Docker Desktop в SSH-сессии

На Windows-хосте Docker Desktop должен быть запущен в интерактивной пользовательской сессии. Если `docker version` показывает клиент, но не может открыть pipe `dockerDesktopLinuxEngine`, запустите Docker Desktop в активной RDP/console-сессии пользователя.

Проверка через Docker-over-SSH:

```powershell
docker -H ssh://docker-gpu version
docker -H ssh://docker-gpu run --rm --gpus all nvidia/cuda:12.4.1-base-ubuntu22.04 nvidia-smi
```

Если `ssh docker-gpu "docker pull ..."` падает с ошибкой `A specified logon session does not exist`, причиной может быть `credsStore: desktop` в `%USERPROFILE%\.docker\config.json`. Для деплоя предпочтительно тянуть образы локальным Docker CLI через `docker -H ssh://docker-gpu ...`; такой режим не требует удаленного desktop credential helper.

## Автозапуск Docker Desktop

На `M7` настроена задача Windows Task Scheduler:

```text
LLM-DockerDesktop-Autostart
```

Задача запускает:

```text
C:\ProgramData\LLM\Ensure-DockerDesktop.ps1
```

Режим:

- при старте Windows с задержкой 2 минуты;
- watchdog каждые 5 минут;
- запуск от пользователя `m7\m` с повышенными правами;
- пароль хранится в Windows Task Scheduler, не в репозитории и не в скрипте.

Лог:

```text
C:\ProgramData\LLM\logs\docker-desktop-autostart.log
```

Проверка задачи:

```powershell
ssh docker-gpu "schtasks /Query /TN LLM-DockerDesktop-Autostart /V /FO LIST"
ssh docker-gpu "cmd /c type C:\ProgramData\LLM\logs\docker-desktop-autostart.log"
```

После проверочной перезагрузки `2026-06-19` задача подняла Docker Desktop автоматически, а GPU smoke test прошел через `docker -H ssh://docker-gpu`.

## Env-файлы под Z:

Для Windows-хоста подготовлены отдельные примеры:

```text
core/deploy/docker-gpu/vllm/.env.windows-z.example
core/deploy/docker-gpu/llama-cpp/.env.windows-z.example
```

В них используются bind mount пути вида:

```text
HOST_MODELS_DIR=Z:/LLM/models
HOST_HF_CACHE_DIR=Z:/LLM/models/cache/huggingface
```

Внутри контейнеров модели видны как `/models`.

## Следующий запуск

После появления SSH-доступа и подтверждения GPU:

```powershell
powershell -NoProfile -ExecutionPolicy Bypass -File scripts/deploy_gpu_stack.ps1 `
  -SshTarget <USER>@docker-gpu.cin.su `
  -DockerHost ssh://<USER>@docker-gpu.cin.su `
  -VllmEnvFile core/deploy/docker-gpu/vllm/.env.windows-z.example `
  -LlamaEnvFile core/deploy/docker-gpu/llama-cpp/.env.windows-z.example `
  -Pull
```

Если Docker Desktop на Windows не принимает remote Docker over SSH напрямую, запуск compose нужно выполнить интерактивно на самом хосте через RDP/SSH PowerShell, используя те же `.env.windows-z.example`.
