# 🚀 Brainy Server Deployment & Remote Connection Guide ## Deploy Brainy to a Server and Connect with Cortex --- ## Quick Start: Deploy in 5 Minutes ```bash # 1. Clone and setup git clone https://github.com/soulcraftlabs/brainy.git cd brainy npm install # 2. Configure environment cp .env.example .env # Edit .env with your settings # 3. Build and run with Docker docker-compose up -d # 4. Connect Cortex remotely cortex connect https://your-server.com:3000 # 5. Add augmentation remotely cortex augmentation add brainy-translator ``` --- ## Table of Contents 1. [Server Architecture](#server-architecture) 2. [Deployment Options](#deployment-options) 3. [Step-by-Step Deployment](#step-by-step-deployment) 4. [Remote Cortex Connection](#remote-cortex-connection) 5. [Adding Augmentations Remotely](#adding-augmentations-remotely) 6. [Production Setup](#production-setup) 7. [Security & Authentication](#security--authentication) 8. [Monitoring & Management](#monitoring--management) --- ## Server Architecture ``` ┌─────────────────────────────────────────────────────────┐ │ Client Side │ ├─────────────────────────────────────────────────────────┤ │ Cortex CLI Web UI Applications │ │ ↓ ↓ ↓ │ └─────────────────────────────────────────────────────────┘ ↓ [HTTPS/WSS] ↓ ┌─────────────────────────────────────────────────────────┐ │ Server Side │ ├─────────────────────────────────────────────────────────┤ │ Nginx/Load Balancer │ │ ↓ │ │ Brainy Server (Express + Socket.io) │ │ ↓ │ │ BrainyData Instance │ │ ├─ Neural Import (Default) │ │ ├─ Premium Augmentations │ │ └─ Custom Augmentations │ │ ↓ │ │ Storage Backend (S3/R2/PostgreSQL) │ └─────────────────────────────────────────────────────────┘ ``` --- ## Deployment Options ### Option 1: Docker (Recommended) **Best for:** Quick deployment, consistent environments, easy scaling ```bash docker run -d \ -p 3000:3000 \ -e BRAINY_LICENSE_KEY=$LICENSE_KEY \ -e AWS_ACCESS_KEY=$AWS_KEY \ -v brainy-data:/data \ soulcraft/brainy:latest ``` ### Option 2: Node.js Direct **Best for:** Development, custom configurations ```bash npm install npm run build npm start ``` ### Option 3: Kubernetes **Best for:** Large scale, high availability ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: brainy spec: replicas: 3 selector: matchLabels: app: brainy template: metadata: labels: app: brainy spec: containers: - name: brainy image: soulcraft/brainy:latest ports: - containerPort: 3000 ``` ### Option 4: Serverless (AWS Lambda/Vercel) **Best for:** Auto-scaling, pay-per-use ```typescript // api/brainy.ts import { BrainyData } from '@soulcraft/brainy' const brainy = new BrainyData({ storage: { type: 'memory' } }) export default async function handler(req, res) { await brainy.init() // Handle requests } ``` --- ## Step-by-Step Deployment ### Step 1: Prepare the Server ```bash # Ubuntu/Debian sudo apt update sudo apt install -y nodejs npm docker.io nginx certbot # CentOS/RHEL sudo yum install -y nodejs npm docker nginx certbot ``` ### Step 2: Create Brainy Server Application ```typescript // server/index.ts import express from 'express' import { createServer } from 'http' import { Server } from 'socket.io' import cors from 'cors' import { BrainyData } from '@soulcraft/brainy' import { NotionConnector, SalesforceConnector } from '@soulcraft/brainy-quantum-vault' import { CortexRemoteHandler } from './cortexHandler' const app = express() const server = createServer(app) const io = new Server(server, { cors: { origin: '*', methods: ['GET', 'POST'] } }) // Middleware app.use(cors()) app.use(express.json()) app.use(express.static('public')) // Initialize Brainy with production storage const brainy = new BrainyData({ storage: { s3Storage: { bucketName: process.env.S3_BUCKET || 'brainy-production', region: process.env.AWS_REGION || 'us-east-1', accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY } }, cache: { maxSize: 10000, ttl: 3600 }, distributedConfig: { nodeId: process.env.NODE_ID || 'node-1', coordinatorUrl: process.env.COORDINATOR_URL } }) // Initialize augmentations async function initializeAugmentations() { await brainy.init() // Neural Import ready // Add premium augmentations if licensed if (process.env.BRAINY_LICENSE_KEY) { // Notion Connector if (process.env.NOTION_TOKEN) { const notion = new NotionConnector({ licenseKey: process.env.BRAINY_LICENSE_KEY, notionToken: process.env.NOTION_TOKEN, syncMode: 'bidirectional', autoSync: true }) await brainy.addAugmentation('CONDUIT', notion, { name: 'notion-connector', autoStart: true }) console.log('✅ Notion Connector activated') } // Salesforce Connector if (process.env.SF_ACCESS_TOKEN) { const salesforce = new SalesforceConnector({ licenseKey: process.env.BRAINY_LICENSE_KEY, instanceUrl: process.env.SF_INSTANCE_URL, accessToken: process.env.SF_ACCESS_TOKEN, refreshToken: process.env.SF_REFRESH_TOKEN }) await brainy.addAugmentation('CONDUIT', salesforce, { name: 'salesforce-connector', autoStart: true }) console.log('✅ Salesforce Connector activated') } } // Save configuration for Cortex await brainy.saveConfiguration('/data/.cortex/config.json') } // REST API Endpoints app.get('/health', (req, res) => { res.json({ status: 'healthy', version: '1.0.0', augmentations: brainy.listAugmentations() }) }) app.post('/api/add', async (req, res) => { try { const { data, metadata, options } = req.body const id = await brainy.add(data, metadata, options) res.json({ success: true, id }) } catch (error) { res.status(500).json({ success: false, error: error.message }) } }) app.get('/api/search', async (req, res) => { try { const { query, k = 10 } = req.query const results = await brainy.search(query, parseInt(k)) res.json({ success: true, results }) } catch (error) { res.status(500).json({ success: false, error: error.message }) } }) app.get('/api/augmentations', async (req, res) => { const augmentations = brainy.listAugmentations() res.json({ augmentations }) }) app.post('/api/augmentations', async (req, res) => { try { const { type, name, config } = req.body // Dynamic augmentation loading let augmentation switch (config.source) { case 'community': const CommunityAug = await import(config.package) augmentation = new CommunityAug.default(config.options) break case 'premium': const PremiumAug = await import('@soulcraft/brainy-quantum-vault') const AugClass = PremiumAug[config.className] augmentation = new AugClass({ ...config.options, licenseKey: process.env.BRAINY_LICENSE_KEY }) break case 'custom': const CustomAug = await import(config.path) augmentation = new CustomAug.default(config.options) break } await brainy.addAugmentation(type, augmentation, { name, autoStart: true }) res.json({ success: true, message: `Augmentation ${name} added` }) } catch (error) { res.status(500).json({ success: false, error: error.message }) } }) // WebSocket for Cortex Remote Commands const cortexHandler = new CortexRemoteHandler(brainy) io.on('connection', (socket) => { console.log('Client connected:', socket.id) // Handle Cortex commands socket.on('cortex:command', async (command, callback) => { try { const result = await cortexHandler.execute(command) callback({ success: true, result }) } catch (error) { callback({ success: false, error: error.message }) } }) // Real-time augmentation events brainy.on('augmentation:added', (data) => { socket.emit('augmentation:added', data) }) brainy.on('data:added', (data) => { socket.emit('data:added', data) }) socket.on('disconnect', () => { console.log('Client disconnected:', socket.id) }) }) // Start server const PORT = process.env.PORT || 3000 initializeAugmentations().then(() => { server.listen(PORT, () => { console.log(`🧠⚛️ Brainy Server running on port ${PORT}`) console.log(`📡 WebSocket ready for Cortex connections`) console.log(`🔗 API endpoint: http://localhost:${PORT}/api`) }) }).catch(error => { console.error('Failed to initialize:', error) process.exit(1) }) ``` ### Step 3: Create Docker Configuration ```dockerfile # Dockerfile FROM node:20-alpine AS builder WORKDIR /app # Install dependencies COPY package*.json ./ RUN npm ci # Copy source COPY . . # Build RUN npm run build # Download models for offline use RUN npm run download-models # Production image FROM node:20-alpine WORKDIR /app # Copy built application COPY --from=builder /app/dist ./dist COPY --from=builder /app/node_modules ./node_modules COPY --from=builder /app/models ./models COPY --from=builder /app/package.json ./ # Create data directory RUN mkdir -p /data/.cortex EXPOSE 3000 CMD ["node", "dist/server/index.js"] ``` ```yaml # docker-compose.yml version: '3.8' services: brainy: build: . container_name: brainy-server ports: - "3000:3000" environment: - NODE_ENV=production - PORT=3000 # License - BRAINY_LICENSE_KEY=${BRAINY_LICENSE_KEY} # Storage - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY} - S3_BUCKET=${S3_BUCKET:-brainy-production} - AWS_REGION=${AWS_REGION:-us-east-1} # Premium Augmentations - NOTION_TOKEN=${NOTION_TOKEN} - SF_INSTANCE_URL=${SF_INSTANCE_URL} - SF_ACCESS_TOKEN=${SF_ACCESS_TOKEN} - SF_REFRESH_TOKEN=${SF_REFRESH_TOKEN} volumes: - brainy-data:/data - ./augmentations:/app/augmentations restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3 nginx: image: nginx:alpine container_name: brainy-nginx ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./certs:/etc/nginx/certs depends_on: - brainy restart: unless-stopped volumes: brainy-data: ``` ### Step 4: Configure Nginx ```nginx # nginx.conf events { worker_connections 1024; } http { upstream brainy_backend { server brainy:3000; } server { listen 80; server_name brainy.example.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name brainy.example.com; ssl_certificate /etc/nginx/certs/fullchain.pem; ssl_certificate_key /etc/nginx/certs/privkey.pem; # API endpoints location /api { proxy_pass http://brainy_backend; 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_set_header X-Forwarded-Proto $scheme; } # WebSocket for Cortex location /socket.io { proxy_pass http://brainy_backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } # Health check location /health { proxy_pass http://brainy_backend; } } } ``` ### Step 5: Deploy ```bash # Clone repository git clone https://github.com/soulcraftlabs/brainy-server.git cd brainy-server # Configure environment cp .env.example .env vim .env # Add your credentials # Get SSL certificate sudo certbot certonly --standalone -d brainy.example.com # Start services docker-compose up -d # Check logs docker-compose logs -f # Verify deployment curl https://brainy.example.com/health ``` --- ## Remote Cortex Connection ### Method 1: Direct API Connection ```bash # Configure Cortex for remote server cortex config set server.url https://brainy.example.com cortex config set server.apiKey your-api-key-here # Test connection cortex status # Connected to: https://brainy.example.com # Server version: 1.0.0 # Augmentations: 5 active # Use normally cortex add "Data to add on remote server" cortex search "query remote server" cortex augmentations # Shows remote augmentations ``` ### Method 2: WebSocket Connection (Real-time) ```bash # Connect via WebSocket cortex connect wss://brainy.example.com # You'll see: # 🔌 Connecting to wss://brainy.example.com... # ✅ Connected to Brainy server # 🧠 Neural Import: Active # 🔧 Notion Connector: Active # 💼 Salesforce Connector: Active # Now all commands execute remotely in real-time cortex add "Real-time data" # Data added to remote server instantly ``` ### Method 3: SSH Tunnel (Development) ```bash # Create SSH tunnel ssh -L 3000:localhost:3000 user@your-server.com # In another terminal cortex connect http://localhost:3000 # Secure connection through SSH cortex augmentations cortex add "Secure data through tunnel" ``` --- ## Adding Augmentations Remotely ### Via Cortex CLI ```bash # Connect to remote cortex connect https://brainy.example.com # Add community augmentation cortex augmentation install brainy-sentiment-analyzer cortex augmentation add sentiment --type PERCEPTION # ✅ Augmentation 'sentiment' added to remote server # Add premium augmentation cortex license activate lic_xxxxxxxxxxxxx cortex augmentation activate notion-connector \ --notion-token secret_xxxxxxxxx \ --sync-mode bidirectional # ✅ Premium augmentation 'notion-connector' activated # Upload and add custom augmentation cortex augmentation upload ./my-custom.js cortex augmentation add my-custom --type COGNITION # ✅ Custom augmentation uploaded and activated # List all remote augmentations cortex augmentations # Neural Import (SENSE): Active [Default] # sentiment (PERCEPTION): Active [Community] # notion-connector (CONDUIT): Active [Premium] # my-custom (COGNITION): Active [Custom] ``` ### Via REST API ```bash # Add augmentation via API curl -X POST https://brainy.example.com/api/augmentations \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $API_KEY" \ -d '{ "type": "CONDUIT", "name": "slack-connector", "config": { "source": "premium", "className": "SlackConnector", "options": { "slackToken": "xoxb-xxxxxxxxxxxxx", "channels": ["general", "engineering"] } } }' # Response: # {"success": true, "message": "Augmentation slack-connector added"} ``` ### Via Admin UI ```typescript // admin-ui/pages/augmentations.tsx import { useState } from 'react' import { useWebSocket } from '../hooks/useWebSocket' export default function AugmentationsPage() { const { socket, connected } = useWebSocket('wss://brainy.example.com') const [augmentations, setAugmentations] = useState([]) async function addAugmentation(config) { socket.emit('cortex:command', { command: 'augmentation', action: 'add', ...config }, (response) => { if (response.success) { console.log('Augmentation added:', response.result) loadAugmentations() } }) } async function loadAugmentations() { const res = await fetch('/api/augmentations') const data = await res.json() setAugmentations(data.augmentations) } return (