Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

167 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

English version of this README is available at README.en.md

Contrato Público

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.

image

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.

image

Funcionalidades Planeadas

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.

Estrutura do projeto

Stack

  • 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

Scraping

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).

Monitorização

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.

Início rápido (Docker)

Pré-requisitos: Docker & Docker Compose

  1. Copia o ficheiro .env.example para .env dentro da pasta docker/ e altere os valores conforme necessário.

  2. Executa o compose:

docker compose -f docker/compose.yml up -d

Isto irá iniciar:

  • meilisearch
  • postgres
  • backend
  • frontend
  • prometheus e grafana
  • rpxy (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:
    1. Adicionar ports: no docker/compose.yml no serviço rpxy, expondo a porta 80.
    2. Alterar server_name de contratopublico.pt para localhost em rpxy/config/config.toml.

Desenvolvimento local

Podes executar o Meilisearch e o Postgres no Docker, o backend com Cargo e o frontend com Bun/Node.

1. Meilisearch

Inicia o Meilisearch e o Postgres no Docker:

docker compose -f docker/compose-meilisearch.yml up -d

2. Backend (Rust)

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-scraper para não iniciar)
  • Expor a API em :3000 e métricas em :3001/metrics

3. Frontend (SvelteKit)

Requisitos: Bun (recomendado) ou Node 20+

Execute:

cd frontend
bun install
bun run dev

Será apresentada a porta onde o frontend foi exposto.

Licença

Consulta a licença de utilização em LICENSE

Footnotes

  1. Sem qualquer afiliação com o Governo de Portugal ou o IMPIC.

About

Search engine service for public contracts in Portugal

Topics

Resources

Stars

68 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages