cliproxyapi / supabase-sync.sh
DanielleNguyen's picture
Update supabase-sync.sh
0ab5700 verified
#!/bin/bash
# Supabase Storage sync script for auth files
# Bucket: clipro, Path: auths/
BUCKET="clipro"
AUTH_DIR="/app/auths"
SUPABASE_API="${SUPABASE_URL}/storage/v1"
# Upload a single file to Supabase Storage
upload_file() {
local filepath="$1"
local filename=$(basename "$filepath")
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
-X POST "${SUPABASE_API}/object/${BUCKET}/auths/${filename}" \
-H "Authorization: Bearer ${SUPABASE_SERVICE_KEY}" \
-H "Content-Type: application/json" \
-H "x-upsert: true" \
--data-binary @"${filepath}")
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "201" ]; then
echo "[SYNC] Uploaded ${filename} to Supabase (${HTTP_CODE})"
else
echo "[SYNC] Failed to upload ${filename} (HTTP ${HTTP_CODE})"
fi
}
# Upload all files in auth dir
upload_all() {
echo "[SYNC] Uploading all auth files to Supabase..."
for f in "${AUTH_DIR}"/*.json; do
[ -f "$f" ] && upload_file "$f"
done
}
# Download all auth files from Supabase
download() {
echo "[SYNC] Listing files in Supabase bucket..."
local offset=0
local limit=1000
local total_downloaded=0
local batch_count=0
while true; do
batch_count=$((batch_count + 1))
echo "[SYNC] Fetching batch ${batch_count} (offset: ${offset}, limit: ${limit})..."
FILE_LIST=$(curl -s \
-H "Authorization: Bearer ${SUPABASE_SERVICE_KEY}" \
-H "Content-Type: application/json" \
"${SUPABASE_API}/object/list/${BUCKET}" \
-d "{\"prefix\":\"auths/\",\"limit\":${limit},\"offset\":${offset}}")
if echo "$FILE_LIST" | jq -e '.[0].name' > /dev/null 2>&1; then
FILE_COUNT=$(echo "$FILE_LIST" | jq length)
echo "[SYNC] Found ${FILE_COUNT} files in this batch"
# Download each file in the batch
local downloaded_in_batch=0
while IFS= read -r filename; do
if [ -n "$filename" ] && [ "$filename" != "null" ] && [ "$filename" != ".emptyFolderPlaceholder" ]; then
echo "[SYNC] Downloading ${filename}..."
if curl -s \
-H "Authorization: Bearer ${SUPABASE_SERVICE_KEY}" \
"${SUPABASE_API}/object/${BUCKET}/auths/${filename}" \
-o "${AUTH_DIR}/${filename}"; then
echo "[SYNC] Saved ${AUTH_DIR}/${filename}"
downloaded_in_batch=$((downloaded_in_batch + 1))
else
echo "[SYNC] Failed to download ${filename}"
fi
fi
done < <(echo "$FILE_LIST" | jq -r '.[].name')
total_downloaded=$((total_downloaded + downloaded_in_batch))
echo "[SYNC] Batch ${batch_count} complete: ${downloaded_in_batch} files downloaded"
# If we got fewer files than the limit, we've reached the end
if [ "$FILE_COUNT" -lt "$limit" ]; then
echo "[SYNC] All batches complete. Total files downloaded: ${total_downloaded}"
break
fi
offset=$((offset + limit))
else
if [ "$offset" -eq 0 ]; then
echo "[SYNC] No files found in Supabase or API error"
echo "[SYNC] Response: ${FILE_LIST}"
else
echo "[SYNC] All batches complete. Total files downloaded: ${total_downloaded}"
fi
break
fi
done
}
# Watch auth directory for changes and sync to Supabase
watch_dir() {
echo "[SYNC] Starting file watcher on ${AUTH_DIR}..."
inotifywait -m -r -e close_write,create,modify,delete "${AUTH_DIR}" --format '%e %f' | while read event filename; do
if [[ "$filename" == *.json ]]; then
echo "[SYNC] Detected event: ${event} on ${filename}"
sleep 2
if [[ "$event" == "DELETE" ]]; then
# File was deleted, remove from Supabase
echo "[SYNC] Deleting ${filename} from Supabase..."
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" \
-X DELETE "${SUPABASE_API}/object/${BUCKET}/auths/${filename}" \
-H "Authorization: Bearer ${SUPABASE_SERVICE_KEY}")
if [ "$HTTP_CODE" = "200" ] || [ "$HTTP_CODE" = "204" ]; then
echo "[SYNC] Deleted ${filename} from Supabase (${HTTP_CODE})"
else
echo "[SYNC] Failed to delete ${filename} from Supabase (HTTP ${HTTP_CODE})"
fi
else
# File was created or modified, upload to Supabase
if [ -f "${AUTH_DIR}/${filename}" ]; then
upload_file "${AUTH_DIR}/${filename}"
fi
fi
fi
done
}
case "$1" in
download) download ;;
upload) upload_file "$2" ;;
upload-all) upload_all ;;
watch) watch_dir ;;
*) echo "Usage: $0 {download|upload <file>|upload-all|watch}"; exit 1 ;;
esac