PSA/docs/ai-automation/ai-automation-vnc-setup.md
Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

378 lines
11 KiB
Markdown

# AI Automation VNC Setup Guide
## Overview
The AI automation system supports VNC (Virtual Network Computing) for visual debugging and monitoring of browser automation tasks. This allows developers to see the browser in real-time as Puppeteer performs automation tasks.
## Architecture
The VNC system consists of several components working together:
```
┌─────────────────┐ ┌──────────────┐ ┌─────────────┐
│ Web Browser │───▶│ NoVNC Client │───▶│ WebSocket │
│ (User Client) │ │ (JavaScript) │ │ Proxy │
└─────────────────┘ └──────────────┘ └─────────────┘
┌─────────────────┐ ┌──────────────┐ ┌─────────────┐
│ Chromium │◀───│ Fluxbox │◀───│ x11vnc │
│ (Puppeteer) │ │ Window Mgr │ │ VNC Server │
└─────────────────┘ └──────────────┘ └─────────────┘
┌─────────────────────┴─────────────────────┐
│ Xvfb │
│ (Virtual X Server) │
│ Display :99 │
└───────────────────────────────────────────┘
```
## Components
### 1. Xvfb (X Virtual Framebuffer)
- **Purpose**: Provides a virtual X11 display server
- **Display**: `:99` (configurable)
- **Resolution**: 1280x1024x16 (optimized for performance)
- **Configuration**: Hardware acceleration disabled for Kubernetes compatibility
### 2. Fluxbox (Window Manager)
- **Purpose**: Manages windows and provides desktop environment
- **Features**: Lightweight, minimal resource usage
- **Menu**: Right-click context menu with applications
- **Config**: Automatically generates basic menu on startup
### 3. x11vnc (VNC Server)
- **Purpose**: Shares the X display over VNC protocol
- **Port**: 5901 (internal)
- **Security**: No password (localhost only)
- **Features**: Caching enabled for better performance
### 4. Websockify (WebSocket Proxy)
- **Purpose**: Bridges VNC protocol to WebSocket for web browsers
- **Port**: 5900 (exposed)
- **Client**: NoVNC JavaScript client
### 5. NoVNC (Web VNC Client)
- **Purpose**: HTML5 VNC client for browsers
- **Access**: Available at `/vnc/` endpoint
- **Features**: Auto-connect, scaling, touch support
## Environment Configuration
### Required Environment Variables
| Variable | Value | Purpose |
|----------|-------|---------|
| `VNC_ENABLED` | `true` | Enables VNC mode in container |
| `DISPLAY` | `:99` | X11 display number |
### Docker Configuration
The Dockerfile includes all necessary VNC components:
```dockerfile
# Install VNC components
RUN apt-get install -qq -y --no-install-recommends \
xvfb \
x11vnc \
fluxbox \
x11-utils \
xauth \
python3 \
python3-pip
# Install websockify
RUN pip3 install --no-cache-dir websockify==0.10.0
# Copy NoVNC client
RUN mkdir -p /usr/share/novnc && \
curl -fsSL https://github.com/novnc/noVNC/archive/v1.3.0.tar.gz | \
tar -xz --strip-components=1 -C /usr/share/novnc
```
## Startup Process
### 1. Container Initialization
When `VNC_ENABLED=true`, the container uses the improved VNC startup script:
```bash
./vnc-startup-improved.sh npm run dev
```
### 2. Service Startup Sequence
1. **Directory Setup**: Creates required directories with proper permissions
2. **Xvfb Launch**: Starts virtual X server with fallback configurations
3. **Window Manager**: Launches Fluxbox with auto-generated menu
4. **VNC Server**: Starts x11vnc with optimized settings
5. **WebSocket Proxy**: Launches websockify for web access
6. **Application**: Starts the Node.js AI automation server
### 3. Browser Mode Detection
The application automatically detects VNC mode and configures Puppeteer accordingly:
```typescript
// In src/index.ts
const useHeadedMode = process.env.VNC_ENABLED === 'true';
await puppeteerManager.init({
headless: !useHeadedMode,
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
```
## Access Methods
### 1. Direct VNC Access
Connect using any VNC client to `<pod-ip>:5900` or through port forwarding:
```bash
kubectl port-forward pod/<pod-name> 5900:5900 -n <namespace>
```
### 2. Web Browser Access
Access through the web interface at:
- Auto-connect: `http://<host>:5900/autoconnect.html`
- Manual connect: `http://<host>:5900/vnc.html`
- Debug interface: `http://<host>:5900/debug.html`
### 3. Kubernetes Port Forwarding
For development access:
```bash
# Forward VNC port
kubectl port-forward deployment/<deployment-name> 5900:5900 -n <namespace>
# Forward API port (if needed)
kubectl port-forward deployment/<deployment-name> 4000:4000 -n <namespace>
```
## Troubleshooting
### Common Issues
#### 1. Black Screen
**Symptoms**: VNC connects but shows only black screen
**Causes**:
- Xvfb not running
- Window manager crashed
- No applications visible
**Solutions**:
```bash
# Check processes
kubectl exec <pod> -- ps aux | grep -E "(Xvfb|fluxbox|x11vnc)"
# Restart window manager
kubectl exec <pod> -- pkill fluxbox
kubectl exec <pod> -- DISPLAY=:99 fluxbox &
# Check logs
kubectl exec <pod> -- cat /tmp/xvfb/fluxbox.log
```
#### 2. VNC Connection Refused
**Symptoms**: Cannot connect to VNC port
**Causes**:
- x11vnc not running
- Port not exposed
- Firewall blocking connection
**Solutions**:
```bash
# Check x11vnc process
kubectl exec <pod> -- pgrep x11vnc
# Check port binding
kubectl exec <pod> -- netstat -ln | grep 5900
# Restart x11vnc
kubectl exec <pod> -- pkill x11vnc
kubectl exec <pod> -- x11vnc -display :99 -nopw -listen localhost -rfbport 5901 &
```
#### 3. Browser Still Headless
**Symptoms**: VNC works but browser not visible
**Causes**:
- Application not detecting VNC mode
- Browser launched before X server ready
**Solutions**:
```bash
# Check environment
kubectl exec <pod> -- env | grep VNC_ENABLED
# Check browser processes
kubectl exec <pod> -- ps aux | grep chromium
# Restart application
kubectl delete pod <pod-name>
```
### Log Locations
| Component | Log Location |
|-----------|--------------|
| Xvfb | `/tmp/xvfb/xvfb.log` |
| Fluxbox | `/tmp/xvfb/fluxbox.log` |
| x11vnc | `/tmp/xvfb/x11vnc.log` |
| Websockify | Container stdout |
| Application | Container stdout |
### Diagnostic Commands
```bash
# Check all VNC processes
kubectl exec <pod> -- ps aux | grep -E "(Xvfb|fluxbox|x11vnc|websockify)"
# Test X display
kubectl exec <pod> -- DISPLAY=:99 xdpyinfo
# Check window list
kubectl exec <pod> -- DISPLAY=:99 xwininfo -root -tree
# Monitor VNC connections
kubectl exec <pod> -- tail -f /tmp/xvfb/x11vnc.log
```
## Performance Optimization
### Resource Configuration
For optimal performance in Kubernetes:
```yaml
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "2Gi"
cpu: "1"
```
### Display Settings
The startup script automatically adjusts display settings based on available memory:
- **High memory** (>512MB): 1280x1024x16
- **Medium memory** (256-512MB): 1024x768x16
- **Low memory** (<256MB): 640x480x8
### VNC Optimization
- **Caching**: Enabled with `-ncache 10 -ncache_cr`
- **Compression**: WebSocket compression enabled
- **Color depth**: 16-bit for balance of quality and performance
## Security Considerations
### Network Security
- VNC server bound to localhost only
- No VNC password (relies on network isolation)
- WebSocket proxy provides controlled access
### Kubernetes Security
- No privileged containers required
- Runs as non-root user (`appuser`)
- No host network access needed
### Access Control
- VNC access controlled by Kubernetes network policies
- API access controlled by service exposure
- No sensitive data displayed in VNC session
## Development Workflow
### Local Development
1. **Build image with VNC**:
```bash
nu cli/main.nu build-ai-api --push --use-latest
```
2. **Deploy with VNC enabled**:
```bash
helm upgrade --install <release> ./helm \
--set ai.api.env.VNC_ENABLED=true
```
3. **Access VNC**:
```bash
kubectl port-forward deployment/<deployment> 5900:5900
# Open browser to http://localhost:5900/autoconnect.html
```
### Debugging Browser Automation
1. **Connect to VNC** to see live browser session
2. **Use developer tools** in the automation browser
3. **Monitor console logs** in real-time
4. **Step through automation** visually
### Testing Changes
1. **Make code changes**
2. **Rebuild and redeploy** with VNC enabled
3. **Connect via VNC** to see changes in action
4. **Debug issues** visually
## Integration with Nginx Proxy
The AI automation system includes nginx as a reverse proxy for VNC access:
```nginx
# VNC WebSocket proxy
location /vnc/ {
proxy_pass http://ai-api:5900/;
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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
# VNC static files
location /vnc/websockify {
proxy_pass http://ai-api:5900/websockify;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
```
This allows accessing VNC through the main application URL at `/vnc/` path.
## Future Enhancements
### Planned Features
- **Multi-user support**: Multiple VNC sessions
- **Recording**: Session recording for debugging
- **Shared sessions**: Collaborative debugging
- **Mobile optimization**: Better touch interface
### Performance Improvements
- **GPU acceleration**: When available in Kubernetes
- **Adaptive quality**: Dynamic compression based on bandwidth
- **Connection pooling**: Reuse VNC connections
---
## Quick Start Checklist
- [ ] Set `VNC_ENABLED=true` in deployment
- [ ] Ensure VNC port (5900) is exposed
- [ ] Build image with latest VNC scripts
- [ ] Deploy to Kubernetes
- [ ] Port forward: `kubectl port-forward <pod> 5900:5900`
- [ ] Open browser to `http://localhost:5900/autoconnect.html`
- [ ] Verify browser appears in VNC session
- [ ] Test automation tasks visually
For additional support, check the troubleshooting section or container logs.