AZILS commited on
Commit
94f12f4
Β·
verified Β·
1 Parent(s): 2c46c74

Update Dockerfile

Browse files
Files changed (1) hide show
  1. Dockerfile +84 -42
Dockerfile CHANGED
@@ -1,90 +1,132 @@
1
  # syntax=docker/dockerfile:1
2
  FROM lbjlaq/antigravity-manager:latest
3
 
4
- # Only extra dep: curl (for Supabase REST API calls)
5
  RUN apt-get update && apt-get install -y --no-install-recommends curl \
6
  && rm -rf /var/lib/apt/lists/*
7
 
8
- # Default env vars (override via HF Space Secrets)
9
  ENV ABV_DATA_DIR=/root/.antigravity_tools \
10
  SUPABASE_BUCKET=antigravity \
11
  PORT=8045
12
 
13
- # ── Write entrypoint inline (no extra files in repo) ─────────────────────────
14
  COPY <<'EOF' /app/entrypoint.sh
15
  #!/bin/bash
16
- set -e
17
 
18
  DATA_DIR="${ABV_DATA_DIR:-/root/.antigravity_tools}"
19
- DATA_DIRNAME=$(basename "$DATA_DIR")
 
20
 
21
- # ── Pull all data from Supabase Storage on startup ───────────────────────────
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  supabase_pull() {
23
  if [ -z "$SUPABASE_URL" ] || [ -z "$SUPABASE_KEY" ]; then
24
- echo "[Sync] ⚠️ No Supabase config β€” running in local-only mode"
25
  return 1
26
  fi
27
 
28
- echo "[Sync] πŸ“₯ Pulling backup from Supabase..."
29
- HTTP=$(curl -sf -o /tmp/backup.tar.gz -w "%{http_code}" \
30
- "${SUPABASE_URL}/storage/v1/object/${SUPABASE_BUCKET}/backup.tar.gz" \
 
 
31
  -H "Authorization: Bearer ${SUPABASE_KEY}" \
32
  -H "apikey: ${SUPABASE_KEY}")
33
 
34
- if [ "$HTTP" = "200" ]; then
35
- echo "[Sync] βœ… Backup found β€” extracting to ${DATA_DIR}..."
36
- mkdir -p "$(dirname "$DATA_DIR")"
37
- tar xzf /tmp/backup.tar.gz -C "$HOME"
38
- echo "[Sync] βœ… Pull complete!"
39
- else
40
- echo "[Sync] πŸ†• No backup found (HTTP $HTTP) β€” this is a fresh start!"
41
  fi
42
- }
43
 
44
- # ── Push entire data dir to Supabase Storage ─────────────────────────────────
45
- supabase_push() {
46
- if [ -z "$SUPABASE_URL" ] || [ -z "$SUPABASE_KEY" ]; then return; fi
47
- if [ ! -d "$DATA_DIR" ]; then return; fi
48
 
49
- echo "[Sync] πŸ“€ Pushing backup to Supabase..."
50
- tar czf /tmp/backup.tar.gz -C "$HOME" "$DATA_DIRNAME"
51
- curl -sf -X PUT \
52
- "${SUPABASE_URL}/storage/v1/object/${SUPABASE_BUCKET}/backup.tar.gz" \
53
- -H "Authorization: Bearer ${SUPABASE_KEY}" \
54
- -H "apikey: ${SUPABASE_KEY}" \
55
- -H "Content-Type: application/octet-stream" \
56
- -H "x-upsert: true" \
57
- --data-binary @/tmp/backup.tar.gz && echo "[Sync] βœ… Push complete!" \
58
- || echo "[Sync] ❌ Push failed!"
 
 
 
 
 
 
 
 
 
59
  }
60
 
61
- # ── Step 1: Pull existing data (no-op on first run) ──────────────────────────
62
  supabase_pull
63
 
64
- # ── Step 2: Start the app in background ──────────────────────────────────────
65
- echo "[App] πŸš€ Starting Antigravity Tools (headless)..."
66
  /app/antigravity-tools --headless &
67
  APP_PID=$!
68
 
69
- # ── Step 3: Watch loop β€” push to Supabase on any .json change ────────────────
70
  LAST_HASH=""
71
  while kill -0 "$APP_PID" 2>/dev/null; do
72
  sleep 30
73
 
74
  if [ -d "$DATA_DIR" ]; then
75
- # Hash all JSON files to detect any change
76
- CURR=$(find "$DATA_DIR" -name "*.json" -type f \
77
- -exec md5sum {} + 2>/dev/null | md5sum | awk '{print $1}')
78
 
79
- if [ "$CURR" != "$LAST_HASH" ]; then
80
  supabase_push
81
  LAST_HASH="$CURR"
82
  fi
83
  fi
84
  done
85
 
86
- # ── Step 4: Final sync before container exits ─────────────────────────────────
87
- echo "[Sync] πŸ›‘ App stopped β€” running final sync..."
88
  supabase_push
89
 
90
  wait "$APP_PID"
 
1
  # syntax=docker/dockerfile:1
2
  FROM lbjlaq/antigravity-manager:latest
3
 
4
+ # Only extra dep: curl (for Supabase REST API)
5
  RUN apt-get update && apt-get install -y --no-install-recommends curl \
6
  && rm -rf /var/lib/apt/lists/*
7
 
 
8
  ENV ABV_DATA_DIR=/root/.antigravity_tools \
9
  SUPABASE_BUCKET=antigravity \
10
  PORT=8045
11
 
 
12
  COPY <<'EOF' /app/entrypoint.sh
13
  #!/bin/bash
 
14
 
15
  DATA_DIR="${ABV_DATA_DIR:-/root/.antigravity_tools}"
16
+ REMOTE_PREFIX="antigravity_tools"
17
+ MANIFEST_PATH="${REMOTE_PREFIX}/_manifest.txt"
18
 
19
+ # ── Upload every JSON file individually + write manifest ──────────────────────
20
+ supabase_push() {
21
+ if [ -z "$SUPABASE_URL" ] || [ -z "$SUPABASE_KEY" ]; then return; fi
22
+ if [ ! -d "$DATA_DIR" ]; then return; fi
23
+
24
+ echo "[Sync] πŸ“€ Pushing files to Supabase..."
25
+ > /tmp/manifest.txt
26
+
27
+ find "$DATA_DIR" -type f -name "*.json" | sort | while IFS= read -r file; do
28
+ rel="${file#$DATA_DIR/}"
29
+ # skip temp / corrupt files
30
+ case "$rel" in *.tmp.*|*.corrupt-*) continue ;; esac
31
+
32
+ HTTP=$(curl -s -o /dev/null -w "%{http_code}" -X PUT \
33
+ "${SUPABASE_URL}/storage/v1/object/${SUPABASE_BUCKET}/${REMOTE_PREFIX}/${rel}" \
34
+ -H "Authorization: Bearer ${SUPABASE_KEY}" \
35
+ -H "apikey: ${SUPABASE_KEY}" \
36
+ -H "Content-Type: application/json" \
37
+ -H "x-upsert: true" \
38
+ --data-binary "@${file}")
39
+
40
+ if [ "$HTTP" = "200" ] || [ "$HTTP" = "201" ]; then
41
+ echo " ↑ $rel"
42
+ echo "$rel" >> /tmp/manifest.txt
43
+ else
44
+ echo " ⚠️ $rel (HTTP $HTTP)"
45
+ fi
46
+ done
47
+
48
+ # Upload manifest so pull knows what files exist
49
+ curl -s -o /dev/null -X PUT \
50
+ "${SUPABASE_URL}/storage/v1/object/${SUPABASE_BUCKET}/${MANIFEST_PATH}" \
51
+ -H "Authorization: Bearer ${SUPABASE_KEY}" \
52
+ -H "apikey: ${SUPABASE_KEY}" \
53
+ -H "Content-Type: text/plain" \
54
+ -H "x-upsert: true" \
55
+ --data-binary @/tmp/manifest.txt
56
+
57
+ echo "[Sync] βœ… Push done!"
58
+ }
59
+
60
+ # ── Download every file listed in manifest ────────────────────────────────────
61
  supabase_pull() {
62
  if [ -z "$SUPABASE_URL" ] || [ -z "$SUPABASE_KEY" ]; then
63
+ echo "[Sync] ⚠️ No Supabase config β€” running local-only"
64
  return 1
65
  fi
66
 
67
+ echo "[Sync] πŸ“₯ Checking Supabase for existing data..."
68
+
69
+ # Try to fetch manifest (no -f so a 404 does NOT crash the script)
70
+ HTTP=$(curl -s -o /tmp/manifest.txt -w "%{http_code}" \
71
+ "${SUPABASE_URL}/storage/v1/object/${SUPABASE_BUCKET}/${MANIFEST_PATH}" \
72
  -H "Authorization: Bearer ${SUPABASE_KEY}" \
73
  -H "apikey: ${SUPABASE_KEY}")
74
 
75
+ if [ "$HTTP" != "200" ]; then
76
+ echo "[Sync] πŸ†• No data found (HTTP $HTTP) β€” fresh start!"
77
+ return 1
 
 
 
 
78
  fi
 
79
 
80
+ echo "[Sync] βœ… Manifest found β€” downloading files..."
81
+ mkdir -p "$DATA_DIR"
 
 
82
 
83
+ while IFS= read -r rel; do
84
+ [ -z "$rel" ] && continue
85
+ local_path="${DATA_DIR}/${rel}"
86
+ mkdir -p "$(dirname "$local_path")"
87
+
88
+ HTTP=$(curl -s -o "$local_path" -w "%{http_code}" \
89
+ "${SUPABASE_URL}/storage/v1/object/${SUPABASE_BUCKET}/${REMOTE_PREFIX}/${rel}" \
90
+ -H "Authorization: Bearer ${SUPABASE_KEY}" \
91
+ -H "apikey: ${SUPABASE_KEY}")
92
+
93
+ if [ "$HTTP" = "200" ]; then
94
+ echo " ↓ $rel"
95
+ else
96
+ echo " ⚠️ $rel (HTTP $HTTP)"
97
+ rm -f "$local_path" # don't keep a broken file
98
+ fi
99
+ done < /tmp/manifest.txt
100
+
101
+ echo "[Sync] βœ… Pull done!"
102
  }
103
 
104
+ # ── 1. Pull on startup ────────────────────────────────────────────────────────
105
  supabase_pull
106
 
107
+ # ── 2. Start the app ──────────────────────────────────────────────────────────
108
+ echo "[App] πŸš€ Starting Antigravity Tools..."
109
  /app/antigravity-tools --headless &
110
  APP_PID=$!
111
 
112
+ # ── 3. Watch: push whenever a JSON file changes (check every 30s) ─────────────
113
  LAST_HASH=""
114
  while kill -0 "$APP_PID" 2>/dev/null; do
115
  sleep 30
116
 
117
  if [ -d "$DATA_DIR" ]; then
118
+ CURR=$(find "$DATA_DIR" -type f -name "*.json" ! -name "*.tmp.*" \
119
+ | sort | xargs md5sum 2>/dev/null | md5sum | awk '{print $1}')
 
120
 
121
+ if [ -n "$CURR" ] && [ "$CURR" != "$LAST_HASH" ]; then
122
  supabase_push
123
  LAST_HASH="$CURR"
124
  fi
125
  fi
126
  done
127
 
128
+ # ── 4. Final sync before exit ─────────────────────────────────────────────────
129
+ echo "[Sync] πŸ›‘ App exited β€” final sync..."
130
  supabase_push
131
 
132
  wait "$APP_PID"