File size: 7,211 Bytes
27a715d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
#!/usr/bin/env bash
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# litellmGUI ไธ€้”ฎ้ƒจ็ฝฒ่„šๆœฌ๏ผˆ้€‚็”จไบŽ GitHub Codespaces / Ubuntu VPS๏ผ‰
# ไฝฟ็”จๆ–นๆณ•๏ผš็›ดๆŽฅ็ฒ˜่ดดๆ•ดๆฎตๅˆฐ็ปˆ็ซฏๆ‰ง่กŒ
# โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
set -euo pipefail

GREEN="\033[32m"; CYAN="\033[36m"; YELLOW="\033[33m"; RED="\033[31m"; RESET="\033[0m"
ok()   { echo -e "${GREEN}โœ“${RESET} $1"; }
info() { echo -e "${CYAN}โ†’${RESET} $1"; }
warn() { echo -e "${YELLOW}โš ${RESET} $1"; }
err()  { echo -e "${RED}โœ— ้”™่ฏฏ๏ผš$1${RESET}"; exit 1; }

echo ""
echo -e "${CYAN}======================================${RESET}"
echo -e "${CYAN}   litellmGUI ไธ€้”ฎ้ƒจ็ฝฒ่„šๆœฌ           ${RESET}"
echo -e "${CYAN}======================================${RESET}"
echo ""

# โ”€โ”€ 1. ๆฃ€ๆŸฅ Docker โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
info "ๆฃ€ๆŸฅ Docker ็Žฏๅขƒ..."
command -v docker &>/dev/null || err "ๆœชๆ‰พๅˆฐ Docker๏ผŒ่ฏทๅ…ˆๅฎ‰่ฃ…๏ผšcurl -fsSL https://get.docker.com | sh"
docker compose version &>/dev/null 2>&1 || err "ๆœชๆ‰พๅˆฐ Docker Compose๏ผŒ่ฏทๅ…ˆๅฎ‰่ฃ…๏ผšapt install docker-compose-plugin -y"
ok "Docker ็Žฏๅขƒๅฐฑ็ปช๏ผš$(docker --version)"

# โ”€โ”€ 2. ๅ…‹้š†ไป“ๅบ“ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
REPO_DIR="$HOME/litellmGUI"
if [ -d "$REPO_DIR/.git" ]; then
  warn "ไป“ๅบ“ๅทฒๅญ˜ๅœจ๏ผŒๆ‰ง่กŒ git pull ๆ›ดๆ–ฐ..."
  git -C "$REPO_DIR" pull --ff-only
else
  info "ๅ…‹้š†ไป“ๅบ“..."
  git clone https://github.com/lipeiying032/litellmGUI.git "$REPO_DIR"
fi
cd "$REPO_DIR"
ok "ไป“ๅบ“ๅฐฑ็ปช๏ผš$REPO_DIR"

# โ”€โ”€ 3. ็”Ÿๆˆๅฏ†้’ฅ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
info "็”Ÿๆˆ้šๆœบๅฏ†้’ฅ..."
gen_hex() { openssl rand -hex "$1" 2>/dev/null || od -An -N"$1" -tx1 /dev/urandom | tr -d ' \n'; }
MASTER_KEY="sk-gateway-$(gen_hex 16)"
JWT_SECRET="$(gen_hex 32)"

# โ”€โ”€ 4. ๅ†™ๅ…ฅ .env โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
info "็”Ÿๆˆ .env ้…็ฝฎๆ–‡ไปถ..."

# ๅˆคๆ–ญๆ˜ฏ Codespaces ่ฟ˜ๆ˜ฏ VPS๏ผŒ่‡ชๅŠจ่ฎพ็ฝฎ GATEWAY_PUBLIC_URL
if [ -n "${CODESPACE_NAME:-}" ]; then
  # GitHub Codespaces ็Žฏๅขƒ
  PUBLIC_URL="https://${CODESPACE_NAME}-80.${GITHUB_CODESPACES_PORT_FORWARDING_DOMAIN:-app.github.dev}"
  warn "ๆฃ€ๆต‹ๅˆฐ Codespaces ็Žฏๅขƒ"
  warn "็ซฏๅฃ่ฝฌๅ‘ URL๏ผˆ้œ€ๅœจ Codespaces ็ซฏๅฃ้ขๆฟ่ฎพ็ฝฎ 80 ็ซฏๅฃไธบ Public๏ผ‰๏ผš"
  warn "  $PUBLIC_URL"
else
  # VPS ็Žฏๅขƒ๏ผŒๅฐ่ฏ•่Žทๅ–ๅ…ฌ็ฝ‘ IP
  PUBLIC_IP=$(curl -s --connect-timeout 3 ifconfig.me 2>/dev/null || echo "localhost")
  PUBLIC_URL="http://${PUBLIC_IP}"
  info "ๆฃ€ๆต‹ๅˆฐ VPS ็Žฏๅขƒ๏ผŒๅ…ฌ็ฝ‘ IP๏ผš${PUBLIC_IP}"
fi

cat > .env << EOF
# ่‡ชๅŠจ็”ŸๆˆไบŽ $(date '+%Y-%m-%d %H:%M:%S')
LITELLM_MASTER_KEY=${MASTER_KEY}
JWT_SECRET=${JWT_SECRET}
GATEWAY_PUBLIC_URL=${PUBLIC_URL}
HTTP_PORT=80
HTTPS_PORT=443
LOG_LEVEL=http
EOF

ok ".env ๅทฒ็”Ÿๆˆ"
echo ""
echo -e "${YELLOW}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}"
echo -e "${YELLOW}  ้‡่ฆ๏ผ่ฏทไฟๅญ˜ไปฅไธ‹ไฟกๆฏ๏ผš${RESET}"
echo -e "${YELLOW}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}"
echo -e "  LITELLM_MASTER_KEY = ${GREEN}${MASTER_KEY}${RESET}"
echo -e "  JWT_SECRET         = ${GREEN}${JWT_SECRET}${RESET}"
echo -e "  GATEWAY_PUBLIC_URL = ${GREEN}${PUBLIC_URL}${RESET}"
echo -e "${YELLOW}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}"
echo ""

# โ”€โ”€ 5. ้™ไฝŽ LiteLLM worker ๆ•ฐ๏ผˆ่Š‚็œๅ†…ๅญ˜๏ผ‰โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
info "ไผ˜ๅŒ–ๅ†…ๅญ˜้…็ฝฎ๏ผˆworker ๆ•ฐ 4โ†’2๏ผ‰..."
sed -i 's/--num_workers 4/--num_workers 2/g' docker-compose.yml
ok "ๅ†…ๅญ˜้…็ฝฎไผ˜ๅŒ–ๅฎŒๆˆ"

# โ”€โ”€ 6. ๆž„ๅปบๅนถๅฏๅŠจ โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
info "ๅผ€ๅง‹ๆž„ๅปบ Docker ้•œๅƒ๏ผˆ้ฆ–ๆฌก็บฆ้œ€ 3~5 ๅˆ†้’Ÿ๏ผ‰..."
docker compose pull litellm 2>/dev/null || true
docker compose build --parallel
docker compose up -d
ok "ๅฎนๅ™จๅทฒๅฏๅŠจ"

# โ”€โ”€ 7. ็ญ‰ๅพ…ๆœๅŠกๅฅๅบท โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
echo ""
info "็ญ‰ๅพ…ๆœๅŠกๅฏๅŠจ๏ผˆLiteLLM ๅˆๅง‹ๅŒ–็บฆ้œ€ 60 ็ง’๏ผ‰..."
echo -n "  ่ฟ›ๅบฆ๏ผš"
HEALTHY=false
for i in $(seq 1 40); do
  sleep 3
  echo -n "."
  if curl -sf http://localhost/api/health &>/dev/null; then
    HEALTHY=true
    echo ""
    break
  fi
done

echo ""
if [ "$HEALTHY" = true ]; then
  # ่Žทๅ–ๅฅๅบท็Šถๆ€
  HEALTH=$(curl -s http://localhost/api/health 2>/dev/null || echo "{}")
  echo -e "${GREEN}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}"
  echo -e "${GREEN}  ๐Ÿš€ ้ƒจ็ฝฒๆˆๅŠŸ๏ผ${RESET}"
  echo -e "${GREEN}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}"
  echo ""
  echo -e "  ๅฅๅบท็Šถๆ€๏ผš${HEALTH}"
  echo ""
  echo -e "  Web UI๏ผš    ${CYAN}${PUBLIC_URL}${RESET}"
  echo -e "  API ็ซฏ็‚น๏ผš  ${CYAN}${PUBLIC_URL}/v1${RESET}"
  echo -e "  ็ฎก็† API๏ผš  ${CYAN}${PUBLIC_URL}/api/health${RESET}"
  echo ""
  if [ -n "${CODESPACE_NAME:-}" ]; then
    echo -e "${YELLOW}  Codespaces ๆ็คบ๏ผš${RESET}"
    echo -e "  ่ฏทๅœจ VS Code ็ซฏๅฃ้ขๆฟไธญๅฐ† 80 ็ซฏๅฃ่ฎพ็ฝฎไธบ Public"
    echo -e "  ๆ‰่ƒฝไปŽๅค–้ƒจ่ฎฟ้—ฎ Web UI"
  fi
  echo ""
  echo -e "  ๅธธ็”จๅ‘ฝไปค๏ผš"
  echo -e "    ๆŸฅ็œ‹ๆ—ฅๅฟ—๏ผš  ${CYAN}cd ~/litellmGUI && docker compose logs -f${RESET}"
  echo -e "    ๆŸฅ็œ‹็Šถๆ€๏ผš  ${CYAN}cd ~/litellmGUI && docker compose ps${RESET}"
  echo -e "    ้‡ๅฏๆœๅŠก๏ผš  ${CYAN}cd ~/litellmGUI && docker compose restart${RESET}"
  echo -e "    ๅœๆญขๆœๅŠก๏ผš  ${CYAN}cd ~/litellmGUI && docker compose down${RESET}"
  echo -e "${GREEN}โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”${RESET}"
else
  warn "ๆœๅŠกๅฏๅŠจ่ถ…ๆ—ถ๏ผŒ่ฏทๆŸฅ็œ‹ๆ—ฅๅฟ—ๆŽ’ๆŸฅ้—ฎ้ข˜๏ผš"
  echo -e "  ${CYAN}cd ~/litellmGUI && docker compose logs --tail=50${RESET}"
  echo ""
  docker compose ps
fi