Índice do diárioDockup / nota de campo
Note / self-host-code-server

Como hospedar o code-server por conta própria em 2026: WebSockets, workspaces e controle de acesso

Hospede o code-server por conta própria com portas corretas, armazenamento persistente, HTTPS, secrets, backups e verificações de atualização. Saiba como corrigir bloqueios de WebSockets pelo proxy.

Uma implantação do code-server que falha nem sempre é encerrada. Ela pode exibir uma página de login enquanto o proxy bloqueia WebSockets ou a propriedade dos arquivos impede a instalação de extensions. Em vez disso, comece com uma verificação de ponta a ponta: faça login, abra um repositório montado, crie um arquivo, execute um comando no terminal, instale uma extension e reconecte o WebSocket do editor.

Essa verificação corresponde ao propósito catalogado do code-server: o VS Code executado no browser em uma máquina remota. Ela também revela dependências ausentes, suposições incorretas sobre o proxy e dados efêmeros mais cedo do que uma verificação de uptime.

Do que o code-server depende

Defina três limites ao redor do code-server: entrada na porta 8080, estado durável e requisitos de suporte. O container pode ser substituído, mas os outros dois precisam de responsáveis explícitos. O requisito do runtime local é um mount de workspace contendo apenas os projetos que o editor deve acessar. Teste esse limite antes da publicação e novamente após substituir um container.

O diagrama está completo quando um cliente limpo consegue fazer login, abrir um repositório montado, criar um arquivo, executar um comando no terminal, instalar uma extension e reconectar o WebSocket do editor. Registre dados de tempo e recursos de memória e CPU usados por language servers, builds, extension hosts e terminais, e não pelo web shell do code-server. Se a transação falhar, o primeiro limite que não se comportar conforme documentado indicará se a investigação deve se concentrar no roteamento, na capacidade local ou em um serviço de suporte.

Transforme o comando local em um serviço observável

Um lançamento com características de produção é intencionalmente simples: estado nomeado, porta explícita e nenhum secret dentro da imagem.

docker run -d \
  --name code-server \
  --restart unless-stopped \
  -p 127.0.0.1:8080:8080 \
  -v code-server-data:/home/coder \
  -e PASSWORD=replace-with-a-long-random-value \
  codercom/code-server:latest \
  --bind-addr 0.0.0.0:8080 --auth password .

O exemplo é uma base, não uma stack de suporte completa. Confirme o requisito local antes de expor o serviço: um mount de workspace contendo apenas os projetos que o editor deve acessar. Verifique os mounts efetivos e o listener; em seguida, tente fazer login, abrir um repositório montado, criar um arquivo, executar um comando no terminal, instalar uma extension e reconectar o WebSocket do editor. Fixe a imagem funcional antes da próxima reinicialização.

Torne a origem pública inequívoca

Coloque o editor atrás de HTTPS e preserve as atualizações de WebSocket. Envie o hostname escolhido para a porta 8080 do container, encaminhe o host original e o esquema HTTPS e evite publicar uma segunda origem direta.

Teste o code-server a partir de um cliente externo limpo. Separe uma falha de entrada do limite conhecido da aplicação — o proxy bloqueia WebSockets ou a propriedade dos arquivos impede a instalação de extensions. Um erro de certificado, DNS ou 502 pertence ao roteamento; uma solicitação que chega ao code-server e falha depois pertence ao estado da aplicação, à capacidade ou ao requisito de suporte. O guia de TLS para domínios personalizados aborda o primeiro grupo.

Faça backup do estado que o code-server não consegue recriar

Uma imagem de container pode ser baixada novamente; a configuração, as extensions e os diretórios de projeto montados explicitamente, não. Monte /home/coder antes do bootstrap, grave dados de exemplo inofensivos e substitua o container para provar que esse caminho é realmente persistente. Inspecione o mount efetivo em vez de confiar no nome de um arquivo do Compose e verifique se o usuário do runtime consegue gravar onde o code-server espera.

Escolha a retenção e um destino externo ao host; depois, ensaie a recuperação sem tocar na produção. O exercício só passa quando as configurações, as extensions e os arquivos do workspace retornam com a propriedade correta e o terminal é iniciado com o usuário pretendido. Para estados baseados em banco de dados, combine snapshots de armazenamento com exports consistentes com a aplicação, conforme descrito em recuperação point-in-time versus snapshots.

Reforce a segurança do code-server após o bootstrap

No caso do code-server, a superfície relevante não é necessariamente a página inicial. O principal erro é conceder casualmente ao container acesso ao socket do Docker ou ao sistema de arquivos completo do host. Evite isso de forma deliberada: monte apenas os workspaces desejados, não use o socket do Docker do host e coloque o editor atrás de HTTPS e de uma autenticação forte.

Substitua imediatamente o PASSWORD de exemplo, armazene-o fora da imagem e faça sua rotação como faria com uma credencial de administrador se ele for exposto. Use um usuário de container sem privilégios quando a imagem oferecer suporte e não monte credenciais sem relação com o serviço. Aplique limites de taxa ou tamanho na entrada, pois trabalhos não confiáveis podem consumir memória e CPU usados por language servers, builds, extension hosts e terminais, e não pelo web shell do code-server.

Diagnostique um code-server com aparência saudável

Observe o trabalho realizado pelo code-server: memória e CPU usadas por language servers, builds, extension hosts e terminais, e não pelo web shell do code-server. Defina limites com margem para esse trabalho e evite uma liveness probe que concorra com ele. A verificação operacional ainda deve tentar fazer login, abrir um repositório montado, criar um arquivo, executar um comando no terminal, instalar uma extension e reconectar o WebSocket do editor periodicamente.

Nas atualizações, lembre-se de que a compatibilidade das extensions e as toolchains da imagem base podem mudar mesmo quando a interface do code-server continua iniciando. Implante a versão candidata em uma cópia recuperada e repita o teste conhecido. Se o proxy bloquear WebSockets ou a propriedade dos arquivos impedir a instalação de extensions, use os logs do runtime e a solicitação de rede real para descobrir qual suposição mudou.

Evidências a coletar antes de colocar o code-server em produção

Crie um fixture pequeno e descartável do code-server e mantenha-o para cada release. O fixture deve exercitar o fluxo de trabalho real: fazer login, abrir um repositório montado, criar um arquivo, executar um comando no terminal, instalar uma extension e reconectar o WebSocket do editor. Registre o digest da imagem, o hostname externo, o endereço da dependência e o resultado esperado para que outro operador possa repetir o teste posteriormente sem precisar interpretar este guia.

Execute o fixture três vezes. Primeiro, use a implantação nova. Em seguida, substitua o container sem tocar no estado durável. Por fim, restaure o backup em um ambiente vazio. A terceira execução só passa quando as configurações, as extensions e os arquivos do workspace retornam com a propriedade correta e o terminal é iniciado com o usuário pretendido. Durante cada execução, capture a latência e o uso de recursos relacionados à memória e à CPU usados por language servers, builds, extension hosts e terminais, e não pelo web shell do code-server; isso se torna a baseline dos alertas, em vez de uma porcentagem de CPU arbitrária.

Por fim, teste deliberadamente o caminho negativo: envie uma entrada inofensiva próxima do limite de recurso ou formato associado a este limite: o proxy bloqueia WebSockets ou a propriedade dos arquivos impede a instalação de extensions. Confirme que o code-server falha de forma visível sem corromper o estado, restaure a condição correta e repita a transação bem-sucedida. Um registro de release contendo esses quatro resultados é uma evidência mais forte do que screenshots de um dashboard ou uma resposta única do curl.

Transfira o trabalho repetível de infraestrutura para o Dockup

O Dockup pode cuidar dos componentes substituíveis da plataforma: direcionar o tráfego para a porta 8080, emitir o domínio e o certificado, injetar secrets, anexar armazenamento persistente e conectar o code-server a serviços gerenciados ou anexados de forma privada. Isso pode ser feito na infraestrutura do Dockup ou em um servidor que você anexar.

O trabalho de aceitação do code-server continua explícito. Após a implantação com um clique, coloque o editor atrás de HTTPS e preserve as atualizações de WebSocket, confirme o requisito local — um mount de workspace contendo apenas os projetos que o editor deve acessar — e execute este cenário: faça login, abra um repositório montado, crie um arquivo, execute um comando no terminal, instale uma extension e reconecte o WebSocket do editor. Essa divisão é intencional: o Dockup elimina a configuração repetitiva de infraestrutura sem fingir que as funções da aplicação, as credenciais do provedor ou a política de restauração se escolhem sozinhas.

Perguntas frequentes

Do que o code-server precisa para uma implantação em produção?

Direcione o container do code-server na porta 8080 por meio de uma única origem HTTPS. O requisito do runtime local é um mount de workspace contendo apenas os projetos que o editor deve acessar. Não considere o code-server pronto até conseguir fazer login, abrir um repositório montado, criar um arquivo, executar um comando no terminal, instalar uma extension e reconectar o WebSocket do editor.

Quais dados do code-server devem fazer parte de um backup?

Torne /home/coder persistente e inclua a configuração, as extensions e os diretórios de projeto montados explicitamente no mesmo manifesto de recuperação. Uma restauração limpa do code-server só passa quando as configurações, as extensions e os arquivos do workspace retornam com a propriedade correta e o terminal é iniciado com o usuário pretendido.

O code-server precisa de HTTPS atrás de um reverse proxy?

Use HTTPS para a origem pública do code-server e mantenha a porta 8080 na rota interna. Aplique corretamente a configuração do code-server: coloque o editor atrás de HTTPS e preserve as atualizações de WebSocket. No caso do code-server, o HTTPS protege credenciais ou conteúdo do usuário durante o trânsito e mantém consistente o comportamento do cliente sensível à origem.

Como testar uma atualização do code-server?

Restaure o estado atual do code-server em uma implantação isolada, aplique a versão candidata e repita sua transação de aceitação. Preste atenção especial, pois a compatibilidade das extensions e as toolchains da imagem base podem mudar mesmo quando a interface do code-server continua iniciando. Mantenha a imagem anterior do code-server até entender os limites de migração de dados e rollback.