Operação e Manutenção
Ferramentas para diagnosticar problemas e controlar o ponto de partida da extração, sem precisar mexer em código.
Nome do domínio nos comandos
Todo comando abaixo recebe --domain <dominio>. <dominio> é sempre um placeholder — troque pelo valor real do domínio que você quer afetar, usando a coluna "Valor de --domain" abaixo (não é o mesmo texto do prefixo do .env):
| Domínio | Prefixo .env |
Valor de --domain |
|---|---|---|
| Produtividade | PROD |
productivity |
| Plantio | PLANT |
planting |
| CTT | CTT |
ctt |
| Ordem de Serviço | ORDEM |
ordem |
| Pragas | PRAGAS |
pragas |
| Clima | CLIMA |
clima |
Se --domain for omitido, o comando roda para todos os domínios ativos.
Checkup de conectividade e queries
Testa, para cada domínio ativo, se a conexão Oracle funciona, se a query {PREFIXO}_QUERY_CTRL_MAX executa sem erro, se a {PREFIXO}_QUERY_TEMPLATE roda (com limit=1) e se a autenticação OAuth2 do Hub está correta.
Não altera nada
O checkup é somente leitura: não grava no estado local (SQLite) nem envia dados ao Hub. Requer npm run build antes de usar (roda sobre o build em dist/).
# Roda o checkup de todos os domínios
npm run extrator -- --checkup
# Roda apenas um domínio — troque "planting" pelo domínio desejado (tabela acima)
npm run extrator -- --checkup --domain planting
# Testa com um ctrl_min específico (sem alterar o estado salvo)
npm run extrator -- --checkup --domain planting --min-ctrl "2020-03-01 00:00:00"
# Pula o teste de autenticação do Hub
npm run extrator -- --checkup --skip-hub
# Saída em JSON (para automação)
npm run extrator -- --checkup --json
O que valida:
- 🔌 Conexão Oracle de cada domínio
- 📊 A query
{PREFIXO}_QUERY_CTRL_MAXreal, mostrando o valor obtido (ou o erro exato do Oracle) - 📋 Um dry-run da
{PREFIXO}_QUERY_TEMPLATE(1 registro), pegando erros de sintaxe/coluna antes do CRON rodar - 🔑 As credenciais
CLIENT_ID/CLIENT_SECRET/scope, obtendo um token OAuth2 real do Hub
Códigos de saída: 0 = tudo passou (ou não havia dados novos); 1 = alguma conexão, query ou autenticação falhou.
Use isso antes de configurar o CRON — assim os erros de configuração (ex: divergência de máscara de data) aparecem na hora, sem precisar vasculhar logs do container.
Consultar e resetar o ponto de partida (ctrl_min / ctrl_max)
O Extrator guarda localmente (em SQLite, dentro do container) o último ponto processado de cada domínio: minCtrl, maxCtrl, status e offset. Isso é o que permite ele continuar de onde parou a cada execução, sem reprocessar tudo.
Por que mudar {PREFIXO}_QUERY_CTRL_MIN_DEFAULT no .env às vezes não faz efeito
Essa variável só é usada quando não existe nenhum registro salvo ainda para aquele domínio. Depois da primeira execução bem-sucedida, o próximo ponto de partida vem do estado salvo — não do .env. Se você mudar o .env depois disso e nada mudar no comportamento, é esse o motivo. Use o comando de reset abaixo para forçar um novo ponto de partida.
Ler o estado atual
# Todos os domínios
docker compose run --rm app node scripts/extrator.mjs
# Um domínio específico — troque "productivity" pelo domínio desejado (tabela acima)
docker compose run --rm app node scripts/extrator.mjs --domain productivity
Forçar reprocessamento a partir de uma data
# Troque "productivity" pelo domínio desejado (tabela acima)
docker compose run --rm app node scripts/extrator.mjs --domain productivity --min-ctrl "2020-04-01 00:00:00"
A próxima execução do CRON (ou o próximo docker compose up -d, se o container não estiver rodando) já vai partir dessa data.
Error: attempt to write a readonly database
Aparece se você rodar node scripts/extrator.mjs direto no host, fora do container. O arquivo SQLite é criado pelo container (geralmente como root) e o seu usuário local não tem permissão de escrita nele. Sempre rode via docker compose run --rm app ... (como nos exemplos acima) — assim o comando executa com a mesma permissão do container que já escreve nesse arquivo normalmente.
Referência rápida de erros
| Sintoma | Causa | Onde resolver |
|---|---|---|
ORA-01861: literal does not match format string |
Coluna de data não é DATE/TIMESTAMP no Oracle, ou tem valor que não bate com o formato usado |
Tipo das colunas de data |
Mudei {PREFIXO}_QUERY_CTRL_MIN_DEFAULT e nada mudou |
Já existe estado salvo para o domínio; o .env só vale na primeira execução |
Comando de reset acima |
| Dados repetidos sendo enviados | {PREFIXO}_QUERY_CTRL_MAX sem HH24:MI:SS |
Precisão de timestamps |
| Extrator não envia nada | Sem dados novos, CRON ainda não chegou na hora, ou credenciais OAuth erradas | Rode o --checkup acima para isolar a causa |
Error: attempt to write a readonly database |
Rodou node scripts/extrator.mjs fora do container, sem permissão no arquivo SQLite |
Rode via docker compose run --rm app ... |
Invalid environment variables |
Variável obrigatória faltando ou com formato inválido no .env |
Solução de problemas — o erro lista qual variável |
DPI-1047: Cannot locate a 64-bit Oracle Client library |
Oracle Instant Client não encontrado no container | Solução de problemas |