O go-filewatcher é uma aplicação escrita em Go para monitoramento de diretórios, cópia e controle de arquivos processados, com suporte a múltiplos tenants (clientes/ambientes isolados). O sistema é altamente configurável via arquivo YAML e mantém um banco de dados SQLite para rastreamento dos arquivos já processados.
- Sincronização automática na inicialização: Ao iniciar, o sistema garante que todos os arquivos presentes nos diretórios monitorados e de destino estejam registrados no banco de dados. Se houver arquivos presentes em disco e não registrados, eles são copiados/sincronizados e o banco é atualizado automaticamente.
- Monitoramento de Diretórios: Observa diretórios configurados para cada tenant e detecta novos arquivos criados.
- Cópia Automática: Ao detectar um novo arquivo, realiza a cópia para o diretório de destino correspondente ao tenant.
- Controle de Processamento: Registra no banco de dados os arquivos já processados, evitando duplicidade.
- Remoção Opcional do Arquivo Original: Por padrão, remove o arquivo original após a cópia, mas pode manter o arquivo com a flag
--keep-source. - Listagem de Arquivos Processados: Permite listar arquivos já processados, com paginação e filtro por tenant.
- Recópia de Arquivos: Possibilita recopiar arquivos processados para o destino, a partir do ID registrado no banco.
- Exclusão de Arquivos Processados: Permite remover registros e arquivos do disco, a partir do ID.
- Shutdown Graceful: Suporte a encerramento seguro via sinais do sistema.
A configuração é feita via arquivo config.yaml (exemplo em config.example.yaml):
tenants:
- name: tenantA
watch_dir: "/tmp/tenantA/incoming"
dest_dir: "/tmp/tenantA/outgoing"
- name: tenantB
watch_dir: "/tmp/tenantB/incoming"
dest_dir: "/tmp/tenantB/outgoing"Cada tenant possui:
name: Nome identificador do tenantwatch_dir: Diretório a ser monitoradodest_dir: Diretório de destino para cópia dos arquivos
- Utiliza SQLite (
filewatcher.db) - Tabela principal:
processed_files- Campos: id, tenant, file, processed_at, file_size, dest_dir
- Garante unicidade por tenant e arquivo
Para instalar e iniciar o gfw como serviço no Linux (Ubuntu/Debian/EC2), execute:
sudo ./gfw --install-serviceO programa irá:
- Detectar o caminho do binário e diretório atual automaticamente
- Gerar o arquivo de serviço systemd com o path correto
- Copiar para
/etc/systemd/system/go-filewatcher.service - Executar
systemctl daemon-reloadesystemctl enable --now go-filewatcher.service
Após isso, o serviço será iniciado automaticamente no boot.
./gfwO projeto possui um Makefile para facilitar a compilação e execução:
| Comando | Descrição |
|---|---|
| make build | Compila o binário em bin/gfw |
| make run | Compila e executa o binário |
| make clean | Remove a pasta bin/ e o binário gerado |
Exemplo de uso:
make build
make run
make clean--list-processed: Lista arquivos processados--tenant <nome>: Filtra operações por tenant--keep-sourceou-k: Mantém o arquivo original após cópia--delete-processed <ids>: Remove arquivos processados por IDs (requer --tenant)--recopy <ids>: Recopia arquivos processados por IDs (requer --tenant)--page <n>: Página da listagem (default 1)--page-size <n>: Tamanho da página (default 20)
Exemplo de listagem:
./gfw --list-processed --tenant tenantA --page 1 --page-size 10Exemplo de recópia:
./gfw --recopy 1,2,3 --tenant tenantAExemplo de exclusão:
./gfw --delete-processed 4,5 --tenant tenantB- fsnotify — Monitoramento de arquivos
- tablewriter — Exibição de tabelas no terminal
- yaml.v2 — Leitura de arquivos YAML
- modernc.org/sqlite — Banco de dados SQLite
- O projeto suporta múltiplos tenants simultaneamente.
- O arquivo de configuração deve estar no mesmo diretório do executável, nomeado como
config.yaml. - O banco de dados é criado automaticamente na primeira execução.
- O sistema é tolerante a falhas e realiza shutdown seguro ao receber sinais SIGINT/SIGTERM.
2025, Desenvolvido por Thiago Zilli Sarmento ❤️