Skip to main content

TOMMY VPS Provisioning

Overview

The TOMMY workflow executes Claude Code CLI on a remote VPS via SSH. This skill covers provisioning a bare Hostinger Ubuntu 24.04 Docker+Traefik VPS into a working TOMMY execution environment.

Target State

ComponentVersionPath
Node.js22.x LTSSystem (via NodeSource)
npm10.xSystem (bundled with Node)
Claude Code CLILatestGlobal npm package
Target repoLatest main/root/projects/{repo-name}

Prerequisites

  • SSH access to the VPS (see Hostinger VPS SSH skill)
  • A GitHub token with read access to the target private repo

Step 1: Install Node.js 22 LTS

curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt-get install -y nodejs
Verify:
node --version    # v22.x.x
npm --version     # 10.x.x
The VPS Docker+Traefik template ships with no Node.js. The NodeSource script adds the official apt repository.

Step 2: Install Claude Code CLI

npm install -g @anthropic-ai/claude-code
Verify:
claude --version    # x.x.x (Claude Code)

Step 3: Clone the Target Repository

Private repos require a GitHub token in the URL:
mkdir -p /root/projects
git clone https://{GITHUB_TOKEN}@github.com/{org}/{repo}.git /root/projects/{repo}
Example:
git clone https://ghp_xxxx@github.com/traceo-ai/traceo-mcp-server.git \
  /root/projects/traceo-mcp-server
Verify:
ls -d /root/projects/traceo-mcp-server/.git
cd /root/projects/traceo-mcp-server && git log --oneline -3
The GitHub token is embedded in the git remote URL. If the token expires, git pull will fail silently. Update with: git remote set-url origin https:// {NEW_TOKEN}@github.com/...

Step 4: Section 0.2 Verification

Run all three checks from the runbook:
# Check 1: SSH connection
ssh -o ConnectTimeout=5 root@vps.devarno.cloud echo "SSH OK"

# Check 2: Claude Code CLI
ssh root@vps.devarno.cloud "claude --version"

# Check 3: Repo exists
ssh root@vps.devarno.cloud "ls -d /root/projects/traceo-mcp-server/.git"
Or via paramiko (if native SSH has issues):
import paramiko

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect('vps.devarno.cloud', username='root', password='...',
               timeout=10, look_for_keys=False, allow_agent=False)

checks = [
    ('SSH connection', 'echo OK'),
    ('Claude CLI', 'claude --version'),
    ('Repo .git', 'ls -d /root/projects/traceo-mcp-server/.git'),
]

for label, cmd in checks:
    _, stdout, _ = client.exec_command(cmd, timeout=30)
    status = stdout.channel.recv_exit_status()
    out = stdout.read().decode().strip()
    icon = 'PASS' if status == 0 else 'FAIL'
    print(f'[{icon}] {label}: {out}')

client.close()

Automated Provisioning Script

For repeat deployments, run this as a single SSH session:
# Full provisioning (idempotent)
curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \
apt-get install -y nodejs && \
npm install -g @anthropic-ai/claude-code && \
mkdir -p /root/projects && \
[ -d /root/projects/traceo-mcp-server/.git ] || \
  git clone https://${GITHUB_TOKEN}@github.com/traceo-ai/traceo-mcp-server.git \
  /root/projects/traceo-mcp-server && \
echo "--- Verification ---" && \
node --version && \
claude --version && \
ls -d /root/projects/traceo-mcp-server/.git

VPS Resource Profile

As of provisioning (2026-03-28):
ResourceValue
OSUbuntu 24.04.4 LTS
Kernel6.8.0-101-generic
PlanKVM 2
Disk96GB total, ~10GB used
Memory7.8GB total, ~6.5GB available
DockerPre-installed (Traefik template)
Primary workloadOpenClaw gateway
The VPS also runs OpenClaw (Docker containers via Traefik). TOMMY execution shares resources. Monitor memory during Claude Code CLI runs — they can be memory-intensive.

Maintenance

Update Claude Code CLI

npm update -g @anthropic-ai/claude-code
claude --version

Pull Latest Repo Changes

cd /root/projects/traceo-mcp-server && git pull

Check for Stale Claude Processes

After TOMMY runs, verify no orphaned processes:
ps aux | grep claude | grep -v grep