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- Dockerfile +6 -4
- 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 /
|
| 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
|
| 47 |
-
#
|
| 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 |
-
#
|
| 5 |
-
#
|
| 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 |
-
|
| 12 |
-
|
| 13 |
|
| 14 |
mkdir -p /app/data
|
| 15 |
|
| 16 |
-
# ── Restore from
|
| 17 |
-
if [ -
|
| 18 |
-
echo "[PERSIST]
|
| 19 |
-
|
| 20 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
else
|
| 22 |
-
echo "[PERSIST]
|
| 23 |
fi
|
| 24 |
|
| 25 |
-
# ──
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
backup_loop() {
|
|
|
|
|
|
|
| 27 |
while true; do
|
| 28 |
-
sleep
|
| 29 |
-
|
| 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
|
| 41 |
cleanup() {
|
| 42 |
-
echo "[PERSIST] Shutdown signal
|
| 43 |
-
|
| 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 set — persistence 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 |
}
|