# Modo de desenvolvimento do Spaces: desenvolvimento sem atritos em Spaces

> [!WARNING]
> O Spaces Dev Mode faz parte dos planos PRO ou Team & Enterprise.

## Spaces Modo de Desenvolvimento

O Dev Mode do Spaces é um recurso que facilita o depuramento do seu aplicativo e torna a iteração em Spaces mais rápida.

Sempre que você faz commit de algumas alterações no repositório do seu Space, a imagem Docker subjacente é reconstruída e, em seguida, uma nova máquina virtual é provisionada para hospedar o novo container.

O Modo de Desenvolvimento permite que você atualize seu Space muito mais rapidamente, substituindo a imagem Docker.

A imagem Docker do Dev Mode inicia sua aplicação como um sub-processo, permitindo que você a reinicie sem parar o próprio contêiner do Space. Ela também inicia um servidor SSH (para editores e terminais locais) e um servidor VS Code (para o VS Code Web no produto) em segundo plano, para que você possa se conectar ao Space.

A capacidade de se conectar ao Space em execução libera vários casos de uso:

    - Você pode fazer alterações no código do aplicativo sem que o Space precise ser reconstruído a cada vez
    - Você pode depurar um aplicativo em execução e monitorar recursos ao vivo

No geral, isso torna o desenvolvimento e a experimentação com Spaces muito mais rápidos, pois elimina a fase de reconstrução da imagem Docker.

## Interface

Quando o Modo de Desenvolvimento é ativado no seu Space, você deve ver um modal como o seguinte.

O aplicativo não reinicia automaticamente quando você altera o código. Para que suas alterações apareçam no Space, você precisa usar o botão `Refresh`, que reiniciará o aplicativo.

  Se você estiver usando o Gradio SDK ou se sua aplicação for baseada em Python, observe que os requisitos não são instalados automaticamente. Você precisará executar manualmente `pip install` a partir do VS Code ou do SSH.

### Conectando

O Dev Mode expõe o Space em execução como um host SSH padrão. O VS Code e qualquer outro editor se conectam por meio desse mesmo endpoint SSH.

#### SSH

Quando o Dev Mode estiver em execução, conecte-se com:

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

O subdomínio é exibido na janela de controles do Modo de Desenvolvimento. Você também pode obtê-lo programaticamente:

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

O CLI do Hugging Face pode resolver o subdomínio e abrir a sessão para você:

```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
```

Pass `--auto` para habilitar o Dev Mode sem solicitar confirmação, caso ele ainda não esteja em execução. Consulte a [referência da CLI `hf spaces ssh`](https://huggingface.co/docs/huggingface_hub/package_reference/cli#hf-spaces-ssh) para a lista completa de opções.

Você precisará adicionar a chave pública SSH da sua máquina em [sua conta de usuário](https://huggingface.co/settings/keys) para poder se conectar ao Space usando SSH. Consulte a documentação de [Git over SSH](./security-git-ssh#add-a-ssh-key-to-your-account) para instruções mais detalhadas.

#### VS Code

Você também pode usar uma instalação local do VS Code para se conectar ao contêiner do Space. Para isso, instale a extensão [Remote - SSH](https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh) e conecte-se ao mesmo host `<space-subdomain>@ssh.hf.space`.

### Persistindo alterações

As alterações que você faz quando o Modo de Desenvolvimento está ativado não são persistidas automaticamente no repositório do Space. Por padrão, elas serão descartadas quando o Modo de Desenvolvimento for desativado ou quando o Space entrar em modo de espera.

Se você deseja persistir as alterações feitas enquanto o Modo de Desenvolvimento estiver ativado, é necessário usar `git` a partir do contêiner do Space (usando VS Code ou SSH). Por exemplo:

```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
```

O modal exibirá um aviso se você tiver alterações não commitadas ou não pushadas no Space:

## Ativando o Modo de Desenvolvimento

Você pode ativar o Dev Mode no seu Space pela interface web ou pela API.

### Via a API

Você pode alternar o Modo de Desenvolvimento programaticamente:

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

{
  "enabled": true
}
```

### Pela interface web

Você também pode criar um Space com o modo de desenvolvimento ativado:

## Limitações

O Dev Mode não está disponível no momento para Spaces estáticos. Spaces Docker também possuem alguns requisitos adicionais.

### Espaços do Docker

O Dev Mode é suportado para Spaces do Docker. No entanto, seu Space precisa estar em conformidade com as seguintes regras para que o Dev Mode funcione corretamente.

1. Os seguintes pacotes devem ser instalados:

- `bash` (necessário para estabelecer conexões SSH)
- `curl`, `wget` e `procps` (necessários pelo processo do servidor do VS Code)
- `git` e `git-lfs` para poder commitar e enviar alterações do seu ambiente de Dev Mode

2. O código da sua aplicação deve estar localizado na pasta `/app` para que o daemon do Dev Mode consiga detectar alterações.

3. A pasta `/app` deve ser propriedade do usuário com uid `1000` para permitir que você faça alterações no código.

4. O Dockerfile deve conter uma instrução `CMD` para inicialização. Consulte a [documentação do Docker](https://docs.docker.com/reference/dockerfile/#cmd) sobre a instrução `CMD` para mais detalhes.

O Dev Mode funciona bem quando a imagem base é baseada em debian (por exemplo, ubuntu).

Distribuições Linux mais exóticas (por exemplo, alpine) não são testadas e o Dev Mode não é garantido para funcionar nelas.

### Exemplo de Dockerfiles compatíveis

Este é um exemplo de um Dockerfile compatível com o Spaces Dev Mode.

Ele instala os pacotes necessários com `apt-get`, além de alguns extras para conveniência do desenvolvedor (a saber: `top`, `vim` e `nano`). Em seguida, inicia uma aplicação NodeJS a partir de `/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"]
```

Existem vários exemplos de Spaces Docker compatíveis com o Dev Mode nesta organização. Sinta-se à vontade para duplicá-los no seu namespace!

Exemplo de aplicativo Python (servidor HTTP FastAPI): https://huggingface.co/spaces/dev-mode-explorers/dev-mode-python

Exemplo de aplicativo JavaScript (servidor HTTP Express.js): https://huggingface.co/spaces/dev-mode-explorers/dev-mode-javascript

## Feedback

Você pode compartilhar seu feedback sobre o Spaces Dev Mode diretamente no HF Hub: https://huggingface.co/spaces/dev-mode-explorers/README/discussions

