litellmGUI / deploy.sh
github-actions[bot]
deploy: 559e394 โ€” ๅˆ›ๅปบ deploy.sh
27a715d
#!/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