Overview
This guide walks through setting up Chameleon in the cloud from scratch on either AWS or OCI. Both environments are supported; choose the path that matches your account.
The primary dependency for the current Chameleon pilot is a working Vulkan driver stack (required for the SPIR-V execution path). The pilot build has been validated across 30+ Linux distributions and is designed for compatibility with 50+. Ubuntu 24.04 is the pilot-certified known-good path because it reduces driver and environment variability.
What you'll accomplish
- Cloud GPU instance running Chameleon
- Remote desktop access via browser (noVNC)
- Full GPU acceleration (via Vulkan drivers for SPIR-V)
- Automated startup/shutdown scripts
- Ability to demo to customers and partners
Prerequisites
.pem · OCI: public + private key
Essence__LNX_X64.w.elf (provided separately)
SSH key handling
Pilot access relies on SSH key authentication. If you are switching machines, ensure the correct private key is present on the machine you are using.
- macOS / Linux:
~/.ssh/ - Windows (PowerShell):
%USERPROFILE%\.ssh\
Verify your key exists:
ls -l ~/.ssh
Copy a key from another machine:
scp user@OTHER_MACHINE_IP:~/.ssh/pilot-key ~/.ssh/
Path A — AWS setup
This script is designed for AWS NVIDIA GPU instances running Ubuntu 24.04 with browser-based access via noVNC and full GPU acceleration via Vulkan (SPIR-V). It manages: virtual X server (Xvfb), VNC server (x11vnc), browser access (noVNC + websockify), PulseAudio, NVIDIA Vulkan ICD setup, and the Chameleon lifecycle.
Create the AWS startup script
Run the following on your AWS instance to create chameleon_start.sh:
cd ~/chameleon
cat > chameleon_start.sh << 'ENDOFSCRIPT'
#!/usr/bin/env bash
set -euo pipefail
DISPLAY_NUMBER="${DISPLAY_NUMBER:-99}"
export DISPLAY=":${DISPLAY_NUMBER}"
X_RES="${X_RES:-1920}"
X_HI="${X_HI:-1080}"
X_DEPTH="${X_DEPTH:-24}"
VNC_PORT="${VNC_PORT:-5901}"
NOVNC_PORT="${NOVNC_PORT:-6080}"
CHAMELEON_BIN="${CHAMELEON_BIN:-$HOME/chameleon/Essence__LNX_X64.w.elf}"
WORKDIR="${WORKDIR:-$HOME/chameleon}"
LOGDIR="${LOGDIR:-$HOME/.local/state/chameleon/Log}"
mkdir -p "$LOGDIR"
export VK_ICD_FILENAMES="/usr/share/vulkan/icd.d/nvidia_icd.json"
export SDL_AUDIODRIVER=pulse
install_deps() {
sudo apt-get update
sudo apt-get install -y \
xvfb x11vnc websockify novnc \
vulkan-tools mesa-vulkan-drivers \
pulseaudio nvidia-utils-550 libnvidia-gl-550
}
clean_locks() {
sudo rm -f /tmp/.X${DISPLAY_NUMBER}-lock
sudo rm -f /tmp/.X11-unix/X${DISPLAY_NUMBER}
}
start_pulseaudio() { pulseaudio --check && pulseaudio --kill || true; pulseaudio --start; }
start_xvfb() { Xvfb "${DISPLAY}" -screen 0 "${X_RES}x${X_HI}x${X_DEPTH}" -ac +extension GLX +render -noreset & sleep 2; }
start_vnc() { x11vnc -display "${DISPLAY}" -rfbport "${VNC_PORT}" -forever -shared -nopw & }
start_websockify() { websockify --web=/usr/share/novnc/ "${NOVNC_PORT}" "localhost:${VNC_PORT}" & }
start_chameleon() { chmod +x "$CHAMELEON_BIN"; cd "$WORKDIR"; "$CHAMELEON_BIN" >"$LOGDIR/chameleon.log" 2>&1 & }
case "${1:-start}" in
install) install_deps ;;
start) clean_locks; start_pulseaudio; start_xvfb; start_vnc; start_websockify; start_chameleon ;;
stop) pkill -f Xvfb || true; pkill -f x11vnc || true; pkill -f websockify || true; pkill -f Essence || true; clean_locks ;;
restart) "$0" stop; sleep 2; "$0" start ;;
status) pgrep -fa Essence || echo "Chameleon not running" ;;
logs) tail -f "$LOGDIR"/*.log ;;
test) nvidia-smi; vulkaninfo --summary | head -20 ;;
*) echo "Usage: $0 {install|start|stop|restart|status|logs|test}" ;;
esac
ENDOFSCRIPT
chmod +x chameleon_start.sh
1. Run ./chameleon_start.sh install once
2. Upload Essence__LNX_X64.w.elf to ~/chameleon
3. Start Chameleon with ./chameleon_start.sh start
4. Access UI via http://localhost:6080/vnc.html
Path B — OCI setup
Designed for OCI NVIDIA GPU instances running Ubuntu 24.04 with browser-based access via noVNC and full GPU acceleration via Vulkan (SPIR-V). OCI uses a different driver, networking, and image model than AWS and requires the OCI-specific startup script.
Ports & networking
- SSH: port 22 (source: your IP)
- noVNC: port 6080 (source: your IP)
- OCI often requires allowing these in both the NSG/Security List and the host firewall (if enabled).
Create the OCI startup script
Run this on the OCI instance to create chameleon_start_oci.sh:
cd ~/chameleon
cat > chameleon_start_oci.sh << 'ENDOFSCRIPT'
#!/usr/bin/env bash
set -euo pipefail
DISPLAY_NUMBER="${DISPLAY_NUMBER:-99}"
export DISPLAY=":${DISPLAY_NUMBER}"
VNC_PORT="${VNC_PORT:-5901}"
NOVNC_PORT="${NOVNC_PORT:-6080}"
CHAMELEON_BIN="${CHAMELEON_BIN:-$HOME/chameleon/Essence__LNX_X64.w.elf}"
WORKDIR="${WORKDIR:-$HOME/chameleon}"
LOGDIR="${LOGDIR:-$HOME/.local/state/chameleon/Log}"
mkdir -p "$LOGDIR"
export SDL_AUDIODRIVER=pulse
set_vk_icd() {
if [ -f /usr/share/vulkan/icd.d/nvidia_icd.json ]; then
export VK_ICD_FILENAMES="/usr/share/vulkan/icd.d/nvidia_icd.json"
elif [ -f /etc/vulkan/icd.d/nvidia_icd.json ]; then
export VK_ICD_FILENAMES="/etc/vulkan/icd.d/nvidia_icd.json"
fi
}
install_base_deps() {
sudo apt-get update
sudo apt-get install -y \
xvfb x11vnc websockify novnc \
pulseaudio vulkan-tools mesa-vulkan-drivers \
ubuntu-drivers-common ca-certificates curl unzip
}
ensure_nvidia_driver() {
if command -v nvidia-smi >/dev/null 2>&1; then
nvidia-smi || true
return 0
fi
sudo ubuntu-drivers autoinstall
echo ">>> Run: sudo reboot"
exit 0
}
# ... (lifecycle functions identical to AWS: start_pulseaudio, start_xvfb, start_vnc,
# start_websockify, start_chameleon, stop_all, clean_locks)
case "${1:-start}" in
install) install_base_deps; ensure_nvidia_driver ;;
start) clean_locks; start_pulseaudio; start_xvfb; start_vnc; start_websockify; start_chameleon ;;
stop) stop_all ;;
restart) stop_all; sleep 2; "$0" start ;;
status)
pgrep -fa Xvfb || echo "Xvfb not running"
pgrep -fa Essence || echo "Chameleon not running" ;;
logs) tail -f "$LOGDIR"/*.log ;;
test) nvidia-smi; set_vk_icd; vulkaninfo --summary | head -40 ;;
esac
ENDOFSCRIPT
chmod +x chameleon_start_oci.sh
1. One-time install: ./chameleon_start_oci.sh install (may trigger a reboot if drivers install)
2. Upload binary to ~/chameleon/
3. Start: ./chameleon_start_oci.sh start
4. Test: ./chameleon_start_oci.sh test
Connect via noVNC (OCI)
SSH tunnel (recommended):
ssh -L 6080:localhost:6080 -i /path/to/your-oci-key ubuntu@YOUR_OCI_PUBLIC_IP
Then open in your browser:
http://localhost:6080/vnc.html
Quick reference
Lifecycle commands (works for both AWS and OCI scripts):
cd ~/chameleon && ./chameleon_start.sh start
cd ~/chameleon && ./chameleon_start.sh stop
cd ~/chameleon && ./chameleon_start.sh restart
cd ~/chameleon && ./chameleon_start.sh status
cd ~/chameleon && ./chameleon_start.sh logs
cd ~/chameleon && ./chameleon_start.sh test
Stop your cloud instance when not in use to avoid hourly GPU charges. ./chameleon_start.sh stop stops Chameleon processes but the instance itself keeps billing — shut down from the AWS or OCI console.
Planning beyond the pilot
Once pilot results are validated, teams typically evaluate next steps for broader rollout, integration, or service-based deployment. MindAptiv offers multiple deployment paths — including Chameleon as a managed service and a forthcoming platform offering — depending on operational and compliance needs.
Pilot binaries and workflows are for evaluation only — not production deployment.