- Automatically runs new SQL migrations on deploy
- Tracks applied migrations in .migrations-applied file
- Skips already-applied migrations
- Logs all actions to /var/log/arbiter-deploy.log
- Handles npm install if package.json changes
- Enables Meg/Holly to deploy without backend access
Install: sudo cp scripts/deploy-arbiter.sh /opt/scripts/
sudo chmod +x /opt/scripts/deploy-arbiter.sh
Chronicler #76
131 lines
4.0 KiB
Bash
131 lines
4.0 KiB
Bash
#!/bin/bash
|
|
# deploy-arbiter.sh - Deploy Arbiter from Gitea with automatic migrations
|
|
# Location: /opt/scripts/deploy-arbiter.sh
|
|
#
|
|
# Features:
|
|
# - Pulls latest code from firefrost-services repo
|
|
# - Runs any new database migrations
|
|
# - Restarts Arbiter service
|
|
# - Logs all actions for debugging
|
|
#
|
|
# Usage: sudo /opt/scripts/deploy-arbiter.sh [username]
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
DEPLOY_USER="${1:-system}"
|
|
GITEA_TOKEN="e0e330cba1749b01ab505093a160e4423ebbbe36"
|
|
REPO_URL="https://${GITEA_TOKEN}@git.firefrostgaming.com/firefrost-gaming/firefrost-services.git"
|
|
ARBITER_DIR="/opt/arbiter-3.0"
|
|
TEMP_DIR="/tmp/arbiter-deploy-$$"
|
|
LOG_FILE="/var/log/arbiter-deploy.log"
|
|
MIGRATION_TRACKER="${ARBITER_DIR}/.migrations-applied"
|
|
|
|
# Database credentials
|
|
DB_USER="arbiter"
|
|
DB_HOST="127.0.0.1"
|
|
DB_NAME="arbiter_db"
|
|
DB_PASS="FireFrost2026!Arbiter"
|
|
|
|
# Logging function
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
log "=========================================="
|
|
log "DEPLOY STARTED by ${DEPLOY_USER}"
|
|
log "=========================================="
|
|
|
|
# Create temp directory
|
|
mkdir -p "$TEMP_DIR"
|
|
cd "$TEMP_DIR"
|
|
|
|
# Clone the repo
|
|
log "Cloning firefrost-services..."
|
|
git clone --depth 1 "$REPO_URL" repo 2>&1 | tee -a "$LOG_FILE"
|
|
|
|
# Check if clone succeeded
|
|
if [ ! -d "repo/services/arbiter-3.0" ]; then
|
|
log "ERROR: Clone failed or arbiter-3.0 not found"
|
|
rm -rf "$TEMP_DIR"
|
|
exit 1
|
|
fi
|
|
|
|
# Create migration tracker if it doesn't exist
|
|
touch "$MIGRATION_TRACKER"
|
|
|
|
# Run new migrations
|
|
log "Checking for new migrations..."
|
|
MIGRATIONS_DIR="repo/services/arbiter-3.0/migrations"
|
|
|
|
if [ -d "$MIGRATIONS_DIR" ]; then
|
|
for migration in "$MIGRATIONS_DIR"/*.sql; do
|
|
if [ -f "$migration" ]; then
|
|
migration_name=$(basename "$migration")
|
|
|
|
# Check if already applied
|
|
if grep -q "^${migration_name}$" "$MIGRATION_TRACKER" 2>/dev/null; then
|
|
log "SKIP: $migration_name (already applied)"
|
|
else
|
|
log "APPLYING: $migration_name"
|
|
|
|
# Run the migration
|
|
if PGPASSWORD="$DB_PASS" psql -U "$DB_USER" -h "$DB_HOST" -d "$DB_NAME" -f "$migration" 2>&1 | tee -a "$LOG_FILE"; then
|
|
# Mark as applied
|
|
echo "$migration_name" >> "$MIGRATION_TRACKER"
|
|
log "SUCCESS: $migration_name applied"
|
|
else
|
|
log "WARNING: $migration_name may have failed (continuing anyway)"
|
|
# Still mark it to avoid re-running on next deploy
|
|
echo "$migration_name" >> "$MIGRATION_TRACKER"
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
else
|
|
log "No migrations directory found"
|
|
fi
|
|
|
|
# Copy new files
|
|
log "Copying updated files..."
|
|
|
|
# Copy source files
|
|
cp -r repo/services/arbiter-3.0/src/* "$ARBITER_DIR/src/" 2>&1 | tee -a "$LOG_FILE"
|
|
|
|
# Copy migrations (for reference)
|
|
cp -r repo/services/arbiter-3.0/migrations/* "$ARBITER_DIR/migrations/" 2>&1 | tee -a "$LOG_FILE"
|
|
|
|
# Copy package.json if changed
|
|
cp repo/services/arbiter-3.0/package.json "$ARBITER_DIR/package.json" 2>&1 | tee -a "$LOG_FILE"
|
|
|
|
# Check if package.json changed and run npm install
|
|
cd "$ARBITER_DIR"
|
|
if ! cmp -s "$TEMP_DIR/repo/services/arbiter-3.0/package.json" "$ARBITER_DIR/package.json.bak" 2>/dev/null; then
|
|
log "package.json changed, running npm install..."
|
|
cp "$ARBITER_DIR/package.json" "$ARBITER_DIR/package.json.bak"
|
|
npm install --production 2>&1 | tee -a "$LOG_FILE"
|
|
fi
|
|
|
|
# Cleanup temp directory
|
|
rm -rf "$TEMP_DIR"
|
|
|
|
# Restart Arbiter
|
|
log "Restarting Arbiter service..."
|
|
systemctl restart arbiter-3 2>&1 | tee -a "$LOG_FILE"
|
|
|
|
# Wait and check status
|
|
sleep 3
|
|
if systemctl is-active --quiet arbiter-3; then
|
|
log "SUCCESS: Arbiter is running"
|
|
else
|
|
log "ERROR: Arbiter failed to start"
|
|
systemctl status arbiter-3 2>&1 | tee -a "$LOG_FILE"
|
|
exit 1
|
|
fi
|
|
|
|
log "=========================================="
|
|
log "DEPLOY COMPLETED by ${DEPLOY_USER}"
|
|
log "=========================================="
|
|
|
|
exit 0
|