# Railway Deployment Guide - BR-95 Desktop OS This guide explains how to deploy the BlackRoad Operating System (BR-95 Desktop) to Railway. ## Overview The BR-95 Desktop is a retro Windows 95-inspired web-based operating system that provides: - **Lucidia AI Orchestration** - 1000+ AI agents - **RoadChain Blockchain** - Decentralized ledger - **RoadCoin Wallet** - Cryptocurrency management - **Mining Interface** - RoadCoin mining dashboard - **Raspberry Pi Management** - IoT device control - **Terminal** - Simulated command-line interface - **Real-time Updates** - WebSocket live data streaming ## Architecture ``` BR-95 Desktop (HTML + JS + CSS) ↓ FastAPI Backend (backend/app/main.py) ↓ BR-95 Router (backend/app/routers/br95.py) ↓ Data Simulator + WebSocket Manager ``` ## Deployment Configuration ### Railway Project - **Project Name**: `gregarious-wonder` - **Service Name**: `BlackRoad-Operating-System` - **Primary Domain**: `app.blackroad.systems` - **Default URL**: `https://blackroad-operating-system-production.up.railway.app` ### Configuration Files **railway.toml**: ```toml [build] builder = "NIXPACKS" [deploy] startCommand = "uvicorn backend.app.main:app --host 0.0.0.0 --port $PORT" healthcheckPath = "/health" healthcheckTimeout = 100 restartPolicyType = "ON_FAILURE" restartPolicyMaxRetries = 10 ``` ### Environment Variables Railway automatically sets: - `PORT` - The port the application should listen on (default: 8080) Optional environment variables: - `BR_OS_VERSION` - Version string for `/version` endpoint (default: "1.0.0") - `GIT_SHA` - Git commit SHA for version tracking - `BUILD_TIME` - Build timestamp ## API Endpoints The BR-95 backend exposes the following endpoints: ### Health & Version - `GET /health` - Health check endpoint ```json { "status": "healthy", "service": "blackroad-operating-system", "timestamp": "2025-11-20T12:34:56Z" } ``` - `GET /version` - Version information ```json { "service": "blackroad-operating-system", "version": "1.0.0", "git_sha": "abc123", "build_time": "2025-11-20T12:00:00Z" } ``` ### BR-95 Data APIs All BR-95 endpoints are prefixed with `/api/br95`: - `GET /api/br95/lucidia` - Lucidia AI orchestration stats - `GET /api/br95/agents` - AI agent statistics - `GET /api/br95/roadchain` - Blockchain statistics - `GET /api/br95/wallet` - Wallet balance and transactions - `GET /api/br95/miner` - Mining performance metrics - `GET /api/br95/raspberry-pi` - Raspberry Pi device stats - `GET /api/br95/github` - GitHub integration stats - `GET /api/br95/roadmail` - RoadMail statistics - `GET /api/br95/roadcraft` - RoadCraft game statistics - `GET /api/br95/road-city` - Road City metaverse statistics - `POST /api/br95/terminal` - Execute terminal commands ### WebSocket - `WS /api/br95/ws` - Real-time updates WebSocket **Message Types**: - `connected` - Initial connection confirmation - `miner_update` - Mining statistics update - `roadchain_update` - Blockchain statistics update - `wallet_update` - Wallet balance update **Example Message**: ```json { "type": "miner_update", "data": { "is_mining": true, "hash_rate": "1.2 GH/s", "shares_accepted": 8423, "blocks_mined": 12 }, "timestamp": "2025-11-20T12:34:56Z" } ``` ## Deployment Process ### 1. Connect to Railway ```bash # Install Railway CLI curl -fsSL https://railway.com/install.sh | sh # Login railway login # Link to project railway link c03a8b98-5c40-467b-b344-81c97de22ba8 ``` ### 2. Deploy Railway will automatically deploy when you push to the connected branch: ```bash git push origin main ``` Or deploy manually: ```bash railway up ``` ### 3. Verify Deployment Check the health endpoint: ```bash curl https://app.blackroad.systems/health ``` Expected response: ```json { "status": "healthy", "service": "blackroad-operating-system", "timestamp": "2025-11-20T12:34:56Z" } ``` ### 4. Test the BR-95 Desktop Open in your browser: ``` https://app.blackroad.systems/ ``` You should see: 1. Boot screen with BlackRoad logo animation 2. Desktop with icons (Lucidia, Agents, RoadChain, Wallet, Miner, etc.) 3. Taskbar with "Road" button and system clock 4. Working windows with real-time data from the API ### 5. Test WebSocket Open the browser console and check for: ``` ✅ BR-95 WebSocket connected WebSocket confirmed: BR-95 OS WebSocket connected ``` ## Troubleshooting ### Health Check Failures If the health check fails: 1. Check the Railway logs: ```bash railway logs ``` 2. Verify the service is listening on `$PORT`: ```python # backend/app/main.py should use: # uvicorn backend.app.main:app --host 0.0.0.0 --port $PORT ``` 3. Ensure `/health` endpoint is accessible: ```bash curl https://app.blackroad.systems/health ``` ### WebSocket Connection Issues If WebSocket fails to connect: 1. Check the browser console for errors 2. Verify WebSocket is properly configured in `br95.py`: ```python @router.websocket("/ws") async def websocket_endpoint(websocket: WebSocket): await manager.connect(websocket) # ... ``` 3. Test WebSocket manually: ```javascript const ws = new WebSocket('wss://app.blackroad.systems/api/br95/ws'); ws.onopen = () => console.log('Connected'); ws.onmessage = (e) => console.log('Message:', e.data); ``` ### Missing Dependencies If deployment fails due to missing dependencies: 1. Verify `psutil` is in `backend/requirements.txt`: ``` psutil==5.9.6 ``` 2. Rebuild the service: ```bash railway up --detach ``` ### API Returns 404 If `/api/br95/*` endpoints return 404: 1. Verify the router is registered in `backend/app/main.py`: ```python from app.routers import br95 app.include_router(br95.router) ``` 2. Check the router prefix in `br95.py`: ```python router = APIRouter(prefix="/api/br95", tags=["BR-95 Desktop"]) ``` ### Static Files Not Loading If CSS/JS files fail to load: 1. Verify static file serving in `main.py`: ```python app.mount("/static", StaticFiles(directory=static_dir, html=True), name="static") ``` 2. Check file paths in HTML: ```html ``` ## Monitoring ### View Logs ```bash railway logs railway logs --follow # Stream logs ``` ### Check Metrics Railway provides built-in metrics: - CPU usage - Memory usage - Network traffic - Request count Access these in the Railway dashboard. ### Custom Metrics The BR-95 backend includes Prometheus metrics (if enabled): - Request duration - Request count - WebSocket connections - API endpoint usage ## Scaling Railway automatically handles scaling for: - Horizontal scaling (multiple instances) - Vertical scaling (increased resources) To manually adjust: 1. Go to Railway dashboard 2. Select the service 3. Adjust resources under "Settings" ## Custom Domain The service is already configured with: - Primary: `app.blackroad.systems` - Railway default: `blackroad-operating-system-production.up.railway.app` To add additional domains: 1. Go to Railway dashboard 2. Select the service 3. Click "Settings" → "Domains" 4. Add custom domain 5. Configure DNS (CNAME or A record) ## Security ### Environment Variables Store sensitive data in Railway environment variables: ```bash railway variables set SECRET_KEY=your-secret-key railway variables set DATABASE_URL=postgresql://... ``` ### CORS Configuration CORS is configured in `backend/app/main.py`: ```python app.add_middleware( CORSMiddleware, allow_origins=settings.allowed_origins_list, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) ``` Update `ALLOWED_ORIGINS` in environment: ```bash railway variables set ALLOWED_ORIGINS="https://app.blackroad.systems,https://blackroad.systems" ``` ## Rollback To rollback to a previous deployment: 1. Go to Railway dashboard 2. Select the service 3. Click "Deployments" 4. Select previous deployment 5. Click "Redeploy" Or via CLI: ```bash railway rollback ``` ## Support For issues: 1. Check Railway logs: `railway logs` 2. Review this documentation 3. Check CLAUDE.md for development guidelines 4. Open an issue on GitHub ## References - Railway Documentation: https://docs.railway.app - FastAPI Documentation: https://fastapi.tiangolo.com - WebSocket Documentation: https://websockets.readthedocs.io - BR-95 Router: `backend/app/routers/br95.py` - Main Application: `backend/app/main.py` - Desktop UI: `backend/static/index.html`