Desde o surgimento da Infinite, nossa plataforma é focada em atender plataformas como WordPress, Joomla, Magento, OpenCart e outros. Ou seja, CMSs majoritariamente desenvolvidos em PHP. Por esta razão, toda a nossa equipe foi treinada e permanece atualizada para atender esse tipo de demanda. Realmente, o nosso suporte é especialista. Entretanto, isso não significa que você não pode hospedar aplicações NodeJS e Go conosco.
Também, temos observado o crescimento de aplicações NodeJS e Go e, com certeza, não as deixaremos na mão. Todavia, por enquanto, embora seja possível instatá-las, o nosso suporte ainda é limitado no auxílio em debugs ou configurações avançadas. Então, esteja atento.
Mas, você não está no escuro: aqui vai um passo a passo detalhado sobre como fazê-lo e, sem dúvidas, contar com as tecnologias da Infinite transformará o seu site em uma experiência única para os seus usúarios e muito tranquila para o empreendedor por trás de tudo.
Assim sendo, para seguir os passos abaixo, conte com a ajuda de alguém que possua certo domínio técnico caso você não seja um desenvolvedor.
1) Instalando o NodeJS & Go
NodeJS
Iniciando, para instalar o NodeJS (e o NPM), basta executar os seguintes comandos no terminal SSH do seu plano:
cd ~/
wget https://nodejs.org/dist/latest-v16.x/node-v16.18.0-linux-x64.tar.gz -O node.tar.gz
tar -zxvf node.tar.gz
mv node-v16* node
rm -f node.tar.gz
echo 'export PATH=$HOME/node/bin:$PATH' >> ~/.bashrc && source ~/.bashrc
Go
Já pra instalar o Go, use os seguintes comandos:
cd ~/
wget https://go.dev/dl/go1.19.2.linux-amd64.tar.gz -O go.tar.gz
tar -zxvf go.tar.gz
rm -f go.tar.gz
echo 'export PATH=$HOME/go/bin:$PATH' >> ~/.bashrc && source ~/.bashrc
Neste momento, preciso lembrar que as versões listadas acima são as mais atuais no período em que escrevo este artigo. Isso posto, verifique qual é a última versão do NodeJS ou Go e atualize a URL do comando wget
mencionado acima.
A princípio, é isso! Com esses comandos, você conseguirá executar aplicações NodeJS ou Go.
Também, é importante pensar que uma aplicação em produção não pode sair do ar em virtude de algum problema no processo que a executa. Para isso, precisaremos de um gerenciador de processos.
2) Gerenciando Processos
Dando continuidade, um gerenciador de processo faz o que o nome indica: gerencia processos. Por gerenciar se entende reiniciá-lo em caso de erros, gravar os logs em um lugar certo, iniciar o processo caso o servidor seja reiniciado ou até mesmo monitorar o consumo.
Nesta tarefa utilizaremos uma ferramenta chamada PM2, desenvolvida, claro, com NodeJS.
Logo, será preciso instalar o NodeJS (mesmo que sua aplicação seja Go), conforme explicado acima. Quando instalá-lo, o npm
virá junto, basta executar o seguinte comando:
npm install pm2@latest -g
Simples assim: o PM2 já estará instalado após executar esse comando e poderemos usá-lo para gerenciar os nossos processos.
Contudo, para iniciar um processo, é preciso conhecer o caminho da aplicação. No caso de aplicações NodeJS, o seguinte comando será suficiente:
pm2 start app.js
Ali, app.js
é o arquivo principal de sua aplicação NodeJS.
Você deve estar se perguntando "e no caso das aplicações Go?", né? Pois bem... é parecido.
Suponha que você decidiu usar o Mattermost, uma aplicação Go que é, basicamente, um Slack open-source (que, inclusive, utilizamos na Infinite). Daí, o arquivo principal do Mattermost está na pasta “mattermost/bin/mattermost”. Você só precisará executar:
pm2 start "mattermost/bin/mattermost"
Uma vez executado o comando acima, você também poderá usar o PM2 para listar as aplicações em execução e, até mesmo, verificar o consumo delas com o comando pm2 list
, veja:
Aqui vai uma dica de ouro: O PM2 permite uma série de configurações avançadas que podem ser úteis, como passar argumentos, definir o período de restart, passar variáveis de ambiente, dentre outras, leia mais aqui.
Caso você mude os parâmetros no cli (e não no .json de configuração), será preciso utilizar o comando pm2 delete nomedoapp
antes do start para que o PM2 não use configurações antigas.
Em nosso caso, por exemplo, foi preciso utilizar o parâmetro "--cwd" para definir no Mattermost qual era o diretório padrão da execução (o famoso “working dir”), a fim de que a aplicação não tivesse problema com os caminhos dos arquivos.
3) Cron de @reboot
Nesta etapa, o seu app já está em execução e rodando conforme o esperado. No entanto, o PM2, caso a nuvem seja reiniciada, não será iniciado automaticamente.
Para tal, você deverá apenas inserir um cron job manualmente pelo SSH, digitando primeiro:
crontab -e
Isso abrirá uma edição de arquivo no SSH, onde você poderá inserir a seguinte linha:
@reboot /home/seusuario/node/bin/pm2 start "/home/seusuario/mattermost/bin/mattermost"
Não se esqueça de alterar "seuusuario" para o nome de usuário de seu plano de hospedagem.
Em seguida, você poderá salvar o arquivo e pronto: o seu cron job foi configurado corretamente. Na dúvida, é possível listar todos os cronjobs configurados em seu plano com o comando:
crontab -l
Perceba que usei o caminho completo do PM2 e do Mattermost no exemplo por ser uma boa prática sempre seguir caminhos absolutos quando for configurar comandos em cron jobs. Desse modo, não há riscos dos aliases não funcionarem.
4) Proxy Reverso HTTP/HTTPS
Para planos Névoa, Cirrus ou Cirrostratus
Até esse momento, você já conseguiu executar sua aplicação NodeJS ou Go na Infinite, mas está faltando uma coisa: o seu app ainda não responde em HTTP/HTTPS nas portas padrões, isso é, nas portas 80 e 443.
Para resolver isso é bem simples. Se seu plano de hospedagem for Névoa, Cirrus ou Cirrostratus, ele suporta regras no arquivo “.htaccess”, o qual está logo no diretório “/home/seuusuario/public_html”.
Dentro desse arquivo (crie-o se não existir) adicione a seguinte regra:
RewriteEngine On
RewriteRule ^(.*)$ http://localhost:PORTA/$1 [P,L]
Para planos Stratocumulus ou superiores
Se seu plano for Stratocumulus ou superior, o seu ambiente é NGINX e, portanto, não suporta o arquivo “.htaccess”. Nessa possibilidade, basta criar um arquivo chamado “proxy.conf” dentro da pasta “/home/seusuario/nginx” com o seguinte conteúdo:
location / {
proxy_pass http://localhost:PORTA;
}
E, então, recarregar as configurações do NGINX com o comando:
cli8 reloadNginx
Independente da regra que usar, lembre-se de substituir “PORTA” pela porta que a sua aplicação escuta. Geralmente, as aplicações NodeJS usam a porta 3000, por exemplo. Já a nossa aplicação de exemplo Go, que é o Mattermost, ouve por padrão a porta 8065.
Outra dica de ouro para você: a depender da aplicação que executar, se você receber um erro 503 ao configurar o proxy HTTP/HTTPS, é bem provável que a aplicação tenha problemas quando “localhost” ou “127.0.0.1” são utilizados para se referir ao servidor em si.
À vista disso, você pode substituir “localhost” pelo endereço de IP real do servidor. Para descobrir qual é o endereço de IP, use o comando:
curl ipecho.net/plain
Conclusão
Viu como não é um bicho de sete cabeças instalar o NodeJS e o Go na Infinite?
Se você está se perguntando o porquê de contratar a Infinite ao invés de gerenciar o seu próprio servidor na DigitalOcean, AWS ou Under, eu deixarei algumas vantagens:
- WAF profissional gratuito incluso para proteger sua aplicação contra hackers e DDoS;
- banco de dados MySQL e PostgreSQL à sua disposição e super bem configurados;
- backups gratuitos automáticos diários locais e semanais fora do datacenter com retenção de 15 dias para garantir a integridade de todos os seus dados;
- otimização de imagens para que todas as imagens de sua aplicação sempre tenham o menor tamanho possível sem perder a qualidade;
- painel de controle com API para você monitorar métricas, criar banco de dados, configurar o WAF, baixar backups e muito mais!
Por fim, deixo uma nota para os geeks de plantão: estamos cientes de que é possível utilizar o “systemd”, “supervisorctl” ou até mesmo o “docker” e outras ferramentas.
Contudo, para a própria segurança do usuário, limitamos as permissões do cliente dentro do servidor. Assim, comandos como “yum”, “systemctl” etc não estão disponíveis em todos os planos, somente a partir do Stratocumulus ou superior, que são planos dedicados.
De qualquer maneira, a solução apresentada aqui é robusta o suficiente para ser usada em produção e funcionará em qualquer plano de hospedagem da Infinite, seja cPanel/semidedicado ou dedicado.
Se você tiver alguma dúvida, é só deixar nos comentários. Será um prazer te ajudar!