Existem diversas formas de fazer o deploy, desde a mais manual até completamente automática.
No caso você tem um servidor Ubuntu e acesso a máquina via ssh.
Pense nas seguintes tarefas:
Configurar o ambiente
O ambiente do servidor deve se assemelhar ao ambiente de desenvolvimento, mesmas versões do node e demais ferramentas utilizadas.
Desta forma você evita o famoso "mas na minha máquina funciona".
Para isso, nada mais "lindo" do que um container Docker e (opcionalmente) um docker-composer para comandar diversos containers.
Isso (docker) é opcional, mas se você quer amadurecer essa infraestrutura, pense nisso.
Entregar o codigo ao servidor
Você precisa de alguma forma chegar com o codigo no servidor, e ter uma forma de fazer isso sempre que lançar uma nov versão.
Existem algumas formas usuais:
- Clona o repositorio git no servidor (use uma chave ssh exclusiva com permissão apenas para pull)
- Sobe os arquivos via scp (um ftp via ssh)
- Faz o download via curl ou wget do teu repositorio de algum canto da internet.
Para auxiliar nesse processo, você pode ter scripts bash que façam esse trabalho braçal, e ao lançar uma nova versão voce só rode ./release.sh
por exemplo.
Também pode usar um webhook do github para chamar um endpoint da sua api responsável por chamar o script de release (um CI simplificado) Nota: sempre proteja esse endpoint com uma chave secreta.
Monitorar o funcionamento da API
Existem ferramentas para forçar sua API a inicializar automaticamente, e reiniciar em caso de falhas. Por exemplo o PM2.
Quando você está em produção, é muito importante gerar LOGs de todos os eventos relevantes, e se possível ter uma ferramenta para monitorar esses logs, e eventualmente lhe alertar de alguns eventos chave (por exemplo quando o servidor for reiniciado por causa de uma falha)