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 BASE[^1], disponibilizando-os numa plataforma muito mais usável, rápida e intuitiva.
[^1]: Sem qualquer afiliação com o Governo de Portugal ou o IMPIC.
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.
Embora não seja uma comparação direta e exata, uma vez que a nossa recolha de dados apenas obtém informação superficial apresentada nos resultados de pesquisa do Portal BASE e não inclui campos como localização ou entidades concorrentes (ver issue #28 para progresso), a diferença nos tempos de resposta continua a ser astronómica. 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.
Está planeada disponibilização de informação mais abrangente e interativa sobre este tema de desempenho em issue #10.
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.
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.
Também está prevista a implementação de páginas dedicadas a cada contrato, com informação mais detalhada, evitando que o utilizador tenha de visitar o Portal BASE para obter mais dados.
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, consulte as issues. Contribuições são bem-vindas. Caso tenha sugestões ou novas ideias, crie uma issue a descrevê-las.
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.
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
Copie o ficheiro .env.example
para .env
dentro da pasta docker/
e altere os valores conforme necessário.
Execute o compose:
docker compose -f docker/docker-compose.yml up -d
Isto irá iniciar:
meilisearch
(dados em backend/data/meili_data
)backend
frontend
prometheus
e grafana
rpxy
(proxy reverso)Por predefinição, as portas não são expostas. Em produção, deve disponibilizar o seu próprio proxy (por exemplo, docker-compose-cftunnels.yml
inicia um Cloudflare Tunnel). Para utilização local pode:
ports:
no docker/docker-compose.yml
no serviço rpxy
, expondo a porta 80.server_name
de contratopublico.pt
para localhost
em rpxy/config/config.toml
.Pode executar o Meilisearch em Docker, o backend com Cargo e o frontend com Bun/Node.
Inicie o Meilisearch em Docker:
docker compose -f docker/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):
:3000
e 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.
Consulte a licença de utilização em LICENSE