| | |
| | import os |
| | import subprocess |
| | import threading |
| | import time |
| | from flask import Flask, jsonify, redirect |
| | import signal |
| | import sys |
| |
|
| | app = Flask(__name__) |
| |
|
| | |
| | code_server_process = None |
| |
|
| | def check_code_server(): |
| | """Check if code-server is installed""" |
| | try: |
| | result = subprocess.run( |
| | ["code-server", "--version"], |
| | check=True, |
| | capture_output=True, |
| | text=True |
| | ) |
| | print(f"Code-server version: {result.stdout.strip()}") |
| | return True |
| | except (subprocess.CalledProcessError, FileNotFoundError) as e: |
| | print(f"Code-server not found: {e}") |
| | return False |
| |
|
| | def start_code_server(): |
| | """Start code-server in background""" |
| | global code_server_process |
| | try: |
| | |
| | config_dir = os.path.expanduser("~/.config/code-server") |
| | os.makedirs(config_dir, exist_ok=True) |
| | |
| | |
| | password = os.getenv("CODE_SERVER_PASSWORD", "huggingface123") |
| | |
| | |
| | cmd = [ |
| | "code-server", |
| | "--bind-addr", "0.0.0.0:8080", |
| | "--auth", "password", |
| | "--password", password, |
| | "--disable-telemetry", |
| | "--disable-update-check" |
| | ] |
| | |
| | print("Starting code-server...") |
| | code_server_process = subprocess.Popen( |
| | cmd, |
| | stdout=subprocess.PIPE, |
| | stderr=subprocess.PIPE, |
| | text=True |
| | ) |
| | |
| | |
| | time.sleep(5) |
| | |
| | if code_server_process.poll() is None: |
| | print("Code-server started successfully!") |
| | print(f"Password: {password}") |
| | return True |
| | else: |
| | print("Code-server failed to start") |
| | return False |
| | |
| | except Exception as e: |
| | print(f"Error starting code-server: {e}") |
| | return False |
| |
|
| | def setup_workspace(): |
| | """Setup initial workspace""" |
| | try: |
| | |
| | workspace_dir = "/tmp/workspace" |
| | os.makedirs(workspace_dir, exist_ok=True) |
| | |
| | |
| | sample_file = os.path.join(workspace_dir, "README.md") |
| | with open(sample_file, "w") as f: |
| | f.write("""# Code-Server on Hugging Face Spaces |
| | |
| | Welcome to your code-server environment! |
| | |
| | ## Features: |
| | - Full VS Code experience in browser |
| | - Python environment ready |
| | - Terminal access |
| | - File editing capabilities |
| | |
| | ## Getting Started: |
| | 1. Open terminal (Ctrl+Shift+`) |
| | 2. Install packages: `pip install package-name` |
| | 3. Start coding! |
| | |
| | ## Note: |
| | - Files are temporary and will be lost on restart |
| | - For persistent storage, use external git repos |
| | """) |
| | |
| | |
| | sample_py = os.path.join(workspace_dir, "sample.py") |
| | with open(sample_py, "w") as f: |
| | f.write("""#!/usr/bin/env python3 |
| | # Sample Python file |
| | |
| | def hello_world(): |
| | print("Hello from Code-Server on Hugging Face!") |
| | |
| | if __name__ == "__main__": |
| | hello_world() |
| | """) |
| | |
| | print("Workspace setup complete!") |
| | return True |
| | |
| | except Exception as e: |
| | print(f"Error setting up workspace: {e}") |
| | return False |
| |
|
| | @app.route('/health') |
| | def health_check(): |
| | """Health check endpoint""" |
| | global code_server_process |
| | |
| | status = { |
| | "status": "healthy", |
| | "timestamp": time.time(), |
| | "code_server_running": False |
| | } |
| | |
| | if code_server_process: |
| | if code_server_process.poll() is None: |
| | status["code_server_running"] = True |
| | else: |
| | status["code_server_running"] = False |
| | status["status"] = "code_server_down" |
| | |
| | return jsonify(status) |
| |
|
| | @app.route('/') |
| | def index(): |
| | """Redirect to code-server""" |
| | return redirect('/code-server/', code=302) |
| |
|
| | @app.route('/code-server/') |
| | def code_server_proxy(): |
| | """Info about code-server access""" |
| | return """ |
| | <html> |
| | <head><title>Code-Server Access</title></head> |
| | <body> |
| | <h1>Code-Server on Hugging Face Spaces</h1> |
| | <p>Code-server should be running on port 8080</p> |
| | <p>If you're seeing this, the proxy might not be working correctly.</p> |
| | <p>Try accessing directly through the Hugging Face Spaces interface.</p> |
| | <p><a href="/health">Check Health Status</a></p> |
| | </body> |
| | </html> |
| | """ |
| |
|
| | def signal_handler(sig, frame): |
| | """Handle shutdown gracefully""" |
| | global code_server_process |
| | print("Shutting down...") |
| | |
| | if code_server_process: |
| | code_server_process.terminate() |
| | code_server_process.wait() |
| | |
| | sys.exit(0) |
| |
|
| | def initialize_environment(): |
| | """Initialize the complete environment""" |
| | print("Initializing environment...") |
| | |
| | |
| | if not check_code_server(): |
| | print("Code-server is not installed!") |
| | return False |
| | |
| | |
| | if not setup_workspace(): |
| | print("Failed to setup workspace") |
| | return False |
| | |
| | |
| | def start_server(): |
| | start_code_server() |
| | |
| | server_thread = threading.Thread(target=start_server, daemon=True) |
| | server_thread.start() |
| | |
| | return True |
| |
|
| | if __name__ == "__main__": |
| | |
| | signal.signal(signal.SIGINT, signal_handler) |
| | signal.signal(signal.SIGTERM, signal_handler) |
| | |
| | |
| | if initialize_environment(): |
| | print("Environment initialized successfully!") |
| | |
| | |
| | port = int(os.getenv("PORT", 7860)) |
| | app.run(host="0.0.0.0", port=port, debug=False) |
| | else: |
| | print("Failed to initialize environment") |
| | sys.exit(1) |