Skip to content

CH 27 · Opções de Implantação

Contagem de palavras~4.210 palavrasTempo~25 minPré-requisitosCH 03, CH 05NívelReproduzível

Objetivo do Capítulo

Você tem usado dsh web localmente para rodar o dsh — essa é a forma mais comum, mas não a única. O dsh possui principalmente quatro formas de execução, cada uma adequada a diferentes cenários:

  • Web UI local: o que os tutoriais anteriores vêm demonstrando
  • Headless CLI: sem necessidade de interface, um único comando executa uma tarefa e sai, adequado para scripts e CI
  • Python SDK: incorpore o dsh em seu próprio programa Python, o Agent se torna uma chamada de função no seu código
  • Docker containerizado: instale o dsh em um contêiner rodando em um servidor, adequado para compartilhamento em equipe — este capítulo traz um tutorial completo de implantação

Depois de ler você saberá: qual forma usar conforme sua necessidade, em vez de conhecer apenas dsh web.

Primeiro Esclarecimento: Por Que o dsh Tem Múltiplas Formas

Voltando ao "tudo é plugin" do CH 08 — o núcleo do dsh é @deepseek-ai/dsh-base (adaptador de modelo, ferramentas, persistência, sandbox, aprovação etc., capacidades de baixo nível), e empilhar diferentes bundles sobre ele se transforma em diferentes formas:

Bundle empilhadoSe tornaComo iniciar
@deepseek-ai/dsh-web-appWeb UI com interface de navegadordsh web
@deepseek-ai/dsh-headlessSem interface, linha de comando executa-e-saidsh --profile headless "tarefa"
Wrapper Python SDKIncorporar em programas Pythonpip install deepseek-harness-sdk
Qualquer um dos anteriores containerizadoRodando por longo tempo em um servidordocker compose up -d

A mesma base, quatro formas de vestir. Isso é "tudo é plugin" mais uma vez — a própria forma é uma combinação de bundles.

Forma Um: Web UI Local

O que o CH 03 ao CH 04 vêm demonstrando é isto. dsh web para iniciar, o navegador abre http://127.0.0.1:3080, sessões, plugins, chaves todos armazenados localmente.

Adequado para uso pessoal diário, depuração de plugins, iniciantes. A limitação é que o computador precisa estar ligado para usar — desligue o computador e o Agent para, não adequado para cenários que precisam de 7x24 online, ou deixar outros acessarem a qualquer momento.

Forma Dois: Headless CLI

O CH 05 já tratou disso na prática. Sem interface, dê uma tarefa, execute, exiba o resultado, saia.

powershell
dsh --profile headless "Resuma o README do diretório atual em três frases"

Adequado para scripts, CI/CD, tarefas agendadas (a do CH 15 que coleta os tópicos quentes de IA todos os dias usa isso), processamento em lote. Não adequado para cenários que precisam de diálogo multi-turno.

Um limite: cada chamada headless é uma sessão independente, termina quando concluída. Para reutilizar contexto você precisa do Python SDK, ou escrever handover baseado em arquivo.

Forma Três: Python SDK

Transforme o dsh em uma biblioteca em código Python, o Agent é uma chamada de função. pip install deepseek-harness-sdk para instalar, o SDK vem com um runtime Node, a máquina alvo não precisa instalar Node separadamente.

python
from deepseek_harness_sdk import DeepSeekHarness

dsh = DeepSeekHarness()
result = dsh.run("Liste os arquivos do diretório atual, pule node_modules")
print(result.last_message)

Adequado para incorporar Agent em seu próprio produto, precisando de controle fino de sessão (reutilização, escuta de eventos, saída em streaming), tarefas em lote compartilhando contexto. Não adequado para quem só quer executar rapidamente uma tarefa (uma linha de comando headless é suficiente).

Um detalhe: o SDK e a Web UI são duas instâncias independentes, não podem compartilhar uma Web UI em execução, cada uma tem seu próprio DSH_HOME.

Forma Quatro: Contêiner Docker (Tutorial Completo de Implantação)

Instale o dsh em um contêiner Docker, rodando em um servidor, adequado para execução de longo prazo e compartilhamento em equipe.

Antes de ir para o servidor, algumas palavras: se você não tem um servidor, as atividades de novos usuários da Tencent Cloud frequentemente têm servidores de aplicação leves de baixo custo, pouco mais de 100 yuans por ano, mais que suficiente para o dsh. Também a Tencent Cloud agora suporta selecionar a imagem do DeepSeek Harness diretamente ao criar instâncias, quem gosta de mexer pode estudar por conta própria. Abaixo demonstramos o fluxo completo de implantação usando um projeto open-source maduro da comunidade.

deepseek-harness-web-docker empacota dsh + Caddy (proxy reverso + autenticação Basic Auth) em um contêiner, pronto para uso, dados persistidos e verificação de saúde automática.

Que Problema Este Projeto Resolve

Três pontos de dor ao usar o dsh web oficial diretamente em um servidor:

  1. Sem autenticação — a Web UI do dsh não tem mecanismo de login por padrão, implantação pública equivale a rodar exposto
  2. Só escuta no loopback127.0.0.1 padrão, é preciso mudar a configuração para permitir acesso externo
  3. Gestão de ambiente é chata — versão do Node, dependências, diretórios de dados tudo precisa ser gerenciado por você

Este projeto usa Caddy como proxy reverso, adiciona Basic Auth (login com usuário/senha), o dsh só escuta no loopback dentro do contêiner, requisições externas precisam passar pela autenticação do Caddy para entrar. Dados são todos montados para o diretório ./data do host, deletar o contêiner e não perder dados.

Passo 1: Preparação

Um servidor Linux (2-core 2G para começar), com o painel BaoTa (BT) instalado. O AI do BaoTa precisa ter o modelo configurado primeiro para usar — vá no menu esquerdo AI → no topo Settings → clique em Add Custom Model, preencha a API Key do seu modelo.

Painel BaoTa adicionar modelo personalizado

Depois de configurar o modelo, o AI do BaoTa pode ajudá-lo a executar comandos.

Passo 2: Implantação com Um Clique do AI do BaoTa

Clique em AI no menu esquerdo do painel BaoTa, envie o seguinte prompt para ele:

text
Me ajude a implantar o DeepSeek Harness Web Docker, faça nesta ordem:
1. Confirme que Docker e Docker Compose estão instalados, instale se não estiverem
2. Endereço do projeto é https://github.com/Xidong-AI/deepseek-harness-web-docker
3. Entre no diretório do projeto, cp .env.example .env
4. Edite .env: DSH_AUTH_USER=admin, DSH_AUTH_PASSWORD defina uma senha forte, DEEPSEEK_API_KEY etc. me diga o caminho do arquivo antes de iniciar que eu preencho sozinho
5. docker compose up -d para iniciar
6. Me dê um resumo depois da verificação

O AI do BaoTa vai ajudá-lo. Quando chegar no passo 4, ele vai configurar tudo no arquivo .env exceto a API Key, depois te dizer o caminho do arquivo para você preencher o DEEPSEEK_API_KEY sozinho:

AI do BaoTa pede para preencher a API Key do .env

Depois de preencher, responda "Done", e a AI vai continuar com docker compose up -d para iniciar, depois fazer verificação de saúde, e finalmente te dar um resumo completo:

AI do BaoTa verifica sucesso da implantação

Quando o status do contêiner for healthy e o Basic Auth estiver ativo (retorna 401 sem credenciais), a implantação foi bem-sucedida.

Passo 3: Acesso

Abra http://server-IP:3080 no navegador, uma caixa de login Basic Auth aparecerá, digite o usuário e senha que você definiu no .env, e você pode entrar na Web UI do dsh.

Note que o canto superior esquerdo do navegador mostrará "Não seguro" — isso é porque o protocolo atual é HTTP, sem certificado SSL, não é um problema do dsh em si. Implantação em produção deve vincular um domínio + HTTPS (próximo passo).

Navegador mostra não seguro

Depois de entrar, é igual a usar o dsh localmente — escolha um workspace, envie mensagens.

Passo 4: Vincular um Domínio + HTTPS

Ambientes de produção devem vincular um domínio + HTTPS para funcionar corretamente. Se você acessar diretamente via http://server-IP, receberá este erro ao escolher um workspace:

Erro crypto.randomUUID ao escolher workspace

O motivo é que crypto.randomUUID() é uma Web API do navegador; o padrão diz que só está disponível em um contexto seguro — ou seja, páginas https://, ou localhost/127.0.0.1. Acessar via http://IP é um contexto inseguro, essa função é undefined, o front-end lança crypto.randomUUID is not a function no momento em que cria uma sessão ou escolhe um workspace.

Então vincular domínio + HTTPS não é uma otimização opcional, é obrigatório.

Pré-requisito: primeiro vá no console de gestão do seu domínio (Tencent Cloud DNSPod, Alibaba Cloud Wanwang, etc.), adicione um registro A para o seu domínio, apontando para o IP público do seu servidor. Aguarde alguns minutos para a resolução fazer efeito.

Continue a conversa que você acabou de ter (não precisa começar uma nova), envie o seguinte para o AI do BaoTa:

text
Me ajude a vincular um domínio ao dsh que acabei de implantar e solicite um certificado SSL e configure para mim
1. O domínio é seu-dominio, já resolvido para este servidor
2. Verifique que https://seu-dominio está acessível, me diga o resultado

O AI do BaoTa vai modificar automaticamente a config do Caddy, abrir portas, reiniciar o contêiner, e solicitar o certificado. Depois de concluído, visite https://seu-dominio, o canto superior esquerdo do navegador mostrará o ícone de cadeado, não mais "Não seguro".

O certificado é emitido pela Let's Encrypt, Caddy renovará automaticamente, sem gestão manual.

Manutenção Contínua

Depois da implantação, para dúvidas diárias basta perguntar diretamente ao AI do BaoTa, por exemplo:

  • "Como atualizar o contêiner do dsh para a versão mais recente?"
  • "Como ver os logs de execução do contêiner do dsh?"
  • "Como reiniciar o contêiner do dsh?"
  • "Como fazer backup dos dados do dsh?"
  • "O contêiner do dsh está ocupando muito espaço em disco, como limpar?"

Ele vai dar os comandos correspondentes com base no seu ambiente real e executá-los. Dados ficam todos no ./data/ do diretório do projeto, deletar o contêiner ou atualizar a imagem não perderá dados; para fazer backup, basta copiar todo o diretório ./data.

Que Ferramentas Podem Ser Instaladas no Contêiner

O contêiner vem com node 22, pnpm, python3, git, curl, jq, ripgrep, make/gcc (para compilar módulos nativos), Rust e outras ferramentas comuns pré-instaladas. O Agent também pode usar x-cmd para instalar mais ferramentas por conta (sem root), os dados instalados também ficam em ./data, sobrevivem a reinicializações.

Observações

  1. A versão atual do dsh não tem isolamento multiusuário — todos usam o mesmo Basic Auth para logar e veem a mesma sessão e configuração. Quando a equipe compartilha, não armazene informações sensíveis, ou faça cada pessoa implantar uma instância independente.
  2. Não codifique API Key no compose — use um arquivo .env, o projeto já tem isso no git-ignore.
  3. O Agent trabalha dentro do contêiner — o que ele vê é o sistema de arquivos dentro do contêiner, não o do seu servidor. Para que ele opere em um diretório do seu servidor, é preciso adicionar um volume mount no docker-compose, mapeando o diretório do host para dentro do contêiner.
  4. Mudar senha: edite DSH_AUTH_PASSWORD no .env, depois docker compose up -d, o contêiner regenerará o hash automaticamente na inicialização.

Como Escolher: Uma Tabela

Sua necessidadeEscolha qualPor quê
Abrir um navegador todo dia para trabalhar com o AgentWeb UI LocalInterface intuitiva, dá para ver trajectory e aprovar
Incorporar em scripts / CI / tarefas agendadasHeadless CLIUm comando, executa-e-sai
Incorporar Agent no seu próprio programaPython SDKChamada em nível de função, dá para controlar sessão e eventos
Servidor rodando por longo prazo / compartilhamento em equipeDockerImplantação containerizada, auto restart, dados montados
Tarefas em lote precisam de contexto compartilhadoPython SDKheadless é sessão independente por chamada, SDK pode reutilizar

Uma sugestão prática: a maioria das pessoas pode começar apenas com a Web UI local. Quando precisar de automação, adicione headless; quando precisar incorporar em um produto, adicione SDK; quando precisar ir para um servidor, use Docker. Não precisa configurar as quatro desde o início — o benefício do dsh é alternar sob demanda, a base é o mesmo conjunto de coisas.

O Que Você Aprendeu Neste Capítulo

Você passa se conseguir completar os itens abaixo:

  • [ ] Saber que o dsh tem quatro formas de implantação: Web UI local, Headless CLI, Python SDK, Docker
  • [ ] Saber os métodos de inicialização e cenários aplicáveis das quatro formas
  • [ ] Conseguir escolher a forma certa conforme a necessidade — em vez de conhecer apenas dsh web
  • [ ] Saber que cada chamada Headless é uma sessão independente, para reutilizar contexto use SDK
  • [ ] Saber que o Python SDK vem com um runtime Node, e é uma instância independente da Web UI
  • [ ] Conseguir usar o projeto deepseek-harness-web-docker para implantar o dsh com Basic Auth em um servidor
  • [ ] Conseguir vincular domínio + HTTPS ao dsh implantado (certificado automático do Caddy)
  • [ ] Saber as observações da implantação Docker: sem isolamento multiusuário, chaves em .env, diferenças de caminho dentro do contêiner

Open Source · MIT · Community Driven