Erro:
No caso de Container NodeJS, o erro é quase sempre o mesmo. A aplicação terminou com erro.
Por natureza de Containers, eles tem um processo principal. Que é executado junto com o container e é derrubado quando o container é derrubado, ou vice versa.
O vice-versa é que é a parte importante nesse caso, pois a aplicação principal de um Container Node é a própria aplicação Node que é hospedada no container. O que significa que se a aplicação terminar, (seja por erro ou forçado) o container será derrubado junto. E não é possível conectar por SSH em um container que não está online. Exemplo de logs de uma aplicação Node que terminou com erro:
Como resolver?
Basta fazer um novo deploy, corrigindo o erro que estava fazendo a aplicação crashar/terminar!
Tá mas, pra resolver isso, eu preciso conectar por SSH
Eu preciso corrigir o erro conectando por SSH. Mas não consigo conectar por SSH por causa do erro
Se você estiver preso nesse deadlock, há uma maneira de resolver. Porém exige uma certa quantia de gambiarra…
Basicamente, alteraria a aplicação para uma de testes, que não faz nada. Mas fica fazendo nada pra sempre, permitindo que o container permaneça online.
- Vá no gerenciador de arquivos
- Crie um arquivo .js. temporario.js, por exemplo
- Nesse arquivo, insira um código que não causará erros e manterá a aplicação rodando. Exemplo:
require("http").createServer((req, res) => res.end("Oi :D")).listen(process.env.PORT || 3000, () => console.log("Aplicação temporária rodando."));
Essa aplicação cria um servidor HTTP nativo (não precisa do express) que escuta na porta 3000. Mas não faz mais nada além disso. - No package.json, altere temporariamente o script start para executar o código acima
“start”: “node temporario.js” - Reinicie o Container
- Tente novamente conectar por SSH
- Corrija os problemas necessários
- Altere o script start de volta para o comando antigo
- Reinicie o container novamente