English version of this README is available at README.en.md
O contratopublico.pt é um serviço de pesquisa de contratos públicos realizados em Portugal que agrega dados do Portal BASE1, disponibilizando-os numa plataforma muito mais usável, rápida e intuitiva.
O Portal BASE oficial apresenta um desempenho muito fraco, mesmo para pesquisas simples de contratos, cada uma demorando frequentemente mais de 5 segundos, e algumas consultas podem ultrapassar os 50 segundos.
A mesma pesquisa simples e a pesquisa com os mesmos filtros no contratopublico.pt devolvem resultados em apenas alguns milissegundos, tornando a pesquisa praticamente instantânea.
O contratopublico.pt também proporciona uma experiência de pesquisa muito mais intuitiva e acessível, com funcionalidades de pesquisa automática, descrições detalhadas para termos técnicos menos familiares ao público geral e uma interface significativamente mais apelativa e funcional.
Atualmente, este projeto permite pesquisar contratos públicos com base em informações simples como título do contrato, entidade adjudicante, entidade adjudicatária, datas, entre outros, e consultar páginas dedicadas a cada contrato com informação detalhada.
Estão planeadas várias novas funcionalidades para tornar o projeto mais informativo. Entre elas, a integração de estatísticas interativas, como gráficos que mostram a despesa diária, mensal e anual com contratos, destaques com os contratos mais caros e quais as localizações/instituições com maior despesa.
Além disso, está planeado o acompanhamento de alterações aos contratos após a sua publicação e a criação de uma página para aceder a informações de cada entidade, mostrando o seu histórico de contratos e estatísticas relacionadas.
Para a lista completa de funcionalidades planeadas, consulta as issues. Contribuições são bem-vindas. Caso tenhas sugestões ou novas ideias, cria uma issue a descrevê-las, ou se te sentires à vontade para a implementar, não hesites em mandar um PR.
- Backend: Rust com Axum
- Motor de Pesquisa: Meilisearch
- Base de Dados: Postgres
- Frontend: SvelteKit + Tailwind + shadcn + TypeScript
- Monitorização: Prometheus + Grafana
backend/ # Backend em Rust
crates/
api/ # API Axum
common/ # Tipos partilhados
scraper/ # Scraper e CLI
frontend/ # Aplicação SvelteKit
docker/ # Ficheiros Compose
monitoring/ # Prometheus + Grafana + k6
rpxy/ # Configuração do proxy reverso
O serviço backend recolhe continuamente dados do Portal BASE usando a crate scraper e adiciona novos contratos ao Meilisearch (para pesquisa de contratos) e à base de dados Postgres (para consulta de informação detalhada de contratos).
O Prometheus e o Grafana com uma dashboard simples estão incluídos em docker/docker-compose.yml, com as suas configurações em monitoring/grafana.
Um simples script de benchmark com k6 também está incluído em monitoring/bench.
Pré-requisitos: Docker & Docker Compose
-
Copia o ficheiro
.env.examplepara.envdentro da pastadocker/e altere os valores conforme necessário. -
Executa o compose:
docker compose -f docker/compose.yml up -d
Isto irá iniciar:
meilisearchpostgresbackendfrontendprometheusegrafanarpxy(proxy reverso)
Por predefinição, as portas não são expostas. Em produção, deves disponibilizar o teu próprio proxy (por exemplo, o compose-cftunnels.yml inicia um Cloudflare Tunnel). Para utilização local podes:
- Executar os serviços localmente sem Docker (ver secção seguinte), ou:
- Adicionar
ports:nodocker/compose.ymlno serviçorpxy, expondo a porta 80. - Alterar
server_namedecontratopublico.ptparalocalhostemrpxy/config/config.toml.
- Adicionar
Podes executar o Meilisearch e o Postgres no Docker, o backend com Cargo e o frontend com Bun/Node.
Inicia o Meilisearch e o Postgres no Docker:
docker compose -f docker/compose-meilisearch.yml up -d
Requisitos: Rust
Consulte backend/src/api/src/main.rs para variáveis de ambiente.
Execute:
cd backend
cargo run --release --bin backend
O backend irá (por predefinição):
- Preparar as definições do Meilisearch
- Executar migrações no Postgres
- Iniciar um ciclo periódico de scraping (usa a flag
--no-scraperpara não iniciar) - Expor a API em
:3000e métricas em:3001/metrics
Requisitos: Bun (recomendado) ou Node 20+
Execute:
cd frontend
bun install
bun run dev
Será apresentada a porta onde o frontend foi exposto.
Consulta a licença de utilização em LICENSE
Footnotes
-
Sem qualquer afiliação com o Governo de Portugal ou o IMPIC. ↩