| #!/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 |
|
|
| |
| 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 & |
|
|
| |
| 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 |
|
|
| |
| LOG "π Starting stealth browser server..." |
| cd /app && python3 browser_server.py >> "$CS_LOGS/browser.log" 2>&1 & |
|
|
| |
| 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 |
|
|
| |
| 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;" |