feat: self-contained deploy/verify scripts in release package
- Add deploy.sh: imports data.sql, copies video, copies output files, verifies - Add verify.sh: checks file integrity + DB/offline status - Both scripts included in tar.gz via release package command - Package now deployable standalone without release CLI
This commit is contained in:
85
scripts/deploy_package.sh
Normal file
85
scripts/deploy_package.sh
Normal file
@@ -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"
|
||||||
57
scripts/verify_package.sh
Normal file
57
scripts/verify_package.sh
Normal file
@@ -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 ==="
|
||||||
@@ -467,6 +467,16 @@ async fn cmd_package(db: &PostgresDb, uuid: &str) -> Result<()> {
|
|||||||
}
|
}
|
||||||
println!(" Output files copied");
|
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
|
// 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 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")
|
let status = Command::new("tar")
|
||||||
|
|||||||
Reference in New Issue
Block a user