VM on Golem Requestor CLI - Create and manage virtual machines on the Golem Network
Project description
VM on Golem Requestor
A sophisticated command-line interface for managing virtual machines on the Golem Network. The requestor works in tandem with provider nodes to create and manage VMs with secure SSH access.
Architecture Overview
graph TB
subgraph Requestor
CLI[CLI Interface]
DB[Local Database]
SSH[SSH Manager]
PC[Provider Client]
end
subgraph Provider
API[Provider API]
VM[VM Manager]
Proxy[SSH Proxy]
RT[Resource Tracker]
end
CLI --> PC
PC --> API
SSH --> Proxy
VM --> RT
How It Works
1. VM Creation Flow
sequenceDiagram
participant User
participant CLI
participant SSH
participant Provider
participant VM
User->>CLI: Create VM Command
CLI->>SSH: Generate SSH Key
SSH-->>CLI: Key Pair
CLI->>Provider: Create VM Request + Public Key
Provider->>VM: Launch with Cloud-Init
Provider->>Proxy: Configure SSH Port
Provider-->>CLI: VM Details + Port
CLI->>DB: Save VM State
CLI-->>User: Connection Info
When you create a VM:
- The requestor generates an SSH key pair or uses your system's existing keys
- The provider receives the public key and injects it during VM creation via cloud-init
- The provider allocates a dedicated port and configures SSH forwarding
- Connection details are stored locally for future access
2. SSH Connection Flow
sequenceDiagram
participant User
participant CLI
participant DB
participant Proxy
participant VM
User->>CLI: SSH Command
CLI->>DB: Get VM Details
DB-->>CLI: Connection Info
CLI->>Proxy: SSH Connection
Proxy->>VM: Forward Connection
VM-->>User: Interactive Shell
The SSH connection process:
- The CLI retrieves stored VM details from the local database
- The provider's proxy system forwards your SSH connection to the VM
- All traffic is securely routed through the allocated port
Streaming Payments (Native ETH on L2)
This requestor integrates with an on‑chain StreamPayment contract to enable “pay‑as‑you‑go” rentals using native ETH (no ERC20 approvals when the token address is zero).
Flow:
- Fetch provider info (preferred addresses):
GET http://{provider}:7466/api/v1/provider/info→provider_id,stream_payment_address,glm_token_address(zero address means native ETH).
- Compute
ratePerSecondfrom provider pricing and requested VM resources. - Ensure
deposit >= ratePerSecond * 3600(≥ 1 hour runway recommended/minimum). - Create a stream (
createStream(0x000...0, provider_id, deposit, ratePerSecond)plusvalue=deposit), capturestream_id. For ERC20 mode use a token address and approve first. - Create VM:
POST /api/v1/vmswithstream_idincluded. - Top‑up over time with
topUp(stream_id, amount)to extend stopTime and keep the VM running indefinitely. - On stop/destroy: the requestor will best‑effort
withdraw/terminateto settle.
CLI helpers
- Open a stream for a planned VM (computes rate from provider pricing):
poetry run golem vm stream open \
--provider-id 0xProvider \
--cpu 2 --memory 4 --storage 20 \
--hours 1
# prints { stream_id, rate_per_second_wei, deposit_wei }
- Top up an existing stream:
# Add 3 hours at prior rate
poetry run golem vm stream topup --stream-id 123 --hours 3
# Or specify exact GLM amount
poetry run golem vm stream topup --stream-id 123 --glm 25.0
- Check stream status via provider (by VM name recorded in your DB):
poetry run golem vm stream status my-vm
# add --json for machine-readable output
- Inspect a stream directly on-chain:
poetry run golem vm stream inspect --stream-id 123
- Create a VM and attach an existing stream (no auto-streams are created by the requestor):
poetry run golem vm create my-vm \
--provider-id 0xProvider \
--cpu 2 --memory 4 --storage 20 \
--stream-id 123
Environment (env prefix GOLEM_REQUESTOR_):
polygon_rpc_url— EVM RPC URL (default L2 RPC)stream_payment_address— StreamPayment address (defaults fromcontracts/deployments/l2.json; overridden by provider info)glm_token_address— Token address (defaults fromcontracts/deployments/l2.json; zero address means native ETH)- Optional override of deployments directory: set
GOLEM_DEPLOYMENTS_DIRto a folder containingl2.json.
- Optional override of deployments directory: set
provider_eth_address— optional dev helper; in production always use/provider/infonetwork— Target network for discovery filtering:testnet(default) ormainnet
Efficiency tips:
- Batch top‑ups (e.g., add several hours at once) to reduce on‑chain calls.
- Withdrawals are typically executed by providers; requestors don’t need to withdraw.
- The CLI
vm stream openwill prefer the provider’s advertised contract/token addresses to prevent mismatches.
Faucet (L2 ETH)
- Request L2 test ETH to cover stream transactions:
poetry run golem wallet faucet
- Defaults:
- Faucet:
https://l2.holesky.golemdb.io/faucet - CAPTCHA:
https://cap.gobas.me/05381a2cef5e - Override with env:
GOLEM_REQUESTOR_l2_faucet_url,GOLEM_REQUESTOR_captcha_url,GOLEM_REQUESTOR_captcha_api_key.
- Faucet:
Installation
# Install using pip
pip install golem-vm-requestor
# Or install from source
git clone https://github.com/golem/vm-on-golem.git
cd vm-on-golem/requestor-server
pip install -e .
Development
To run the application in development mode, you need to set environment variables to configure development-specific settings. These are defined in the .env.dev file.
You can run the server in development mode using one of the following methods:
Using source
First, source the development environment variables:
source .env.dev
Then, run any golem command. For example:
poetry run golem vm providers
Prepending variables
Alternatively, you can prepend the environment variables directly to the command:
GOLEM_REQUESTOR_ENVIRONMENT="development" GOLEM_REQUESTOR_FORCE_LOCALHOST="true" poetry run golem vm providers
Mode vs. Network
-
Development Mode (
GOLEM_REQUESTOR_ENVIRONMENT=development)- Improves local workflows: prefixes central discovery URL with
DEVMODE-and, when using the central driver, maps provider IPs tolocalhostfor easier testing. - Does not determine chain selection.
- Improves local workflows: prefixes central discovery URL with
-
Network Selection (
--networkorGOLEM_REQUESTOR_NETWORK)- Filters Golem Base discovery results by
golem_network=testnet|mainnet. - Combine with the appropriate RPC envs (
GOLEM_REQUESTOR_GOLEM_BASE_RPC_URL,GOLEM_REQUESTOR_GOLEM_BASE_WS_URL) and any contract addresses. - Independent from dev ergonomics.
- Filters Golem Base discovery results by
Examples:
- List providers on mainnet without changing env:
poetry run golem vm providers --network mainnet
- Create a VM while targeting testnet:
poetry run golem vm create my-vm --provider-id 0xProvider --cpu 2 --memory 4 --storage 20 --network testnet
Usage
Provider Discovery
List available providers with their resources:
golem vm providers
Example output:
────────────────────────────────────────────────
🌍 Available Providers (3 total)
────────────────────────────────────────────────
Provider ID Country CPU Memory Disk
provider-1 🌍 SE 💻 4 🧠 8GB 💾 40GB
provider-2 🌍 US 💻 8 🧠 16GB 💾 80GB
provider-3 🌍 DE 💻 2 🧠 4GB 💾 20GB
────────────────────────────────────────────────
Creating a VM
golem vm create my-webserver --provider-id provider-1 --cpu 2 --memory 4 --storage 20
The system will:
- Verify provider availability
- Check resource requirements
- Set up SSH access
- Deploy and configure the VM
- Save connection details locally
Example output:
────────────────────────────────────────────────
🎉 VM Deployed Successfully!
────────────────────────────────────────────────
VM Details
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
🏷️ Name : my-webserver
💻 Resources : 2 CPU, 4GB RAM, 20GB Disk
🟢 Status : running
Connection Details
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
🌐 IP Address : 192.168.1.100
🔌 Port : 50800
Quick Connect
┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈┈
🔑 SSH Command : ssh -i ~/.golem/ssh/id_rsa -p 50800 ubuntu@192.168.1.100
────────────────────────────────────────────────
Managing VMs
List your VMs:
golem vm list
Example output:
────────────────────────────────────────────────
📋 Your VMs (2 total)
────────────────────────────────────────────────
Name Status IP Address Resources
my-webserver ● running 192.168.1.100 2 CPU, 4GB RAM
my-database ● stopped 192.168.1.101 4 CPU, 8GB RAM
────────────────────────────────────────────────
Other commands:
# SSH into a VM
golem vm ssh my-webserver
# Stop a VM
golem vm stop my-webserver
# Start a VM
golem vm start my-webserver
# Destroy a VM
golem vm destroy my-webserver
Configuration
The requestor uses a hierarchical configuration system:
- Environment Variables:
# Discovery Service
export GOLEM_REQUESTOR_DISCOVERY_URL="http://discovery.golem.network:9001"
# Base Directory (default: ~/.golem)
export GOLEM_REQUESTOR_BASE_DIR="/path/to/golem/dir"
# Individual Paths (override base dir)
export GOLEM_REQUESTOR_SSH_KEY_DIR="/path/to/keys"
export GOLEM_REQUESTOR_DB_PATH="/path/to/database.db"
# Environment Mode (defaults to "production")
export GOLEM_REQUESTOR_ENVIRONMENT="development" # Optional: Switch to development mode
export GOLEM_REQUESTOR_FORCE_LOCALHOST="true" # Optional: Force localhost in development mode
export GOLEM_REQUESTOR_NETWORK="testnet" # Or "mainnet"; filters Golem Base results by annotation
- Directory Structure:
~/.golem/
├── ssh/ # SSH keys
│ ├── id_rsa # Private key
│ └── id_rsa.pub # Public key
└── vms.db # SQLite database
Technical Details
SSH Key Management
The system intelligently handles SSH keys:
- Uses existing system SSH keys if available
- Generates and manages Golem-specific keys if needed
- Ensures proper key permissions (0600 for private, 0644 for public)
- Supports key reuse across VMs
State Management
Local state is maintained in SQLite:
- VM details and configuration
- Provider information
- Connection parameters
- VM status tracking
Provider Integration
The requestor communicates with providers through:
- Discovery service for provider location
- Direct API calls for VM management
- SSH proxy system for secure access
- Resource tracking for capacity management
Error Handling
The system provides clear error messages and recovery steps:
Error: Unable to establish SSH connection (VM may be starting up)
Solution: Wait a few moments and try again. The VM is likely still initializing.
Error: Provider is no longer available (they may have gone offline)
Solution: Choose a different provider or wait for the original to come back online.
Error: VM not found in local database
Solution: The VM may have been manually removed. Use 'golem vm list' to see available VMs.
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Run the tests
- Submit a pull request
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file request_vm_on_golem-0.1.47.tar.gz.
File metadata
- Download URL: request_vm_on_golem-0.1.47.tar.gz
- Upload date:
- Size: 36.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.4 CPython/3.13.7 Linux/6.11.0-1018-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cf8bd40a35476bf6401455cebe3f4d508552be70e50f939021f62482135ed29d
|
|
| MD5 |
f5e79273236d5d59c2787a7e5704231c
|
|
| BLAKE2b-256 |
bf524f603f6cba4e506088acd941df816eca2cc6125fd64d257c167e1bf1ebc8
|
File details
Details for the file request_vm_on_golem-0.1.47-py3-none-any.whl.
File metadata
- Download URL: request_vm_on_golem-0.1.47-py3-none-any.whl
- Upload date:
- Size: 40.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.1.4 CPython/3.13.7 Linux/6.11.0-1018-azure
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5de504d345232b017cb93ec2eb30f0aae22fa9d91844b43f18b64431ee36f5e9
|
|
| MD5 |
1171c512c411837f2d753dbce63c3ee8
|
|
| BLAKE2b-256 |
bef4af574ec390710bddd59a3d98dd173c76fd3545a0e1aa2f05d1c7f2c89d18
|