No description
  • Go 60.7%
  • HTML 32.5%
  • Dockerfile 4.1%
  • Makefile 2.7%
Find a file
Jesus Marin adce59a042
All checks were successful
CI / test (push) Successful in 1m23s
CI / lint (push) Successful in 1m19s
CI / docker (push) Successful in 1m3s
initial commit
2026-05-13 11:29:15 -04:00
.forgejo/workflows initial commit 2026-05-13 11:29:15 -04:00
cmd/app initial commit 2026-05-13 11:29:15 -04:00
internal initial commit 2026-05-13 11:29:15 -04:00
templates initial commit 2026-05-13 11:29:15 -04:00
.env.example initial commit 2026-05-13 11:29:15 -04:00
.gitignore initial commit 2026-05-13 11:29:15 -04:00
docker-compose.yml initial commit 2026-05-13 11:29:15 -04:00
Dockerfile initial commit 2026-05-13 11:29:15 -04:00
go.mod initial commit 2026-05-13 11:29:15 -04:00
go.sum initial commit 2026-05-13 11:29:15 -04:00
Makefile initial commit 2026-05-13 11:29:15 -04:00
README.md initial commit 2026-05-13 11:29:15 -04:00

Banco Central de Venezuela (BCV) Scraper

Aplicacion Go que extrae la tasa de cambio oficial USD/VES desde bcv.org.ve, la almacena en SQLite y la expone via Web UI y API JSON.

Caracteristicas

  • Scraping robusto con goquery usando selectores CSS
  • Reintentos con backoff exponencial (3 intentos)
  • Deduplicacion en base de datos: solo inserta si el precio cambio
  • Web UI en / con la tasa actual formateada
  • Historial en /history con grafica de linea (Chart.js desde CDN)
  • API JSON en /api/rates y /api/rates/history
  • Health check en /health para monitoreo
  • Graceful shutdown: cierra conexiones y detiene el scheduler al recibir SIGTERM/SIGINT
  • Logging estructurado con log/slog
  • Configuracion via variables de entorno
  • Docker con build multi-stage y persistencia de datos

Uso rapido

# Clonar
git clone <repo-url> && cd bcv_app

# Con Make
make run

# O manual
cp .env.example .env
go run cmd/app/main.go

# Abrir http://localhost:8080

Docker

make docker-up     # Construye y levanta
make docker-down   # Detiene

El contenedor expone el puerto 80 y persiste la BD en ./data/.

Endpoints

Ruta Metodo Descripcion
/ GET Pagina web con la tasa actual
/history GET Pagina con grafica de historial de tasas
/api/rates GET JSON con el ultimo precio registrado
/api/rates/history?limit=90 GET JSON con historial de precios (max 500)
/health GET Health check (HTTP 200)

Ejemplo respuesta /api/rates

{
  "price": "508,60",
  "date": "13/05/2026 10:30 AM",
  "timestamp": "2026-05-13T10:30:00-04:00"
}

Ejemplo respuesta /api/rates/history?limit=3

[
  {"price": "508,60", "date": "13/05/2026 02:21 PM"},
  {"price": "390,29", "date": "12/02/2026 02:18 PM"},
  {"price": "390,29", "date": "12/02/2026 02:10 PM"}
]

Variables de entorno

Variable Default Descripcion
BCV_DB_PATH data/bcv.db Ruta del archivo SQLite
BCV_PORT 8080 Puerto HTTP
BCV_SCRAPE_URL https://bcv.org.ve/ URL del BCV
BCV_SCRAPE_INTERVAL 12h Intervalo entre scrapes (formato Go duration)
BCV_INSECURE_TLS true Deshabilita verificacion TLS (necesario para BCV)
BCV_LOG_LEVEL info Nivel de log: debug, info, warn, error

Estructura del proyecto

bcv_app/
├── cmd/app/main.go          # Entry point
├── internal/
│   ├── config/config.go     # Carga de variables de entorno
│   ├── core/db/sqlite.go    # Inicializacion de SQLite
│   └── modules/exchange/
│       ├── model.go         # Entidad Rate
│       ├── repository.go    # Acceso a datos
│       ├── scraper.go       # Scraping con goquery
│       ├── service.go       # Logica de negocio y scheduler
│       └── handler.go       # Handlers HTTP
├── templates/
│   ├── index.html     # Template de la Web UI
│   └── history.html   # Grafica de historial
├── Dockerfile
├── docker-compose.yml
├── Makefile
├── .env.example
├── go.mod
└── go.sum

Desarrollo

make build      # Compila el binario
make run        # Ejecuta localmente
make test       # Corre tests
make lint       # Revisa codigo con go vet
make fmt        # Formatea codigo
make clean      # Elimina binario

CI/CD (Forgejo Actions)

El proyecto incluye un workflow de integracion continua en .forgejo/workflows/ci.yml:

  1. test — Ejecuta go test -race en cada push y PR
  2. lint — Ejecuta go vet para verificacion estatica
  3. docker — Construye y publica la imagen en el registry de Forgejo (git.jesusmarin.dev/{owner}/{repo}) con tags latest y sha-{commit} (solo en push a master)

Configuracion requerida

Crear un secreto FORGEJO_TOKEN en Settings > Actions > Secrets del repositorio. Debe ser un token de acceso personal con permisos de lectura/escritura al container registry.

Dependencias

Licencia

MIT