CHORE: Adicionada configuração para rodar o PM2 com cluster e CronJobs com FORK
This commit is contained in:
parent
0d4128df3d
commit
4d931bdddf
@ -39,9 +39,9 @@ HUBGLPI_DB_PASSWORD=Ut@2S@$M9Xs@@W
|
||||
# BANCO DE DADOS FINAL - GLPI (MySQL - Desenvolvimento)
|
||||
# ==============================================================================
|
||||
GLPI_DB_TYPE=mysql
|
||||
GLPI_DB_HOST=177.73.177.44
|
||||
GLPI_DB_HOST=177.73.177.32
|
||||
GLPI_DB_PORT=3306
|
||||
GLPI_DB_USER=desenvolvimento
|
||||
GLPI_DB_PASSWORD=Ut@2S@$M9Xs@@W
|
||||
GLPI_DB_USER=snglpi
|
||||
GLPI_DB_PASSWORD=j2633669
|
||||
GLPI_DB_NAME=glpi_data
|
||||
GLPI_DB_CHARSET=utf8mb4
|
||||
|
||||
@ -29,7 +29,7 @@ HUBSOFT_DATABASE_PASSWORD=2d0f4e138ba533693a1fc244d08a7f8596d8b472
|
||||
# ==============================================================================
|
||||
# BANCO DE DADOS INTERMEDIÁRIO - HUBGLPI (PostgreSQL - Desenvolvimento)
|
||||
# ==============================================================================
|
||||
HUBGLPI_DB_HOST=localhost
|
||||
HUBGLPI_DB_HOST=10.0.120.75
|
||||
HUBGLPI_DB_PORT=5432
|
||||
HUBGLPI_DB_NAME=hubglpi
|
||||
HUBGLPI_DB_USER=desenvolvimento
|
||||
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
||||
node_modules/
|
||||
logs/
|
||||
.env.production
|
||||
.env.development
|
||||
.env.production
|
||||
|
||||
@ -1,24 +1,69 @@
|
||||
module.exports = {
|
||||
apps: [
|
||||
// 🟢 --- PRIMEIRA APLICAÇÃO: API PRINCIPAL (servidor HTTP) ---
|
||||
{
|
||||
name: "hubxglpi",
|
||||
script: "src/server.js",
|
||||
instances: 1,
|
||||
autorestart: true,
|
||||
watch: false,
|
||||
name: "hubxglpi-api", // Nome que aparecerá no PM2
|
||||
script: "src/server.js", // Caminho do arquivo principal da API
|
||||
|
||||
// 👇 Execução em modo "cluster" (um processo por core da máquina)
|
||||
exec_mode: "cluster",
|
||||
instances: "max", // "max" = usa todos os núcleos disponíveis
|
||||
|
||||
// ⚙️ Variáveis de ambiente padrão (modo development)
|
||||
env: {
|
||||
NODE_ENV: "development",
|
||||
PORT: 3000 // Porta usada no ambiente de desenvolvimento
|
||||
},
|
||||
|
||||
// ⚙️ Variáveis de ambiente quando rodar com `--env production`
|
||||
env_production: {
|
||||
NODE_ENV: "production",
|
||||
PORT: 8080 // Porta usada no ambiente de produção
|
||||
}
|
||||
},
|
||||
|
||||
// 🕒 --- SEGUNDA APLICAÇÃO: CRON JOBS (tarefas agendadas) ---
|
||||
{
|
||||
name: "hubxglpi-cron", // Nome do serviço de crons
|
||||
script: "src/cron.js", // Arquivo onde ficam as tarefas agendadas
|
||||
|
||||
// 👇 Modo "fork" = apenas 1 instância, sem cluster (evita rodar crons duplicados)
|
||||
exec_mode: "fork",
|
||||
instances: 1, // Força a rodar somente um processo
|
||||
|
||||
// ⚙️ Variáveis de ambiente para desenvolvimento
|
||||
env: {
|
||||
NODE_ENV: "development"
|
||||
},
|
||||
|
||||
// ⚙️ Variáveis de ambiente para produção
|
||||
env_production: {
|
||||
NODE_ENV: "production"
|
||||
}
|
||||
}
|
||||
]
|
||||
};
|
||||
/** * Arquivo preparado para configuração do PM2. */
|
||||
|
||||
/** * File prepared for PM2 configuration. */
|
||||
/** * Para subiir o projeto para produção, utilize o comando: pm2 start ecosystem.config.js --env production */
|
||||
/** * To deploy the project to production, use the command: pm2 start ecosystem.config.js --env production */
|
||||
/** * Para subir o projeto em desenvolvimento, utilize o comando: pm2 start ecosystem.config.js --env development */
|
||||
/** * To run the project in development, use the command: pm2 start ecosystem.config.js --env development */
|
||||
|
||||
/** * @module server
|
||||
* @description Ponto de entrada principal da aplicação.
|
||||
* Este módulo é responsável por:
|
||||
* Definir a configuração do PM2 para gerenciar a aplicação principal e o serviço de cron jobs.
|
||||
* 1. A aplicação principal (`hubxglpi-api`) roda em modo cluster para lidar com requisições HTTP. Para encerrar chamados.
|
||||
* 2. O serviço de cron jobs (`hubxglpi-cron`) roda em modo fork para evitar execuções duplicadas das tarefas agendadas.
|
||||
*/
|
||||
|
||||
/**
|
||||
* 💡 Dicas de uso:
|
||||
*
|
||||
* 🧪 Ambiente de desenvolvimento:
|
||||
* pm2 start ecosystem.config.js --env development
|
||||
*
|
||||
* 🚀 Ambiente de produção:
|
||||
* pm2 start ecosystem.config.js --env production
|
||||
* pm2 startup systemd
|
||||
* sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u desenvolvimento --hp /home/desenvolvimento
|
||||
* pm2 save
|
||||
*
|
||||
* ✅ Após isso, o PM2 inicializa automaticamente os dois processos no boot do servidor.
|
||||
*/
|
||||
1398
node_modules/.package-lock.json
generated
vendored
1398
node_modules/.package-lock.json
generated
vendored
File diff suppressed because it is too large
Load Diff
1413
package-lock.json
generated
1413
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -15,6 +15,7 @@
|
||||
"mysql2": "^3.15.2",
|
||||
"node-cron": "^4.2.1",
|
||||
"pg": "^8.16.3",
|
||||
"pm2": "^6.0.13",
|
||||
"qs": "^6.14.0",
|
||||
"winston": "^3.18.3",
|
||||
"winston-daily-rotate-file": "^5.0.0"
|
||||
|
||||
@ -1,18 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
LOCKFILE=/tmp/hubglpi.lock
|
||||
|
||||
# Verifica se já existe lock
|
||||
if [ -e "$LOCKFILE" ]; then
|
||||
echo "$(date) - Processo já está rodando, saindo..."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
# Cria lockfile
|
||||
touch "$LOCKFILE"
|
||||
|
||||
# Roda o Node.js
|
||||
node app.js
|
||||
|
||||
# Remove lockfile
|
||||
rm -f "$LOCKFILE"
|
||||
37
src/cron.js
Normal file
37
src/cron.js
Normal file
@ -0,0 +1,37 @@
|
||||
const loadEnv = require('./config/envLoader');
|
||||
loadEnv();
|
||||
|
||||
const cron = require('node-cron');
|
||||
const { processaAtendimentos } = require('./controller/processController.js');
|
||||
const { logInfo, logError } = require('./utils/logger.js');
|
||||
|
||||
let isCronRunning = false;
|
||||
|
||||
logInfo('⏰ Agendando cron job para processar atendimentos a cada 5 minutos.');
|
||||
|
||||
cron.schedule('*/5 * * * *', async () => {
|
||||
if (isCronRunning) {
|
||||
logInfo('CRON: Tentativa de início, mas o processo anterior ainda está em execução. Pulando esta rodada.');
|
||||
return;
|
||||
}
|
||||
|
||||
isCronRunning = true;
|
||||
logInfo('CRON: Iniciando processamento de atendimentos...');
|
||||
try {
|
||||
await processaAtendimentos();
|
||||
logInfo('CRON: Processamento concluído com sucesso.');
|
||||
} catch (error) {
|
||||
logError('CRON: Erro durante o processamento de atendimentos.', error);
|
||||
} finally {
|
||||
isCronRunning = false;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* @module server
|
||||
* @description Ponto de entrada principal da aplicação.
|
||||
* Este módulo é responsável por:
|
||||
* 1. Carregar as variáveis de ambiente.
|
||||
* 2. Iniciar o servidor Express para escutar requisições HTTP (ex: webhooks do GLPI).
|
||||
* 3. Agendar e executar um cron job que roda a função `processaAtendimentos` periodicamente para sincronizar novos tickets do HubSoft para o GLPI.
|
||||
*/
|
||||
@ -1,46 +1,21 @@
|
||||
const loadEnv = require('./config/envLoader');
|
||||
loadEnv();
|
||||
|
||||
const cron = require('node-cron');
|
||||
const createApp = require('./app.js');
|
||||
const { processaAtendimentos } = require('./controller/processController.js');
|
||||
const { logInfo, logError } = require('./utils/logger.js');
|
||||
const { logInfo } = require('./utils/logger.js');
|
||||
|
||||
const app = createApp();
|
||||
|
||||
let isCronRunning = false; // Variável de controle para evitar sobreposição
|
||||
|
||||
const PORT = process.env.PORT || 3000;
|
||||
|
||||
app.listen(PORT, () => {
|
||||
logInfo(`🚀 Servidor HTTP iniciado e ouvindo na porta ${PORT}`);
|
||||
|
||||
// Agenda a tarefa para rodar a cada 5 minutos.
|
||||
logInfo('⏰ Agendando cron job para processar atendimentos a cada 5 minutos.');
|
||||
cron.schedule('*/5 * * * *', async () => {
|
||||
if (isCronRunning) {
|
||||
logInfo('CRON: Tentativa de início, mas o processo anterior ainda está em execução. Pulando esta rodada.');
|
||||
return;
|
||||
}
|
||||
|
||||
isCronRunning = true;
|
||||
logInfo('CRON: Iniciando processamento de atendimentos...');
|
||||
try {
|
||||
await processaAtendimentos();
|
||||
logInfo('CRON: Processamento de atendimentos concluído com sucesso.');
|
||||
} catch (error) {
|
||||
logError('CRON: Erro durante o processamento de atendimentos.', error);
|
||||
} finally {
|
||||
isCronRunning = false; // Garante que a trava seja liberada, mesmo em caso de erro
|
||||
}
|
||||
});
|
||||
logInfo(`🚀 Servidor HTTP iniciado e ouvindo na porta ${PORT}`);
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* @module server
|
||||
* @description Ponto de entrada principal da aplicação.
|
||||
* Este módulo é responsável por:
|
||||
* 1. Carregar as variáveis de ambiente.
|
||||
* 2. Iniciar o servidor Express para escutar requisições HTTP (ex: webhooks do GLPI).
|
||||
* 3. Agendar e executar um cron job que roda a função `processaAtendimentos` periodicamente para sincronizar novos tickets do HubSoft para o GLPI.
|
||||
*/
|
||||
**/
|
||||
Loading…
Reference in New Issue
Block a user