docs: reply to M4 release fixes — pre-clean all tables + SCHEMA variable
This commit is contained in:
35
docs_v1.0/M4_workspace/2026-05-13_release_fixes_response.md
Normal file
35
docs_v1.0/M4_workspace/2026-05-13_release_fixes_response.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Release Fixes — 回覆
|
||||
|
||||
**Date**: 2026-05-13
|
||||
**From**: M5
|
||||
**To**: M4
|
||||
**Ref**: `2026-05-13_release_fixes_required.md`
|
||||
|
||||
---
|
||||
|
||||
## 修正
|
||||
|
||||
| # | 問題 | 狀態 | Commit |
|
||||
|---|------|:--:|--------|
|
||||
| 1 | pre-clean 只清 identities,缺其他 table | ✅ | `6cd41ed` |
|
||||
| 2 | deploy.sh schema 寫死 `dev.`,無法對 public 部署 | ✅ 加 `SCHEMA` 變數 | `6cd41ed` |
|
||||
| 3 | SOP schema migration 缺 `file_uuid` column | ✅ | `6cd41ed` |
|
||||
|
||||
## 使用方式
|
||||
|
||||
```bash
|
||||
# dev schema (預設)
|
||||
bash deploy.sh
|
||||
|
||||
# public schema (production)
|
||||
SCHEMA=public bash deploy.sh
|
||||
```
|
||||
|
||||
## Release 現狀確認
|
||||
|
||||
| 項目 | 狀態 |
|
||||
|------|:--:|
|
||||
| aeed7134 deploy to public | ✅ 已由 M4 手動完成 |
|
||||
| 23b1c87 deploy to public | ⏳ M4 待執行(可用 `SCHEMA=public bash deploy.sh`) |
|
||||
| Binary deployed | ✅ |
|
||||
| Schema migration | ✅ `chunks→chunk` + `file_uuid` column |
|
||||
283
docs_v1.0/M4_workspace/2026-05-13_release_sop_draft.md
Normal file
283
docs_v1.0/M4_workspace/2026-05-13_release_sop_draft.md
Normal file
@@ -0,0 +1,283 @@
|
||||
# Release SOP — Dev → Production (3002)
|
||||
|
||||
**Date**: 2026-05-13
|
||||
**Version**: 2.0
|
||||
**Status**: Draft — M5 Review Required
|
||||
|
||||
---
|
||||
|
||||
## 1. Prerequisites
|
||||
|
||||
### 必須確認
|
||||
|
||||
| # | 檢查項 | 方法 | 門檻 |
|
||||
|:--:|------|------|:--:|
|
||||
| 1 | Dev (3003) 39/39 API test | `bash api_test.sh` | ✅ 39/39 |
|
||||
| 2 | 檔案內容包匯入成功 | 9 tables all > 0 | ✅ 通過 |
|
||||
| 3 | TMDB identities 匹配 | `SELECT * FROM dev.identities WHERE source='tmdb'` | ✅ 7 actors |
|
||||
| 4 | TKG 到位 | tkg_nodes + tkg_edges > 0 | ✅ 通過 |
|
||||
| 5 | Release binary 已編譯 | `cargo build --release --bin momentry` | ✅ 成功 |
|
||||
| 6 | `.env.development` 切換確認 | `DATABASE_SCHEMA=public` | ✅ |
|
||||
|
||||
|
||||
## 2. Backup
|
||||
|
||||
### 2.1 Database
|
||||
|
||||
```bash
|
||||
BACKUP_DIR="/Users/accusys/momentry_core_releases/backup_$(date +%Y%m%d_%H%M)"
|
||||
mkdir -p "$BACKUP_DIR"
|
||||
|
||||
# Full public schema dump
|
||||
pg_dump -U accusys -d momentry --schema=public \
|
||||
--no-owner --no-acl \
|
||||
> "$BACKUP_DIR/public_schema_full.sql"
|
||||
|
||||
# Data-only dump (smaller, faster restore)
|
||||
pg_dump -U accusys -d momentry --schema=public \
|
||||
--data-only --no-owner --no-acl \
|
||||
> "$BACKUP_DIR/public_schema_data.sql"
|
||||
|
||||
echo "Backup: $BACKUP_DIR"
|
||||
```
|
||||
|
||||
### 2.2 Binary
|
||||
|
||||
```bash
|
||||
cp /path/to/release/momentry "$BACKUP_DIR/momentry_$(date +%Y%m%d)"
|
||||
```
|
||||
|
||||
### 2.3 Release Info
|
||||
|
||||
```bash
|
||||
echo "Release: v1.0.0" > "$BACKUP_DIR/RELEASE_INFO.txt"
|
||||
echo "Date: $(date)" >> "$BACKUP_DIR/RELEASE_INFO.txt"
|
||||
echo "Binary: $(ls -la target/release/momentry)" >> "$BACKUP_DIR/RELEASE_INFO.txt"
|
||||
echo "Schema: public" >> "$BACKUP_DIR/RELEASE_INFO.txt"
|
||||
```
|
||||
|
||||
|
||||
## 3. Schema Migration
|
||||
|
||||
### 3.1 Apply Migration
|
||||
|
||||
```sql
|
||||
-- Add file_uuid column to identities (if deploying from pre-v2.0 package)
|
||||
ALTER TABLE public.identities ADD COLUMN IF NOT EXISTS file_uuid VARCHAR(64);
|
||||
|
||||
-- Rename chunks → chunk (v2.0 schema change)
|
||||
ALTER TABLE IF EXISTS public.chunks RENAME TO chunk;
|
||||
|
||||
-- Drop deprecated columns
|
||||
ALTER TABLE public.chunk DROP COLUMN IF EXISTS old_chunk_id;
|
||||
ALTER TABLE public.chunk DROP COLUMN IF EXISTS chunk_index;
|
||||
|
||||
-- Add new columns (v1.0.3+)
|
||||
ALTER TABLE public.face_detections ADD COLUMN IF NOT EXISTS timestamp_secs float8;
|
||||
```
|
||||
|
||||
### 3.2 Verify Schema
|
||||
|
||||
```sql
|
||||
SELECT column_name, data_type
|
||||
FROM information_schema.columns
|
||||
WHERE table_schema = 'public' AND table_name = 'chunk'
|
||||
ORDER BY ordinal_position;
|
||||
```
|
||||
|
||||
Expected: 24 columns, no `old_chunk_id`, no `chunk_index`.
|
||||
|
||||
|
||||
## 4. Deploy Package
|
||||
|
||||
### 4.1 Deploy via deploy.sh
|
||||
|
||||
```bash
|
||||
cd path/to/package/
|
||||
PG_BIN="/opt/homebrew/opt/postgresql@18/bin" \
|
||||
DB_NAME="momentry" DB_USER="accusys" \
|
||||
DATABASE_SCHEMA=public \
|
||||
bash deploy.sh
|
||||
```
|
||||
|
||||
### 4.2 Manual Verification (after deploy)
|
||||
|
||||
```sql
|
||||
SELECT 'chunk' as tbl, count(*) FROM public.chunk WHERE file_uuid = '{uuid}';
|
||||
SELECT 'identities (tmdb)', count(*) FROM public.identities WHERE source = 'tmdb';
|
||||
SELECT 'tkg_nodes', count(*) FROM public.tkg_nodes WHERE file_uuid = '{uuid}';
|
||||
SELECT 'tkg_edges', count(*) FROM public.tkg_edges WHERE file_uuid = '{uuid}';
|
||||
```
|
||||
|
||||
Expected: chunk > 0, identities > 0, tkg_nodes > 0, tkg_edges > 0.
|
||||
|
||||
### 4.3 Set Status
|
||||
|
||||
```sql
|
||||
UPDATE public.videos SET status = 'completed' WHERE file_uuid IN (
|
||||
'aeed71342a899fe4b4c57b7d41bcb692',
|
||||
'23b1c872379d4ec06479e5ed39eef4c5'
|
||||
);
|
||||
```
|
||||
|
||||
|
||||
## 5. Binary Swap & Restart
|
||||
|
||||
### 5.1 Stop Old Server
|
||||
|
||||
```bash
|
||||
# Graceful stop
|
||||
pkill -TERM momentry
|
||||
sleep 5
|
||||
|
||||
# Force if needed
|
||||
pkill -9 momentry 2>/dev/null
|
||||
```
|
||||
|
||||
### 5.2 Deploy New Binary
|
||||
|
||||
```bash
|
||||
cp target/release/momentry /path/to/production/binary
|
||||
chmod +x /path/to/production/binary
|
||||
```
|
||||
|
||||
### 5.3 Start New Server
|
||||
|
||||
```bash
|
||||
DATABASE_SCHEMA=public /path/to/production/binary server --port 3002
|
||||
# or with .env
|
||||
MOMENTRY_SERVER_PORT=3002 DATABASE_SCHEMA=public cargo run --release -- server
|
||||
```
|
||||
|
||||
### 5.4 Health Check
|
||||
|
||||
```bash
|
||||
curl http://localhost:3002/health
|
||||
# Expected: {"status":"ok","version":"1.0.0","build_git_hash":"..."}
|
||||
```
|
||||
|
||||
|
||||
## 6. Verification
|
||||
|
||||
### 6.1 API Tests
|
||||
|
||||
```bash
|
||||
API_KEY="muser_68600856036340bcafc01930eb4bd839_1774418104_97221b69"
|
||||
HOST="http://localhost:3002"
|
||||
|
||||
# Health
|
||||
curl "$HOST/health"
|
||||
curl "$HOST/health/detailed"
|
||||
|
||||
# Files
|
||||
curl -H "X-API-Key: $API_KEY" "$HOST/api/v1/files?page=1&page_size=5"
|
||||
curl -H "X-API-Key: $API_KEY" "$HOST/api/v1/files/scan"
|
||||
|
||||
# Search
|
||||
curl -X POST -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
|
||||
-d '{"query":"Audrey Hepburn","uuid":"aeed71342a899fe4b4c57b7d41bcb692","limit":3}' \
|
||||
"$HOST/api/v1/search/universal"
|
||||
|
||||
# Identities
|
||||
curl -H "X-API-Key: $API_KEY" "$HOST/api/v1/identities?page=1&page_size=5"
|
||||
|
||||
# Chunk detail (v1.0.3+)
|
||||
curl -H "X-API-Key: $API_KEY" "$HOST/api/v1/file/aeed71342a899fe4b4c57b7d41bcb692/chunk/0"
|
||||
|
||||
# Face trace
|
||||
curl -X POST -H "X-API-Key: $API_KEY" -H "Content-Type: application/json" \
|
||||
-d '{"sort_by":"face_count","limit":3}' \
|
||||
"$HOST/api/v1/file/aeed71342a899fe4b4c57b7d41bcb692/face_trace/sortby"
|
||||
|
||||
# Trace video
|
||||
curl -o /dev/null -w "%{http_code}" -H "X-API-Key: $API_KEY" \
|
||||
"$HOST/api/v1/file/aeed71342a899fe4b4c57b7d41bcb692/trace/1934/video?padding=1"
|
||||
# Expected: 200
|
||||
|
||||
# Full test suite
|
||||
bash api_test.sh
|
||||
# Expected: 39/39
|
||||
```
|
||||
|
||||
### 6.2 Portal Check
|
||||
|
||||
| Page | URL | Expect |
|
||||
|------|-----|--------|
|
||||
| FilesView | `http://localhost:1420/files` | Charade = ✅ 已就绪 |
|
||||
| SearchView | `http://localhost:1420/search` | File dropdown has Charade |
|
||||
| Trace View | File → Traces | Face list visible |
|
||||
| Video Playback | Search → Play | Video plays |
|
||||
|
||||
### 6.3 Demo
|
||||
|
||||
```bash
|
||||
DEMO_BASE="http://localhost:3002" \
|
||||
DEMO_FILE="aeed71342a899fe4b4c57b7d41bcb692" \
|
||||
python3 scripts/demo_runner.py API_V1.0.0/DEMO_SCRIPT_v1.0.0.json --auto --speed 0.03
|
||||
|
||||
# Expected: 21/21 steps passed
|
||||
```
|
||||
|
||||
|
||||
## 7. Rollback
|
||||
|
||||
### 7.1 Binary Rollback
|
||||
|
||||
```bash
|
||||
pkill momentry
|
||||
cp "$BACKUP_DIR/momentry_$(date +%Y%m%d)" /path/to/production/binary
|
||||
DATABASE_SCHEMA=public /path/to/production/binary server --port 3002
|
||||
```
|
||||
|
||||
### 7.2 Schema Rollback
|
||||
|
||||
```sql
|
||||
-- Rename back if needed
|
||||
ALTER TABLE public.chunk RENAME TO chunks;
|
||||
```
|
||||
|
||||
### 7.3 Data Rollback
|
||||
|
||||
```bash
|
||||
psql -U accusys -d momentry < "$BACKUP_DIR/public_schema_full.sql"
|
||||
```
|
||||
|
||||
### 7.4 Downtime Estimation
|
||||
|
||||
| Step | Est. Time |
|
||||
|------|:--------:|
|
||||
| Backup | 2 min |
|
||||
| Schema migration | 1 min |
|
||||
| Package deploy | 5-10 min |
|
||||
| Binary swap | 1 min |
|
||||
| Verification | 5 min |
|
||||
| **Total** | **~15-20 min** |
|
||||
|
||||
|
||||
## 8. Decision Log
|
||||
|
||||
| # | Decision | Owner | Decision |
|
||||
|---|----------|:--:|------|
|
||||
| 1 | Production binary source | M5 | M5 提供 release binary or M4 自編譯 |
|
||||
| 2 | Schema: rename chunks→chunk? | M5 | M5 決定 public schema 結構 |
|
||||
| 3 | Identity merge strategy | M5 | Keep prod 15 TMDB + merge with dev data? |
|
||||
| 4 | Downtime window | M5 | 維護模式 (403 all) or hard stop? |
|
||||
| 5 | Release scope | M5 | `aeed7134` only or both HD + YouTube? |
|
||||
| 6 | .env / config for public schema | M5 | Production binary reads `DATABASE_SCHEMA=public` |
|
||||
|
||||
---
|
||||
|
||||
## Appendix: Release Checklist
|
||||
|
||||
- [ ] Dev 3003 passed all tests (39/39 + demo 21/21)
|
||||
- [ ] Production old binary backed up
|
||||
- [ ] Production DB full backup
|
||||
- [ ] Schema migration SQL ready
|
||||
- [ ] Package deployed to public schema
|
||||
- [ ] Status set to completed
|
||||
- [ ] New binary deployed
|
||||
- [ ] Server restarted on 3002
|
||||
- [ ] Health check returns ok
|
||||
- [ ] 39/39 API tests pass on 3002
|
||||
- [ ] Portal shows files correctly
|
||||
- [ ] Demo runs 21/21 on 3002
|
||||
Reference in New Issue
Block a user