sashank1989 commited on
Commit
e87926e
·
1 Parent(s): 76835ba

fix: persist DB via HF Dataset repo — bucket FUSE mount doesn't support SQLite writes

Browse files
Files changed (2) hide show
  1. Dockerfile +6 -4
  2. entrypoint.sh +44 -28
Dockerfile CHANGED
@@ -27,10 +27,11 @@ RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o server ./
27
  # ============================================================================
28
  FROM alpine:3.19
29
 
30
- RUN apk --no-cache add ca-certificates tzdata
 
31
 
32
  WORKDIR /app
33
- RUN mkdir -p /data /app/data /app/static
34
 
35
  # Copy Go binary
36
  COPY --from=backend-builder /build/backend/server .
@@ -43,8 +44,8 @@ RUN chmod +x entrypoint.sh
43
  COPY --from=frontend-builder /build/frontend/build ./static
44
 
45
  # Environment
46
- # DB runs on local disk (/app/data/) for proper SQLite locking/WAL support.
47
- # /data is the HF bucket mount used only for backup/restore by entrypoint.sh.
48
  ENV PORT=7860
49
  ENV ENVIRONMENT=production
50
  ENV DB_PATH=/app/data/restaurant.db
@@ -52,6 +53,7 @@ ENV STATIC_DIR=/app/static
52
  ENV UPLOAD_DIR=/app/data/uploads
53
  ENV CORS_ORIGINS=*
54
  ENV JWT_SECRET=hss-pos-hf-deploy-2026
 
55
 
56
  EXPOSE 7860
57
 
 
27
  # ============================================================================
28
  FROM alpine:3.19
29
 
30
+ RUN apk --no-cache add ca-certificates tzdata python3 py3-pip \
31
+ && pip3 install --no-cache-dir --break-system-packages huggingface-hub
32
 
33
  WORKDIR /app
34
+ RUN mkdir -p /app/data /app/static
35
 
36
  # Copy Go binary
37
  COPY --from=backend-builder /build/backend/server .
 
44
  COPY --from=frontend-builder /build/frontend/build ./static
45
 
46
  # Environment
47
+ # DB runs on local disk for proper SQLite locking/WAL support.
48
+ # HF_TOKEN is set as a Space secret — used by entrypoint.sh for DB backup/restore.
49
  ENV PORT=7860
50
  ENV ENVIRONMENT=production
51
  ENV DB_PATH=/app/data/restaurant.db
 
53
  ENV UPLOAD_DIR=/app/data/uploads
54
  ENV CORS_ORIGINS=*
55
  ENV JWT_SECRET=hss-pos-hf-deploy-2026
56
+ ENV HF_BACKUP_REPO=FordAI/hss-pos-backup
57
 
58
  EXPOSE 7860
59
 
entrypoint.sh CHANGED
@@ -1,50 +1,66 @@
1
  #!/bin/sh
2
  # entrypoint.sh — Persist SQLite across HF Spaces rebuilds
3
  #
4
- # Problem: HF Storage Buckets (mounted at /data) are Xet-backed FUSE mounts
5
- # that don't support SQLite's file locking, mmap, or WAL mode.
6
- #
7
- # Solution: Run SQLite on local disk (/app/data/), and periodically copy the
8
- # DB file to /data/ as a backup. On startup, restore from /data/ if present.
9
 
10
  LOCAL_DB="/app/data/restaurant.db"
11
- PERSIST_DIR="/data"
12
- PERSIST_DB="${PERSIST_DIR}/restaurant.db"
13
 
14
  mkdir -p /app/data
15
 
16
- # ── Restore from persistent storage on startup ──
17
- if [ -f "$PERSIST_DB" ]; then
18
- echo "[PERSIST] Restoring database from persistent storage..."
19
- cp "$PERSIST_DB" "$LOCAL_DB"
20
- echo "[PERSIST] Database restored ($(du -h "$LOCAL_DB" | cut -f1))"
 
 
 
 
 
 
 
 
 
21
  else
22
- echo "[PERSIST] No backup foundstarting fresh"
23
  fi
24
 
25
- # ── Periodic backup: local bucket (every 2 min) ──
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  backup_loop() {
 
 
27
  while true; do
28
- sleep 120
29
- if [ -f "$LOCAL_DB" ]; then
30
- cp "$LOCAL_DB" "${PERSIST_DB}.tmp" 2>/dev/null && \
31
- mv "${PERSIST_DB}.tmp" "$PERSIST_DB" 2>/dev/null && \
32
- echo "[PERSIST] Backup complete ($(du -h "$PERSIST_DB" | cut -f1))" || \
33
- echo "[PERSIST] Backup failed"
34
- fi
35
  done
36
  }
37
  backup_loop &
38
  BACKUP_PID=$!
39
 
40
- # ── Graceful shutdown: final backup before exit ──
41
  cleanup() {
42
- echo "[PERSIST] Shutdown signal received, running final backup..."
43
- if [ -f "$LOCAL_DB" ]; then
44
- cp "$LOCAL_DB" "$PERSIST_DB" 2>/dev/null && \
45
- echo "[PERSIST] Final backup complete" || \
46
- echo "[PERSIST] Final backup failed"
47
- fi
48
  kill "$BACKUP_PID" 2>/dev/null || true
49
  exit 0
50
  }
 
1
  #!/bin/sh
2
  # entrypoint.sh — Persist SQLite across HF Spaces rebuilds
3
  #
4
+ # Uses huggingface-cli to upload/download the DB to a private Dataset repo.
5
+ # HF_TOKEN must be set as a Space secret.
6
+ # HF_BACKUP_REPO is the dataset repo (e.g. FordAI/hss-pos-backup).
 
 
7
 
8
  LOCAL_DB="/app/data/restaurant.db"
9
+ BACKUP_REPO="${HF_BACKUP_REPO:-FordAI/hss-pos-backup}"
10
+ BACKUP_FILE="restaurant.db"
11
 
12
  mkdir -p /app/data
13
 
14
+ # ── Restore DB from HF Dataset repo on startup ──
15
+ if [ -n "$HF_TOKEN" ]; then
16
+ echo "[PERSIST] Downloading database from $BACKUP_REPO..."
17
+ huggingface-cli download "$BACKUP_REPO" "$BACKUP_FILE" \
18
+ --repo-type dataset \
19
+ --local-dir /app/data \
20
+ --token "$HF_TOKEN" \
21
+ --quiet 2>/dev/null
22
+ if [ -f "$LOCAL_DB" ] && [ "$(stat -c%s "$LOCAL_DB" 2>/dev/null || echo 0)" -gt 8192 ]; then
23
+ echo "[PERSIST] Database restored ($(du -h "$LOCAL_DB" | cut -f1))"
24
+ else
25
+ echo "[PERSIST] No valid backup found — starting fresh"
26
+ rm -f "$LOCAL_DB"
27
+ fi
28
  else
29
+ echo "[PERSIST] HF_TOKEN not setpersistence disabled"
30
  fi
31
 
32
+ # ── Upload DB to HF Dataset repo ──
33
+ do_backup() {
34
+ if [ -z "$HF_TOKEN" ]; then return; fi
35
+ if [ ! -f "$LOCAL_DB" ]; then return; fi
36
+ # Only backup if DB has real data (>8KB)
37
+ DB_SIZE=$(stat -c%s "$LOCAL_DB" 2>/dev/null || echo 0)
38
+ if [ "$DB_SIZE" -le 8192 ]; then return; fi
39
+
40
+ huggingface-cli upload "$BACKUP_REPO" "$LOCAL_DB" "$BACKUP_FILE" \
41
+ --repo-type dataset \
42
+ --token "$HF_TOKEN" \
43
+ --quiet 2>/dev/null \
44
+ && echo "[PERSIST] Backup complete ($(du -h "$LOCAL_DB" | cut -f1))" \
45
+ || echo "[PERSIST] Backup failed"
46
+ }
47
+
48
+ # ── Periodic backup every 5 minutes ──
49
  backup_loop() {
50
+ sleep 30 # first backup after 30s (let DB seed finish)
51
+ do_backup
52
  while true; do
53
+ sleep 300
54
+ do_backup
 
 
 
 
 
55
  done
56
  }
57
  backup_loop &
58
  BACKUP_PID=$!
59
 
60
+ # ── Graceful shutdown: final backup ──
61
  cleanup() {
62
+ echo "[PERSIST] Shutdown signal, running final backup..."
63
+ do_backup
 
 
 
 
64
  kill "$BACKUP_PID" 2>/dev/null || true
65
  exit 0
66
  }