From ad720817600599aee1c2279e39ddfd1d16127cae Mon Sep 17 00:00:00 2001 From: jamestagg Date: Tue, 20 Jan 2026 17:27:30 -0800 Subject: [PATCH] Add droplet sync and startup scripts - droplet-sync.sh: Syncs assets from LFS repo on boot - ralpha-ue5.service: Systemd service for auto-start - droplet-setup-ue5-project.sh: One-time setup script Co-Authored-By: Claude Opus 4.5 --- .gitignore | 1 + scripts/droplet-setup-ue5-project.sh | 63 +++++++++++++++++++++++++++ scripts/droplet-sync.sh | 65 ++++++++++++++++++++++++++++ scripts/ralpha-ue5.service | 38 ++++++++++++++++ 4 files changed, 167 insertions(+) create mode 100644 scripts/droplet-setup-ue5-project.sh create mode 100644 scripts/droplet-sync.sh create mode 100644 scripts/ralpha-ue5.service diff --git a/.gitignore b/.gitignore index a4371a9b..17e01046 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,4 @@ Desktop.ini # Starter content (if using) **/StarterContent/ +repomix-output.txt diff --git a/scripts/droplet-setup-ue5-project.sh b/scripts/droplet-setup-ue5-project.sh new file mode 100644 index 00000000..8a4053ca --- /dev/null +++ b/scripts/droplet-setup-ue5-project.sh @@ -0,0 +1,63 @@ +#!/bin/bash +# One-time setup for ralpha-ue5 on DO droplet +# Run this after base UE5 is installed + +set -e + +REPO_DIR="/opt/ralpha-ue5" +GITHUB_TOKEN="${GITHUB_TOKEN:-}" + +echo "=== Setting up ralpha-ue5 on droplet ===" + +# Install jq for JSON parsing +apt-get update && apt-get install -y jq + +# Create ralpha user if not exists +if ! id "ralpha" &>/dev/null; then + useradd -m -s /bin/bash ralpha +fi + +# Clone ralpha-ue5 with LFS +if [ ! -d "$REPO_DIR" ]; then + echo "Cloning ralpha-ue5..." + + if [ -n "$GITHUB_TOKEN" ]; then + git clone "https://${GITHUB_TOKEN}@github.com/jamestagg/ralpha-ue5.git" "$REPO_DIR" + else + git clone "https://github.com/jamestagg/ralpha-ue5.git" "$REPO_DIR" + fi + + cd "$REPO_DIR" + git lfs install + git lfs pull +else + echo "ralpha-ue5 already exists at $REPO_DIR" +fi + +# Create log directories +mkdir -p /var/log/ralpha +mkdir -p /var/lib/ralpha +chown -R ralpha:ralpha /var/log/ralpha /var/lib/ralpha + +# Set ownership +chown -R ralpha:ralpha "$REPO_DIR" + +# Make scripts executable +chmod +x "$REPO_DIR/scripts/"*.sh + +# Create symlink for plugin (assumes main ralpha repo is at /opt/ralpha) +if [ -d "/opt/ralpha/plugin" ] && [ ! -L "$REPO_DIR/Plugins/RalphaPlugin" ]; then + mkdir -p "$REPO_DIR/Plugins" + ln -sf /opt/ralpha/plugin "$REPO_DIR/Plugins/RalphaPlugin" + echo "Created plugin symlink" +fi + +# Install systemd service +cp "$REPO_DIR/scripts/ralpha-ue5.service" /etc/systemd/system/ +systemctl daemon-reload +systemctl enable ralpha-ue5 + +echo "=== Setup complete ===" +echo "To start: systemctl start ralpha-ue5" +echo "To check status: systemctl status ralpha-ue5" +echo "Logs: /var/log/ralpha/" diff --git a/scripts/droplet-sync.sh b/scripts/droplet-sync.sh new file mode 100644 index 00000000..f1d02f74 --- /dev/null +++ b/scripts/droplet-sync.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# Sync ralpha-ue5 assets on droplet boot +# Called by systemd service before launching UE5 + +set -e + +REPO_DIR="${RALPHA_UE5_DIR:-/opt/ralpha-ue5}" +CATALOGUE_PATH="$REPO_DIR/RalphaData/catalogue/catalogue.json" +HASH_FILE="/var/lib/ralpha/catalogue-hash" +LOG_FILE="/var/log/ralpha/sync.log" + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" +} + +mkdir -p "$(dirname "$LOG_FILE")" +mkdir -p "$(dirname "$HASH_FILE")" + +log "Starting ralpha-ue5 sync..." + +cd "$REPO_DIR" + +# Store previous catalogue hash +PREV_HASH="" +if [ -f "$HASH_FILE" ]; then + PREV_HASH=$(cat "$HASH_FILE") +fi + +# Fetch and pull latest +log "Fetching from origin..." +git fetch origin + +# Check if we're behind +LOCAL=$(git rev-parse HEAD) +REMOTE=$(git rev-parse origin/master 2>/dev/null || git rev-parse origin/main) + +if [ "$LOCAL" != "$REMOTE" ]; then + log "Updates available, pulling..." + git pull --ff-only + + # Pull LFS objects for new/changed files + log "Pulling LFS objects..." + git lfs pull + + log "Pull complete." +else + log "Already up to date." +fi + +# Check catalogue hash +if [ -f "$CATALOGUE_PATH" ]; then + CURRENT_HASH=$(jq -r '.catalogue_hash // empty' "$CATALOGUE_PATH" 2>/dev/null || echo "unknown") + echo "$CURRENT_HASH" > "$HASH_FILE" + + if [ "$PREV_HASH" != "$CURRENT_HASH" ]; then + log "Catalogue updated: $PREV_HASH -> $CURRENT_HASH" + # Could trigger cache invalidation or notify MCP server here + else + log "Catalogue unchanged: $CURRENT_HASH" + fi +else + log "Warning: Catalogue not found at $CATALOGUE_PATH" +fi + +log "Sync complete." diff --git a/scripts/ralpha-ue5.service b/scripts/ralpha-ue5.service new file mode 100644 index 00000000..fc7f2cc1 --- /dev/null +++ b/scripts/ralpha-ue5.service @@ -0,0 +1,38 @@ +[Unit] +Description=Ralpha UE5 Asset Server +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=ralpha +Group=ralpha +Environment="DISPLAY=:99" +Environment="RALPHA_UE5_DIR=/opt/ralpha-ue5" +Environment="UE5_DIR=/opt/UnrealEngine" + +# Sync assets before starting +ExecStartPre=/opt/ralpha-ue5/scripts/droplet-sync.sh + +# Start virtual framebuffer +ExecStartPre=/usr/bin/Xvfb :99 -screen 0 1920x1080x24 & + +# Launch UE5 with ralpha-ue5 project (headless, MCP server enabled) +ExecStart=/opt/UnrealEngine/Engine/Binaries/Linux/UnrealEditor \ + /opt/ralpha-ue5/Ralpha.uproject \ + -RenderOffscreen \ + -NoSound \ + -NullRHI=0 \ + -Vulkan \ + -log \ + -unattended + +Restart=on-failure +RestartSec=10 + +# Logging +StandardOutput=append:/var/log/ralpha/ue5.log +StandardError=append:/var/log/ralpha/ue5-error.log + +[Install] +WantedBy=multi-user.target