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.
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/ # 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.example para .env dentro da pasta docker/ e altere os valores conforme necessário.
Executa o compose:
docker compose -f docker/compose.yml up -d
Isto irá iniciar:
meilisearchpostgresbackendfrontendprometheus e grafanarpxy (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:
ports: no docker/compose.yml no serviço rpxy, expondo a porta 80.server_name de contratopublico.pt para localhost em rpxy/config/config.toml.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):
--no-scraper para não iniciar):3000 e métricas em :3001/metricsRequisitos: 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