Spaces:
Paused
Paused
Upload start.sh with huggingface_hub
Browse files
start.sh
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
#!/bin/bash
|
| 2 |
+
set -e
|
| 3 |
+
|
| 4 |
+
echo "=== Claude Code Real β Starting ==="
|
| 5 |
+
echo "Model backend: ${MODEL:-z-ai/glm-5.1}"
|
| 6 |
+
|
| 7 |
+
# ββ Pre-configure Claude Code ββ
|
| 8 |
+
mkdir -p /home/user/.claude
|
| 9 |
+
cat > /home/user/.claude/settings.json << 'JSON'
|
| 10 |
+
{
|
| 11 |
+
"permissions": {
|
| 12 |
+
"allow": ["Bash(*)","Read(*)","Write(*)","Edit(*)","Computer(*)","WebFetch(*)","mcp__*"],
|
| 13 |
+
"deny": []
|
| 14 |
+
},
|
| 15 |
+
"hasCompletedOnboarding": true,
|
| 16 |
+
"hasAcknowledgedDisclaimer": true
|
| 17 |
+
}
|
| 18 |
+
JSON
|
| 19 |
+
touch /home/user/.claude/.terms-accepted
|
| 20 |
+
|
| 21 |
+
# ββ Create .bashrc with Claude env for terminal users ββ
|
| 22 |
+
cat > /home/user/.bashrc << 'BASHRC'
|
| 23 |
+
export ANTHROPIC_BASE_URL="http://localhost:4000"
|
| 24 |
+
export ANTHROPIC_API_KEY="sk-ant-proxy-key-for-local-translation"
|
| 25 |
+
export ANTHROPIC_MODEL="claude-sonnet-4-20250514"
|
| 26 |
+
export DISABLE_PROMPT_CACHING="true"
|
| 27 |
+
export CLAUDE_CODE_SKIP_OOBE="1"
|
| 28 |
+
export TERM="xterm-256color"
|
| 29 |
+
export PATH="/home/user/.npm-global/bin:/home/user/.local/bin:$PATH"
|
| 30 |
+
|
| 31 |
+
echo ""
|
| 32 |
+
echo "π€ Claude Code Terminal β Ready!"
|
| 33 |
+
echo " Model: ${MODEL:-z-ai/glm-5.1} via NVIDIA API"
|
| 34 |
+
echo " Run: claude"
|
| 35 |
+
echo " Or: claude -p 'your prompt' --dangerously-skip-permissions"
|
| 36 |
+
echo ""
|
| 37 |
+
cd /home/user/workspace
|
| 38 |
+
BASHRC
|
| 39 |
+
|
| 40 |
+
# ββ Start AnthropicβOpenAI proxy on port 4000 ββ
|
| 41 |
+
echo "Starting proxy on :4000..."
|
| 42 |
+
python3 /home/user/proxy.py &
|
| 43 |
+
PROXY_PID=$!
|
| 44 |
+
|
| 45 |
+
for i in $(seq 1 20); do
|
| 46 |
+
if curl -s http://localhost:4000/health > /dev/null 2>&1; then
|
| 47 |
+
echo "β
Proxy ready!"
|
| 48 |
+
break
|
| 49 |
+
fi
|
| 50 |
+
sleep 1
|
| 51 |
+
done
|
| 52 |
+
|
| 53 |
+
curl -s http://localhost:4000/health | python3 -m json.tool 2>/dev/null || true
|
| 54 |
+
echo "Claude Code: $(claude --version 2>/dev/null || echo 'checking...')"
|
| 55 |
+
|
| 56 |
+
# ββ Quick test (don't block startup) ββ
|
| 57 |
+
echo "Testing Claude Code (background)..."
|
| 58 |
+
export ANTHROPIC_BASE_URL="http://localhost:4000"
|
| 59 |
+
export ANTHROPIC_API_KEY="sk-ant-proxy-key-for-local-translation"
|
| 60 |
+
export ANTHROPIC_MODEL="claude-sonnet-4-20250514"
|
| 61 |
+
export DISABLE_PROMPT_CACHING="true"
|
| 62 |
+
export CLAUDE_CODE_SKIP_OOBE="1"
|
| 63 |
+
|
| 64 |
+
timeout 30 claude -p "Say hi" --dangerously-skip-permissions --output-format text 2>&1 | head -5 &
|
| 65 |
+
|
| 66 |
+
# ββ Start ttyd web terminal on port 7862 (password protected) ββ
|
| 67 |
+
echo "Starting web terminal on :7862..."
|
| 68 |
+
TERM_PASSWORD="${TERMINAL_PASSWORD:-2004}"
|
| 69 |
+
ttyd -p 7862 -c "ayoub:${TERM_PASSWORD}" \
|
| 70 |
+
-t fontSize=14 \
|
| 71 |
+
-t 'theme={"background":"#1a1b26","foreground":"#c0caf5"}' \
|
| 72 |
+
bash --login &
|
| 73 |
+
TTYD_PID=$!
|
| 74 |
+
echo " ttyd PID: $TTYD_PID"
|
| 75 |
+
|
| 76 |
+
# ββ Start nginx on port 7860 ββ
|
| 77 |
+
echo "Starting nginx on :7860..."
|
| 78 |
+
nginx -c /home/user/nginx.conf -g 'daemon off;' &
|
| 79 |
+
NGINX_PID=$!
|
| 80 |
+
sleep 1
|
| 81 |
+
|
| 82 |
+
# Check if nginx started OK
|
| 83 |
+
if kill -0 $NGINX_PID 2>/dev/null; then
|
| 84 |
+
echo " β
nginx PID: $NGINX_PID"
|
| 85 |
+
else
|
| 86 |
+
echo " β οΈ nginx failed! Falling back to Flask on :7860"
|
| 87 |
+
NGINX_PID=""
|
| 88 |
+
# If nginx fails, start Flask directly on 7860
|
| 89 |
+
export FLASK_PORT=7860
|
| 90 |
+
fi
|
| 91 |
+
|
| 92 |
+
# ββ Start Flask + Telegram bot ββ
|
| 93 |
+
FLASK_PORT=${FLASK_PORT:-7861}
|
| 94 |
+
echo "Starting Flask+Bot on :${FLASK_PORT}..."
|
| 95 |
+
FLASK_PORT=$FLASK_PORT python3 /home/user/app.py &
|
| 96 |
+
APP_PID=$!
|
| 97 |
+
|
| 98 |
+
echo ""
|
| 99 |
+
echo "=== All services started ==="
|
| 100 |
+
echo " Proxy: PID $PROXY_PID (:4000)"
|
| 101 |
+
echo " App: PID $APP_PID (:$FLASK_PORT)"
|
| 102 |
+
echo " Terminal: PID $TTYD_PID (:7862)"
|
| 103 |
+
[ -n "$NGINX_PID" ] && echo " Nginx: PID $NGINX_PID (:7860)"
|
| 104 |
+
echo ""
|
| 105 |
+
echo " π Web Terminal: https://ayoub5550-claudecode.hf.space/terminal/"
|
| 106 |
+
echo " π Health: https://ayoub5550-claudecode.hf.space/health"
|
| 107 |
+
echo ""
|
| 108 |
+
|
| 109 |
+
# ββ Keep alive: only die if the main app (bot) dies ββ
|
| 110 |
+
# Don't use wait -n, only wait for the bot process
|
| 111 |
+
while true; do
|
| 112 |
+
if ! kill -0 $APP_PID 2>/dev/null; then
|
| 113 |
+
echo "β App process died! Restarting..."
|
| 114 |
+
FLASK_PORT=$FLASK_PORT python3 /home/user/app.py &
|
| 115 |
+
APP_PID=$!
|
| 116 |
+
sleep 5
|
| 117 |
+
fi
|
| 118 |
+
if ! kill -0 $PROXY_PID 2>/dev/null; then
|
| 119 |
+
echo "β Proxy died! Restarting..."
|
| 120 |
+
python3 /home/user/proxy.py &
|
| 121 |
+
PROXY_PID=$!
|
| 122 |
+
sleep 5
|
| 123 |
+
fi
|
| 124 |
+
sleep 10
|
| 125 |
+
done
|