# Agendamento em produção

O painel é o único consumidor da fila de sincronização. O cron de sincronização apenas enfileira os municípios elegíveis em `nfse_sync_jobs`.

## Crontab recomendado

```cron
* * * * * /home/notanacional/www/masper-notanacional/start_panel.sh >/dev/null 2>&1
*/5 * * * * /home/notanacional/www/masper-notanacional/update_app.sh >/dev/null 2>&1
2,12,22,32,42,52 * * * * /home/notanacional/www/masper-notanacional/sync_all.sh >> /home/notanacional/www/masper-notanacional/sync_cron.log 2>&1
```

O deslocamento de dois minutos evita iniciar o enqueue no mesmo minuto do `update_app.sh`.

## Responsabilidades

- `start_panel.sh`: watchdog idempotente; mantém o painel e o dispatcher ativos.
- `update_app.sh`: atualiza código, dependências e migrations; reinicia o painel quando necessário.
- `sync_all.sh`: seleciona municípios ativos com certificado ativo e válido e os coloca na fila.
- dispatcher do painel: executa no máximo a quantidade definida no menu `Controle` de sincronizações simultâneas.

Se o painel estiver temporariamente parado, o cron ainda grava os jobs. Eles serão consumidos quando o painel iniciar novamente.

## Transição de versão

A implantação pode ocorrer sem janela crítica:

1. publicar primeiro a versão nova;
2. deixar `update_app.sh` copiar o novo `sync_all.sh`;
3. substituir o crontab pelo bloco recomendado.

A opção antiga `--concurrency` continua aceita temporariamente pelo script, mas é ignorada. A concorrência pertence somente ao dispatcher.
