1
resposta

Sobre deploy de projetos Next.js em servidores que utilizam Passenger

Olá pessoal, tudo bom?

Tenho uma dúvida, que não é bem uma dúvida e sim mais uma necessidade de validação. Eu tenho um projeto que configurei o CD para fazer deploy em um servidor (que não é Vercel) que roda o node.js por meio do Passenger. Eu notei que ele tem apresentado uns comportamentos meio diferentes em relação ao comportamento que teria na Vercel, e não sei se estou fazendo alguma bobagem durante o processo de Deployment.

Vou colocar aqui o trecho do yml que faz o delivery, se alguém tiver alguma sugestão ou notar algo faltando no processo, fico grato se receber algum apoio (ps.: o projeto nextjs fica num subfolder chamado frontend):

deploy-app:
    runs-on: ubuntu-latest
    name: Build and Deploy APP
    steps:
    - uses: actions/checkout@v3
    - name: Bucket actions
      uses: actions/setup-node@v3
      with:
        node-version: '12.22.12'
    - name: Installing packages
      run: yarn install
      working-directory: ./frontend
    - name: Setup .env file - Copy from sample
      run: cp .env.sample .env
      working-directory: ./frontend
    - name: Setup .env file - Set NODE_ENV to prod
      run: sed -i 's/<node_env>/prod/' .env
      working-directory: ./frontend
    - name: Setup .env file - Set PORT to 80
      run: sed -i 's/<app_port>/80/' .env
      working-directory: ./frontend      
    - name: Setup .env file - Set API_URL to https://wpdesafiob-api.mastelari.ml
      run: sed -i 's/<api_url>/'"'"'https\:\/\/wpdesafiob\-api\.mastelari\.ml'"'"'/' .env
      working-directory: ./frontend      
    - name: Setup .env file - Set AUTH0 environment variables - DISABLED_AUTH0
      run: |
        sed -i 's/<disabled_auth0>/ 0/' .env
      working-directory: ./frontend
    - name: Setup .env file - Set AUTH0 environment variables - AUTH0_CLIENT_ID
      run: |
        sed -i 's/<auth0_client_id>/'"'"'${{ secrets.DH_MASTELARI_AUTH0_CLIENT_ID }}'"'"'/' .env
      working-directory: ./frontend
    - name: Setup .env file - Set AUTH0 environment variables - AUTH0_CLIENT_SECRET
      run: |
        sed -i 's/<auth0_client_secret>/'"'"'${{ secrets.DH_MASTELARI_AUTH0_CLIENT_SECRET }}'"'"'/' .env
      working-directory: ./frontend
    - name: Setup .env file - Set AUTH0 environment variables - AUTH0_AUDIENCE
      run: |
        sed -i 's/<auth0_audience>/${{ secrets.DH_MASTELARI_AUTH0_APP_AUDIENCE }}/' .env
      working-directory: ./frontend
    - name: Setup .env file - Set AUTH0 environment variables - AUTH0_SUBDOMAIN
      run: |
        sed -i 's/<auth0_subdomain>/${{ secrets.DH_MASTELARI_AUTH0_SUBDOMAIN }}/' .env
      working-directory: ./frontend
    - name: Setup .env file - Set AUTH0 environment variables - AUTH0_REGION
      run: |
        sed -i 's/<auth0_region>/${{ secrets.DH_MASTELARI_AUTH0_REGION }}/' .env
      working-directory: ./frontend
    - name: Building
      run: yarn build
      working-directory: ./frontend
    - name: Packaging
      run: tar --exclude={".env.sample",".env.local","README.md","next-env.d.ts","jest.config.ts",".eslintrc.json","__tests__",".next","node_modules",".swc","coverage","out"} -zcvf ../build-content.tar.gz .
      working-directory: ./frontend
    - name: Publishing
      uses: ArthurYdalgo/github-action-scp@master
      with:
        host: ${{ secrets.DH_MASTELARI_SSHHOST }}
        username: ${{ secrets.DH_MASTELARI_SSHUSER }}
        password : ${{ secrets.DH_MASTELARI_SSHPASSWORD }}
        port: ${{ secrets.DH_MASTELARI_SSHPORT }}
        local: "build-content.tar.gz"
        remote: "wpdesafiob.mastelari.ml/build-content.tar.gz"
    - name: Post-publishing actions
      uses: appleboy/ssh-action@master
      with:
        host: ${{ secrets.DH_MASTELARI_SSHHOST }}
        username: ${{ secrets.DH_MASTELARI_SSHUSER }}
        password : ${{ secrets.DH_MASTELARI_SSHPASSWORD }}
        port: ${{ secrets.DH_MASTELARI_SSHPORT }}
        script_stop: true
        script: |
          export NVM_DIR="$HOME/.nvm"
          [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
          [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
          cd ~/wpdesafiob.mastelari.ml
          tar -zxvf build-content.tar.gz
          rm build-content.tar.gz
          yarn install
          yarn build
          touch tmp/restart.txt
1 resposta

Olá Fábio, tudo bem contigo?

Analisei o trecho do arquivo YAML que você compartilhou e percebi que se trata de um pipeline de integração contínua/entrega contínua (CI/CD) utilizando o GitHub Actions para implantar um aplicativo Next.js em um servidor diferente da Vercel. O deploy é feito via SCP (Secure Copy Protocol) e, em seguida, são executadas algumas ações no servidor de destino.

No geral, o fluxo parece estar correto, mas vou fornecer algumas sugestões e observações para você verificar se algo está faltando ou se há algum problema:

  1. Verifique se o servidor de destino está configurado corretamente para executar o Node.js com o Passenger. Certifique-se de que o ambiente esteja corretamente configurado no servidor para executar o aplicativo Node.js.

  2. Antes de iniciar o processo de implantação, é importante garantir que o servidor de destino tenha os requisitos adequados para o aplicativo Next.js. Verifique se o servidor possui as versões corretas do Node.js e das dependências necessárias.

  3. Certifique-se de que os segredos e variáveis de ambiente estejam configurados corretamente nas configurações do repositório do GitHub. Verifique se os nomes dos segredos correspondem aos usados no arquivo YAML e se os segredos têm os valores corretos.

  4. No script de pós-publicação (Post-publishing actions), você faz referência ao diretório "~/wpdesafiob.mastelari.ml". Verifique se esse diretório existe no servidor de destino e se o caminho está correto. Certifique-se de que o usuário SSH tenha permissões adequadas para acessar e modificar o diretório.

  5. Depois de extrair o conteúdo do pacote no servidor de destino, você executa yarn install e yarn build. Verifique se o diretório em que você está localizado é o diretório correto onde o aplicativo foi implantado. Também verifique se o comando yarn install é realmente necessário após a extração do pacote, uma vez que você já executou esse comando anteriormente no fluxo do pipeline.

  6. Por fim, você usa o comando touch tmp/restart.txt. Isso é específico para o Passenger, que pode monitorar esse arquivo para reiniciar o aplicativo. Verifique se o Passenger está configurado corretamente para monitorar esse arquivo e reiniciar o aplicativo quando necessário.

Essas são algumas sugestões e considerações com base no trecho do arquivo YAML fornecido. Verifique esses pontos e veja se algum deles pode estar causando os comportamentos diferentes que você está observando. Se possível, forneça mais informações sobre os comportamentos diferentes que você está enfrentando para que eu possa ajudá-lo melhor.

Se você tiver mais alguma dúvida ou precisar de mais ajuda, é só me perguntar. Estou aqui para ajudar. Boa sorte com o seu projeto! ;)

Abraços e bons estudos.