Node.js: Introdução
Aprenda a implementar um serviço Node.js no Stackhero de forma rápida e segura
👋 Bem-vindo à documentação do Stackhero!
A Stackhero oferece uma solução Node.js cloud pronta a usar que proporciona uma série de benefícios, incluindo:
- Implemente a sua aplicação em segundos com um simples
git push.- Utilize o seu próprio nome de domínio e beneficie da configuração automática de certificados HTTPS para uma segurança reforçada.
- Desfrute de tranquilidade com backups automáticos, atualizações com um clique, e preços simples, transparentes e previsíveis.
- Obtenha desempenho ótimo e segurança robusta graças a uma VM privada e dedicada.
Poupe tempo e simplifique a sua vida: só leva 5 minutos para experimentar a solução de hospedagem cloud Node.js da Stackhero!
Implementar um serviço Node.js no Stackhero é rápido, eficiente e fiável. Este guia orienta-o através dos passos essenciais para implementar a sua aplicação em segundos, garantindo segurança e desempenho de primeira linha.
Iniciar um serviço Node.js
Comece por criar um serviço Node.js no Stackhero. Este passo estabelece a base para a implementação da sua aplicação e prepara-o para explorar todos os benefícios da solução de alojamento em cloud do Stackhero.
Pré-requisitos
Antes de implementar no Stackhero, certifique-se de que tem as seguintes ferramentas instaladas:
- Git. Pode descarregá-lo de https://git-scm.com/downloads.
- Para utilizadores de Windows, sugerimos o uso do Windows Terminal disponível na Microsoft Store para uma melhor experiência.
Configurar o seu serviço
A única configuração necessária é a atualização da sua chave pública SSH. Esta chave permite que o Stackhero aceda de forma segura ao seu repositório de código.
Para localizar a sua chave pública, execute um destes comandos:
cat ~/.ssh/id_rsa.pub
ou
cat ~/.ssh/id_ed25519.pub
Se ainda não tiver um par de chaves SSH, pode gerar uma executando ssh-keygen no Linux ou macOS ou ssh-keygen.exe no Windows.
Após recuperar a sua chave pública, inicie sessão no painel de controlo do Stackhero, selecione o seu serviço Node.js, navegue até à sua configuração e cole a sua chave.
Dica: Pode definir a sua chave pública SSH globalmente para que todos os serviços futuros a incluam automaticamente. Para isso, vá ao painel de controlo do Stackhero, clique na sua foto de perfil (localizada no canto superior direito), navegue até 'O seu perfil' e cole a sua chave pública SSH.
Clonar o exemplo
É fornecida uma aplicação Node.js de exemplo para ilustrar o processo de implementação no Stackhero. Pode clonar o repositório com os seguintes comandos:
git clone https://github.com/stackhero-io/nodejsGettingStarted.git stackhero-nodejs-getting-started
cd stackhero-nodejs-getting-started
Configurar o servidor de repositório remoto
Implementar a sua aplicação via git é rápido, fiável e simples no Stackhero. Na página principal do seu serviço, encontrará um comando para adicionar um repositório remoto git. Pode parecer algo assim:
git remote add stackhero ssh://stackhero@XXXXX.stackhero-network.com:222/project.git
Basta copiar e colar o comando no seu terminal.
Implementar a sua aplicação Node.js
Envie o seu código para o Stackhero usando o seguinte comando:
git push stackhero main
Na primeira vez que enviar, ser-lhe-á solicitado que adicione a impressão digital da chave. Digite "yes" para continuar.
Após alguns momentos, a sua aplicação estará online. Pode verificar o seu estado visitando o URL do site fornecido no painel de controlo do Stackhero (por exemplo, https://XXXXX.stackhero-network.com).
É isso. A sua aplicação está agora implementada!
Se fizer alterações ao ficheiro app.js, basta confirmar e enviar as suas modificações:
git add -A .
git commit -m "Update app.js"
git push stackhero main
Implementar uma aplicação existente
Para aplicações existentes, adicione o repositório remoto conforme descrito anteriormente em Configurar o servidor de repositório remoto. Depois, implemente as suas alterações com:
git push stackhero main
Lidar com o erro "failed to push some refs to '[...]'"
Se encontrar o seguinte erro:
error: failed to push some refs to '[...]'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
(e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
Este erro indica que o seu repositório local não está sincronizado com o repositório remoto. Neste caso, pode forçar o envio executando:
git push -f stackhero main
Lidar com o erro "src refspec main does not match any"
Se vir este erro ao executar git push stackhero main:
error: src refspec main does not match any
error: failed to push some refs to 'ssh://<XXXXXX>.stackhero-network.com:222/project.git'
Isto indica que o ramo main não existe. Pode tentar enviar o ramo master em vez disso:
git push stackhero master
Lidar com o erro "Everything up-to-date" ao enviar
Se o git responder com "Everything up-to-date" mas as suas alterações não forem implementadas, pode ser porque se esqueceu de confirmar as suas alterações. Nesse caso, execute:
git add -A .
git commit -m "Your commit message"
git push stackhero main
Se não foram feitas alterações mas ainda assim deseja forçar uma implementação, pode forçar um commit vazio:
git commit --allow-empty -m "Force update"
git push stackhero main
Implementar um ramo diferente de main
Se quiser implementar um ramo diferente de main, como production, pode usar o seguinte comando:
git push stackhero production:main
Implementar uma tag
Se trabalhar com tags e quiser implementar uma tag específica (por exemplo, v1.0), execute:
git push stackhero 'v1.0^{}:main'
Aqui, ^{} garante que o commit associado à tag seja enviado.
Reverter ou implementar um commit específico
Se precisar de implementar um commit específico, primeiro identifique o hash do commit usando git log. Depois implemente-o com:
git push -f stackhero <HASH>:main
Implementar em múltiplos ambientes
Pode configurar múltiplos serviços Node.js para diferentes ambientes, como produção e staging. Para renomear o repositório remoto atual de stackhero para stackhero-staging, execute:
git remote rename stackhero stackhero-staging
Em seguida, crie um novo serviço Node.js no painel de controlo do Stackhero e adicione-o como stackhero-production:
git remote add stackhero-production ssh://stackhero@XXXXX.stackhero-network.com:222/project.git
Implemente em produção ou staging usando os comandos respetivos:
git push stackhero-production main
ou
git push stackhero-staging main
Guardar a palavra-passe da sua chave privada SSH no keychain do macOS
No macOS, pode ser solicitado a introduzir a palavra-passe da sua chave SSH cada vez que envia o seu código. Para maior conveniência e segurança (sem remover a palavra-passe da sua chave), pode guardá-la no keychain do macOS executando:
/usr/bin/ssh-add --apple-use-keychain ~/.ssh/id_rsa
Este comando guarda a palavra-passe da sua chave no keychain para que não seja solicitado novamente durante futuras implementações.
Gerir segredos
Para ambientes de staging e produção, gerir segredos como tokens ou palavras-passe de forma segura é essencial. Em vez de armazenar estes segredos diretamente no seu repositório, use variáveis de ambiente para uma segurança reforçada.
Pode adicionar variáveis de ambiente através do painel de controlo do Stackhero e acedê-las no seu código Node.js. Por exemplo, se definir uma variável chamada mySecret, pode acedê-la na sua aplicação da seguinte forma:
process.env.mySecret
Abrir outras portas de rede
Se a sua aplicação não usar HTTP, pode ser necessário abrir portas TCP e UDP adicionais através do painel de controlo do Stackhero. Basta especificar a porta de entrada pública, a porta de destino no seu serviço Node.js e o protocolo (TCP ou UDP) para garantir uma conectividade adequada.
Armazenar ficheiros
Para armazenar ficheiros como fotos de utilizadores, é melhor usar uma solução de armazenamento de objetos. Esta abordagem permite o compartilhamento de ficheiros entre múltiplos serviços e instâncias enquanto mantém o seu código separado dos seus dados. Recomendamos MinIO como uma solução simples, rápida e poderosa compatível com o protocolo Amazon S3.
Se preferir armazenamento local, pode usar o armazenamento persistente disponível com a sua instância Node.js. Este armazenamento está localizado em /persistent/storage/.
ATENÇÃO: Nunca armazene dados fora da pasta
/persistent/storage/!Os dados armazenados fora desta pasta podem ser perdidos se a sua instância reiniciar ou se enviar alterações de código.
Encerramento gracioso
Ao implementar uma nova versão da sua aplicação, a versão antiga recebe um sinal de terminação antecipadamente. Isto dá-lhe tempo para fechar graciosamente as ligações à base de dados e parar outros serviços.
O sinal de terminação SIGTERM é emitido. Pode capturar este sinal no seu código da seguinte forma:
process.on('SIGTERM', () => {
// Este log aparece no painel de controlo do Stackhero na aba 'logs'
console.info('😯 Sinal SIGTERM recebido.');
// Feche aqui as ligações à base de dados ou outros serviços
// ...
});
Executar o seu código em múltiplos núcleos de CPU
Por padrão, o Node.js é executado num único núcleo usando um único thread. Para tirar pleno proveito de todos os núcleos de CPU disponíveis, considere usar a API cluster do Node.js. Pode consultar a documentação oficial aqui: https://nodejs.org/api/cluster.html.
Abaixo está um exemplo simples que cria um servidor HTTP utilizando todos os CPUs disponíveis:
const cluster = require('cluster');
const http = require('http');
const cpusCount = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Fork workers
for (let i = 0; i < cpusCount; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
// Os workers partilham qualquer ligação TCP; neste caso, um servidor HTTP
http.createServer((req, res) => {
res.writeHead(200);
res.end('hello world\n');
}).listen(8000);
console.log(`Worker ${process.pid} started`);
}