abhiraj12 commited on
Commit
2d7bceb
·
1 Parent(s): e222621

Optimize for HF Spaces: Robust start.sh, Celery worker, and permissions

Browse files
Files changed (2) hide show
  1. Dockerfile +2 -0
  2. start.sh +23 -43
Dockerfile CHANGED
@@ -26,6 +26,8 @@ COPY --chown=user . .
26
  # Create necessary directories for the backend
27
  RUN mkdir -p backend/runs backend/tmp
28
 
 
 
29
  ENV PYTHONPATH=$HOME/app/backend:$PYTHONPATH
30
 
31
  # Tell your start.sh script to boot Streamlit on 7860 (the only port HF exposes)
 
26
  # Create necessary directories for the backend
27
  RUN mkdir -p backend/runs backend/tmp
28
 
29
+ RUN chmod +x start.sh
30
+
31
  ENV PYTHONPATH=$HOME/app/backend:$PYTHONPATH
32
 
33
  # Tell your start.sh script to boot Streamlit on 7860 (the only port HF exposes)
start.sh CHANGED
@@ -1,59 +1,39 @@
1
  #!/bin/bash
2
- set -e
 
 
3
 
4
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
5
  cd "$SCRIPT_DIR"
6
 
7
- cleanup() {
8
- echo "Shutting down services..."
9
- [ -n "$BACKEND_PID" ] && kill "$BACKEND_PID" 2>/dev/null || true
10
- [ -n "$FRONTEND_PID" ] && kill "$FRONTEND_PID" 2>/dev/null || true
11
- [ -n "$REDIS_PID" ] && kill "$REDIS_PID" 2>/dev/null || true
12
- exit 0
13
- }
14
- trap cleanup INT TERM
15
-
16
  export PYTHONPATH="$SCRIPT_DIR/backend:$PYTHONPATH"
 
17
 
18
- # Start Redis locally if available
19
- if command -v redis-server >/dev/null 2>&1; then
20
- echo "Starting local Redis..."
21
- redis-server --daemonize yes
22
- sleep 1
23
- if ! redis-cli ping >/dev/null 2>&1; then
24
- echo "Redis failed to start. Continuing without local Redis."
25
- else
26
- echo "Redis is running."
27
- fi
28
- else
29
- echo "redis-server not installed; skipping local Redis startup."
30
- fi
31
-
32
- # Start backend on internal port
33
  cd "$SCRIPT_DIR/backend"
34
  python -m uvicorn main:app --host 0.0.0.0 --port 8000 --timeout-keep-alive 600 &
35
  BACKEND_PID=$!
36
 
37
- echo "Waiting for backend to start..."
38
- for i in {1..20}; do
39
- if curl -sf http://127.0.0.1:8000/health >/dev/null 2>&1; then
40
- echo "Backend ready."
41
- break
42
- fi
43
- sleep 1
44
- done
45
 
46
- # Start frontend on Railway's assigned port
 
47
  cd "$SCRIPT_DIR/frontend"
48
- PORT=${PORT:-8501} # Use Railway's PORT env var, default to 8501
49
- python -m streamlit run app.py --server.port $PORT --server.headless true --server.address 0.0.0.0 &
50
  FRONTEND_PID=$!
51
 
52
- echo "Frontend starting on port $PORT..."
53
-
54
- echo "AutoML Studio services are now running."
55
- echo "Backend: http://127.0.0.1:8000 (internal)"
56
- echo "Frontend: http://0.0.0.0:$PORT (external)"
57
 
58
- tail --pid="$FRONTEND_PID" -f /dev/null
59
- wait -n "$BACKEND_PID" "$FRONTEND_PID"
 
1
  #!/bin/bash
2
+
3
+ # 🛡️ ROBUST START SCRIPT FOR HUGGING FACE SPACES
4
+ # This script launches Redis, FastAPI, Celery, and Streamlit in one container.
5
 
6
  SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
  cd "$SCRIPT_DIR"
8
 
 
 
 
 
 
 
 
 
 
9
  export PYTHONPATH="$SCRIPT_DIR/backend:$PYTHONPATH"
10
+ export HOME="/home/user"
11
 
12
+ # 1. Start Redis (Internal Broker)
13
+ # We run it in the background using & and point it to /tmp for write access.
14
+ echo "Starting Redis..."
15
+ redis-server --port 6379 --dir /tmp --dbfilename dump.rdb --daemonize no &
16
+ REDIS_PID=$!
17
+
18
+ # 2. Start FastAPI Backend (Internal API)
19
+ echo "Starting FastAPI Backend..."
 
 
 
 
 
 
 
20
  cd "$SCRIPT_DIR/backend"
21
  python -m uvicorn main:app --host 0.0.0.0 --port 8000 --timeout-keep-alive 600 &
22
  BACKEND_PID=$!
23
 
24
+ # 3. Start Celery Worker (Task Processor)
25
+ echo "Starting Celery Worker..."
26
+ # We run this from the backend directory where core.worker is accessible
27
+ python -m celery -A core.worker.celery_app worker --loglevel=info --concurrency=1 &
28
+ WORKER_PID=$!
 
 
 
29
 
30
+ # 4. Start Streamlit Frontend (Public UI)
31
+ echo "Starting Streamlit Frontend on port ${PORT:-7860}..."
32
  cd "$SCRIPT_DIR/frontend"
33
+ python -m streamlit run app.py --server.port "${PORT:-7860}" --server.headless true --server.address 0.0.0.0 &
 
34
  FRONTEND_PID=$!
35
 
36
+ echo "🚀 All services launched!"
 
 
 
 
37
 
38
+ # Keep the script alive. If the Frontend or Backend fails, the container should stop.
39
+ wait -n $FRONTEND_PID $BACKEND_PID