Spaces:
Running
Running
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| # Code Server Β· Startup Script | |
| # Runs as: root | Port: 7860 | Extensions: image-local | |
| # Persisted to /data: workspace + User settings only | |
| # βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| set -euo pipefail | |
| # ββ Storage paths ββββββββββββββββββββββββββββββββββββββββββββββββ | |
| if [ -d "/data" ]; then | |
| DATA_DIR="/data" | |
| echo "β /data storage bucket mounted" | |
| else | |
| DATA_DIR="/root/.local/codeserver-data" | |
| echo "β οΈ /data not found β using local storage (not persistent)" | |
| fi | |
| WORKSPACE="${DATA_DIR}/workspace" | |
| CS_USER_DATA="${DATA_DIR}/vscode-user-data" | |
| CS_LOGS="${DATA_DIR}/logs" | |
| # Extensions stay LOCAL β never on the bucket (S3 FUSE can't atomic-rename) | |
| CS_EXTENSIONS_DIR="/root/.local/share/code-server/extensions" | |
| # ββ Create directories safely ββββββββββββββββββββββββββββββββββββ | |
| mkdir -p \ | |
| "$WORKSPACE" \ | |
| "$CS_USER_DATA/User" \ | |
| "$CS_LOGS" \ | |
| "$CS_EXTENSIONS_DIR" | |
| # ββ VS Code settings (written once; user can edit inside editor) β | |
| SETTINGS_FILE="$CS_USER_DATA/User/settings.json" | |
| if [ ! -f "$SETTINGS_FILE" ]; then | |
| cat > "$SETTINGS_FILE" << 'SETTINGS' | |
| { | |
| "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, | |
| "editor.guides.bracketPairs": true, | |
| "editor.smoothScrolling": true, | |
| "editor.cursorBlinking": "smooth", | |
| "terminal.integrated.fontSize": 13, | |
| "terminal.integrated.scrollback": 5000, | |
| "terminal.integrated.defaultProfile.linux": "bash", | |
| "files.autoSave": "afterDelay", | |
| "files.autoSaveDelay": 1000, | |
| "files.trimTrailingWhitespace": true, | |
| "workbench.startupEditor": "none", | |
| "git.autofetch": true, | |
| "git.confirmSync": false, | |
| "extensions.autoUpdate": false, | |
| "telemetry.telemetryLevel": "off", | |
| "update.mode": "none" | |
| } | |
| SETTINGS | |
| echo "β VS Code settings written" | |
| fi | |
| # ββ code-server config βββββββββββββββββββββββββββββββββββββββββββ | |
| mkdir -p /root/.config/code-server | |
| cat > /root/.config/code-server/config.yaml << CSCONFIG | |
| bind-addr: 0.0.0.0:7860 | |
| auth: password | |
| password: ${PASSWORD:-codeserver123} | |
| cert: false | |
| user-data-dir: ${CS_USER_DATA} | |
| extensions-dir: ${CS_EXTENSIONS_DIR} | |
| CSCONFIG | |
| # ββ Git config βββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| git config --global init.defaultBranch main | |
| git config --global pull.rebase false | |
| git config --global core.editor "code --wait" | |
| [ -n "${GIT_USER_NAME:-}" ] && git config --global user.name "$GIT_USER_NAME" | |
| [ -n "${GIT_USER_EMAIL:-}" ] && git config --global user.email "$GIT_USER_EMAIL" | |
| if [ -n "${GITHUB_TOKEN:-}" ]; then | |
| git config --global \ | |
| url."https://${GITHUB_TOKEN}@github.com/".insteadOf "https://github.com/" | |
| echo "β GitHub token configured" | |
| fi | |
| # ββ HuggingFace login ββββββββββββββββββββββββββββββββββββββββββββ | |
| if [ -n "${HF_TOKEN:-}" ]; then | |
| huggingface-cli login --token "$HF_TOKEN" --add-to-git-credential 2>/dev/null || true | |
| echo "β HuggingFace token configured" | |
| fi | |
| # ββ Welcome README (only on first boot) βββββββββββββββββββββββββ | |
| README_FILE="$WORKSPACE/README.md" | |
| if [ ! -f "$README_FILE" ]; then | |
| # Write via tee to avoid heredoc redirect issues on FUSE mounts | |
| tee "$README_FILE" > /dev/null << 'WSREADME' | |
| # π Code Server β Cloud Dev Environment | |
| Your persistent workspace is backed by HF Storage Bucket at `/data`. | |
| ## π Paths | |
| | Path | Purpose | | |
| |------|---------| | |
| | `/data/workspace` | Your code (this folder) | | |
| | `/data/vscode-user-data` | Settings & keybindings | | |
| | `/root/.local/share/code-server/extensions` | Extensions (image-local) | | |
| ## π Port Proxy | |
| Access any running server: | |
| https://-.hf.space/proxy/PORT/ | |
| Example: app on port 3000 β `/proxy/3000/` | |
| ## π Secrets (Space Settings β Repository secrets) | |
| | Secret | Purpose | | |
| |--------|---------| | |
| | `PASSWORD` | code-server login password | | |
| | `GITHUB_TOKEN` | Private GitHub repo auth | | |
| | `HF_TOKEN` | HuggingFace CLI auth | | |
| | `GIT_USER_NAME` | Git commit name | | |
| | `GIT_USER_EMAIL` | Git commit email | | |
| ## π οΈ Pre-installed | |
| - Python 3, pip, venv, numpy, pandas, black | |
| - Node.js 20, npm, yarn, pnpm | |
| - Git, GitHub CLI (gh) | |
| - build-essential, cmake, curl, wget, jq, ripgrep | |
| - Extensions: Python, Jupyter, Prettier, GitLens, Material Icons | |
| WSREADME | |
| echo "β Workspace README created" | |
| fi | |
| # ββ Launch βββββββββββββββββββββββββββββββββββββββββββββββββββββββ | |
| echo "" | |
| echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββ" | |
| echo "β π₯οΈ Code Server starting... β" | |
| echo "β βββββββββββββββββββββββββββββββββββββββββββββββββββ£" | |
| echo "β Workspace : $WORKSPACE" | |
| echo "β Extensions : $CS_EXTENSIONS_DIR" | |
| echo "β Port : 7860" | |
| echo "ββββββββββββββββββββββββββββββββββββββββββββββββββββ" | |
| echo "" | |
| exec code-server \ | |
| --config /root/.config/code-server/config.yaml \ | |
| --disable-telemetry \ | |
| --disable-update-check \ | |
| "$WORKSPACE" \ | |
| 2>&1 | tee -a "$CS_LOGS/code-server.log" |