diff --git a/pull-deploy.sh b/pull-deploy.sh new file mode 100644 index 0000000..eab8ca6 --- /dev/null +++ b/pull-deploy.sh @@ -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 [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."