Homelab Operations & SSH Access

How to access and manage the homelab fleet.

SSH Access

  • Most CTs accessible via aliases (preferred over raw IPs)
  • Key-based auth configured across the fleet
  • SSH config generated from inventory: /root/homelab/inventory/ssh_config.generated
  • On openclaw (CT124), there is no ~/.ssh/config — use full ssh root@<host> or deploy the generated config

Generated SSH Targets (from inventory)

ssh workhorse        # 192.168.0.250 — Proxmox host (GPU compute)
ssh pve              # 192.168.0.190 — Proxmox host (general services)
ssh gestalt          # 192.168.0.96 — Gestalt CT112 (pve/forge01)
ssh admin01          # 192.168.0.196 — Ansible control node (CT6969)

Note: These entries are in /root/homelab/inventory/ssh_config.generated. Other CTs (caddy CT118, maplestory CT125, 2004scape CT123) need their IPs discovered and added to inventory before SSH config is generated.

Other Hosts (accessible by IP directly)

ssh root@192.168.0.95   # Grafana CT120
ssh root@192.168.0.139  # Mai-staging CT217

Ansible

  • Control node: admin01 (CT6969 on workhorse)
  • Inventory: /root/homelab/hosts.yml
  • generate.py on admin01 produces configs from inventory

Caddy Deployment Pitfall

Ansible --tags caddy may silently skip (0 tasks) if tag structure doesn’t match. Fallback:

scp generated-caddyfile admin01:/tmp/
pct push 118 /tmp/generated-caddyfile /etc/caddy/Caddyfile
pct exec 118 -- caddy validate --config /etc/caddy/Caddyfile
pct exec 118 -- caddy reload --config /etc/caddy/Caddyfile

Workstation SSH Config Distribution

Bare git repo at admin01:/root/homelab.git tracks:

  • ssh_config.generated
  • setup.sh installer
  • bin/homelab-sync sync script

On inventory changes:

  1. Update hosts.yml
  2. Regenerate config
  3. Commit and push to bare repo
  4. Workstations run homelab-sync

Naming Convention

Always use both node name and alias on first mention:

  • workhorse/gpu01 (.250, 128GB, 3x GPU)
  • pve/forge01 (.190, 64GB, RTX 3060)
  • intel1/edge01 (.122, OPNsense)