File size: 4,235 Bytes
585219d d85f0a5 585219d d85f0a5 585219d d85f0a5 585219d d85f0a5 585219d d85f0a5 585219d d85f0a5 585219d d85f0a5 585219d | 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 | #!/bin/bash
set -euo pipefail
LOG() { echo "[$(date '+%H:%M:%S')] $*"; }
if [ -d "/data" ]; then DATA_DIR="/data"
else DATA_DIR="/root/.local/codeserver-data"; LOG "β οΈ No /data bucket"; fi
WORKSPACE="${DATA_DIR}/workspace"
CS_USER_DATA="${DATA_DIR}/vscode-user-data"
CS_LOGS="${DATA_DIR}/logs"
CS_EXTENSIONS_DIR="/root/.local/share/code-server/extensions"
mkdir -p "$WORKSPACE" "$CS_USER_DATA/User" "$CS_LOGS"
mkdir -p /tmp/nginx-client-body /tmp/nginx-proxy
SETTINGS="$CS_USER_DATA/User/settings.json"
[ ! -f "$SETTINGS" ] && tee "$SETTINGS" > /dev/null << 'EOF'
{
"workbench.colorTheme": "Default Dark+",
"workbench.iconTheme": "vs-seti",
"editor.fontSize": 14, "editor.fontFamily": "monospace",
"editor.tabSize": 2, "editor.formatOnSave": true,
"editor.wordWrap": "on", "editor.minimap.enabled": true,
"editor.bracketPairColorization.enabled": true,
"terminal.integrated.fontSize": 13,
"terminal.integrated.scrollback": 5000,
"files.autoSave": "afterDelay", "files.autoSaveDelay": 1000,
"workbench.startupEditor": "none",
"git.autofetch": true, "extensions.autoUpdate": false,
"telemetry.telemetryLevel": "off", "update.mode": "none"
}
EOF
export PASSWORD="${PASSWORD:-codeserver123}"
mkdir -p /root/.config/code-server
cat > /root/.config/code-server/config.yaml << CONF
bind-addr: 0.0.0.0:8080
auth: password
password: ${PASSWORD}
cert: false
user-data-dir: ${CS_USER_DATA}
extensions-dir: ${CS_EXTENSIONS_DIR}
CONF
git config --global init.defaultBranch main
git config --global pull.rebase false
[ -n "${GIT_USER_NAME:-}" ] && git config --global user.name "$GIT_USER_NAME"
[ -n "${GIT_USER_EMAIL:-}" ] && git config --global user.email "$GIT_USER_EMAIL"
[ -n "${GITHUB_TOKEN:-}" ] && git config --global \
url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/"
[ -n "${HF_TOKEN:-}" ] && \
huggingface-cli login --token "$HF_TOKEN" --add-to-git-credential 2>/dev/null || true
# ββ 1. code-server βββββββββββββββββββββββββββββββββββββββββββββββ
LOG "π» Starting code-server..."
code-server \
--config /root/.config/code-server/config.yaml \
--disable-telemetry --disable-update-check \
"$WORKSPACE" >> "$CS_LOGS/code-server.log" 2>&1 &
# Wait for code-server to be ready
LOG "β³ Waiting for code-server..."
for i in $(seq 1 30); do
if curl -sf http://127.0.0.1:8080/ -o /dev/null 2>&1; then
LOG "β
code-server ready (${i}s)"; break
fi
sleep 1
done
# ββ 2. Browser server ββββββββββββββββββββββββββββββββββββββββββββ
LOG "π Starting stealth browser server..."
cd /app && python3 browser_server.py >> "$CS_LOGS/browser.log" 2>&1 &
# Playwright + Chromium launch takes time β wait properly
LOG "β³ Waiting for browser server (Chromium init)..."
for i in $(seq 1 60); do
if curl -sf http://127.0.0.1:8888/ -o /dev/null 2>&1; then
LOG "β
Browser server ready (${i}s)"; break
fi
if [ $i -eq 60 ]; then
LOG "β Browser server failed to start. Last logs:"
tail -20 "$CS_LOGS/browser.log"
fi
sleep 1
done
# ββ 3. nginx βββββββββββββββββββββββββββββββββββββββββββββββββββββ
echo ""
echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ"
echo "β π All services ready β"
echo "β βββββββββββββββββββββββββββββββββββββββββββββββββββββββ£"
echo "β Editor : https://<space>.hf.space/ β"
echo "β Browser : https://<space>.hf.space/browser/ β"
echo "β Password: $PASSWORD"
echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ"
LOG "π Starting nginx on :7860..."
exec nginx -g "daemon off;" |