בטח, בשמחה. הנה קובץ תרגילים מקיף ומעשי לשיעור 3.8, שנבנה בהתאם לדרישות ולפורמט שצוינו.

---

<div dir="rtl" lang="he">

# תרגילים - שיעור 3.8: Deploy לפרודקשן – Cloudflare, Vercel

## מידע כללי
- **שיעור:** 3.8 - Deploy לפרודקשן – Cloudflare, Vercel
- **סוג השיעור:** מעשי (2 שעות אקדמיות)
- **הערה:** תרגילים אלו מניחים שיש לכם חשבון GitHub, חשבון Vercel (חינמי) וחשבון Cloudflare (חינמי). נשתמש באפליקציית Python קטנה (מבוססת FastAPI) כבסיס לתרגילים.

---

## תרגיל 1: הקמת אפליקציית בסיס מקומית (Local Setup - 15 דקות)
### הנחיות:
בשלב הראשון, ניצור אפליקציית FastAPI פשוטה שתשמש אותנו לכל אורך התרגול. האפליקציה תקבל מחרוזת טקסט ותחזיר "ניתוח סנטימנט" מדומה. המטרה היא ליצור בסיס יציב ל-Deploy, לא לבנות מודל AI מורכב.

### משימות:
1.  צרו תיקייה חדשה לפרויקט והקימו בתוכה סביבה וירטואלית (`python -m venv venv`).
2.  התקינו את הספריות הנדרשות: `pip install fastapi uvicorn`.
3.  צרו קובץ `main.py` עם הקוד הבא:
    ```python
    from fastapi import FastAPI
    from pydantic import BaseModel

    app = FastAPI()

    class TextInput(BaseModel):
        text: str

    @app.get("/")
    def read_root():
        return {"message": "שרת ניתוח סנטימנט ישראלי"}

    @app.post("/analyze")
    def analyze_sentiment(input: TextInput):
        # In a real app, you would use a model here.
        # For this exercise, we'll use a simple rule.
        if "מעולה" in input.text or "מצוין" in input.text:
            sentiment = "positive"
        elif "גרוע" in input.text or "אכזבה" in input.text:
            sentiment = "negative"
        else:
            sentiment = "neutral"
        
        return {"original_text": input.text, "sentiment": sentiment}
    ```
4.  צרו קובץ `requirements.txt` באמצעות הפקודה: `pip freeze > requirements.txt`.
5.  ודאו שהאפליקציה רצה מקומית באמצעות הפקודה: `uvicorn main:app --reload`. גלשו אל `http://127.0.0.1:8000` ובדקו שהיא עובדת.

---

## תרגיל 2: Deploy ראשון ל-Vercel באמצעות CLI (מעשי - 15 דקות)
### הנחיות:
ניקח את האפליקציה שבנינו ונעלה אותה בפעם הראשונה לרשת באמצעות ה-Command Line Interface של Vercel. זו הדרך המהירה ביותר לקבל URL ציבורי.

### משימות:
1.  התקינו את ה-Vercel CLI גלובלית: `npm install -g vercel`.
2.  התחברו לחשבון שלכם: `vercel login`.
3.  מהתיקייה הראשית של הפרויקט, הריצו את פקודת ה-Deploy: `vercel`.
4.  ענו על השאלות בתהליך האינטראקטיבי. Vercel תזהה שמדובר באפליקציית Python ותציע הגדרות ברירת מחדל. אשרו אותן.
5.  בסיום התהליך, Vercel תספק לכם קישור. גשו לקישור ובדקו שהאפליקציה חיה ומתפקדת בענן.

---

## תרגיל 3: אוטומציה עם GitHub ו-Vercel (CI/CD - 20 דקות)
### הנחיות:
כעת נשדרג את תהליך העבודה שלנו. במקום לבצע Deploy ידני בכל פעם, נחבר את הפרויקט למאגר GitHub ונגדיר את Vercel לבצע Deploy אוטומטי בכל `push` לענף הראשי (`main`).

### משימות:
1.  צרו מאגר (repository) חדש וריק ב-GitHub.
2.  בתיקיית הפרויקט המקומית, הפעילו git, בצעו commit ראשוני ודחפו את הקוד למאגר שיצרתם.
3.  בלוח הבקרה (Dashboard) של Vercel, ייבאו את הפרויקט החדש מ-GitHub. Vercel תזהה את הקונפיגורציה ותבצע Deploy ראשוני.
4.  בצעו שינוי קטן בקובץ `main.py` (לדוגמה, שנו את הטקסט בהודעת השורש).
5.  בצעו `commit` ו-`push` לשינוי.
6.  עקבו אחר תהליך ה-Build וה-Deploy האוטומטי בלוח הבקרה של Vercel. ודאו שהשינוי מופיע בגרסה החיה של האפליקציה תוך דקה-שתיים.

---

## תרגיל 4: ניהול סודות ומשתני סביבה (Secrets Management - 15 דקות)
### הנחיות:
אפליקציות אמיתיות דורשות מפתחות API וסודות אחרים. נלמד כיצד לנהל אותם בצורה בטוחה ב-Vercel מבלי לחשוף אותם בקוד.

### משימות:
1.  שנו את ה-endpoint הראשי (`/`) ב-`main.py` כך שיציג הודעה סודית שנקראת ממשתנה סביבה:
    ```python
    import os
    from dotenv import load_dotenv

    load_dotenv() # To load variables locally for testing
    
    SECRET_KEY = os.getenv("SECRET_KEY", "Default-Secret")

    @app.get("/")
    def read_root():
        return {"message": f"ההודעה הסודית היא: {SECRET_KEY}"}
    ```
    *(אל תשכחו להוסיף `python-dotenv` ל-`requirements.txt`)*
2.  צרו קובץ `.env` מקומי לבדיקה עם התוכן: `SECRET_KEY="סוד ישראלי שמור היטב"`. ודאו שזה עובד מקומית.
3.  הוסיפו את הקובץ `.env` לקובץ ה-`.gitignore` שלכם!
4.  בלוח הבקרה של Vercel, תחת הגדרות הפרויקט -> Environment Variables, הוסיפו משתנה חדש בשם `SECRET_KEY` עם ערך סודי משלכם.
5.  בצעו `push` לקוד המעודכן. לאחר ה-Deploy האוטומטי, גשו ל-URL וודאו שההודעה הסודית מהשרת מוצגת, ולא ערך ברירת המחדל.

---

## תרגיל 5: Deploy ל-Cloudflare Workers (מעשי - 20 דקות)
### הנחיות:
כעת נתנסה בפלטפורמה מתחרה עם ארכיטקטורה שונה. ניקח את הלוגיקה הבסיסית של האפליקציה ונמיר אותה ל-Cloudflare Worker, הפועל על רשת ה-Edge הגלובלית.

### משימות:
1.  התקינו את `wrangler`, ה-CLI של Cloudflare: `npm install -g wrangler`.
2.  התחברו לחשבון: `wrangler login`.
3.  צרו פרויקט Worker חדש: `wrangler init my-ai-worker`. בחרו באופציה "Hello World".
4.  החליפו את הקוד בקובץ `src/index.ts` (או `index.js`) כך שיממש לוגיקה דומה לזו של אפליקציית ה-FastAPI (קבלת JSON, בדיקת מחרוזת והחזרת תשובה).
    * **טיפ:** המבנה הבסיסי ב-TypeScript יראה כך:
    ```typescript
    export default {
        async fetch(request: Request): Promise<Response> {
            if (request.method === 'POST') {
                const body: { text: string } = await request.json();
                let sentiment = "neutral";
                if (body.text.includes("מעולה")) {
                    sentiment = "positive";
                }
                return new Response(JSON.stringify({ sentiment }), {
                    headers: { 'Content-Type': 'application/json' },
                });
            }
            return new Response('שלום מ-Cloudflare Worker!');
        },
    };
    ```
5.  בצעו Deploy באמצעות הפקודה: `wrangler deploy`.
6.  בדקו את ה-URL שהתקבל ושלחו בקשת POST באמצעות כלי כמו Postman או `curl` כדי לוודא שהלוגיקה עובדת.

---

## תרגיל 6: ניתוח והשוואה: Vercel vs. Cloudflare (תיאורטי - 10 דקות)
### הנחיות:
לאחר שהתנסיתם בשתי הפלטפורמות, זה הזמן לעצור לרגע ולנתח את ההבדלים, היתרונות והחסרונות של כל אחת מהן בהקשר של אפליקציות AI.

### משימות:
1.  מלאו את הטבלה הבאה על סמך ניסיונכם והחומר הנלמד:
| קריטריון | Vercel | Cloudflare Workers |
| :--- | :--- | :--- |
| **חווית מפתחים (DX)** | | |
| **מודל תמחור (חינמי)** | | |
| **זמן Cold Start (תחושה)** | | |
| **אינטגרציה עם Frontend** | | |
| **הרצה על ה-Edge** | | |
2.  ענו על השאלה הבאה (2-3 משפטים): לאיזו אפליקציית AI הייתם בוחרים Vercel ומתי הייתם מעדיפים Cloudflare Workers? נמקו עם דוגמה קונקרטית (למשל: צ'אטבוט, עיבוד תמונה, המלצות בזמן אמת).

---

## תרגיל 7 (בונוס): AI על ה-Edge עם Workers AI (מעשי - 15 דקות)
### הנחיות:
נראה את העוצמה האמיתית של Edge Computing. נשתמש בשירות Workers AI המובנה של Cloudflare כדי להריץ מודל שפה קטן ישירות על ה-Edge, ללא צורך בשרת חיצוני.

### משימות:
1.  צרו פרויקט Worker חדש (או השתמשו בקיים).
2.  בקובץ `wrangler.toml`, הוסיפו את הגדרת ה-binding הבאה כדי לאפשר גישה ל-Workers AI:
    ```toml
    [[ai]]
    binding = "AI"
    ```
3.  עדכנו את קוד ה-Worker ב-`src/index.ts` כדי לקרוא למודל שפה:
    ```typescript
    interface Env {
        AI: any;
    }

    export default {
        async fetch(request: Request, env: Env): Promise<Response> {
            const { text } = await request.json();
            const response = await env.AI.run(
                '@cf/meta/llama-2-7b-chat-int8',
                {
                    prompt: `תרגם את המשפט הבא לאנגלית: '${text}'`
                }
            );
            return new Response(JSON.stringify(response));
        },
    };
    ```
4.  בצעו Deploy: `wrangler deploy`.
5.  שלחו בקשת POST עם טקסט בעברית ובדקו את התרגום שמתקבל מהמודל שרץ על ה-Edge.

---

## תרגיל 8: משימת בית - פרויקט Deploy מלא
### הנחיות:
במשימת הבית עליכם ליישם את כל מה שלמדנו בשיעור על פרויקט קטן חדש. המטרה היא להראות שליטה בתהליך מקצה לקצה, החל מפיתוח ועד ל-Deploy אוטומטי ומאובטח.

### משימות:
1.  **בנו אפליקציית AI חדשה:** צרו אפליקציה פשוטה המשתמשת ב-API חיצוני. רעיונות:
    *   "מסכם חדשות": מקבל URL של כתבה ישראלית ומחזיר תקציר באמצעות API חיצוני (כמו aihub.co.il או אחר).
    *   "בודק מזג אוויר חכם": מקבל שם עיר ומחזיר המלצת לבוש על סמך נתוני מזג אוויר מ-API חינמי.
2.  **בחרו פלטפורמת Deploy:** בחרו ב-Vercel **או** ב-Cloudflare Workers לפרויקט שלכם.
3.  **יישמו את כל השלבים:**
    *   צרו מאגר GitHub לפרויקט.
    *   הגדירו CI/CD כך שכל `push` ל-`main` יבצע Deploy אוטומטי.
    *   נהלו את מפתח ה-API של השירות החיצוני כ-Environment Variable / Secret. **אל תכניסו את המפתח לקוד!**
    *   צרו קובץ `README.md` במאגר שיכלול:
        *   קישור לאפליקציה החיה.
        *   הסבר קצר על מה האפליקציה עושה.
        *   **פסקה קצרה המסבירה מדוע בחרתם בפלטפורמת ה-Deploy הספציפית (Vercel/Cloudflare) עבור פרויקט זה.**
4.  **הגשה:** הגישו את הקישור למאגר ה-GitHub שלכם.

**הגישו עד השיעור הבא.**

---

## קריטריונים להערכה
| קריטריון | ציון |
|---|---|
| תרגילים 1-7 הושלמו במהלך השיעור | 30% |
| משימת בית: אפליקציה עובדת ב-Deploy | 25% |
| משימת בית: CI/CD מוגדר ועובד | 20% |
| משימת בית: ניהול סודות נכון (API Key לא בקוד) | 15% |
| משימת בית: קובץ README.md איכותי עם נימוק לבחירת פלטפורמה | 10% |
| **סה"כ** | **100%** |

</div>