Spaces:
Sleeping
Sleeping
| # | |
| # 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 "" | |