AIMeter es un dashboard self-hosted para rastrear uso, cuota y tendencias históricas de proveedores de IA.
- Dashboard frontend con React
- API backend con Express
- Arquitectura de adaptadores multi-proveedor
- Modos runtime:
nodeyserverless - Almacenamiento basado en base de datos y flujo de bootstrap
- Dashboard unificado para varios proveedores de IA
- Gestión de credenciales de proveedores y visualización de cuota
- Historial de uso y páginas de gráficos
- Páginas API relacionadas con endpoint/proxy
- Flujo de inicialización bootstrap + ruta admin
- Motores DB:
sqlite,d1,postgres,mysql
- Frontend: React 18, TypeScript, Vite, Tailwind CSS
- Backend: Node.js, Express, TypeScript
- Almacenamiento: SQLite / Cloudflare D1 / PostgreSQL / MySQL
.
├─ src/ # App frontend
├─ server/ # API backend, auth, jobs, almacenamiento
├─ deploy/ # Guías de despliegue por plataforma
├─ docs/ # Docs API, ejemplos de proveedor, traducciones, docs de config
├─ config.all.yaml # Plantilla completa de configuración
├─ config.yaml # Configuración local activa (copiada de la plantilla)
└─ .env.all # Plantilla completa de variables de entorno
Despliegue en un solo contenedor con nginx + Node.js. Los datos se persisten mediante un volumen montado.
mkdir -p ~/aimeter/db ~/aimeter/log
docker run -d --name aimeter \
-p 3000:3000 \
-e AIMETER_DATABASE_ENGINE=sqlite \
-e AIMETER_DATABASE_CONNECTION=/aimeter/db/aimeter.db \
-e AIMETER_SERVER_PORT=3000 \
-e AIMETER_BACKEND_PORT=3001 \
-e AIMETER_RUNTIME_MODE=node \
-v ~/aimeter/db:/aimeter/db \
-v ~/aimeter/log:/aimeter/log \
bugwz/aimeter:latestAbrir: http://localhost:3000
Docker Compose, HTTPS, MySQL/PostgreSQL y builds multi-arch: deploy/container/README.md
Despliegue serverless. Requiere una base de datos MySQL o PostgreSQL externa.
| Base de datos | Desplegar |
|---|---|
| MySQL | |
| PostgreSQL |
Configura las variables de entorno, completa el bootstrap y luego configura un servicio cron externo para llamar a /api/system/jobs/refresh cada 5 minutos.
Configuración de cron y guía completa: deploy/vercel/README.md
Despliegue serverless. Soporta Cloudflare D1, MySQL o PostgreSQL.
Tras el despliegue, configura las variables de entorno según el modo de base de datos:
| Modo | Variables requeridas |
|---|---|
| D1 | AIMETER_RUNTIME_MODE=serverlessAIMETER_SERVER_PROTOCOL=httpsAIMETER_DATABASE_ENGINE=d1AIMETER_DATABASE_CONNECTION=DB |
| MySQL | AIMETER_RUNTIME_MODE=serverlessAIMETER_SERVER_PROTOCOL=httpsAIMETER_DATABASE_ENGINE=mysqlAIMETER_DATABASE_CONNECTION=mysql://USER:PASSWORD@HOST:3306/DATABASE |
| PostgreSQL | AIMETER_RUNTIME_MODE=serverlessAIMETER_SERVER_PROTOCOL=httpsAIMETER_DATABASE_ENGINE=postgresAIMETER_DATABASE_CONNECTION=postgres://USER:PASSWORD@HOST:5432/DATABASE?sslmode=require |
Los Cron Triggers están integrados — wrangler.jsonc programa automáticamente un refresco cada 5 minutos.
Enlace D1, Hyperdrive y pasos de configuración completos: deploy/cloudflare/README.md
npm run dev # solo frontend
npm run start:server # solo backend
npm run dev:all # frontend + backend
npm run dev:mock:all # frontend + backend (modo mock)
npm run build # chequeo de tipos y build frontend
npm run preview # previsualizar build frontend
npm run cf:dev # desarrollo local de Cloudflare Workers
npm run cf:deploy # desplegar a Cloudflare WorkersFuentes de configuración y prioridad actual:
config.yaml(o ruta desdeAIMETER_CONFIG_FILE)- Variables de entorno
- Valores por defecto internos
Importante:
database.engine/AIMETER_DATABASE_ENGINEes obligatorio.database.connection/AIMETER_DATABASE_CONNECTIONes obligatorio.- En modo
serverless, el scheduler está deshabilitado. - En modo
node, el scheduler en proceso se inicia automáticamente.
Mapeo detallado de campos y explicaciones:
Modos de despliegue compatibles:
- El session secret y la configuración de cifrado se inicializan y persisten por el almacenamiento del sistema durante bootstrap en modo base de datos.
AIMETER_CRON_SECRETyAIMETER_ENDPOINT_SECRETson secretos opcionales de integración; usa valores aleatorios robustos de 32 caracteres.- En producción usa
AIMETER_SERVER_PROTOCOL=httpspara habilitar cabeceras de seguridad de transporte más estrictas.



