Upload files to "/"

This commit is contained in:
mike 2026-06-25 03:09:03 +08:00
parent c4dee5e672
commit 4a3bd4db7c
1 changed files with 105 additions and 0 deletions

105
pull-deploy.sh Normal file
View File

@ -0,0 +1,105 @@
#!/bin/bash
# General-purpose deploy: pulls ONLY the files you name as arguments from
# your Gitea repo, backs up whatever they're replacing, applies them,
# reinstalls deps, rebuilds the frontend, and restarts the service.
#
# Usage examples:
# ./pull-deploy.sh App.jsx
# ./pull-deploy.sh App.jsx storage.js
# ./pull-deploy.sh server.js server-package.json
#
# Recognized filenames (anything else is an error, to catch typos):
# App.jsx -> frontend/src/App.jsx
# storage.js -> frontend/src/storage.js
# server.js -> server/server.js
# server-package.json -> server/package.json
# frontend-package.json -> frontend/package.json
#
# If the Gitea repo is private, generate a token (Settings -> Applications
# -> Generate New Token, "read:repository" scope) and run it like this:
# GITEA_TOKEN=your_token_here ./pull-deploy.sh App.jsx
set -e
GITEA_BASE="https://git.stickrouter.com/mike/client/raw/branch/main"
GITEA_TOKEN="${GITEA_TOKEN:-}"
APP_DIR=/opt/customer-crm
BACKUP_DIR=/opt/customer-crm-backups
TS=$(date +%Y%m%d_%H%M%S)
if [ "$#" -eq 0 ]; then
echo "Usage: ./pull-deploy.sh <file1> [file2] [file3] ..."
echo "Example: ./pull-deploy.sh App.jsx"
exit 1
fi
mkdir -p "$BACKUP_DIR"
CURL_AUTH=()
if [ -n "$GITEA_TOKEN" ]; then
CURL_AUTH=(-H "Authorization: token $GITEA_TOKEN")
fi
dest_for() {
case "$1" in
App.jsx) echo "frontend/src/App.jsx" ;;
storage.js) echo "frontend/src/storage.js" ;;
server.js) echo "server/server.js" ;;
server-package.json) echo "server/package.json" ;;
frontend-package.json) echo "frontend/package.json" ;;
*) echo "" ;;
esac
}
echo "=== [1/4] Downloading the requested files ==="
DOWNLOADED=()
for name in "$@"; do
dest=$(dest_for "$name")
if [ -z "$dest" ]; then
echo "[ERROR] Unrecognized filename: $name"
echo " Valid names: App.jsx, storage.js, server.js, server-package.json, frontend-package.json"
exit 1
fi
tmp="/tmp/$(basename "$name").new"
if ! curl -fsSL "${CURL_AUTH[@]}" "$GITEA_BASE/$name" -o "$tmp"; then
echo "[ERROR] Could not download $name from $GITEA_BASE/$name"
exit 1
fi
echo " $name: downloaded"
DOWNLOADED+=("$name:$dest:$tmp")
done
echo ""
echo "=== [2/4] Backing up the files being replaced ==="
for entry in "${DOWNLOADED[@]}"; do
IFS=: read -r name dest tmp <<< "$entry"
target="$APP_DIR/$dest"
if [ -f "$target" ]; then
backup_name=$(echo "$name" | sed 's/\.[^.]*$//')
ext="${name##*.}"
cp "$target" "$BACKUP_DIR/${backup_name}_$TS.$ext"
echo " $name -> $BACKUP_DIR/${backup_name}_$TS.$ext"
fi
done
echo ""
echo "=== [3/4] Applying the new files ==="
for entry in "${DOWNLOADED[@]}"; do
IFS=: read -r name dest tmp <<< "$entry"
mkdir -p "$(dirname "$APP_DIR/$dest")"
mv "$tmp" "$APP_DIR/$dest"
echo " $name -> $dest"
done
echo ""
echo "=== [4/4] Rebuilding and restarting ==="
cd "$APP_DIR/server"
npm install --omit=dev
cd "$APP_DIR/frontend"
npm install
npm run build
systemctl restart customer-crm
sleep 1
systemctl --no-pager -l status customer-crm | head -10
echo ""
echo "Done. Open your domain in a browser to check it."