Files
momentry_core/scripts/package_delivery.sh
Accusys 48c3b13c37 fix: restore identity_id after face_dedup, rebuild package v20260512
- Re-ran identity_bind.py to restore identity_id on face_detections
- Dedup cleanup had removed rows with identity_id, kept NULL rows
- 70691 face_detections now have identity_id, 428 identities
- Full package rebuild: 169MB sqlite, 1358MB tar.gz
- identities.json: 428 identities + 5483 bindings + 5483 trace maps
- TMDB matching complete: Audrey Hepburn 843 traces, Cary Grant 482
2026-05-13 04:30:18 +08:00

225 lines
6.8 KiB
Bash

#!/bin/bash
# Package Delivery — 依 M4 spec 三層打包
# Usage:
# bash package_delivery.sh dev <version>
# bash package_delivery.sh prod <version>
# bash package_delivery.sh file <file_uuid> <version>
set -euo pipefail
CMD="${1:?Usage: $0 <dev|prod|file> <arg> [version]}"
PROJECT="/Users/accusys/momentry_core_0.1"
PG_BIN="/Users/accusys/pgsql/18.3/bin"
T0=$(date +%s)
case "$CMD" in
dev)
VERSION="${2:?Usage: $0 dev <version>}"
OUTPUT="$PROJECT/release/dev_upgrade_${VERSION}"
mkdir -p "$OUTPUT/schema" "$OUTPUT/bin" "$OUTPUT/src"
echo "=== Dev Upgrade Package ${VERSION} ==="
# Migration SQL (auto-generated from current schema)
echo "[1/4] Migration SQL..."
{
echo "-- Migration: dev schema ${VERSION}"
echo "-- Date: $(date +%Y-%m-%d)"
echo "-- Auto-generated from current DB schema"
echo ""
echo "SET search_path TO dev;"
echo ""
# face_detections: timestamp_secs was added later
$PG_BIN/psql -U accusys -d momentry -t -A -c "
SELECT 'ALTER TABLE dev.face_detections ADD COLUMN IF NOT EXISTS ' || column_name || ' ' || udt_name || ';'
FROM information_schema.columns
WHERE table_schema='dev' AND table_name='face_detections'
AND column_name = 'timestamp_secs';
" 2>/dev/null
# chunk: chunk_id was changed to short format
echo ""
echo "-- Chunk index removals (already applied)"
echo "-- chunk_vectors: standard columns"
} > "$OUTPUT/schema/migration_${VERSION}.sql"
echo " migration_${VERSION}.sql"
# Binary
echo "[2/4] Binary..."
BIN_SRC="$PROJECT/target/debug/momentry_playground"
if [ -f "$BIN_SRC" ]; then
cp "$BIN_SRC" "$OUTPUT/bin/"
echo " momentry_playground ($(ls -lh "$OUTPUT/bin/momentry_playground" | awk '{print $5}'))"
else
echo " WARN: binary not found at $BIN_SRC (build first: cargo build --bin momentry_playground)"
fi
# Source (optional)
echo "[3/4] Source code..."
cd "$PROJECT"
git archive --format=tar.gz -o "$OUTPUT/src/momentry_core_${VERSION}_source.tar.gz" HEAD 2>/dev/null
echo " source.tar.gz ($(ls -lh "$OUTPUT/src/momentry_core_${VERSION}_source.tar.gz" | awk '{print $5}'))"
# UPGRADE.md
echo "[4/4] UPGRADE.md..."
cat > "$OUTPUT/UPGRADE.md" << UPEOF
# Dev Upgrade ${VERSION}
## Steps
\`\`\`bash
# 1. Apply migration
psql -U accusys -d momentry < schema/migration_${VERSION}.sql
# 2. Replace binary
cp bin/momentry_playground ${PROJECT}/target/debug/
# 3. Restart
pkill momentry_playground
DATABASE_SCHEMA=dev ${PROJECT}/target/debug/momentry_playground server --port 3003
\`\`\`
UPEOF
# Package
cd "$PROJECT/release"
tar czf "dev_upgrade_${VERSION}.tar.gz" -C "$(dirname "$OUTPUT")" "$(basename "$OUTPUT")"
echo ""
echo "=== Package: release/dev_upgrade_${VERSION}.tar.gz ($(ls -lh "dev_upgrade_${VERSION}.tar.gz" | awk '{print $5}')) ==="
;;
prod)
VERSION="${2:?Usage: $0 prod <version>}"
OUTPUT="$PROJECT/release/prod_upgrade_${VERSION}"
mkdir -p "$OUTPUT/schema" "$OUTPUT/bin"
echo "=== Prod Upgrade Package ${VERSION} ==="
echo "[1/3] Migration SQL..."
cat > "$OUTPUT/schema/migration_${VERSION}.sql" << SQLEOF
-- Migration: public schema ${VERSION}
-- Date: $(date +%Y-%m-%d)
SET search_path TO public;
-- ALTER TABLE public.videos ADD COLUMN IF NOT EXISTS ...;
SQLEOF
echo " migration_${VERSION}.sql"
echo "[2/3] Binary..."
BIN_SRC="$PROJECT/target/release/momentry"
if [ -f "$BIN_SRC" ]; then
cp "$BIN_SRC" "$OUTPUT/bin/"
echo " momentry ($(ls -lh "$OUTPUT/bin/momentry" | awk '{print $5}'))"
else
echo " WARN: release binary not found (build: cargo build --release --bin momentry)"
fi
echo "[3/3] UPGRADE.md..."
cat > "$OUTPUT/UPGRADE.md" << UPEOF
# Prod Upgrade ${VERSION}
## Pre-flight
\`\`\`bash
pg_dump -U accusys -d momentry --schema=public > backup_${VERSION}_pre.sql
\`\`\`
## Steps
\`\`\`bash
# 1. Migration
psql -U accusys -d momentry < schema/migration_${VERSION}.sql
# 2. Replace binary
cp bin/momentry ${PROJECT}/target/release/
# 3. Restart
sudo launchctl stop com.momentry.api
sudo launchctl start com.momentry.api
\`\`\`
## Rollback
\`\`\`bash
psql -U accusys -d momentry < backup_${VERSION}_pre.sql
\`\`\`
UPEOF
cd "$PROJECT/release"
tar czf "prod_upgrade_${VERSION}.tar.gz" -C "$(dirname "$OUTPUT")" "$(basename "$OUTPUT")"
echo ""
echo "=== Package: release/prod_upgrade_${VERSION}.tar.gz ($(ls -lh "prod_upgrade_${VERSION}.tar.gz" | awk '{print $5}')) ==="
;;
file)
UUID="${2:?Usage: $0 file <uuid> [version]}"
VERSION="${3:-v1.0}"
OUTPUT="$PROJECT/release/file_${UUID}_${VERSION}"
mkdir -p "$OUTPUT"
echo "=== File Package ${UUID} ${VERSION} ==="
# file_info.json
echo "[1/5] file_info.json..."
$PG_BIN/psql -U accusys -d momentry -t -A -c "
SELECT json_build_object(
'file_uuid', file_uuid,
'file_name', file_name,
'duration', duration,
'fps', fps,
'width', width,
'height', height,
'total_frames', total_frames,
'status', status
) FROM dev.videos WHERE file_uuid='$UUID';
" 2>/dev/null | python3 -c "import json,sys;json.dump(json.load(sys.stdin),open('$OUTPUT/file_info.json','w'),indent=2)"
# data.sql (using Python export script)
echo "[2/5] data.sql..."
python3 "$PROJECT/scripts/export_file_package.py" "$UUID" "$OUTPUT" 2>&1
# checksums.md5
echo "[3/5] checksums.md5..."
cd "$OUTPUT"
md5sum data.sql file_info.json 2>/dev/null > checksums.md5 || md5 data.sql file_info.json > checksums.md5 2>/dev/null
echo " checksums.md5"
# README.md
echo "[4/5] README.md..."
cat > "$OUTPUT/README.md" << READMEEOF
# File Package: ${UUID}
## Import
\`\`\`bash
export UUID=${UUID}
# 1. Clean existing data for this file
psql -U accusys -d momentry << SQL
DELETE FROM dev.chunk_vectors WHERE uuid = '\${UUID}'::text;
DELETE FROM dev.chunk WHERE file_uuid = '\${UUID}';
DELETE FROM dev.face_detections WHERE file_uuid = '\${UUID}';
DELETE FROM dev.videos WHERE file_uuid = '\${UUID}';
SQL
# 2. Restore
psql -U accusys -d momentry < data.sql
# 3. Verify
psql -U accusys -d momentry -c "SELECT file_uuid, status FROM dev.videos WHERE file_uuid = '\${UUID}'"
\`\`\`
## Verification
- \`GET /api/v1/file/{uuid}\` → 200, status=ready
- \`GET /api/v1/file/{uuid}/chunk/0-01\` → 200
- \`POST /api/v1/search/universal\` → results
READMEEOF
# Package
echo "[5/5] Packaging tar.gz..."
cd "$PROJECT/release"
tar czf "file_${UUID}_${VERSION}.tar.gz" -C "$(dirname "$OUTPUT")" "$(basename "$OUTPUT")" 2>/dev/null
echo " release/file_${UUID}_${VERSION}.tar.gz ($(ls -lh "file_${UUID}_${VERSION}.tar.gz" | awk '{print $5}'))"
rm -rf "$OUTPUT"
;;
*)
echo "Usage: $0 <dev|prod|file> <arg> [version]"
exit 1
;;
esac
ELAPSED=$(($(date +%s) - T0))
echo " Elapsed: ${ELAPSED}s"