Recebi o plano. Ele está **majoritariamente correto** para AlmaLinux 9 + cPanel/WHM, mas tem alguns pontos que merecem ajuste ou atenção. Deixa eu fazer uma análise detalhada antes de você me enviar os erros — assim a gente já cruza as informações. --- ## ✅ O que está correto 1. **ETAPA 1 — PostgreSQL**: `dnf` + `postgresql-setup --initdb` está certo. Mas veja o ponto 1 abaixo sobre versão. 2. **ETAPA 2 — Subdomínio via cPanel**: Correto. 3. **ETAPA 4 — `.env`**: Estrutura ok. 4. **ETAPA 6 — PM2 com `pm2 startup systemd`**: Correto no AlmaLinux 9. 5. **ETAPA 8 — Let's Encrypt via cPanel (AutoSSL)**: Correto. 6. **ETAPA 9 — Script de deploy**: Funcional. --- ## ⚠️ Pontos que precisam ajuste / atenção ### 1. PostgreSQL — versão muito antiga no repo padrão do AlmaLinux 9 O pacote `postgresql-server` do AppStream do AlmaLinux 9 instala o **PostgreSQL 13**, que já está no fim de vida. Se seu app usa recursos novos (JSONB avançado, `gen_random_uuid()` nativo sem extension, etc.), pode dar problema. **Recomendado** — usar o repositório oficial do PostgreSQL (PGDG) para instalar uma versão atual (15 ou 16): ```bash sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-9-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo dnf -qy module disable postgresql sudo dnf install -y postgresql16-server postgresql16-contrib sudo /usr/pgsql-16/bin/postgresql-16-setup initdb sudo systemctl enable --now postgresql-16 ``` O serviço passa a se chamar `postgresql-16` e o `psql` fica em `/usr/pgsql-16/bin/psql`. --- ### 2. PostgreSQL — autenticação `pg_hba.conf` (isso quase sempre quebra) Faltou no plano. Por padrão, o PostgreSQL no AlmaLinux usa `ident` para conexões locais, o que **vai recusar** seu `DATABASE_URL` com senha. Precisa alterar para `md5` ou `scram-sha-256`: ```bash # Caminho depende da versão: sudo nano /var/lib/pgsql/data/pg_hba.conf # versão 13 do appstream sudo nano /var/lib/pgsql/16/data/pg_hba.conf # versão 16 do PGDG ``` Altere as linhas `local` e `host ... 127.0.0.1/32` de `ident`/`peer` para `scram-sha-256`: ``` local all all scram-sha-256 host all all 127.0.0.1/32 scram-sha-256 host all all ::1/128 scram-sha-256 ``` Depois: ```bash sudo systemctl restart postgresql-16 ``` **Sem isso, o Node.js não consegue conectar** — e provavelmente é um dos erros que você vai me mostrar. --- ### 3. ETAPA 3 — Clonar na pasta do subdomínio (cuidado!) `git clone ... .` dentro de `/home/usuario/portal.onsms.com.br` **vai misturar os arquivos do Node** com o `public_html` servido pelo Apache. Isso é perigoso por dois motivos: - O Apache pode servir `.env`, `package.json`, código-fonte, etc. publicamente. - Arquivos como `cgi-bin` e `.htaccess` criados pelo cPanel podem conflitar. **Recomendo** separar: ``` /home/usuario/apps/portal/ ← código Node (git clone aqui) /home/usuario/portal.onsms.com.br/ ← docroot do Apache (só o proxy) ``` O Apache só faz proxy reverso para `localhost:5000`, então o docroot do subdomínio pode ficar vazio (ou só com um `index.html` placeholder). --- ### 4. ETAPA 7 — Caminho do include do Apache está quase certo, mas depende do contexto O caminho `/etc/apache2/conf.d/userdata/ssl/2/usuario/dominio/` assume: - Apache 2.4 (`2` na URL) - Configuração **SSL** (`ssl/`) - Que o SSL já exista — ou seja, **após** gerar o Let's Encrypt da ETAPA 8 Para funcionar em HTTP e HTTPS, você precisa de **dois arquivos**: ```bash # Para HTTP (porta 80): /etc/apache2/conf.d/userdata/std/2_4/usuario/portal.onsms.com.br/proxy.conf # Para HTTPS (porta 443): /etc/apache2/conf.d/userdata/ssl/2_4/usuario/portal.onsms.com.br/proxy.conf ``` Note o `2_4` (não só `2`). Pode variar — confira com: ```bash ls /etc/apache2/conf.d/userdata/ ``` Além disso, a ordem importa: **crie o subdomínio primeiro**, **emita o SSL**, e **só depois** crie os arquivos de include e rode `/scripts/rebuildhttpdconf`. Também falta um diretivo importante para WebSockets (se o app usa) e headers: ```apache ProxyRequests Off ProxyPreserveHost On ProxyPass / http://127.0.0.1:5000/ ProxyPassReverse / http://127.0.0.1:5000/ # Preserva IP real do cliente RequestHeader set X-Forwarded-Proto "https" RequestHeader set X-Forwarded-For "%{REMOTE_ADDR}s" ``` Se o app usa WebSocket (socket.io, etc.), precisa também: ```apache RewriteEngine On RewriteCond %{HTTP:Upgrade} =websocket [NC] RewriteRule /(.*) ws://127.0.0.1:5000/$1 [P,L] ``` E precisa habilitar o módulo `mod_proxy_wstunnel` no WHM → EasyApache 4. --- ### 5. ETAPA 5 — Testar com `npm start` pode falhar em produção Se o seu `package.json` tem `"start": "node dist/index.js"`, ok. Mas muitos projetos vindos do Replit usam `tsx` ou `vite` no `start` e **não têm build de produção configurado**. Vale confirmar antes: ```bash cat package.json | grep -A 10 '"scripts"' ``` --- ### 6. Firewall — possível esquecimento AlmaLinux vem com `firewalld` ativo. A porta 5000 **não precisa** ser aberta (é só localhost via proxy), mas confirme que o firewall não bloqueia loopback: ```bash sudo firewall-cmd --list-all ``` Se `DATABASE_URL` aponta para `localhost`, tudo bem. Mas se em algum momento você quiser acessar o Postgres de fora, aí precisa liberar — **não recomendo**. --- ### 7. SELinux — isso é o "pega" clássico no AlmaLinux **Faltou totalmente no plano.** O AlmaLinux 9 vem com SELinux em modo `enforcing`, e isso bloqueia por padrão: - Apache fazer conexão de rede de saída (proxy para `localhost:5000`) → **erro 503** - Node acessar certos diretórios Para permitir o proxy: ```bash sudo setsebool -P httpd_can_network_connect 1 ``` Verificar status: ```bash sestatus sudo ausearch -m avc -ts recent # logs de bloqueios recentes ``` **Aposto que pelo menos um dos erros que você vai me mandar é relacionado a isso (503 Service Unavailable ou "Proxy Error").** --- ## Resumo da avaliação | Etapa | Status | |---|---| | 1. PostgreSQL | ⚠️ Funciona, mas versão velha + falta `pg_hba.conf` | | 2. Subdomínio | ✅ OK | | 3. Clone do Git | ⚠️ Separar pasta do código da pasta do docroot | | 4. `.env` | ✅ OK | | 5. Build | ⚠️ Confirmar `npm start` do projeto | | 6. PM2 | ✅ OK | | 7. Apache proxy | ⚠️ Caminho pode estar `2_4` em vez de `2`, faltam headers, WebSocket | | 8. SSL | ✅ OK (mas ordem importa) | | 9. Deploy script | ✅ OK | | **Faltando** | ❌ `pg_hba.conf`, SELinux, separação de pastas | --- Agora **pode me mandar os erros** que você encontrou. Com essa base em mente, vou conseguir apontar rapidamente a causa de cada um.