No description
- Go 60.7%
- HTML 32.5%
- Dockerfile 4.1%
- Makefile 2.7%
| .forgejo/workflows | ||
| cmd/app | ||
| internal | ||
| templates | ||
| .env.example | ||
| .gitignore | ||
| docker-compose.yml | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| Makefile | ||
| README.md | ||
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
/historycon grafica de linea (Chart.js desde CDN) - API JSON en
/api/ratesy/api/rates/history - Health check en
/healthpara 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:
- test — Ejecuta
go test -raceen cada push y PR - lint — Ejecuta
go vetpara verificacion estatica - docker — Construye y publica la imagen en el registry de Forgejo (
git.jesusmarin.dev/{owner}/{repo}) con tagslatestysha-{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
- goquery - Parser HTML con selectores CSS
- modernc.org/sqlite - Driver SQLite puro en Go (sin CGO)
- Chart.js - Graficas via CDN (sin compilacion)
Licencia
MIT