#!/usr/bin/env bash # deploy.sh — Deploy pipeline and diagnostics to VPS from repo # Usage: ./deploy.sh [--dry-run] [--restart] # # Requires: committed, clean working tree. Enforces repo-first workflow. set -euo pipefail VPS_HOST="teleo@77.42.65.182" VPS_PIPELINE="/opt/teleo-eval/pipeline" VPS_DIAGNOSTICS="/opt/teleo-eval/diagnostics" VPS_AGENT_STATE="/opt/teleo-eval/ops/agent-state" REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" DRY_RUN=false RESTART=false for arg in "$@"; do case "$arg" in --dry-run) DRY_RUN=true ;; --restart) RESTART=true ;; --help|-h) echo "Usage: $0 [--dry-run] [--restart]" echo " --dry-run Show what would be deployed without doing it" echo " --restart Restart services after deploy" exit 0 ;; *) echo "Unknown arg: $arg"; exit 1 ;; esac done # Gate: working tree must be clean if [ -n "$(git -C "$REPO_ROOT" status --porcelain)" ]; then echo "ERROR: Uncommitted changes. Commit first, deploy second." git -C "$REPO_ROOT" status --short exit 1 fi echo "Deploying from commit: $(git -C "$REPO_ROOT" log --oneline -1)" echo "" # Syntax check all Python files before deploying echo "=== Pre-deploy syntax check ===" ERRORS=0 for f in "$REPO_ROOT/ops/pipeline-v2/lib/"*.py "$REPO_ROOT/ops/pipeline-v2/"*.py "$REPO_ROOT/ops/diagnostics/"*.py; do [ -f "$f" ] || continue if ! python3 -c "import ast, sys; ast.parse(open(sys.argv[1]).read())" "$f" 2>/dev/null; then echo "SYNTAX ERROR: $f" ERRORS=$((ERRORS + 1)) fi done if [ "$ERRORS" -gt 0 ]; then echo "ERROR: $ERRORS files have syntax errors. Fix before deploying." exit 1 fi echo "All files pass syntax check." echo "" RSYNC_FLAGS="-avz --exclude='__pycache__' --exclude='*.pyc' --exclude='*.bak*'" if $DRY_RUN; then RSYNC_FLAGS="$RSYNC_FLAGS --dry-run" echo "=== DRY RUN ===" fi echo "=== Pipeline lib/ ===" rsync $RSYNC_FLAGS "$REPO_ROOT/ops/pipeline-v2/lib/" "$VPS_HOST:$VPS_PIPELINE/lib/" echo "" echo "=== Pipeline top-level ===" for f in teleo-pipeline.py reweave.py batch-extract-50.sh; do [ -f "$REPO_ROOT/ops/pipeline-v2/$f" ] || continue rsync $RSYNC_FLAGS "$REPO_ROOT/ops/pipeline-v2/$f" "$VPS_HOST:$VPS_PIPELINE/$f" done echo "" echo "=== Diagnostics ===" rsync $RSYNC_FLAGS "$REPO_ROOT/ops/diagnostics/" "$VPS_HOST:$VPS_DIAGNOSTICS/" echo "" echo "=== Agent state ===" rsync $RSYNC_FLAGS "$REPO_ROOT/ops/agent-state/" "$VPS_HOST:$VPS_AGENT_STATE/" echo "" echo "=== Research session ===" rsync $RSYNC_FLAGS "$REPO_ROOT/ops/research-session.sh" "$VPS_HOST:/opt/teleo-eval/research-session.sh" echo "" if $DRY_RUN; then echo "Dry run complete. No changes made." exit 0 fi echo "Deploy complete." if $RESTART; then echo "" echo "=== Restarting services ===" ssh "$VPS_HOST" "sudo systemctl restart teleo-pipeline teleo-diagnostics" echo "Services restarted." fi