#!/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://.hf.space/ ║" echo "║ Browser : https://.hf.space/browser/ ║" echo "║ Password: $PASSWORD" echo "╚══════════════════════════════════════════════════════╝" LOG "🌐 Starting nginx on :7860..." exec nginx -g "daemon off;"