121 lines
3.5 KiB
Nix
121 lines
3.5 KiB
Nix
{ pkgs, ... }:
|
|
|
|
let
|
|
sshKeyPath = "/home/lebowski/.ssh/id_ed25519";
|
|
sshKeyName = "V3";
|
|
serverName = "nix-builder";
|
|
serverType = "ccx43";
|
|
location = "nbg1";
|
|
|
|
sshCmd = "ssh -o StrictHostKeyChecking=no -o BatchMode=yes -i ${sshKeyPath}";
|
|
|
|
# Spin up a builder from the NixOS snapshot
|
|
builder-up = pkgs.writeShellApplication {
|
|
name = "builder-up";
|
|
runtimeInputs = with pkgs; [ hcloud openssh ];
|
|
text = ''
|
|
SERVER_NAME="${serverName}"
|
|
SSH_KEY_PATH="${sshKeyPath}"
|
|
|
|
# ── Check if server already exists ──
|
|
if hcloud server describe "$SERVER_NAME" &>/dev/null; then
|
|
IP=$(hcloud server ip "$SERVER_NAME")
|
|
echo "Server '$SERVER_NAME' already running at $IP"
|
|
echo " builder-ssh"
|
|
exit 0
|
|
fi
|
|
|
|
# ── Find snapshot ──
|
|
SNAPSHOT_ID=$(hcloud image list --type snapshot --selector description="${snapshotDesc}" -o noheader -o columns=id 2>/dev/null | head -1)
|
|
if [ -z "$SNAPSHOT_ID" ]; then
|
|
# Fallback: search by description
|
|
SNAPSHOT_ID=$(hcloud image list --type snapshot -o noheader -o columns=id,description | grep "${snapshotDesc}" | awk '{print $1}' | head -1)
|
|
fi
|
|
|
|
if [ -z "$SNAPSHOT_ID" ]; then
|
|
echo "ERROR: No snapshot '${snapshotDesc}' found."
|
|
echo " Create one with: builder-snapshot"
|
|
exit 1
|
|
fi
|
|
|
|
# ── Create server from snapshot ──
|
|
echo "==> Creating ${serverType} in ${location} from snapshot $SNAPSHOT_ID..."
|
|
hcloud server create \
|
|
--name "$SERVER_NAME" \
|
|
--type "${serverType}" \
|
|
--image "$SNAPSHOT_ID" \
|
|
--location "${location}" \
|
|
--label role=nix-builder \
|
|
--ssh-key "${sshKeyName}"
|
|
|
|
IP=$(hcloud server ip "$SERVER_NAME")
|
|
|
|
# ── Wait for SSH ──
|
|
echo "==> Waiting for SSH..."
|
|
for i in $(seq 1 30); do
|
|
if ${sshCmd} "root@''${IP}" true 2>/dev/null; then
|
|
break
|
|
fi
|
|
if [ "$i" -eq 30 ]; then
|
|
echo "ERROR: SSH did not become available after 150s"
|
|
exit 1
|
|
fi
|
|
sleep 5
|
|
done
|
|
|
|
# ── Update known_hosts ──
|
|
ssh-keygen -R "$IP" 2>/dev/null || true
|
|
ssh-keyscan -H "$IP" >> ~/.ssh/known_hosts 2>/dev/null
|
|
|
|
echo ""
|
|
echo "=== Builder ready ==="
|
|
echo " builder-ssh"
|
|
'';
|
|
};
|
|
|
|
# SSH into the builder
|
|
builder-ssh = pkgs.writeShellApplication {
|
|
name = "builder-ssh";
|
|
runtimeInputs = with pkgs; [ hcloud openssh ];
|
|
text = ''
|
|
SERVER_NAME="${serverName}"
|
|
SSH_KEY_PATH="${sshKeyPath}"
|
|
|
|
if ! hcloud server describe "$SERVER_NAME" &>/dev/null; then
|
|
echo "No server '$SERVER_NAME' found. Run builder-up first."
|
|
exit 1
|
|
fi
|
|
|
|
IP=$(hcloud server ip "$SERVER_NAME")
|
|
ssh -i "$SSH_KEY_PATH" -t "root@$IP" "tmux new-session -A -s build"
|
|
'';
|
|
};
|
|
|
|
# Tear down the builder
|
|
builder-down = pkgs.writeShellApplication {
|
|
name = "builder-down";
|
|
runtimeInputs = with pkgs; [ hcloud openssh ];
|
|
text = ''
|
|
SERVER_NAME="${serverName}"
|
|
|
|
if hcloud server describe "$SERVER_NAME" &>/dev/null; then
|
|
IP=$(hcloud server ip "$SERVER_NAME")
|
|
echo "==> Deleting '$SERVER_NAME' ($IP)..."
|
|
hcloud server delete "$SERVER_NAME"
|
|
ssh-keygen -R "$IP" 2>/dev/null || true
|
|
echo " Done."
|
|
else
|
|
echo "No server '$SERVER_NAME' found."
|
|
fi
|
|
'';
|
|
};
|
|
|
|
in
|
|
{
|
|
environment.systemPackages = [
|
|
builder-up
|
|
builder-ssh
|
|
builder-down
|
|
pkgs.hcloud
|
|
];
|
|
}
|