# Spaces Dev Mode: бесшовная разработка в Spaces

> [!WARNING]
> Режим разработки Spaces входит в состав тарифных планов PRO или Team & Enterprise.

## Spaces Dev Mode

Spaces Dev Mode — это функция, которая упрощает отладку вашего приложения и ускоряет итерации в Spaces.

Каждый раз, когда вы отправляете изменения в репозиторий вашего Space, базовый образ Docker пересобирается, а затем выделяется новая виртуальная машина для размещения нового контейнера.

Режим Dev позволяет значительно быстрее обновлять ваш Space, переопределяя Docker-образ.

Docker-образ Dev Mode запускает ваше приложение как дочерний процесс, что позволяет перезапускать его без остановки самого контейнера Space. Он также запускает в фоновом режиме SSH-сервер (для локальных редакторов и терминалов) и сервер VS Code (для встроенного в продукт VS Code Web), чтобы вы могли подключиться к Space.

Возможность подключаться к работающему Space открывает несколько вариантов использования:

    - Вы можете вносить изменения в код приложения без необходимости пересобирать Space каждый раз
    - Вы можете отлаживать работающее приложение и отслеживать ресурсы в реальном времени

В целом это значительно ускоряет разработку и эксперименты со Spaces, позволяя пропустить этап пересборки Docker-образа.

## Интерфейс

После включения режима Dev на вашем Space вы должны увидеть модальное окно, подобное следующему.

Приложение не перезапускается автоматически при изменении кода. Чтобы изменения отобразились в Space, необходимо нажать кнопку `Refresh`, которая перезапустит приложение.

  Если вы используете Gradio SDK или ваше приложение написано на Python, обратите внимание, что зависимости не устанавливаются автоматически. Вам нужно вручную выполнить `pip install` из VS Code или по SSH.

### Подключение

Dev Mode предоставляет доступ к запущенному Space как к стандартному SSH-хосту. VS Code и любой другой редактор подключаются через тот же SSH-эндпоинт.

#### SSH

После запуска Dev Mode подключитесь с помощью:

```shell
ssh <space-subdomain>@ssh.hf.space
```

Поддомен отображается в модальном окне управления Dev Mode. Вы также можете получить его программно:

```python
from huggingface_hub import HfApi
print(HfApi().space_info("namespace/repo").subdomain)
```

CLI Hugging Face может разрешить поддомен и открыть сессию за вас:

```shell
# SSH into the Space's Dev Mode container
hf spaces ssh username/my-space

# Print the SSH command instead of running it
hf spaces ssh username/my-space --dry-run

# Use a specific identity file
hf spaces ssh username/my-space -i ~/.ssh/id_ed25519
```

Передайте `--auto`, чтобы включить Dev Mode без запроса, если он ещё не запущен. Полный список параметров см. в [справке по CLI `hf spaces ssh`](https://huggingface.co/docs/huggingface_hub/package_reference/cli#hf-spaces-ssh).

Чтобы подключиться к Space по SSH, вам нужно добавить публичный SSH-ключ вашего компьютера в [вашу учётную запись](https://huggingface.co/settings/keys). Подробные инструкции приведены в документации [Git over SSH](./security-git-ssh#add-a-ssh-key-to-your-account).

#### VS Code

Вы также можете использовать локальную установку VS Code для подключения к контейнеру Space. Для этого установите расширение [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh) и подключитесь к тому же хосту `<space-subdomain>@ssh.hf.space`.

### Сохранение изменений

Изменения, внесённые при включённом режиме Dev Mode, не сохраняются в репозиторий Space автоматически. По умолчанию они будут удалены при отключении Dev Mode или при переходе Space в спящий режим.

Если вы хотите сохранить изменения, внесённые при включённом режиме разработки, вам нужно использовать `git` изнутри контейнера Space (через VS Code или SSH). Например:

```shell
# Add changes and commit them
git add .
git commit -m "Persist changes from Dev Mode"

# Push the commit to persist them in the repo
git push
```

Модальное окно отобразит предупреждение, если в Space есть незакоммиченные или не отправленные изменения:

## Включение режима разработки

Вы можете включить Dev Mode в вашем Space через веб-интерфейс или через API.

### Через API

Вы можете переключить режим разработки программно:

```
POST https://huggingface.co/api/spaces/{namespace}/{repo}/dev-mode
Content-Type: application/json
Authorization: Bearer {token}

{
  "enabled": true
}
```

### Через веб-интерфейс

Вы также можете создать Space с включенным режимом разработки:

## Ограничения

Dev Mode в настоящее время недоступен для статических Spaces. Для Docker Spaces также существуют дополнительные требования.

### Docker Spaces

Режим разработки поддерживается для Docker Spaces. Однако для корректной работы режима разработки ваш Space должен соответствовать следующим правилам.

1. Необходимо установить следующие пакеты:

- `bash` (необходим для установления SSH-соединений)
- `curl`, `wget` и `procps` (необходимы для процесса сервера VS Code)
- `git` и `git-lfs` для возможности коммитить и отправлять изменения из вашей среды Dev Mode

2. Код вашего приложения должен находиться в папке `/app`, чтобы демон Dev Mode мог обнаруживать изменения.

3. Папка `/app` должна принадлежать пользователю с uid `1000`, чтобы вы могли вносить изменения в код.

4. Dockerfile должен содержать инструкцию `CMD` для запуска. Подробности об инструкции `CMD` см. в [документации Docker](https://docs.docker.com/reference/dockerfile/#cmd).

Dev Mode хорошо работает, если базовый образ основан на Debian (например, Ubuntu).

Более экзотические дистрибутивы Linux (например, alpine) не тестируются, и работа Dev Mode на них не гарантируется.

### Примеры совместимых Dockerfile

Это пример Dockerfile, совместимый с Spaces Dev Mode.

Он устанавливает необходимые пакеты с помощью `apt-get`, а также несколько дополнительных для удобства разработчика (а именно: `top`, `vim` и `nano`). Затем запускает приложение NodeJS из `/app`.

```Dockerfile
FROM node:19-slim

RUN apt-get update && \
    apt-get install -y \
      bash \
      git git-lfs \
      wget curl procps \
      htop vim nano && \
    rm -rf /var/lib/apt/lists/*

WORKDIR /app
COPY --link ./ /app
RUN  npm i 

RUN chown 1000 /app
USER 1000
CMD ["node", "index.js"]
```

В этой организации есть несколько примеров Docker Spaces, совместимых с Dev Mode. Вы можете свободно дублировать их в своём пространстве имён!

Пример приложения на Python (HTTP-сервер FastAPI): https://huggingface.co/spaces/dev-mode-explorers/dev-mode-python

Пример приложения на JavaScript (HTTP-сервер Express.js): https://huggingface.co/spaces/dev-mode-explorers/dev-mode-javascript

## Обратная связь

Вы можете поделиться своим мнением о Spaces Dev Mode напрямую на HF Hub: https://huggingface.co/spaces/dev-mode-explorers/README/discussions

