BLACKCOFFEE
APPLICATION SERVER v2.12.0
Insitu Framework v1.3.0 | Node.js >=22.0.0
Overview
BlackCoffee es un Application Server de próxima generación construido con Insitu Framework.
Desplegá múltiples aplicaciones con aislamiento lógico, hot reload, y gestión centralizada de bases de datos.
La versión v2.12.0 incluye Scheduler Extension para tareas programadas (cron), Route Statistics para métricas en tiempo real,
y aislamiento de procesos con child_process.fork().
System Requirements
| Operating System | Windows, Linux, macOS |
| Runtime | Node.js >= 22.0.0 |
| Framework | Insitu Framework v1.3.0 |
| Memory | 512 MB RAM (2 GB recommended) |
| Disk Space | 100 MB |
| License | Apache License 2.0 |
| Docker Image | ~257MB (Alpine-based) |
Quick Start
- Clonar el repositorio
- Ejecutar first-start (crea certificados y directorios)
- Iniciar el servidor
- Acceder al admin console
$ git clone https://gitlab.com/bytedogssyndicate1/bc2
$ npm run first-start
$ node server.js
[BlackCoffee] Server initialized
[BlackCoffee] HTTPS on port 9791
[BlackCoffee] Admin: https://localhost:9791/admin
[BlackCoffee] ✓ Ready
Installation
Prerequisites
$ git clone https://gitlab.com/bytedogssyndicate1/bc2
$ cd bc2
$ npm run first-start
$ node server.js
Server Access
| Server | https://localhost:9791 | API y aplicaciones |
| Admin Web | https://localhost:9791/admin | Dashboard administrativo |
| Admin TCP | telnet 127.0.0.1 9999 | Consola administrativa |
Features
| Feature | Description |
| Multi-App Deploy | Deploy múltiples apps con aislamiento (/app-name/version/) |
| Logical Isolation | Cada app corre en contexto aislado |
| Process Isolation (v2.6) | Aislamiento total con child_process.fork() - useVM: true |
| External Config | Configuración JSON externa sin modificar código |
| Hot Reload | Auto-deploy y recarga en vivo |
| Database Pools | SQLite, MariaDB, MySQL, Memory, Redis, PostgreSQL |
| Queue Manager | Procesamiento de jobs asíncronos con workers |
| Scheduler Extension (v2.12) | Tareas programadas con cron, interval y delay |
| Route Statistics (v2.10) | Métricas de rendimiento en tiempo real por endpoint |
| Isolated Helpers (v2.7) | Acceso seguro a DB Pools y Queues desde apps aisladas (IPC) |
| CLI Tools | Interfaz de línea de comandos completa |
| Web Admin UI | Dashboard para administración |
| Docker Support | Imagen minimalista ~257MB optimizada para producción |
| Login Rate Limiter | Protección contra brute force |
Architecture
| Component | Location | Description |
| Entry Point | server.js | Servidor principal |
| App Loader | core/appLoader.js | Gestión de aplicaciones |
| IsolatedAppLoader | core/IsolatedAppLoader.js | Carga de apps aisladas (child_process.fork) |
| Hot Reload | core/hotReload.js | Recarga en vivo |
| DB Pool Manager | core/databasePoolManager.js | Gestión de conexiones |
| Queue Manager | core/QueueManager.js | Colas de jobs |
| Scheduler Extension | includes/scheduler-extension.js | Tareas programadas (cron, interval, delay) |
| Route Stats | includes/route-stats.js | Estadísticas de rutas en tiempo real |
| CLI | cli/commands/ | Comandos de terminal |
| Admin Controllers | controllers/admin/ | APIs administrativas |
| Session Manager | core/blackcoffee-core/ | Gestión de sesiones |
| Login Rate Limiter | includes/loginRateLimiter.js | Protección anti brute force |
Directory Structure
blackcoffee/
├── server.js # Entry point
├── manifests/ # Manifiestos inmutables
│ └── {app-name}/{version}/
│ └── manifest.json
├── apps/ # Código de aplicaciones
│ └── {app-name}/{version}/
│ ├── controllers/
│ ├── models/
│ ├── routes/
│ └── public/
├── core/ # Core del framework
│ ├── blackcoffee-core/ # Core library
│ ├── appLoader.js
│ ├── IsolatedAppLoader.js # Aislamiento de procesos
│ ├── hotReload.js
│ ├── databasePoolManager.js
│ ├── QueueManager.js
│ ├── PostgresAdapter.js
│ └── RedisAdapter.js
├── includes/ # Middleware y utilidades
│ ├── scheduler-extension.js # Tareas programadas
│ ├── route-stats.js # Estadísticas de rutas
│ ├── loginRateLimiter.js
│ ├── adminAuth.js
│ └── sessions.js
├── config/
│ ├── server.json
│ ├── database.json
│ └── queues.json
└── certs/ # Certificados SSL
Process Isolation (v2.6.0)
BlackCoffee v2.6.0 introduce aislamiento real de procesos usando child_process.fork().
Cada aplicación aislada corre en un proceso separado con su propio espacio de memoria.
Enable Isolation
{
"name": "mi-app",
"version": "1-0-0",
"blackcoffee": {
"useVM": true
}
}
Benefits
- Isolated Memory - Cada app tiene su own heap
- No Shared Globals - No puede afectar
global.dbPoolManager
- No Shared Module Cache - Cada app tiene su propio cache
- No Prototype Pollution - Prototype chain aislada
- Crash Isolation - Si una app crashea, las otras no se afectan
IPC Communication
El servidor principal y los workers se comunican mediante mensajes IPC:
┌─────────────────────────────────────────────────────────┐
│ BlackCoffee Server (Main Process) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ App 1 │ │ App 2 │ │ App 3 │ │
│ │ Worker │ │ Worker │ │ Worker │ │
│ │ (PID:123) │ │ (PID:124) │ │ (PID:125) │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
│ │ IPC │ IPC │ IPC │
│ └────────────────┴────────────────┘ │
└─────────────────────────────────────────────────────────┘
Scheduler Extension (v2.12.0)
BlackCoffee v2.12.0 introduce el sistema de programación de tareas para jobs recurrentes.
Construido sobre QueueManager, permite ejecutar tareas con cron expressions, intervalos o delays.
Features
- Cron Expressions - Programá con sintaxis cron (
0 */15 * * * *)
- Interval Jobs - Ejecutá cada X tiempo (
30s, 5m, 1h)
- Delay Jobs - Ejecución única después de un delay
- Persistent - Los jobs se guardan en BD, sobreviven a reinicios
- Task Management Dashboard - Gestioná tareas desde
/tasks
Example Usage
const scheduler = require('./includes/scheduler-extension');
await scheduler.init({
queue: 'otrack-tasks',
pool: 'otrack-db',
concurrency: 2
});
scheduler.schedule('0 */15 * * * *', 'detect-abandoned-carts', {}, {
name: 'detect-abandoned-carts',
timezone: 'America/Santiago'
});
scheduler.every('1h', 'cleanup-sessions', {}, {
name: 'cleanup-expired-sessions'
});
scheduler.delay(3600000, 'send-reminder', {
userId: 123
});
Scheduled Jobs Example (OTrack)
| Job | Schedule | Description |
detect-abandoned-carts | 0 */15 * * * * | Detectar carritos abandonados (30+ min inactivo) |
cleanup-expired-sessions | 0 0 * * * * | Limpiar sesiones expiradas de la BD |
cleanup-old-logs | 0 0 4 * * * | Limpieza diaria de eventos viejos (90+ días) |
Route Statistics (v2.10.0)
BlackCoffee v2.10.0 introduce estadísticas de rendimiento en tiempo real por ruta.
Monitoreá el performance de tus endpoints con métricas detalladas.
API Endpoints
| Method | Endpoint | Description | Auth |
| GET | /api/admin/stats/routes | Listar todas las rutas con stats | Required |
| GET | /api/admin/stats/routes/summary | Resumen general de estadísticas | Required |
| GET | /api/admin/stats/routes/:method/:path | Stats de ruta específica | Required |
| DELETE | /api/admin/stats/routes/clear | Limpiar estadísticas acumuladas | Required |
Metrics Captured
- count - Total de requests por ruta
- rps - Requests por segundo (ventana deslizante de 1 min)
- avgMs - Tiempo promedio de respuesta en milisegundos
- totalMs - Tiempo total acumulado
- lastAccess - Timestamp del último acceso
- createdAt - Cuando se registró la ruta por primera vez
Example Response
{
"success": true,
"data": [
{
"method": "POST",
"path": "/api/admin/auth/login",
"count": 50,
"rps": 5,
"avgMs": 15,
"totalMs": 750,
"lastAccess": "2026-02-23T16:00:00.000Z",
"createdAt": "2026-02-23T15:00:00.000Z"
}
],
"timestamp": "2026-02-23T16:00:01.000Z"
}
Authentication & Sessions
BlackCoffee soporta dos sistemas de autenticación independientes:
System 1: Session Manager del Core
Usado por el dashboard administrativo (/admin). Almacena sesiones en memoria.
- Cookie:
blackcoffee_admin_session
- Default User:
admin / bl4ckc0ff33
- ⚠️ IMPORTANTE: Cambiar contraseña inmediatamente
System 2: Database Sessions + JWT (Recomendado para Apps)
Usado por otrack y woo-analytics. Sesiones persistentes en base de datos.
- Persistence: Sobrevive a reinicios del servidor
- Auditing: Tracking completo de actividad
- JWT Support: Para APIs y mobile apps
- Invalidation: Revocación controlada de sesiones
Database Structure
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) UNIQUE NOT NULL,
email VARCHAR(100) UNIQUE NOT NULL,
password_hash VARCHAR(255) NOT NULL,
role VARCHAR(20) DEFAULT 'user',
active TINYINT(1) DEFAULT 1,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
last_login DATETIME NULL
);
CREATE TABLE jwt_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
token VARCHAR(255) NOT NULL,
token_hash VARCHAR(64) NOT NULL,
expires_at DATETIME NOT NULL,
issued_at DATETIME DEFAULT CURRENT_TIMESTAMP,
revoked TINYINT(1) DEFAULT 0,
ip_address VARCHAR(45),
user_agent TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
CREATE TABLE sessions (
id VARCHAR(64) PRIMARY KEY,
user_id INT NOT NULL,
token VARCHAR(128) UNIQUE NOT NULL,
data TEXT,
expires_at DATETIME NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
Change Password
$ node cli/admin-users.js reset-password admin NuevaPassword123!
POST /api/admin/auth/change-password
{
"currentPassword": "bl4ckc0ff33",
"newPassword": "MiNuevaPassword123!"
}
Docker Deployment
BlackCoffee incluye una imagen Docker minimalista (~257MB) optimizada para producción.
Quick Start
$ docker build -f docker/Dockerfile -t blackcoffee:latest .
$ docker run -d --name blackcoffee-server \
-p 9791:9791 -p 9999:9999 \
--restart unless-stopped \
blackcoffee:latest
$ cd docker
$ docker compose up -d
Access
| Server | https://localhost:9791 |
| Health | https://localhost:9791/api/health |
| Admin Web | https://localhost:9791/admin/login |
| Console TCP | telnet localhost 9999 |
⚠️ Security Warning: Admin Console (Port 9999)
⚠️
DO NOT expose port 9999 publicly in production
ADMIN_HOST=127.0.0.1 previene acceso remoto a la consola TCP. Solo cambiar a 0.0.0.0 si tenés seguridad de red adecuada (firewall, VPN, etc.).
Environment Variables
| Variable | Default | Description |
PORT | 9791 | HTTPS server port |
HOST | 0.0.0.0 | Server host |
ADMIN_PORT | 9999 | Admin console port |
ADMIN_HOST | 127.0.0.1 | Admin console host (secure) |
HOT_RELOAD | false | Hot reload (disable in prod) |
NODE_ENV | production | Node environment |
API Reference
Admin API
| Method | Endpoint | Description |
| GET | /api/admin/apps | List applications |
| GET | /api/admin/apps/:name/:version | App info |
| POST | /api/admin/apps/deploy | Deploy app |
| DELETE | /api/admin/apps/:name/:version | Undeploy |
| POST | /api/admin/apps/:name/:version/restart | Restart |
| GET | /api/admin/auth/verify | Verify session |
| POST | /api/admin/auth/change-password | Change password |
Database API
| Method | Endpoint | Description |
| GET | /api/admin/database/pools | List pools |
| GET | /api/admin/database/pools/stats | Pool statistics |
| POST | /api/admin/database/pools | Create pool |
| DELETE | /api/admin/database/pools/:name | Remove pool |
| POST | /api/admin/database/pools/:name/connect | Connect |
| POST | /api/admin/database/pools/:name/disconnect | Disconnect |
Queues API
| Method | Endpoint | Description |
| GET | /api/admin/queues | List queues |
| GET | /api/admin/queues/stats | Queue stats |
| GET | /api/admin/queues/:name/jobs | List jobs |
| POST | /api/admin/queues | Create queue |
| DELETE | /api/admin/queues/:name | Delete queue |
Stats API (v2.10.0)
| Method | Endpoint | Description |
| GET | /api/admin/stats/routes | List all routes with stats |
| GET | /api/admin/stats/routes/summary | General statistics summary |
| GET | /api/admin/stats/routes/:method/:path | Stats for specific route |
| DELETE | /api/admin/stats/routes/clear | Clear accumulated stats |
Scheduler API (v2.12.0)
| Method | Endpoint | Description |
| GET | /api/admin/scheduler/jobs | List scheduled jobs |
| POST | /api/admin/scheduler/jobs/:name/trigger | Manually trigger job |
| POST | /api/admin/scheduler/jobs/:name/pause | Pause job |
| POST | /api/admin/scheduler/jobs/:name/resume | Resume job |
CLI Commands
Application
blackcoffee app:deploy <tarball> | Deploy application |
blackcoffee app:list | List all apps |
blackcoffee app:status <app> [version] | Show app status |
blackcoffee app:restart <app> [version] | Restart app |
blackcoffee app:undeploy <app> [version] | Remove app |
blackcoffee app:logs <app> [--tail=100] | View app logs |
Database
blackcoffee db:pool:create <name> <type> | Create new pool |
blackcoffee db:pool:list | List all pools |
blackcoffee db:pool:stats | Pool statistics |
blackcoffee db:pool:remove <name> | Remove pool |
Queues
blackcoffee queue:list | List all queues |
blackcoffee queue:stats | Queue statistics |
blackcoffee queue:jobs <queue> | List queue jobs |
Server
blackcoffee server:status | Server status |
blackcoffee server:restart | Restart server |
blackcoffee config:list | List configuration |
Admin Users
node cli/admin-users.js create <user> <pass> [email] | Create admin user |
node cli/admin-users.js list | List admin users |
node cli/admin-users.js delete <user> | Delete admin user |
node cli/admin-users.js reset-password <user> <pass> | Reset password |
Database Pools
Supported Databases
- SQLite - File-based, development
- MariaDB - Production MySQL-compatible
- MySQL - Open-source RDBMS
- PostgreSQL - Production, complex data
- Memory - In-memory caching
- Redis - Key-value store, high-performance
{
"pools": {
"default": {
"type": "sqlite",
"filename": "data/app.sqlite"
},
"production": {
"type": "postgresql",
"host": "localhost",
"port": 5432,
"user": "blackcoffee_app",
"password": "secret",
"database": "myapp_prod"
},
"cache": {
"type": "redis",
"host": "localhost",
"port": 6379
}
}
}
☕
Hot Reload
Los cambios en la configuración de database pools se aplican automáticamente sin reiniciar el servidor.
Isolated Helpers (v2.7.0)
Las aplicaciones aisladas (useVM: true) pueden acceder a Database Pools y Queues vía IPC:
const pools = await global.blackcoffee.db.listPools();
const users = await global.blackcoffee.db.query(
'default',
'SELECT * FROM users WHERE active = ?',
[1]
);
const queues = await global.blackcoffee.queue.listQueues();
const jobId = await global.blackcoffee.queue.enqueue(
'email-queue',
'send-email',
{ to: 'user@example.com' }
);
Roadmap
Progreso: 100% (8/8 fases completas)
| Phase | Description | Status | Version |
| Phase 0 | Stable Base | ✓ Complete | v2.0.0 |
| Phase 1 | App Server Core | ✓ Complete | v2.1.0 |
| Phase 2 | CLI | ✓ Complete | v2.2.0 |
| Phase 3 | Web UI | ✓ Complete | v2.3.0 |
| Phase 4 | Hot Reload | ✓ Complete | v2.4.0 |
| Phase 5 | Database Integration | ✓ Complete | v2.5.0 |
| Phase 6 | Queue Manager | ✓ Complete | v2.8.0 |
| Phase 7 | Production Hardening | ✓ Complete | v2.12.0 |
Features by Version
| Version | Feature | Description |
| v2.12.0 | Scheduler Extension | Tareas programadas con cron, interval, delay |
| v2.10.0 | Route Statistics | Métricas de rendimiento en tiempo real |
| v2.8.0 | Queue Manager | Jobs asíncronos con workers |
| v2.7.0 | Isolated Helpers | Acceso seguro a DB/Queues desde apps aisladas |
| v2.6.0 | Process Isolation | Aislamiento total con child_process.fork |
| v2.5.0 | Database Pools | SQLite, MariaDB, MySQL, Redis, PostgreSQL |