- config.py: add NEXUS_SERVER_HOST env var for cross-VM deployment - health_service.py: graceful Redis failure when only localhost-bound - systemd service: document remote VM configuration - README: add dedicated 'VM separada' installation section - .env.example: new file with remote connection examples
204 lines
6.2 KiB
Markdown
204 lines
6.2 KiB
Markdown
# Nexus Instance Manager
|
|
|
|
Panel de control central para gestionar instancias multi-tenant de Nexus POS.
|
|
|
|
## Qué hace
|
|
|
|
- **Crear demos** en 1 clic con subdominio, PIN de acceso y fecha de expiración
|
|
- **Monitorear** salud de todos los servicios (POS, DB, Redis, Quart, Systemd)
|
|
- **Gestionar tenants**: activar/desactivar, resetear datos, eliminar
|
|
- **Ejecutar migraciones** de schema en todos los tenants desde una UI
|
|
- **Dashboard** con estadísticas globales y alertas de demos por expirar
|
|
|
|
## Estructura
|
|
|
|
```
|
|
manager/
|
|
├── app.py # Flask app principal
|
|
├── config.py # Variables de entorno
|
|
├── wsgi.py # Entry point para Gunicorn
|
|
├── requirements.txt # Dependencias
|
|
├── services/ # Lógica de negocio
|
|
│ ├── health_service.py # Health checks de infraestructura
|
|
│ ├── tenant_service.py # CRUD tenants (usa tenant_manager del POS)
|
|
│ └── migration_service.py# Orquestación de migraciones
|
|
├── blueprints/ # API REST
|
|
│ ├── auth_bp.py # Login/logout JWT
|
|
│ ├── tenants_bp.py # Gestión de tenants
|
|
│ ├── demos_bp.py # Creación de demos
|
|
│ ├── health_bp.py # Health checks
|
|
│ └── admin_bp.py # Dashboard stats y migraciones
|
|
├── static/ # Frontend SPA
|
|
│ ├── css/manager.css
|
|
│ └── js/manager.js
|
|
├── templates/
|
|
│ └── index.html # Single Page App
|
|
├── scripts/
|
|
│ └── init_manager.py # Inicialización de DB + admin
|
|
├── systemd/
|
|
│ └── nexus-manager.service # Servicio systemd
|
|
└── README.md # Documentación completa
|
|
```
|
|
|
|
## Instalación rápida (mismo servidor)
|
|
|
|
### 1. Dependencias
|
|
|
|
```bash
|
|
cd /home/Autopartes/manager
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### 2. Inicializar base de datos y usuario admin
|
|
|
|
```bash
|
|
cd /home/Autopartes/manager
|
|
python scripts/init_manager.py --email admin@nexus.local --password nexus2026 --name "Super Admin"
|
|
```
|
|
|
|
Esto crea:
|
|
- Tabla `manager_users` (login del panel)
|
|
- Tabla `manager_audit_log` (registro de acciones)
|
|
- Usuario admin por defecto
|
|
|
|
### 3. Configurar variables de entorno
|
|
|
|
Asegúrate de que estas variables estén disponibles (en systemd o `.env`):
|
|
|
|
```bash
|
|
MASTER_DB_URL=postgresql://postgres@localhost/nexus_autoparts
|
|
TENANT_DB_URL_TEMPLATE=postgresql://postgres@localhost/{db_name}
|
|
MANAGER_JWT_SECRET=genera-un-segredo-largo-aqui
|
|
POS_DIR=/home/Autopartes/pos
|
|
REDIS_URL=redis://localhost:6379/0
|
|
```
|
|
|
|
### 4. Registrar servicio systemd
|
|
|
|
```bash
|
|
cp systemd/nexus-manager.service /etc/systemd/system/
|
|
systemctl daemon-reload
|
|
systemctl enable nexus-manager
|
|
systemctl start nexus-manager
|
|
```
|
|
|
|
Accede en: `http://TU_IP:5003`
|
|
|
|
### 5. (Opcional) Agregar a nginx
|
|
|
|
```nginx
|
|
server {
|
|
listen 80;
|
|
server_name manager.nexusautoparts.com.mx;
|
|
|
|
location / {
|
|
proxy_pass http://127.0.0.1:5003;
|
|
proxy_set_header Host $host;
|
|
proxy_set_header X-Real-IP $remote_addr;
|
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
proxy_read_timeout 300s;
|
|
}
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Instalación en Máquina Virtual separada (misma red local)
|
|
|
|
Si el manager corre en una VM diferente al servidor principal (donde está PostgreSQL + POS):
|
|
|
|
### Requisitos de red
|
|
- PostgreSQL del servidor principal debe escuchar en `0.0.0.0:5432` (verificar `listen_addresses = '*'` en `postgresql.conf`)
|
|
- POS (5001), Dashboard (5000) y Quart (5002) ya escuchan en `0.0.0.0` por defecto
|
|
- Redis puede estar solo en `127.0.0.1`; en ese caso el health check mostrará advertencia pero no afecta el funcionamiento
|
|
|
|
### 1. Clonar el repo en la VM
|
|
|
|
```bash
|
|
git clone https://git.consultoria-as.com/consultoria-as/Autoparts-DB.git /home/Autopartes
|
|
cd /home/Autopartes/manager
|
|
```
|
|
|
|
### 2. Instalar dependencias
|
|
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### 3. Configurar variables para conexión remota
|
|
|
|
Crea `/home/Autopartes/manager/.env` o edita el servicio systemd:
|
|
|
|
```bash
|
|
# IP del servidor principal donde corre PostgreSQL y POS
|
|
NEXUS_SERVER_HOST=192.168.10.91
|
|
|
|
# PostgreSQL remoto (cambiar localhost por la IP del servidor)
|
|
MASTER_DB_URL=postgresql://nexus:PASSWORD@192.168.10.91/nexus_autoparts
|
|
TENANT_DB_URL_TEMPLATE=postgresql://nexus:PASSWORD@192.168.10.91/{db_name}
|
|
|
|
# Redis remoto (puede no funcionar si Redis solo escucha en localhost)
|
|
REDIS_URL=redis://192.168.10.91:6379/0
|
|
|
|
# Seguridad
|
|
MANAGER_JWT_SECRET=genera-un-segredo-largo-aqui
|
|
POS_DIR=/home/Autopartes/pos
|
|
```
|
|
|
|
**Nota importante:** La VM manager no necesita una instalación completa del POS. Solo necesita:
|
|
- Los archivos de `manager/`
|
|
- Los archivos de `pos/` (para reutilizar `tenant_manager.py` y migraciones)
|
|
- Conectividad TCP al puerto 5432 del servidor principal
|
|
|
|
### 4. Inicializar DB y admin
|
|
|
|
```bash
|
|
cd /home/Autopartes/manager
|
|
python scripts/init_manager.py --email admin@nexus.local --password TU_PASSWORD
|
|
```
|
|
|
|
### 5. Systemd
|
|
|
|
```bash
|
|
cp systemd/nexus-manager.service /etc/systemd/system/
|
|
# Edita el archivo y cambia localhost por la IP del servidor en MASTER_DB_URL y NEXUS_SERVER_HOST
|
|
nano /etc/systemd/system/nexus-manager.service
|
|
|
|
systemctl daemon-reload
|
|
systemctl enable nexus-manager
|
|
systemctl start nexus-manager
|
|
```
|
|
|
|
---
|
|
|
|
## Uso
|
|
|
|
### Crear una demo
|
|
1. Ve a la sección **Crear Demos**
|
|
2. Llena nombre del negocio, email, días de vigencia
|
|
3. El subdominio se genera automáticamente (puedes personalizarlo)
|
|
4. Click en **Crear Demo**
|
|
5. El panel muestra la URL de acceso y el PIN del owner
|
|
|
|
### Resetear una demo
|
|
- Presiona el ícono de 🔄 en la tabla de demos
|
|
- Limpia TODO el inventario, ventas, clientes, facturas
|
|
- Conserva empleados (incluyendo el owner) y configuración fiscal
|
|
|
|
### Eliminar una demo
|
|
- Presiona 🗑️ y confirma
|
|
- Borra permanentemente la base de datos del tenant
|
|
|
|
### Migraciones
|
|
- Ve a **Migraciones** para ver la versión de schema de cada tenant
|
|
- **Ejecutar todas pendientes** aplica migraciones en TODOS los tenants
|
|
|
|
---
|
|
|
|
## Notas de seguridad
|
|
|
|
- Cambia `MANAGER_JWT_SECRET` en producción
|
|
- El panel expone acciones destructivas (delete/reset); protege el acceso con firewall o VPN
|
|
- Usa HTTPS en producción
|
|
- Si despliegas en VM separada, asegúrate de que el firewall del servidor principal permite conexiones desde la IP de la VM manager al puerto 5432 (PostgreSQL)
|