Skip to main content

AWS / GCP / Azure

RushDB runs well on a single Linux VM with Docker Compose. The lowest-friction path is to boot an Ubuntu VM with the cloud-init template below, after replacing the placeholder external Neo4j/Aura values in the user-data file.

Verify the Prerequisites first.

SettingMinimumRecommended
OSUbuntu 22.04 LTSUbuntu 22.04 or 24.04 LTS
CPU2 vCPU4 vCPU
RAM4 GB8 GB
Disk30 GB SSD50+ GB SSD with snapshots
Public ports22, temporary 3000, 80, 443Close 3000 after TLS proxy is configured

Do not expose Neo4j (7474, 7687) or Postgres (5432) publicly.

Fast Path: Cloud-Init​

Download the template locally:

curl -L -o rushdb-cloud-init.yaml https://raw.githubusercontent.com/rush-db/rushdb/main/deploy/templates/cloud-vm/cloud-init.yaml

The template installs Docker, downloads the RushDB Compose stack to /opt/rushdb/compose.yaml, writes /opt/rushdb/.env, opens SSH and port 3000, and starts RushDB. Before production use, replace every placeholder in the cloud-init file or in /opt/rushdb/.env.

After first boot, SSH into the VM and rotate the generated configuration:

cd /opt/rushdb
sudo nano .env

# Required changes before production:
# RUSHDB_PASSWORD
# RUSHDB_AES_256_ENCRYPTION_KEY="$(openssl rand -hex 16)"
# NEO4J_URL
# NEO4J_USERNAME
# NEO4J_PASSWORD
# POSTGRES_PASSWORD
# RUSHDB_DASHBOARD_URL=https://rushdb.example.com
# RUSHDB_BASE_URL=https://rushdb.example.com

sudo docker compose --env-file .env -f compose.yaml up -d

Use the AWS console or CLI to launch an Ubuntu EC2 instance with user data from rushdb-cloud-init.yaml.

Recommended defaults:

  • Instance type: t3.medium or larger
  • Storage: 50 GB gp3
  • Security group:
    • 22/tcp from your IP
    • 3000/tcp from your IP for first verification
    • 80/tcp and 443/tcp from 0.0.0.0/0 when using a reverse proxy

CLI shape:

aws ec2 run-instances \
--image-id ami-REPLACE_WITH_UBUNTU_AMI \
--instance-type t3.medium \
--key-name YOUR_KEY_PAIR \
--security-group-ids sg-REPLACE \
--subnet-id subnet-REPLACE \
--block-device-mappings '[{"DeviceName":"/dev/sda1","Ebs":{"VolumeSize":50,"VolumeType":"gp3","DeleteOnTermination":true}}]' \
--user-data file://rushdb-cloud-init.yaml

Ubuntu AMI IDs are region-specific; select the current Ubuntu LTS AMI in the EC2 launch wizard or through your standard image catalog.

Manual Path​

After SSHing into your VM, install Docker and start the same Compose stack manually:

curl -fsSL https://get.docker.com | sh

mkdir rushdb && cd rushdb
curl -L -o compose.yaml https://raw.githubusercontent.com/rush-db/rushdb/main/deploy/templates/docker-compose/compose.yaml
curl -L -o .env https://raw.githubusercontent.com/rush-db/rushdb/main/deploy/templates/docker-compose/.env.example

nano .env
docker compose up -d

Required .env edits:

VariableWhat to set
RUSHDB_PASSWORDStrong dashboard admin password
RUSHDB_AES_256_ENCRYPTION_KEYExactly 32 characters; generate with openssl rand -hex 16
RUSHDB_DASHBOARD_URLPublic URL, e.g. https://rushdb.example.com
RUSHDB_BASE_URLSame public API URL
NEO4J_URLExternal Neo4j/Aura Bolt URL
NEO4J_USERNAMEExternal Neo4j/Aura username
NEO4J_PASSWORDExternal Neo4j/Aura password
POSTGRES_PASSWORDStrong internal Postgres password

See Environment Variables for the full reference.

TLS with Caddy​

Once DNS points at the VM, put RushDB behind HTTPS:

sudo apt install -y caddy
sudo tee /etc/caddy/Caddyfile >/dev/null <<'EOF'
rushdb.example.com {
reverse_proxy 127.0.0.1:3000
}
EOF
sudo systemctl reload caddy

Then update /opt/rushdb/.env or your deployment directory:

RUSHDB_DASHBOARD_URL=https://rushdb.example.com
RUSHDB_BASE_URL=https://rushdb.example.com

Restart RushDB and remove public access to port 3000 from your cloud firewall or security group.

Backups and Persistence​

The Docker Compose template stores Neo4j and Postgres data in Docker volumes. For production:

  • Enable VM disk snapshots or provider backups.
  • Prefer a separate attached disk for Docker data if your operations policy requires it.
  • Test restore from a snapshot before relying on it.
  • Keep Neo4j and Postgres ports private.

Verify​

curl http://VM_PUBLIC_IP:3000/health
# or, after TLS:
curl https://rushdb.example.com/health

Then open the dashboard, sign in with RUSHDB_LOGIN / RUSHDB_PASSWORD, and continue with Get your API Key.

Troubleshooting​

cd /opt/rushdb # or your manual deployment directory
docker compose --env-file .env -f compose.yaml ps
docker compose --env-file .env -f compose.yaml logs -f rushdb
docker compose --env-file .env -f compose.yaml logs -f neo4j

Common failures:

SymptomCheck
Container exits immediatelyRUSHDB_AES_256_ENCRYPTION_KEY must be exactly 32 characters
Browser cannot connectCloud firewall/security group and VM firewall both need the port open
RushDB cannot reach Neo4jNeo4j health, NEO4J_PASSWORD, and APOC plugin startup
API works on 3000 but HTTPS failsDNS record, Caddy logs, and ports 80 / 443