Parser em Node.js + TypeScript para extrair dados de PDFs e persistir no MySQL.
O projeto suporta dois modos de operacao:
batch: processa PDFs da raiz do projeto.api + worker: recebe eventos do Google Drive e processa via fila Redis.
Fluxo principal: PDF -> normalizacao -> extracao -> persistencia MySQL.
- Node.js 22+
- npm
- Docker e Docker Compose
- Copie o arquivo de ambiente:
cp .env.example .env- Ajuste o
.envcom os valores minimos:
MYSQL_HOST=mysql
MYSQL_PORT=3306
MYSQL_DATABASE=formulas
MYSQL_USER=formulas
MYSQL_PASSWORD=formulas
MYSQL_ROOT_PASSWORD=root
API_MODE=api
API_HOST=0.0.0.0
API_PORT=3000
REDIS_ENABLED=true
REDIS_URL=redis://redis:6379
REDIS_QUEUE_NAME=drive-file-events
DRIVE_FOLDER_ID=<id-da-pasta>
DRIVE_SHARED_DRIVE_ID=<id-do-shared-drive-opcional>
DRIVE_WEBHOOK_TOKEN=<token-secreto>
DRIVE_WEBHOOK_ADDRESS=https://<url-publica>/webhooks/drive
GOOGLE_APPLICATION_CREDENTIALS=/home/jlima/Projetos/Formulas/secrets/gcp-service-account.json
GOOGLE_SERVICE_ACCOUNT_KEY_JSON=
GOOGLE_DRIVE_SCOPES=https://www.googleapis.com/auth/drive.readonly- Suba a stack:
docker compose up -d --build- Verifique os servicos:
docker compose ps- Suba banco e redis:
docker compose up -d mysql redis- Instale dependencias e compile:
npm install
npm run build- Execute no modo desejado:
npm start
npm run start:api
npm run start:worker# batch local
npm start
# somente API
npm run start:api
# API + batch no mesmo processo
npm run start:both
# worker de fila
npm run start:workerUse este fluxo para validar entrada de novos PDFs em tempo real sem derrubar API/worker/tunnel no fim do teste.
- Iniciar teste E2E em modo persistente:
npm run test:e2e:drive-real:persistent-
Adicionar um novo PDF na pasta do Google Drive configurada.
-
Acompanhar logs e validar no banco (formulas e drive_file_checkpoints).
-
Encerrar tudo manualmente quando finalizar o teste:
npm run stop:e2e:drive-realObservacao: o modo padrao continua disponivel em npm run test:e2e:drive-real e encerra runtime no final.
- Health:
curl -s http://localhost:3000/health- Diagnostico:
curl -s http://localhost:3000/api/diagnostics- Criar canal watch:
curl -s -X POST http://localhost:3000/api/drive/watch/start- Ver watch ativo:
curl -s http://localhost:3000/api/drive/watchGET /healthGET /api/diagnosticsPOST /api/drive/syncGET /api/drive/watchPOST /api/drive/watch/startPOST /api/drive/watch/renewPOST /api/drive/watch/stopPOST /webhooks/drive
Foi adicionada uma estrutura dedicada de producao em deploy/digitalocean com:
- compose de producao (
compose.prod.yaml) - Nginx + Certbot para SSL
- scripts de bootstrap e deploy no Droplet
Guia completo: deploy/digitalocean/README.md.
Fluxo operacional sem hardening (redeploy e smoke test) tambem esta documentado nesse guia.
- API nao sobe: confira
docker compose logs formulas-app. - Worker nao processa: confira
docker compose logs formulas-workereREDIS_ENABLED=true. - Watch nao recebe eventos: confira URL publica HTTPS e path
/webhooks/drive. - Drive sem permissao: compartilhe a pasta com o
client_emailda service account. - Erro de credencial: valide caminho em
GOOGLE_APPLICATION_CREDENTIALSe se o arquivo existe no container.