diff --git a/scripts/deploy_package.sh b/scripts/deploy_package.sh new file mode 100644 index 0000000..7120140 --- /dev/null +++ b/scripts/deploy_package.sh @@ -0,0 +1,85 @@ +#!/bin/bash +# Momentry Release Package — Deploy Script +# Usage: bash deploy.sh [--db-only] [--skip-video] + +set -euo pipefail +DIR="$(cd "$(dirname "$0")" && pwd)" +UUID=$(basename "$DIR") +PG_BIN="${PG_BIN:-/Users/accusys/pgsql/18.3/bin}" +DB_NAME="${DB_NAME:-momentry}" +DB_USER="${DB_USER:-accusys}" +DEMO_DIR="${DEMO_DIR:-/Users/accusys/momentry/var/sftpgo/data/demo}" +OUTPUT_DIR="${OUTPUT_DIR:-/Users/accusys/momentry/output_dev}" + +echo "=== Momentry Package Deploy ===" +echo "UUID: $UUID" +echo "Time: $(date '+%Y-%m-%d %H:%M:%S')" +echo "" + +# 1. Verify package integrity +echo "[1/5] Verifying package..." +REQUIRED_FILES=("data.sql" "file_info.json") +MISSING=0 +for f in "${REQUIRED_FILES[@]}"; do + if [ ! -f "$DIR/$f" ]; then + echo " ❌ Missing: $f" + MISSING=1 + fi +done +if [ $MISSING -eq 1 ]; then + echo "ERROR: Package incomplete" + exit 1 +fi +echo " ✅ Package verified" + +# 2. Import data.sql +echo "[2/5] Importing DB data..." +"$PG_BIN/psql" -U "$DB_USER" -d "$DB_NAME" -f "$DIR/data.sql" 2>&1 | tail -3 +echo " ✅ Data imported" + +# 3. Copy video to demo dir +VIDEO_FILE=$(ls "$DIR"/*.mp4 "$DIR"/*.mov "$DIR"/*.avi "$DIR"/*.mkv 2>/dev/null | head -1) +if [ -n "$VIDEO_FILE" ]; then + VIDEO_NAME=$(basename "$VIDEO_FILE") + DEST="$DEMO_DIR/$VIDEO_NAME" + if [ ! -f "$DEST" ]; then + cp "$VIDEO_FILE" "$DEST" + echo "[3/5] Video copied: $VIDEO_NAME → $DEMO_DIR" + else + echo "[3/5] Video already in demo dir, skipping" + fi +else + echo "[3/5] No video file in package, skipping" +fi + +# 4. Copy output files +echo "[4/5] Copying output files..." +COPIED=0 +for f in "$DIR"/*.json "$DIR"/*.sqlite "$DIR"/*.sqlite; do + if [ -f "$f" ]; then + FNAME=$(basename "$f") + if [ "$FNAME" != "file_info.json" ] && [ "$FNAME" != "package.json" ]; then + cp "$f" "$OUTPUT_DIR/$FNAME" + COPIED=$((COPIED + 1)) + fi + fi +done +echo " ✅ $COPIED files copied to $OUTPUT_DIR" + +# 5. Verify deployment +echo "[5/5] Verifying deployment..." +CHUNKS=$("$PG_BIN/psql" -U "$DB_USER" -d "$DB_NAME" -t -A -c "SELECT COUNT(*) FROM dev.chunk WHERE file_uuid='$UUID' AND chunk_type='sentence'" 2>/dev/null || echo "?") +FACES=$("$PG_BIN/psql" -U "$DB_USER" -d "$DB_NAME" -t -A -c "SELECT COUNT(*) FROM dev.face_detections WHERE file_uuid='$UUID'" 2>/dev/null || echo "?") + +echo "" +echo "=== Deploy Complete ===" +echo " UUID: $UUID" +echo " Chunks: $CHUNKS" +echo " Faces: $FACES" +echo " Output: $OUTPUT_DIR/" +echo "" +echo "Next: trigger pipeline processing" +echo " curl -X POST http://localhost:3003/api/v1/file/$UUID/process" +echo "" +echo "Or open the offline report:" +echo " python3 render_offline_report.py $OUTPUT_DIR/$UUID.sqlite" diff --git a/scripts/verify_package.sh b/scripts/verify_package.sh new file mode 100644 index 0000000..3a428e8 --- /dev/null +++ b/scripts/verify_package.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# Momentry Release Package — Verify Script +# Usage: bash verify.sh + +set -euo pipefail +DIR="$(cd "$(dirname "$0")" && pwd)" +UUID=$(basename "$DIR") +PG_BIN="${PG_BIN:-/Users/accusys/pgsql/18.3/bin}" +DB_NAME="${DB_NAME:-momentry}" +DB_USER="${DB_USER:-accusys}" + +echo "=== Package Verification ===" +echo "UUID: $UUID" +echo "" + +# Check files +FILES=("data.sql" "file_info.json" "$UUID.sqlite" "$UUID.identities.json" "$UUID.asr.json" "$UUID.face.json" "$UUID.speaker_map.json") +echo "## 1. File Integrity" +for f in "${FILES[@]}"; do + if [ -f "$DIR/$f" ]; then + SIZE=$(ls -lh "$DIR/$f" | awk '{print $5}') + echo " ✅ $f ($SIZE)" + else + echo " ⚠️ $f (not found)" + fi +done + +# Check DB (if accessible) +if "$PG_BIN/psql" -U "$DB_USER" -d "$DB_NAME" -c "SELECT 1" >/dev/null 2>&1; then + echo "" + echo "## 2. Database" + for tbl in chunk face_detections tkg_nodes tkg_edges identities identity_bindings; do + COUNT=$("$PG_BIN/psql" -U "$DB_USER" -d "$DB_NAME" -t -A -c "SELECT COUNT(*) FROM dev.$tbl WHERE file_uuid='$UUID' OR uuid='$UUID'" 2>/dev/null || echo "N/A") + echo " $tbl: $COUNT" + done +else + echo "" + echo "## 2. Database (offline — check $UUID.sqlite)" + if [ -f "$DIR/$UUID.sqlite" ]; then + python3 -c " +import sqlite3 +conn = sqlite3.connect('$DIR/$UUID.sqlite') +c = conn.cursor() +for tbl in ['chunk', 'face_detections', 'identities', 'tkg_nodes', 'tkg_edges']: + c.execute(f'SELECT COUNT(*) FROM {tbl}') + print(f' {tbl}: {c.fetchone()[0]}') +conn.close() +" 2>/dev/null || echo " (sqlite3 unavailable)" + fi +fi + +echo "" +echo "## 3. Pipeline Status" +echo " $("$PG_BIN/psql" -U "$DB_USER" -d "$DB_NAME" -t -A -c "SELECT status FROM dev.videos WHERE file_uuid='$UUID'" 2>/dev/null || echo "unknown")" + +echo "" +echo "=== Verification Complete ===" diff --git a/src/bin/release.rs b/src/bin/release.rs index 97a9e08..ddbe6cd 100644 --- a/src/bin/release.rs +++ b/src/bin/release.rs @@ -467,6 +467,16 @@ async fn cmd_package(db: &PostgresDb, uuid: &str) -> Result<()> { } println!(" Output files copied"); + // Copy deploy + verify scripts into package + let deploy_src = "/Users/accusys/momentry_core_0.1/scripts/deploy_package.sh"; + let verify_src = "/Users/accusys/momentry_core_0.1/scripts/verify_package.sh"; + if Path::new(deploy_src).exists() { + fs::copy(deploy_src, outdir.join("deploy.sh"))?; + } + if Path::new(verify_src).exists() { + fs::copy(verify_src, outdir.join("verify.sh"))?; + } + // Create tar.gz let tarball = Path::new(RELEASE_DIR).join(format!("{}_v{}.tar.gz", uuid, Utc::now().format("%Y%m%d_%H%M%S"))); let status = Command::new("tar")