Skip to content

moa-devops/soteropetro

Repository files navigation

🛢️ SoteroPetro — Real-time Fuel Intelligence for Salvador

Sistema de inteligência preditiva de combustíveis para Salvador/BA, correlacionando o mercado de petróleo Brent (Londres) com os preços nas bombas da cidade.


📌 Sobre o Sistema

O SoteroPetro monitora em tempo real o preço do barril de petróleo Brent e correlaciona com os preços praticados nos postos de Salvador, usando um modelo preditivo que estima quando e quanto o reajuste da Refinaria de Mataripe (Acelen) chegará ao consumidor final.

Contexto real: Em março de 2026, com o Brent ultrapassando US$ 89 e instabilidade no Estreito de Ormuz, a diferença de preço entre postos de Salvador chegou a R$ 1,16/L — o sistema identifica onde está o combustível mais barato em tempo real.


🏗️ Arquitetura — Microserviços em Go

sotetropetro/
├── cmd/
│   ├── ingestor/    # Worker: coleta Brent (Yahoo Finance) + preços dos postos
│   ├── predictor/   # Engine preditivo: correlação Brent → bomba Salvador
│   └── api/         # REST API + serve o dashboard estático
├── internal/
│   ├── models/      # Structs compartilhadas entre os serviços
│   └── repository/  # Camada de acesso ao PostgreSQL
├── frontend/        # Dashboard HTML com Chart.js
├── deploy/
│   ├── chart/       # Helm Chart com PostgreSQL (PVC) + Redis + 3 deployments
│   └── values/
│       └── prod.yml # Values de produção (AWS)
└── gitlab-aws-terraform/  # Infraestrutura AWS provisionada com Terraform

Os 3 Microserviços

Serviço Função Intervalo
ingestor Coleta Brent (Yahoo Finance BZ=F) + câmbio USD/BRL (USDBRL=X); calcula preços da bomba via fórmula calibrada ANP × ICE 5 min
predictor Calcula previsão de reajuste usando coeficiente Acelen (0.42x) 10 min
api Serve dashboard + endpoints REST com cache Redis Contínuo

Um único Dockerfile compila os 3 binários (multi-stage build) e a variável SERVICE seleciona qual executar no pod.


☁️ Infraestrutura AWS (Terraform)

O ambiente de produção roda inteiramente na AWS (região us-east-2 — Ohio) com 3 VMs EC2 t3.medium, cada uma com Elastic IP fixo (IP que não muda mesmo ao desligar a VM) e domínio via Route 53.

AWS — us-east-2 (Ohio)
├── VPC: 10.0.0.0/16
│
├── EC2: gitlab.mateusassis.com          (Elastic IP fixo)
│   └── GitLab CE — HTTPS via Let's Encrypt
│
├── EC2: registry.mateusassis.com        (Elastic IP fixo)
│   ├── Docker Registry (sem senha) — HTTPS via nginx + Let's Encrypt
│   └── GitLab Runner (Docker executor + kubectl + helm)
│
└── EC2: k8s.mateusassis.com             (Elastic IP fixo)
    └── MicroK8s 1.29
        └── Namespace: sotetropetro
            ├── Deployment: sotetropetro-api
            ├── Deployment: sotetropetro-ingestor
            ├── Deployment: sotetropetro-predictor
            ├── Deployment: sotetropetro-postgres (PVC: 2Gi)
            ├── Deployment: sotetropetro-redis
            ├── Ingress: sotetropetro.apps.mateusassis.com (HTTPS · TLS via cert-manager)
            └── ClusterIssuer: letsencrypt-prod (HTTP-01 · Let's Encrypt)

DNS (Route 53 — mateusassis.com)

Subdomínio Destino
gitlab.mateusassis.com VM GitLab
registry.mateusassis.com VM Registry + Runner
k8s.mateusassis.com VM Kubernetes
*.apps.mateusassis.com Ingress do K8s (apps expostas)

Provisionar a infraestrutura

cd gitlab-aws-terraform
cp terraform.tfvars.example terraform.tfvars
# Preencha: key_name, my_ip

terraform init
terraform plan
terraform apply

💾 Infraestrutura como Código (IaC)

PVC — O diferencial desta demonstração

# postgres.yaml — dados persistem mesmo se o pod reiniciar
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sotetropetro-postgres-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: microk8s-hostpath

Recursos criados no Kubernetes

  • 3 Deployments (api, ingestor, predictor) com initContainers aguardando o PostgreSQL
  • 1 PVC de 2Gi para persistência dos dados históricos
  • Secret com credenciais do banco injetadas via secretKeyRef
  • Service + Ingress com TLS automático via cert-manager + Let's Encrypt
  • ClusterIssuer letsencrypt-prod gerenciado pelo próprio Helm Chart

⛽ Cálculo de Preços da Bomba

O ingestor usa uma fórmula calibrada por correlação histórica ANP × ICE para calcular o preço da gasolina comum em Salvador em tempo real:

base = Brent (USD/barril) × USD/BRL × 0,0105 + R$ 2,20

O resultado inclui: custo de refino (Acelen/Mataripe), PIS/COFINS + CIDE, margem de distribuição, margem do posto e ICMS-BA (~20,5%). Cada posto tem um offset fixo de localização aplicado sobre a base (ex: Petrobras Paralela -R$ 0,15 por alto volume; BR Barra +R$ 0,32 por ser área turística). Os preços variam a cada ciclo de coleta conforme o mercado.


🔮 Motor Preditivo

Se Brent subiu 10% em Londres:
→ Impacto no preço final = 10% × 0.42 (coeficiente Acelen)
→ Latência de repasse: 7-14 dias (depende da magnitude)
→ Confiança: inversamente proporcional à volatilidade

Baseado em análises históricas da ANP pós-privatização da Refinaria de Mataripe.


🔄 Pipeline CI/CD

push main → build (Kaniko) → deploy (Helm)
  • Kaniko compila o Go multi-stage e publica no Registry (registry.mateusassis.com)
  • O Registry não exige autenticação — acesso controlado pelo Security Group da AWS
  • Helm faz o deploy dos 3 serviços + PostgreSQL + Redis no MicroK8s

🌐 Variáveis CI/CD

Variável Descrição Tipo Masked
KUBECONFIG kubeconfig do cluster MicroK8s File

O registry não usa senha — nenhuma credencial de registry é necessária no pipeline.


🛠️ Como rodar localmente

# Sobe PostgreSQL e Redis via Docker
docker run -d --name postgres -e POSTGRES_DB=sotetropetro \
  -e POSTGRES_USER=sotetropetro -e POSTGRES_PASSWORD=sotetropetro \
  -p 5432:5432 postgres:16-alpine

docker run -d --name redis -p 6379:6379 redis:7.2-alpine

# Build e execução
go run ./cmd/ingestor &
go run ./cmd/predictor &
go run ./cmd/api

# Acesse: http://localhost:8080

☸️ Deploy manual no Kubernetes

helm upgrade --install sotetropetro ./deploy/chart/ \
  --namespace sotetropetro \
  --values ./deploy/values/prod.yml \
  --set image.repository=registry.mateusassis.com/soteropetro/soteropetro \
  --set image.tag=latest \
  --create-namespace

About

Plataforma de inteligência de preços de combustíveis em Salvador/BA — Go, Kubernetes, Helm e AWS

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors