Docs/ Operações/ Acesso ao Terminal

Acesso ao terminal

Um shell interativo dentro do contêiner em execução de um app, pelo navegador ou pelo servidor, e um terminal do host para administradores.

Terminal de um app

A aba Terminal de um app abre um shell dentro do contêiner em execução, por um WebSocket ligado ao docker exec com TTY.

  1. Abra o app e vá até a aba Terminal.
  2. Escolha o shell: sh (auto), bash, ash (Alpine) ou zsh. O shell precisa existir na imagem.
  3. Clique em Conectar. Desconectar encerra a sessão; fechar a aba também.
  • O shell roda com o usuário do contêiner, no diretório de trabalho dele, com as variáveis de ambiente do app, segredos incluídos.
  • Alterações em arquivos fora de um volume montado somem na próxima implantação, como no gerenciador de arquivos.
  • O painel se conecta ao contêiner principal. Num app composto por vários serviços, o WebSocket /api/v1/apps/<id>/terminal aceita um parâmetro service.

Pela CLI

sh0 ssh <app> [comando] executa um comando no contêiner do app, ou /bin/sh se nenhum for informado (saída real):

Terminal (on the server)
$ sh0 ssh my-api ls /app
[*] Connecting to my-api (a17f99c5c4ac)...
server.js

$ sh0 ssh my-api        # opens /bin/sh in the container
Warning
sh0 ssh não passa pela API: ele encontra o contêiner pelo rótulo e executa docker exec -it na máquina onde a CLI roda. Por isso só funciona no próprio servidor sh0, para um usuário com acesso ao Docker, e num terminal de verdade (caso contrário: “cannot attach stdin to a TTY-enabled container because stdin is not a terminal”). Ele não alcança apps num nó remoto. A partir do seu computador, use a aba Terminal.

Terminal do host

Configurações, Host Access oferece um terminal no próprio servidor, fora de qualquer contêiner, e um navegador de arquivos do host. O shell roda com as permissões do serviço sh0, que é root numa instalação padrão.

Danger
O terminal do host é o controle total da máquina: cada app, cada banco de dados, cada segredo nela. Ele é restrito aos papéis owner e admin; atribua esses papéis com cuidado.

Bancos de dados

Os servidores de banco de dados não têm terminal próprio no sh0 v1.10.2. Para rodar psql, mysql ou redis-cli, abra o terminal do host (ou entre no servidor por SSH) e use docker exec no contêiner do banco:

Terminal (on the server)
docker ps --format '{{.Names}}' | grep <database-name>
docker exec -it <container> psql -U <user> <database>

Quem pode abrir um shell

  • Terminal de um app -- papel developer no projeto do app.
  • Terminal do host -- papel owner ou admin.
  • Chaves de API -- os dois shells são recusados para chaves cujo escopo não é admin.
  • Revogação -- se o acesso do usuário for removido durante uma sessão, a sessão é encerrada.

Limitações

  • O app precisa estar rodando: um app parado não tem contêiner.
  • Não é possível entrar em imagens sem shell (distroless, scratch).
  • A aba Terminal funciona para apps num nó remoto, pela conexão do nó; sh0 ssh, não.
  • Os comandos digitados num shell não são registrados pelo sh0.