cydd / deploy.sh
chaofenghui's picture
Upload folder using huggingface_hub
dd92d97 verified
Raw
History Blame Contribute Delete
5.69 kB
#!/usr/bin/env bash
#
# Short Track Dashboard โ€” Linux ่‡ชๅŠจ้ƒจ็ฝฒ่„šๆœฌ
# ๆ›ฟไปฃ deploy_all.ps1๏ผŒ้€‚็”จไบŽ PRoot/aarch64 Linux ็Žฏๅขƒ
#
# ็”จๆณ•:
# ./deploy.sh # ๅฎŒๆ•ด้ƒจ็ฝฒ๏ผˆไฟ็•™ๆœๅŠกๅ™จๆ•ฐๆฎๅบ“๏ผ‰
# ./deploy.sh --force-data # ๅผบๅˆถๅŒๆญฅๆœฌๅœฐๆ•ฐๆฎๅบ“ๅˆฐๆœๅŠกๅ™จ
# ./deploy.sh --apk-only # ไป…ๆž„ๅปบๅนถไธŠไผ  APK
#
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$SCRIPT_DIR"
SERVER="ubuntu@122.51.80.140"
REMOTE_DIR="~/short_track_dashboard"
APK_SRC="static/app-debug-latest.apk"
BUILD_LOG="/tmp/deploy_$(date +%Y%m%d_%H%M%S).log"
FORCE_DATA=false
APK_ONLY=false
for arg in "$@"; do
case "$arg" in
--force-data) FORCE_DATA=true ;;
--apk-only) APK_ONLY=true ;;
*) echo "ๆœช็Ÿฅๅ‚ๆ•ฐ: $arg"; exit 1 ;;
esac
done
# โ”€โ”€ Color helpers โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
red() { echo -e "\033[31m$1\033[0m"; }
green() { echo -e "\033[32m$1\033[0m"; }
yellow() { echo -e "\033[33m$1\033[0m"; }
cyan() { echo -e "\033[36m$1\033[0m"; }
step() { echo ""; yellow "[$1/$2] $3"; }
ok() { green " โœ“ $1"; }
warn() { yellow " โš  $1"; }
fail() { red " โœ— $1"; exit 1; }
echo ""
cyan "========================================"
cyan " Short Track Dashboard Deploy"
cyan "========================================"
echo ""
# โ”€โ”€ Step 1: Check / Build APK โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
step 1 3 "ๆฃ€ๆŸฅ APK..."
NEED_APK_BUILD=true
# โ”€โ”€ Step 2: Web ้ƒจ็ฝฒ (if not APK-only) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if [ "$APK_ONLY" = false ]; then
step 2 3 "ๆ‰“ๅŒ…้กน็›ฎ..."
PACK_FILE="$SCRIPT_DIR/deploy_tmp.tar.gz"
rm -f "$PACK_FILE"
# ๆŽ’้™คๅˆ—่กจ
EXCLUDES=(
'node_modules' '__pycache__' '.git' '.codebuddy'
'deploy_tmp.tar.gz' 'android' 'wechat_decrypted' 'wx_key_tool'
'dist' 'deploy*.ps1' 'deploy_guide.md' 'deploy.sh'
'.venv' 'venv' '.pytest_cache' 'hf-space'
'data' # ไฟๆŠคๆœๅŠกๅ™จๆ•ฐๆฎๅบ“ โ† ้‡่ฆ๏ผ
)
# ๆž„ๅปบ tar exclude ๅ‚ๆ•ฐ
TAR_EXCLUDE=""
for ex in "${EXCLUDES[@]}"; do
TAR_EXCLUDE="$TAR_EXCLUDE --exclude=$ex"
done
# ๆ‰“ๅŒ…๏ผˆๅŒ…ๅซ data/ ็›ฎๅฝ•ไธ‹็š„ .db ไฝ†ไธ่ฆ†็›–ๆœๅŠกๅ™จๆ•ฐๆฎ๏ผ‰
tar czf "$PACK_FILE" $TAR_EXCLUDE \
--exclude='check_*.py' --exclude='debug_*.py' \
--exclude='decrypt*.py' --exclude='export_competition.py' \
--exclude='export_training.py' --exclude='_*' \
-C "$SCRIPT_DIR" .
PACK_SIZE=$(du -h "$PACK_FILE" | cut -f1)
ok "ๆ‰“ๅŒ…ๅฎŒๆˆ ($PACK_SIZE)"
step 3 3 "ไธŠไผ ้กน็›ฎๅˆฐๆœๅŠกๅ™จ..."
scp -o StrictHostKeyChecking=no "$PACK_FILE" "${SERVER}:~/deploy_tmp.tar.gz" || fail "ไธŠไผ ๅคฑ่ดฅ"
rm -f "$PACK_FILE"
ok "ไธŠไผ ๅฎŒๆˆ"
echo ""
echo " ่ฟœ็จ‹้ƒจ็ฝฒไธญ..."
echo ""
# ๆ•ฐๆฎๅบ“ๅค‡ไปฝ๏ผˆ้ƒจ็ฝฒๅ‰่‡ชๅŠจๅค‡ไปฝ๏ผŒ้˜ฒๆญขๆ•ฐๆฎไธขๅคฑ๏ผ‰
BACKUP_CMD="mkdir -p $REMOTE_DIR/db_backups && cp $REMOTE_DIR/data/short_track.db $REMOTE_DIR/db_backups/short_track_\$(date +%Y%m%d_%H%M%S).db 2>/dev/null || true"
# ๆž„ๅปบ่ฟœ็จ‹ๅ‘ฝไปค๏ผˆtar ็š„้ž่‡ดๅ‘ฝๆƒ้™้”™่ฏฏ็”จ sed ่ฟ‡ๆปค๏ผ‰
if [ "$FORCE_DATA" = true ]; then
warn "ForceData ๆจกๅผ๏ผšๅฐ†่ฆ†็›–ๆœๅŠกๅ™จๆ•ฐๆฎๅบ“"
REMOTE_CMD="$BACKUP_CMD && cd $REMOTE_DIR && tar xzf ~/deploy_tmp.tar.gz --no-same-permissions 2>&1 | sed '/Cannot/d' && rm ~/deploy_tmp.tar.gz && sudo docker compose down && sudo docker compose up -d --build && sleep 8 && sudo docker compose ps"
else
ok "ไฟ็•™ๆœๅŠกๅ™จๆ•ฐๆฎๅบ“๏ผˆๅทฒๅค‡ไปฝ๏ผ‰"
REMOTE_CMD="$BACKUP_CMD && cd $REMOTE_DIR && tar xzf ~/deploy_tmp.tar.gz --no-same-permissions 2>&1 | sed '/Cannot/d' && rm ~/deploy_tmp.tar.gz && sudo docker compose down && sudo docker compose up -d --build && sleep 8 && sudo docker compose ps"
fi
ssh -o StrictHostKeyChecking=no "$SERVER" "$REMOTE_CMD" || fail "่ฟœ็จ‹้ƒจ็ฝฒๅคฑ่ดฅ"
ok "Docker ๅฎนๅ™จๅทฒ้‡ๅฏ"
fi
# โ”€โ”€ Step 3: APK ไธŠไผ  โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
if [ "$NEED_APK_BUILD" = true ] || [ "$APK_ONLY" = true ]; then
echo ""
yellow "[APK] ๆž„ๅปบ Android APK..."
python3 build_mobile.py android || fail "APK ๆž„ๅปบๅคฑ่ดฅ"
ok "APK ๆž„ๅปบๅฎŒๆˆ"
fi
echo ""
echo " ไธŠไผ  APK ๅˆฐๆœๅŠกๅ™จ..."
scp -o StrictHostKeyChecking=no "$APK_SRC" "${SERVER}:~/app-debug.apk" || fail "APK ไธŠไผ ๅคฑ่ดฅ"
ok "APK ๅทฒไธŠไผ "
# ๅฎ‰่ฃ… APK ๅˆฐ static/ ็›ฎๅฝ•
ssh -o StrictHostKeyChecking=no "$SERVER" \
"cp ~/app-debug.apk $REMOTE_DIR/static/app-debug-latest.apk && cp ~/app-debug.apk $REMOTE_DIR/static/app-debug-v\$(python3 -c \"import re, os; print(re.search(r'APP_VERSION\s*=\s*\\\"([^\\\"]+)\\\"', open(os.path.join(os.path.expanduser('~'), 'short_track_dashboard/app.py')).read()).group(1))\").apk && rm ~/app-debug.apk && ls -lh $REMOTE_DIR/static/app-debug-*.apk" || warn "APK ๅฎ‰่ฃ…ๅˆฐ static/ ๅคฑ่ดฅ๏ผˆๅฏ่ƒฝ็‰ˆๆœฌๅทๆๅ–ๅผ‚ๅธธ๏ผ‰"
ok "APK ๅทฒ้ƒจ็ฝฒๅˆฐๆœๅŠกๅ™จ"
# โ”€โ”€ Done โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
echo ""
cyan "========================================"
green " ้ƒจ็ฝฒๅฎŒๆˆ!"
cyan "========================================"
echo ""
echo " Web: http://122.51.80.140:5000"
echo " APK: http://122.51.80.140:5000/static/app-debug-latest.apk"
echo " Ping: http://122.51.80.140:5000/api/ping"
echo ""