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
| Component | Version | Path |
|---|
| Node.js | 22.x LTS | System (via NodeSource) |
| npm | 10.x | System (bundled with Node) |
| Claude Code CLI | Latest | Global npm package |
| Target repo | Latest 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):
| Resource | Value |
|---|
| OS | Ubuntu 24.04.4 LTS |
| Kernel | 6.8.0-101-generic |
| Plan | KVM 2 |
| Disk | 96GB total, ~10GB used |
| Memory | 7.8GB total, ~6.5GB available |
| Docker | Pre-installed (Traefik template) |
| Primary workload | OpenClaw 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