-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsetup.sh
More file actions
executable file
·156 lines (131 loc) · 4.64 KB
/
setup.sh
File metadata and controls
executable file
·156 lines (131 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/bin/bash
# OpenClaw Local Setup Script
set -euo pipefail
cd "$(dirname "${BASH_SOURCE[0]}")"
# shellcheck source=local/common.sh
source ./local/common.sh
if [[ -f ./.env ]]; then
set -a
# shellcheck source=/dev/null
source ./.env
set +a
fi
# === Check hcloud ===
# shellcheck source=local/check-hcloud.sh
source ./local/check-hcloud.sh
# === Server name ===
echo ""
echo -ne "Server name (default: openclaw): "
read -r SERVER_NAME
SERVER_NAME="${SERVER_NAME:-openclaw}"
# === Fetch and display server types ===
log_step "Fetching server types"
SERVER_TYPES=$(hcloud server-type list -o json | jq -r '.[] | select(.name | test("^(cpx|cx)")) | "\(.name)|\(.cores)|\(.memory)|\(.prices[0].price_monthly.gross)"' | sort -t'|' -k4 -n)
log_ok "Server types loaded"
echo ""
echo "Available server types:"
echo ""
printf " %-8s %-8s %-8s %s\n" "TYPE" "CPU" "RAM" "PRICE"
echo "$SERVER_TYPES" | while IFS='|' read -r name cores mem price; do
price_fmt=$(printf "%.0f" "$price")
printf " %-8s %-8s %-8s ~€%s/mo\n" "$name" "${cores}vCPU" "${mem}GB" "$price_fmt"
done
echo ""
echo -ne "Server type (default: cx23): "
read -r SERVER_TYPE
SERVER_TYPE="${SERVER_TYPE:-cx23}"
# === Fetch and display locations ===
log_step "Fetching locations"
LOCATIONS=$(hcloud location list -o json | jq -r '.[] | "\(.name)|\(.city)|\(.country)"')
log_ok "Locations loaded"
echo ""
echo "Available locations:"
echo ""
echo "$LOCATIONS" | while IFS='|' read -r name city country; do
printf " %-8s %s, %s\n" "$name" "$city" "$country"
done
echo ""
echo -ne "Location (default: nbg1): "
read -r SERVER_LOCATION
SERVER_LOCATION="${SERVER_LOCATION:-nbg1}"
# === SSH Key ===
SSH_KEY_NAME=$(./local/setup-ssh-key.sh | tail -1)
# === API keys ===
if [[ -n "${TAILSCALE_AUTH_KEY:-}" ]]; then
log_ok "Tailscale key from .env"
else
echo -ne "Tailscale auth key: "
read -r TAILSCALE_AUTH_KEY
[[ -z "$TAILSCALE_AUTH_KEY" ]] && log_fail "Tailscale auth key required"
fi
if [[ -n "${OPENROUTER_API_KEY:-}" ]]; then
log_ok "OpenRouter key from .env"
else
echo -ne "OpenRouter API key: "
read -r OPENROUTER_API_KEY
[[ -z "$OPENROUTER_API_KEY" ]] && log_fail "OpenRouter API key required"
fi
MACBOOK_TAILSCALE_IP=""
if command -v tailscale &>/dev/null; then
MACBOOK_TAILSCALE_IP=$(tailscale ip -4 2>/dev/null || true)
fi
if [[ -z "${MACBOOK_TAILSCALE_IP}" ]]; then
echo -ne "Your Mac's Tailscale IP: "
read -r MACBOOK_TAILSCALE_IP
[[ -z "$MACBOOK_TAILSCALE_IP" ]] && log_fail "Mac Tailscale IP required"
else
log_ok "Mac Tailscale IP detected (${MACBOOK_TAILSCALE_IP})"
fi
if [[ -n "${OPENAI_API_KEY:-}" ]]; then
log_ok "OpenAI key from .env"
else
echo -ne "OpenAI API key (optional): "
read -r OPENAI_API_KEY
fi
if [[ -n "${ELEVENLABS_API_KEY:-}" ]]; then
log_ok "ElevenLabs key from .env"
else
echo -ne "ElevenLabs API key (optional): "
read -r ELEVENLABS_API_KEY
fi
# === Confirmation ===
echo ""
echo "Server: ${SERVER_NAME} (${SERVER_TYPE}) in ${SERVER_LOCATION}"
echo ""
echo -ne "Proceed? (Y/n): "
read -r CONFIRM
CONFIRM="${CONFIRM:-y}"
[[ ! "$CONFIRM" =~ ^[Yy]$ ]] && log_fail "Aborted"
# === Create server ===
VPS_HOST=$(./local/create-server.sh "${SERVER_NAME}" "${SERVER_TYPE}" "${SERVER_LOCATION}" "${SSH_KEY_NAME}" | tail -1)
# === Wait for SSH ===
./local/wait-for-ssh.sh "${VPS_HOST}"
# === Run remote setup ===
scp -q -o StrictHostKeyChecking=accept-new -r ./remote "root@${VPS_HOST}:/tmp/" || log_fail "Failed to upload scripts"
# create env file for remote scripts
cat > /tmp/openclaw-env.sh << EOF
export TAILSCALE_AUTH_KEY="${TAILSCALE_AUTH_KEY}"
export OPENROUTER_API_KEY="${OPENROUTER_API_KEY}"
export MACBOOK_TAILSCALE_IP="${MACBOOK_TAILSCALE_IP}"
export OPENAI_API_KEY="${OPENAI_API_KEY:-}"
export ELEVENLABS_API_KEY="${ELEVENLABS_API_KEY:-}"
EOF
scp -q /tmp/openclaw-env.sh "root@${VPS_HOST}:/tmp/openclaw-env.sh"
rm /tmp/openclaw-env.sh
# run init and capture tailscale IP from last line (tee shows output while capturing)
TAILSCALE_IP=$(ssh "root@${VPS_HOST}" "source /tmp/openclaw-env.sh && chmod +x /tmp/remote/*.sh && /tmp/remote/init.sh" | tee /dev/stderr | tail -1)
SSH_EXIT_CODE=${PIPESTATUS[0]}
if [[ $SSH_EXIT_CODE -eq 0 ]]; then
log_ok "Setup complete"
echo ""
echo "Starting OpenClaw setup wizard via Tailscale (${TAILSCALE_IP})..."
echo ""
ssh -t "root@${TAILSCALE_IP}" "cd /opt/openclaw && ./docker-setup.sh"
# print dashboard URL after setup completes
echo ""
echo "=============================================="
log_ok "Dashboard: http://${TAILSCALE_IP}:18789"
echo "=============================================="
else
log_fail "Setup failed (exit code ${SSH_EXIT_CODE})"
fi