هل تريد استخدام VS Code في المتصفح من خلال JupyterLab 4؟ يُتيح لك امتداد jupyter-codeserver-proxy تشغيل VS Code كاملًا (عبر code-server) مباشرةً داخل بيئة JupyterLab، مما يوفر تجربة تطوير موحدة عبر المتصفح دون الحاجة إلى تثبيت برامج إضافية محليًا.


لماذا jupyter-codeserver-proxy؟

يُقدّم هذا الامتداد مزايا جوهرية:

المصادقة الموحدة: يعمل من خلال نظام مصادقة JupyterLab، لذا لا حاجة لإعداد مصادقة منفصلة.

التشغيل بنقرة واحدة: يظهر code-server كخيار في قائمة مشغّل JupyterLab.

وكيل آمن: يمر الاتصال عبر خادم Jupyter بدلًا من فتح منافذ إضافية.

دعم بيئات متعددة: يعمل بشكل مثالي على الجهاز المحلي وDocker وخوادم GPU وKubernetes.


الفرق بين JupyterLab 4 وJupyterLab 3

الجانب JupyterLab 3 JupyterLab 4
نظام الامتدادات تثبيت npm مطلوب امتدادات مُجمَّعة مسبقًا
jupyter-codeserver-proxy يحتاج بناء من المصدر يعمل فور التثبيت عبر pip
الأداء أبطأ أسرع بشكل ملحوظ
واجهة المستخدم كلاسيكية محسّنة وعصرية

JupyterLab 4 يُبسّط التثبيت بشكل كبير.


التثبيت المحلي على macOS

المتطلبات الأساسية

# Python 3.9 أو أحدث
python3 --version

# Node.js (لـ code-server)
node --version

التثبيت عبر pip

# إنشاء بيئة افتراضية (موصى به)
python3 -m venv venv-jupyterlab
source venv-jupyterlab/bin/activate

# تثبيت JupyterLab 4
pip install "jupyterlab>=4.0"

# تثبيت jupyter-codeserver-proxy
pip install jupyter-codeserver-proxy

# تثبيت jupyter-server-proxy (مطلوب)
pip install jupyter-server-proxy

التثبيت عبر Homebrew (على macOS)

# تثبيت code-server عبر Homebrew
brew install code-server

# التحقق من التثبيت
code-server --version

# تثبيت حزم Python
pip install jupyterlab jupyter-codeserver-proxy jupyter-server-proxy

التحقق من التثبيت

# تشغيل JupyterLab
jupyter lab

# التحقق من قائمة الامتدادات المثبتة
jupyter labextension list

# يجب أن تجد:
# jupyter-codeserver-proxy v1.x.x enabled OK

بيئة Docker

Dockerfile الأساسي

# Dockerfile
# JupyterLab 4 مع code-server

FROM python:3.11-slim

# تثبيت التبعيات الأساسية
RUN apt-get update && apt-get install -y \
    curl \
    wget \
    git \
    nodejs \
    npm \
    && rm -rf /var/lib/apt/lists/*

# تثبيت code-server
RUN curl -fsSL https://code-server.dev/install.sh | sh

# إنشاء مستخدم غير root للأمان
RUN useradd -m -s /bin/bash jupyter
USER jupyter
WORKDIR /home/jupyter

# تثبيت حزم Python
RUN pip install --no-cache-dir \
    "jupyterlab>=4.0" \
    jupyter-server-proxy \
    jupyter-codeserver-proxy \
    numpy \
    pandas \
    matplotlib \
    scikit-learn

# إعداد JupyterLab
RUN jupyter lab build

# نسخ ملف الإعداد
COPY --chown=jupyter:jupyter jupyter_server_config.py /home/jupyter/.jupyter/

EXPOSE 8888

CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser"]

ملف إعداد Jupyter

# jupyter_server_config.py
# إعداد خادم Jupyter

c.ServerApp.ip = '0.0.0.0'
c.ServerApp.port = 8888
c.ServerApp.open_browser = False

# تعطيل المصادقة للاستخدام المحلي (غيّر هذا في الإنتاج)
c.ServerApp.token = ''
c.ServerApp.password = ''

# السماح بالاتصال من أي مصدر (للاستخدام مع Docker)
c.ServerApp.allow_origin = '*'

Docker Compose

# docker-compose.yml
# بيئة JupyterLab مع code-server

version: '3.8'

services:
  jupyterlab:
    build: .
    container_name: jupyterlab-codeserver
    ports:
      - "8888:8888"
    volumes:
      # مجلد العمل الدائم
      - ./workspace:/home/jupyter/workspace
      # إعدادات VS Code
      - ~/.config/Code:/home/jupyter/.config/Code:ro
      # امتدادات code-server
      - code-server-extensions:/home/jupyter/.local/share/code-server
    environment:
      - JUPYTER_TOKEN=my-secure-token
    restart: unless-stopped

volumes:
  code-server-extensions:

تشغيل Docker

# بناء وتشغيل الحاوية
docker-compose up -d

# عرض السجلات
docker-compose logs -f jupyterlab

# الوصول إلى JupyterLab
# افتح المتصفح على: http://localhost:8888

بيئة خادم GPU

Dockerfile مع NVIDIA CUDA

# Dockerfile.gpu
# JupyterLab مع دعم CUDA و code-server

FROM nvidia/cuda:12.1.0-devel-ubuntu22.04

# تجنب التفاعل في التثبيت
ENV DEBIAN_FRONTEND=noninteractive

# تثبيت التبعيات الأساسية
RUN apt-get update && apt-get install -y \
    python3.11 \
    python3.11-pip \
    python3.11-venv \
    curl \
    wget \
    git \
    nodejs \
    npm \
    build-essential \
    && rm -rf /var/lib/apt/lists/*

# إنشاء رابط python3
RUN ln -s /usr/bin/python3.11 /usr/bin/python3
RUN ln -s /usr/bin/pip3 /usr/bin/pip

# تثبيت code-server
RUN curl -fsSL https://code-server.dev/install.sh | sh

# تثبيت حزم Python للتعلم الآلي
RUN pip install --no-cache-dir \
    "jupyterlab>=4.0" \
    jupyter-server-proxy \
    jupyter-codeserver-proxy \
    torch torchvision torchaudio \
    tensorflow \
    numpy pandas matplotlib seaborn \
    scikit-learn xgboost \
    transformers datasets \
    accelerate

# إنشاء مستخدم
RUN useradd -m jupyter
USER jupyter
WORKDIR /home/jupyter

EXPOSE 8888

CMD ["jupyter", "lab", "--ip=0.0.0.0", "--port=8888", "--no-browser", "--allow-root"]

Docker Compose لخادم GPU

# docker-compose.gpu.yml
# إعداد Docker Compose لبيئة GPU

version: '3.8'

services:
  jupyterlab-gpu:
    build:
      context: .
      dockerfile: Dockerfile.gpu
    container_name: jupyterlab-gpu
    ports:
      - "8888:8888"
    volumes:
      - ./workspace:/home/jupyter/workspace
      - ./data:/home/jupyter/data
      - model-cache:/home/jupyter/.cache
    environment:
      - JUPYTER_TOKEN=${JUPYTER_TOKEN:-secure-gpu-token}
      - NVIDIA_VISIBLE_DEVICES=all
      - CUDA_VISIBLE_DEVICES=0,1
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: all
              capabilities: [gpu]
    restart: unless-stopped

volumes:
  model-cache:

نشر على Kubernetes

# k8s-jupyterlab-gpu.yaml
# نشر JupyterLab على Kubernetes مع GPU

apiVersion: apps/v1
kind: Deployment
metadata:
  name: jupyterlab-gpu
  namespace: ml-workloads
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jupyterlab-gpu
  template:
    metadata:
      labels:
        app: jupyterlab-gpu
    spec:
      containers:
        - name: jupyterlab
          image: your-registry/jupyterlab-gpu:latest
          ports:
            - containerPort: 8888
          env:
            - name: JUPYTER_TOKEN
              valueFrom:
                secretKeyRef:
                  name: jupyter-secret
                  key: token
          resources:
            requests:
              memory: "8Gi"
              cpu: "2"
              nvidia.com/gpu: 1
            limits:
              memory: "32Gi"
              cpu: "8"
              nvidia.com/gpu: 1
          volumeMounts:
            - name: workspace
              mountPath: /home/jupyter/workspace
      volumes:
        - name: workspace
          persistentVolumeClaim:
            claimName: jupyter-workspace-pvc
---
apiVersion: v1
kind: Service
metadata:
  name: jupyterlab-service
  namespace: ml-workloads
spec:
  selector:
    app: jupyterlab-gpu
  ports:
    - port: 8888
      targetPort: 8888
  type: ClusterIP

التشغيل والاستخدام

الوصول إلى code-server من JupyterLab

  1. افتح JupyterLab في المتصفح (http://localhost:8888)
  2. في لوحة المشغّل (Launcher)، ستجد قسمًا جديدًا
  3. انقر على “VS Code” أو “Code Server”
  4. سيفتح VS Code كاملًا في نافذة جانبية أو علامة تبويب جديدة

الوصول عبر URL مباشر

# عنوان code-server مباشرةً
http://localhost:8888/codeserver/

# أو مع توكن المصادقة
http://localhost:8888/codeserver/?token=your-token

تثبيت امتدادات VS Code

# داخل code-server، يمكنك تثبيت الامتدادات كالمعتاد
# من واجهة VS Code أو عبر سطر الأوامر:

code-server --install-extension ms-python.python
code-server --install-extension ms-python.vscode-pylance
code-server --install-extension github.copilot
code-server --install-extension eamodio.gitlens

استكشاف الأخطاء وإصلاحها

المشكلة 1: أيقونة code-server لا تظهر في المشغّل

# التحقق من تثبيت الامتداد
pip show jupyter-codeserver-proxy

# إعادة تثبيت مع التبعيات
pip uninstall jupyter-codeserver-proxy jupyter-server-proxy
pip install jupyter-server-proxy jupyter-codeserver-proxy

# إعادة بناء JupyterLab
jupyter lab build

# إعادة تشغيل JupyterLab

المشكلة 2: خطأ 404 أو مشاكل التوكن

# التحقق من الإعدادات
jupyter server --show-config

# التحقق من صحة إعداد الوكيل
jupyter serverextension list

# مشاهدة السجلات لتشخيص المشكلة
jupyter lab --log-level=DEBUG 2>&1 | grep -i "code-server\|proxy"

المشكلة 3: إغلاق المتصفح يقطع الجلسة

# استخدام tmux أو screen للجلسات الدائمة
tmux new-session -d -s jupyter 'jupyter lab'

# أو استخدام nohup
nohup jupyter lab &> jupyter.log &

# عرض معرف العملية
echo $! > jupyter.pid

المشكلة 4: مشاكل ذاكرة GPU

# داخل دفتر Jupyter للتحقق من حالة GPU
import torch

# التحقق من توفر GPU
print(f"GPU متاحة: {torch.cuda.is_available()}")
print(f"عدد GPU: {torch.cuda.device_count()}")

# مسح ذاكرة GPU
torch.cuda.empty_cache()

# مراقبة الذاكرة
for i in range(torch.cuda.device_count()):
    mem = torch.cuda.memory_stats(i)
    print(f"GPU {i}: ذاكرة محجوزة = {mem.get('reserved_bytes.all.current', 0) / 1e9:.2f} GB")

الإعدادات المتقدمة

تحسين الأداء

# jupyter_server_config.py - إعدادات الأداء المتقدمة

# زيادة حجم الرسائل المسموح بها
c.ServerApp.max_buffer_size = 10 * 1024 * 1024 * 1024  # 10 GB

# ضبط المهلة الزمنية للاتصال
c.ServerApp.websocket_max_message_size = 10 * 1024 * 1024  # 10 MB

# إعداد وكيل الخادم لـ code-server
c.ServerProxy.servers = {
    'codeserver': {
        'command': ['code-server', '--auth', 'none', '--port', '{port}'],
        'timeout': 30,
        'launcher_entry': {
            'enabled': True,
            'title': 'VS Code',
            'icon_path': '/path/to/vscode-icon.svg'
        }
    }
}

إعدادات الأمان للإنتاج

# jupyter_server_config.py - إعدادات الأمان

import secrets

# توليد توكن آمن
c.ServerApp.token = secrets.token_hex(32)

# تفعيل HTTPS
c.ServerApp.certfile = '/path/to/ssl/cert.pem'
c.ServerApp.keyfile = '/path/to/ssl/key.pem'

# تقييد عناوين IP المسموح بها
c.ServerApp.ip = '0.0.0.0'  # أو عنوان IP محدد

# إضافة كلمة مرور
from jupyter_server.auth import passwd
c.ServerApp.password = passwd('your-secure-password')

الحلول البديلة: مقارنة

الحل المزايا العيوب
jupyter-codeserver-proxy تكامل مثالي مع JupyterLab يحتاج code-server مثبتًا
jupyter-lsp خوادم لغة مدمجة لا يُوفر VS Code كاملًا
OpenVSCode Server vs code رسمي من Microsoft لا يتكامل مع JupyterLab
VS Code محلي + Remote SSH الأفضل للإنتاج يحتاج VS Code مثبتًا محليًا

حالات الاستخدام العملية

تطوير نماذج التعلم العميق

# مثال: تطوير نموذج تعلم عميق مع code-server

# 1. كتابة الشيفرة في code-server (VS Code)
# 2. تشغيل التجارب في Jupyter Notebook
# 3. مراقبة GPU في نافذة منفصلة

import torch
import torch.nn as nn
from torch.utils.data import DataLoader

class SimpleModel(nn.Module):
    """نموذج بسيط للتوضيح"""
    def __init__(self, input_size: int, hidden_size: int, output_size: int):
        super().__init__()
        self.network = nn.Sequential(
            nn.Linear(input_size, hidden_size),
            nn.ReLU(),
            nn.Dropout(0.3),
            nn.Linear(hidden_size, output_size)
        )
    
    def forward(self, x):
        return self.network(x)

# استخدام GPU إذا كانت متاحة
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = SimpleModel(784, 256, 10).to(device)

print(f"النموذج يعمل على: {device}")
print(f"عدد المعاملات: {sum(p.numel() for p in model.parameters()):,}")

تحليل البيانات الضخمة

# مثال: تحليل بيانات كبيرة مع code-server + JupyterLab

import pandas as pd
import dask.dataframe as dd
from pathlib import Path

# قراءة ملفات CSV كبيرة باستخدام Dask
data_path = Path("/home/jupyter/data")

# قراءة متعددة الملفات في توازٍ
df = dd.read_csv(data_path / "*.csv", 
                 dtype_backend='pyarrow',
                 assume_missing=True)

print(f"حجم البيانات: {len(df)} صف")
print(f"الأعمدة: {list(df.columns)}")

# معالجة البيانات بكفاءة
result = (df
    .groupby('category')
    .agg({'value': ['mean', 'std', 'count']})
    .compute()  # تنفيذ الحساب الفعلي
)

print(result)

الخلاصة والنقاط الأساسية

jupyter-codeserver-proxy هو الحل المثالي للجمع بين قوة JupyterLab وسهولة VS Code في بيئة موحدة:

للمطور الفردي: استخدمه محليًا لتجربة تطوير سلسة.

لفرق البيانات: نشره على Docker أو Kubernetes لبيئة مشتركة.

لبحوث التعلم الآلي: استخدمه مع خوادم GPU للحصول على أقصى أداء.

النقاط الأساسية:

  • JupyterLab 4 يُبسّط التثبيت مقارنةً بالإصدار 3
  • Docker يضمن بيئة متسقة عبر جميع المطورين
  • إعدادات الأمان ضرورية في بيئات الإنتاج
  • استخدم tmux/screen للجلسات الدائمة على الخوادم البعيدة