VOLT

Self-Hosting

Deploy VOLT on your own infrastructure.

Overview

VOLT can be self-hosted on any Linux server. The platform consists of two Node.js applications (server and client) plus three external services (MongoDB, Redis, MinIO).

Self-hosting gives you full control over your data and infrastructure. All simulations, analyses, and files stay on your servers.

Requirements

ComponentMinimumRecommended
OSUbuntu 20.04+ / Debian 11+Ubuntu 22.04 LTS
Node.js18.x22.x
RAM4 GB8 GB+
Disk20 GBDepends on simulation data
Docker20.x+Latest stable

External Services

ServicePurposeDefault Port
MongoDBDatabase for users, teams, simulations, analyses27017
RedisJob queues (BullMQ), caching, pub/sub6379
MinIOS3-compatible object storage for files9000
Guacamole (optional)Remote desktop for containers via XRDP4822

Quick Start

1. Start External Services

You can run MongoDB, Redis, and MinIO using Docker:

# MongoDB
docker run -d --name volt-mongo \
  -p 27017:27017 \
  -e MONGO_INITDB_ROOT_USERNAME=volt \
  -e MONGO_INITDB_ROOT_PASSWORD=changeme \
  -v volt-mongo-data:/data/db \
  mongo:7

# Redis
docker run -d --name volt-redis \
  -p 6379:6379 \
  redis:7 --requirepass changeme

# MinIO
docker run -d --name volt-minio \
  -p 9000:9000 -p 9001:9001 \
  -e MINIO_ROOT_USER=voltadmin \
  -e MINIO_ROOT_PASSWORD=changeme \
  -v volt-minio-data:/data \
  minio/minio server /data --console-address ":9001"

2. Clone the Repository

git clone https://github.com/VoltLabs-Research/Volt.git
cd Volt

3. Configure the Server

cp server/.env.example server/.env

Edit server/.env with your service credentials:

NODE_ENV=production

# Redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=changeme
REDIS_PORT=6379
REDIS_DB=0

# MinIO
MINIO_ENDPOINT=127.0.0.1
MINIO_PORT=9000
MINIO_USE_SSL=false
MINIO_ACCESS_KEY=voltadmin
MINIO_SECRET_KEY=changeme

# Server
SERVER_ENDPOINT=https://your-domain.com
SERVER_PORT=8000
SERVER_HOSTNAME=your-domain.com
SERVER_SCHEMA=https

# Client
CLIENT_HOST=https://your-domain.com

# MongoDB
MONGO_URI=mongodb://volt:changeme@127.0.0.1:27017
MONGO_AUTH_SOURCE=admin
PRODUCTION_DATABASE=voltcloud@production

# Security (generate unique values!)
SECRET_KEY=your-random-secret-key
SSH_ENCRYPTION_KEY=your-random-encryption-key
JWT_EXPIRATION_DAYS=7d

4. Configure the Client

cp client/.env.example client/.env
VITE_API_URL=https://your-domain.com
VITE_ENV=production

5. Install and Build

# Server
cd server
npm install
npm run build

# Client
cd ../client
npm install
npm run build

6. Start the Server

cd server
npm run start

The server listens on port 8000 by default and binds to 0.0.0.0.

7. Serve the Client

The client build outputs static files. Serve them with nginx or any static file server.

Reverse Proxy (nginx)

You need a reverse proxy to serve the client, proxy the API, and handle WebSocket connections.

server {
    listen 443 ssl http2;
    server_name your-domain.com;

    ssl_certificate     /etc/ssl/certs/your-domain.crt;
    ssl_certificate_key /etc/ssl/private/your-domain.key;

    # Client (static files)
    location / {
        root /path/to/Volt/client/dist;
        try_files $uri $uri/ /index.html;
    }

    # API proxy
    location /api/ {
        proxy_pass http://127.0.0.1:8000;
        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;

        # File uploads
        client_max_body_size 0;
    }

    # WebSocket proxy
    location /socket.io/ {
        proxy_pass http://127.0.0.1:8000;
        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;
    }
}

Environment Variables

Server

Required

VariableDescription
MONGO_URIMongoDB connection string
MONGO_AUTH_SOURCEMongoDB auth database (usually admin)
PRODUCTION_DATABASEDatabase name for production
REDIS_HOSTRedis hostname
REDIS_PORTRedis port
REDIS_PASSWORDRedis password
MINIO_ENDPOINTMinIO hostname
MINIO_PORTMinIO API port
MINIO_ACCESS_KEYMinIO access key
MINIO_SECRET_KEYMinIO secret key
SERVER_ENDPOINTFull public URL of the server
SERVER_PORTPort the server listens on
SERVER_HOSTNAMEPublic hostname
CLIENT_HOSTFull public URL of the client
SECRET_KEYSecret for signing tokens
JWT_EXPIRATION_DAYSJWT token TTL (e.g. 7d)
SSH_ENCRYPTION_KEYKey for encrypting stored SSH credentials

Optional

VariableDefaultDescription
NODE_ENVdevelopmentEnvironment mode
LOG_LEVELinfoLogging verbosity
MINIO_USE_SSLfalseUse TLS for MinIO
SERVER_SCHEMAhttpURL scheme (http or https)
SMTP_HOSTSMTP server for email notifications
SMTP_PORTSMTP port
SMTP_AUTH_USERSMTP username
SMTP_AUTH_PASSWORDSMTP password
GUACD_HOST127.0.0.1Guacamole daemon host
GUACD_PORT4822Guacamole daemon port

OAuth (Optional)

VariableDescription
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRETGitHub OAuth app credentials
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRETGoogle OAuth app credentials
MICROSOFT_CLIENT_ID / MICROSOFT_CLIENT_SECRETMicrosoft OAuth app credentials
GITHUB_CALLBACK_URLDefault: /api/auth/github/callback
GOOGLE_CALLBACK_URLDefault: /api/auth/google/callback
MICROSOFT_CALLBACK_URLDefault: /api/auth/microsoft/callback

Client

VariableDescription
VITE_API_URLFull public URL of the VOLT server
VITE_ENVproduction or development

MinIO Buckets

The server automatically creates the following buckets on startup:

BucketAccessContent
volt-modelsPrivate3D models and GLB files
volt-rasterizerPrivateRendered thumbnails
volt-pluginsPrivatePlugin binaries
volt-dumpsPrivateLAMMPS trajectory files
volt-whiteboardsPrivateWhiteboard data
volt-avatarsPublicUser avatar images
volt-chatPublicChat attachments
volt-latex-assetsPublicLaTeX document assets

Ports Summary

PortService
8000VOLT API Server
5173Vite dev server (development only)
27017MongoDB
6379Redis
9000MinIO API
9001MinIO Console
4822Guacamole daemon (optional)
23000–23999TCP relay for XRDP sessions (optional)

On this page