mirror of
https://github.com/hanzoai/replicate.git
synced 2026-10-30 18:23:20 +00:00
- All source files, configs, docs, CI renamed - Binary: replicate (not litestream) - Config: replicate.yml (litestream.yml as fallback) - Env: REPLICATE_* (LITESTREAM_* as fallback) - Socket: /var/run/replicate.sock - Image: ghcr.io/hanzoai/replicate - Module: github.com/hanzoai/replicate - Package name: replicate (Go), replicate-vfs (npm/pip/gem) - VFS: registered as "replicate", pragmas replicate_* - C exports: ReplicateVFSRegister, GoReplicate* - Windows service: Replicate - Systemd unit: replicate.service - Upstream attribution preserved (README, upgrade test scripts)
124 lines
4.3 KiB
Bash
Executable File
124 lines
4.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../.." && pwd)"
|
|
ENDPOINT="http://localhost:5555/s3"
|
|
STORAGE_API="http://localhost:5555"
|
|
ACCESS_KEY="supabase-s3-access-key"
|
|
SECRET_KEY="supabase-s3-secret-key-that-is-long-enough"
|
|
SERVICE_KEY="eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCJ9.eyJpc3MiOiAic3VwYWJhc2UiLCAicm9sZSI6ICJzZXJ2aWNlX3JvbGUifQ.lRaC0LUy-3mILAj_17hVWOBnaft3QPpK-pqAs8h2MRI"
|
|
BUCKET="replicate-test"
|
|
REGION="us-east-1"
|
|
TMPDIR_BASE=$(mktemp -d)
|
|
|
|
cleanup() {
|
|
echo ""
|
|
echo "=== Cleaning up ==="
|
|
rm -rf "$TMPDIR_BASE"
|
|
cd "$SCRIPT_DIR"
|
|
docker compose down -v --remove-orphans 2>/dev/null || true
|
|
}
|
|
trap cleanup EXIT
|
|
|
|
echo "================================================"
|
|
echo "Supabase S3 Integration Test for Replicate"
|
|
echo "================================================"
|
|
echo ""
|
|
|
|
# Step 1: Build replicate
|
|
echo "[1/6] Building replicate..."
|
|
cd "$PROJECT_ROOT"
|
|
go build -o "$TMPDIR_BASE/replicate" ./cmd/replicate
|
|
echo " OK: Binary built at $TMPDIR_BASE/replicate"
|
|
echo ""
|
|
|
|
# Step 2: Start Supabase stack
|
|
echo "[2/6] Starting Supabase storage stack..."
|
|
cd "$SCRIPT_DIR"
|
|
docker compose up -d --wait --wait-timeout 90
|
|
echo " OK: Supabase storage running at $ENDPOINT"
|
|
echo ""
|
|
|
|
# Step 3: Create bucket via Supabase REST API
|
|
echo "[3/6] Creating bucket '$BUCKET' via Supabase REST API..."
|
|
BUCKET_RESPONSE=$(curl -s -w "\n%{http_code}" -X POST "$STORAGE_API/bucket" \
|
|
-H "Authorization: Bearer $SERVICE_KEY" \
|
|
-H "Content-Type: application/json" \
|
|
-d "{\"name\": \"$BUCKET\", \"public\": true}")
|
|
BUCKET_HTTP_CODE=$(echo "$BUCKET_RESPONSE" | tail -1)
|
|
BUCKET_BODY=$(echo "$BUCKET_RESPONSE" | sed '$d')
|
|
if [ "$BUCKET_HTTP_CODE" = "200" ] || [ "$BUCKET_HTTP_CODE" = "201" ]; then
|
|
echo " OK: Bucket created (HTTP $BUCKET_HTTP_CODE)"
|
|
elif echo "$BUCKET_BODY" | grep -q "already exists"; then
|
|
echo " OK: Bucket already exists"
|
|
else
|
|
echo " FAIL: Bucket creation failed (HTTP $BUCKET_HTTP_CODE): $BUCKET_BODY"
|
|
exit 1
|
|
fi
|
|
echo ""
|
|
|
|
# Step 4: Create and populate test database
|
|
echo "[4/6] Creating test SQLite database..."
|
|
DB_PATH="$TMPDIR_BASE/test.db"
|
|
sqlite3 "$DB_PATH" <<'SQL'
|
|
PRAGMA journal_mode=WAL;
|
|
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT, created_at TEXT);
|
|
INSERT INTO users VALUES (1, 'Alice', '[email protected]', datetime('now'));
|
|
INSERT INTO users VALUES (2, 'Bob', '[email protected]', datetime('now'));
|
|
INSERT INTO users VALUES (3, 'Charlie', '[email protected]', datetime('now'));
|
|
SQL
|
|
ROW_COUNT=$(sqlite3 "$DB_PATH" "SELECT COUNT(*) FROM users;")
|
|
echo " OK: Database created with $ROW_COUNT rows"
|
|
echo ""
|
|
|
|
# Step 5: Replicate to Supabase S3
|
|
echo "[5/6] Replicating database to Supabase S3..."
|
|
REPLICA_URL="s3://${BUCKET}/testdb?endpoint=${ENDPOINT}®ion=${REGION}"
|
|
echo " URL: $REPLICA_URL"
|
|
echo " (Auto-detection should apply force-path-style=true and sign-payload=true)"
|
|
|
|
AWS_ACCESS_KEY_ID="$ACCESS_KEY" \
|
|
AWS_SECRET_ACCESS_KEY="$SECRET_KEY" \
|
|
"$TMPDIR_BASE/replicate" replicate "$DB_PATH" "$REPLICA_URL" &
|
|
REPLICATE_PID=$!
|
|
|
|
# Wait for initial sync, then write more data
|
|
sleep 5
|
|
sqlite3 "$DB_PATH" <<'SQL'
|
|
INSERT INTO users VALUES (4, 'Diana', '[email protected]', datetime('now'));
|
|
INSERT INTO users VALUES (5, 'Eve', '[email protected]', datetime('now'));
|
|
SQL
|
|
echo " OK: Wrote 2 additional rows during replication"
|
|
|
|
# Give time for WAL sync
|
|
sleep 10
|
|
kill "$REPLICATE_PID" 2>/dev/null || true
|
|
wait "$REPLICATE_PID" 2>/dev/null || true
|
|
echo " OK: Replication completed"
|
|
echo ""
|
|
|
|
# Step 6: Restore and verify
|
|
echo "[6/6] Restoring database from Supabase S3..."
|
|
RESTORE_PATH="$TMPDIR_BASE/restored.db"
|
|
AWS_ACCESS_KEY_ID="$ACCESS_KEY" \
|
|
AWS_SECRET_ACCESS_KEY="$SECRET_KEY" \
|
|
"$TMPDIR_BASE/replicate" restore -o "$RESTORE_PATH" "$REPLICA_URL"
|
|
|
|
RESTORED_COUNT=$(sqlite3 "$RESTORE_PATH" "SELECT COUNT(*) FROM users;")
|
|
echo " Restored row count: $RESTORED_COUNT"
|
|
|
|
if [ "$RESTORED_COUNT" -ge 3 ]; then
|
|
echo ""
|
|
echo "================================================"
|
|
echo "SUCCESS: Supabase S3 integration test passed!"
|
|
echo " - Auto-detection: Working (no manual force-path-style/sign-payload needed)"
|
|
echo " - Replication: Working"
|
|
echo " - Restore: Working ($RESTORED_COUNT rows recovered)"
|
|
echo "================================================"
|
|
else
|
|
echo ""
|
|
echo "FAIL: Expected at least 3 rows, got $RESTORED_COUNT"
|
|
exit 1
|
|
fi
|