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 BASE[^1], disponibilizando-os numa plataforma muito mais usável, rápida e intuitiva.

image

[^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.

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.

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.

Estrutura do projeto

Stack

  • Backend: Rust com Axum
  • Motor de Pesquisa: Meilisearch
  • Frontend: SvelteKit + Tailwind + 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.

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. Copie o ficheiro .env.example para .env dentro da pasta docker/ e altere os valores conforme necessário.

  2. 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:

  • Executar os serviços localmente sem Docker (ver secção seguinte), ou:
    1. Adicionar ports: no docker/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

Pode executar o Meilisearch em Docker, o backend com Cargo e o frontend com Bun/Node.

1. Meilisearch

Inicie o Meilisearch em Docker:

docker compose -f docker/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
  • Iniciar um ciclo periódico de scraping
  • 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

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

Top categories

Loading Svelte Themes