File size: 7,102 Bytes
ac86214
3863641
b916cdf
4dfa41d
d83ec2c
4dfa41d
ac86214
b916cdf
 
ac86214
b916cdf
 
ac86214
ae3da12
 
 
b916cdf
 
ac86214
 
 
 
 
 
 
 
 
 
 
 
 
b916cdf
f2020b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
096295a
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
# Use the official Python 3.9 image
FROM tiangolo/uvicorn-gunicorn-fastapi:python3.9


RUN apt-get update && apt-get install ffmpeg libsm6 libxext6 curl -y

# Set the working directory to /code
WORKDIR /code

# Copy the current directory contents into the container at /code
COPY ./requirements.txt /code/requirements.txt

# Install requirements.txt 

RUN pip install pip==24.0

RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# Set up a new user named "user" with user ID 1000
RUN useradd -m -u 1000 user
# Switch to the "user" user
USER user
# Set home to the user's home directory
ENV HOME=/home/user \
	PATH=/home/user/.local/bin:$PATH

# Set the working directory to the user's home directory
WORKDIR $HOME/app

# Copy the current directory contents into the container at $HOME/app setting the owner to the user
COPY --chown=user . $HOME/app

# Create a startup script for HF Spaces using echo commands
RUN echo '#!/bin/bash' > start_hf_spaces.sh && \
    echo 'set -e' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo 'echo "πŸš€ Starting Neural OS for HF Spaces"' >> start_hf_spaces.sh && \
    echo 'echo "===================================="' >> start_hf_spaces.sh && \
    echo 'echo "πŸ“ Current directory: $(pwd)"' >> start_hf_spaces.sh && \
    echo 'echo "πŸ“‹ Files in current directory:"' >> start_hf_spaces.sh && \
    echo 'ls -la' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Check if required files exist' >> start_hf_spaces.sh && \
    echo 'if [[ ! -f "dispatcher.py" ]]; then' >> start_hf_spaces.sh && \
    echo '    echo "❌ Error: dispatcher.py not found"' >> start_hf_spaces.sh && \
    echo '    exit 1' >> start_hf_spaces.sh && \
    echo 'fi' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo 'if [[ ! -f "worker.py" ]]; then' >> start_hf_spaces.sh && \
    echo '    echo "❌ Error: worker.py not found"' >> start_hf_spaces.sh && \
    echo '    exit 1' >> start_hf_spaces.sh && \
    echo 'fi' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo 'if [[ ! -f "static/index.html" ]]; then' >> start_hf_spaces.sh && \
    echo '    echo "❌ Error: static/index.html not found"' >> start_hf_spaces.sh && \
    echo '    exit 1' >> start_hf_spaces.sh && \
    echo 'fi' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo 'echo "βœ… All required files found"' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Start dispatcher in background' >> start_hf_spaces.sh && \
    echo 'echo "🎯 Starting dispatcher..."' >> start_hf_spaces.sh && \
    echo 'python dispatcher.py --port 7860 > dispatcher.log 2>&1 &' >> start_hf_spaces.sh && \
    echo 'DISPATCHER_PID=$!' >> start_hf_spaces.sh && \
    echo 'echo "πŸ“Š Dispatcher PID: $DISPATCHER_PID"' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Wait for dispatcher to start and check if it is running' >> start_hf_spaces.sh && \
    echo 'echo "⏳ Waiting for dispatcher to initialize..."' >> start_hf_spaces.sh && \
    echo 'sleep 5' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo 'if ! kill -0 $DISPATCHER_PID 2>/dev/null; then' >> start_hf_spaces.sh && \
    echo '    echo "❌ Dispatcher failed to start"' >> start_hf_spaces.sh && \
    echo '    echo "πŸ“‹ Dispatcher log:"' >> start_hf_spaces.sh && \
    echo '    cat dispatcher.log' >> start_hf_spaces.sh && \
    echo '    exit 1' >> start_hf_spaces.sh && \
    echo 'fi' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Test if dispatcher is responding' >> start_hf_spaces.sh && \
    echo 'echo "πŸ” Testing dispatcher health..."' >> start_hf_spaces.sh && \
    echo 'curl -f http://localhost:7860/ > /dev/null 2>&1' >> start_hf_spaces.sh && \
    echo 'if [ $? -eq 0 ]; then' >> start_hf_spaces.sh && \
    echo '    echo "βœ… Dispatcher is responding to HTTP requests"' >> start_hf_spaces.sh && \
    echo 'else' >> start_hf_spaces.sh && \
    echo '    echo "⚠️ Dispatcher HTTP test failed, but continuing..."' >> start_hf_spaces.sh && \
    echo 'fi' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Start single worker' >> start_hf_spaces.sh && \
    echo 'echo "πŸ”§ Starting worker..."' >> start_hf_spaces.sh && \
    echo 'python worker.py --worker-address localhost:8001 --dispatcher-url http://localhost:7860 > worker.log 2>&1 &' >> start_hf_spaces.sh && \
    echo 'WORKER_PID=$!' >> start_hf_spaces.sh && \
    echo 'echo "πŸ“Š Worker PID: $WORKER_PID"' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Wait for worker to initialize' >> start_hf_spaces.sh && \
    echo 'echo "⏳ Waiting for worker to initialize..."' >> start_hf_spaces.sh && \
    echo 'sleep 30' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Check if worker is still running' >> start_hf_spaces.sh && \
    echo 'if ! kill -0 $WORKER_PID 2>/dev/null; then' >> start_hf_spaces.sh && \
    echo '    echo "❌ Worker failed to start"' >> start_hf_spaces.sh && \
    echo '    echo "πŸ“‹ Worker log:"' >> start_hf_spaces.sh && \
    echo '    cat worker.log' >> start_hf_spaces.sh && \
    echo '    echo "πŸ“‹ Dispatcher log:"' >> start_hf_spaces.sh && \
    echo '    cat dispatcher.log' >> start_hf_spaces.sh && \
    echo '    exit 1' >> start_hf_spaces.sh && \
    echo 'fi' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo 'echo "βœ… System ready!"' >> start_hf_spaces.sh && \
    echo 'echo "🌍 Web interface: http://localhost:7860"' >> start_hf_spaces.sh && \
    echo 'echo "πŸ“Š Dispatcher PID: $DISPATCHER_PID"' >> start_hf_spaces.sh && \
    echo 'echo "πŸ“Š Worker PID: $WORKER_PID"' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Function to cleanup' >> start_hf_spaces.sh && \
    echo 'cleanup() {' >> start_hf_spaces.sh && \
    echo '    echo "πŸ›‘ Shutting down..."' >> start_hf_spaces.sh && \
    echo '    kill $DISPATCHER_PID $WORKER_PID 2>/dev/null || true' >> start_hf_spaces.sh && \
    echo '    exit 0' >> start_hf_spaces.sh && \
    echo '}' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo 'trap cleanup SIGINT SIGTERM' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Keep the script running by following the dispatcher log' >> start_hf_spaces.sh && \
    echo 'echo "πŸ“‹ Following dispatcher log (Ctrl+C to stop):"' >> start_hf_spaces.sh && \
    echo 'tail -f dispatcher.log &' >> start_hf_spaces.sh && \
    echo 'TAIL_PID=$!' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Wait for dispatcher (main process)' >> start_hf_spaces.sh && \
    echo 'wait $DISPATCHER_PID' >> start_hf_spaces.sh && \
    echo '' >> start_hf_spaces.sh && \
    echo '# Clean up tail process' >> start_hf_spaces.sh && \
    echo 'kill $TAIL_PID 2>/dev/null || true' >> start_hf_spaces.sh && \
    chmod +x start_hf_spaces.sh

CMD ["bash", "start_hf_spaces.sh"]