Skip to main content
< All Topics
Print

המדריך המעמיק: הקמת SavaPage על Hyper-V וחיבור תחנות קצה

SavaPage היא מערכת ניהול הדפסות ארגונית בקוד פתוח (Open Source). היא עוטפת את שרת ההדפסות של לינוקס (CUPS) ומוסיפה לו "שכל": ניהול משתמשים, מעקב אחרי צריכת נייר, גביית תשלומים, והדפסה מאובטחת (הדפסה שמשוחררת למדפסת רק כשהעובד מזהה את עצמו פיזית בעמדה). במדריך זה נבנה את תשתית השרת מאפס, ונלמד כיצד להגדיר חיבורים למחשבים בתוך הרשת ומחוצה לה.

🧠 איך נראית הארכיטקטורה של SavaPage?

כדי לחבר מחשבים נכון, צריך להבין את המסלול של מסמך מודפס בארגון:

  • תחנת הקצה (המשתמש): לא מתקינה ישירות את המדפסת של ה-HP/Xerox, אלא מתקינה מדפסת רשת וירטואלית של SavaPage.
  • שרת ה-SavaPage: קולט את העבודה, עוצר אותה, מנתח אותה (כמה דפים, צבעוני או שחור לבן), ומחשב את העלות מול חשבון המשתמש.
  • שחרור ההדפסה: המשתמש מאשר את העבודה (בממשק הרשת, באפליקציה, או דרך כרטיס קרבה), ו-SavaPage מעביר את הפקודה ל-CUPS שמדפיס אותה פיזית.

🖥️ שלב 1: הקמת השרת בסביבת Hyper-V

1

הכנת המכונה הוירטואלית (VM)

הורידו קובץ ISO של Ubuntu Server 22.04 LTS (מומלץ מאוד לעבוד על לינוקס כי CUPS היא מערכת הדפסות טבעית ליוניקס). ב-Hyper-V צרו מכונה חדשה:

  • vCPU: 2 עד 4 ליבות (תלוי בכמות ההדפסות במקביל).
  • RAM: מינימום 4GB. (מנוע ה-SavaPage מבוסס Java וזקוק לזיכרון לעיבוד קבצי PDF).
  • אחסון: 50GB-100GB. עבודות ההדפסה נשמרות באופן זמני (Spooling) בדיסק. חובה לדאוג לשטח פנוי.
  • רשת: Virtual Switch חיצוני, חובה להגדיר IP קבוע (Static IP) כדי שמחשבי הקצה ימצאו את המדפסת תמיד באותה כתובת.
2

התקנת תשתיות הליבה בלינוקס

התחברו לשרת (SSH) והתקינו את סביבת העבודה הדרושה ל-SavaPage: מסד נתונים (PostgreSQL), שרת הדפסות (CUPS) וסביבת ריצה (Java).

Bash
# עדכון המערכת sudo apt-get update && sudo apt-get upgrade -y # התקנת CUPS, מסד נתונים ו-Java sudo apt-get install -y cups cups-pdf postgresql openjdk-11-jre # צירוף משתמש המערכת לקבוצת מנהלי ההדפסות sudo usermod -aG lpadmin $USER # חשיפת שרת ה-CUPS לרשת הפנימית כדי לאפשר גישה ממחשבים אחרים sudo cupsctl –remote-any sudo systemctl restart cups

⚙️ שלב 2: התקנה והגדרת SavaPage

3

הורדה והתקנת המערכת

הורידו את החבילה העדכנית ביותר של SavaPage מהאתר הרשמי, חלצו אותה והריצו את סקריפט ההתקנה שייצור את מסד הנתונים ויגדיר את השירותים.

Bash
# מעבר לספריית ה-opt המיועדת לתוכנות צד-שלישי cd /opt # הורדת הגרסה (בדקו באתר הרשמי אם יש גרסה חדשה יותר) sudo wget https://www.savapage.org/download/savapage-linux-x64-latest.tar.gz # חילוץ הקובץ sudo tar -xzf savapage-linux-x64-latest.tar.gz # הרצת סקריפט ההתקנה האוטומטי cd savapage/server/bin/linux-x64 sudo ./savapage-setup.sh

במהלך ההתקנה תתבקשו לאשר הגדרות בסיסיות. בסיום, שירות SavaPage ירוץ ברקע באופן אוטומטי.

4

כניסה לממשק והגדרות ראשוניות

פתחו דפדפן מהמחשב שלכם והקלידו את כתובת השרת על פורט 8632:

https://192.168.1.50:8632/admin

בהפעלה הראשונה, תתבקשו ליצור משתמש מנהל (Admin) וסיסמה.

חיבור למדפסות פיזיות: בתוך הממשק, גשו ל-Printers. המערכת תשלוף אוטומטית את כל המדפסות שהותקנו בשרת ה-CUPS הלינוקסי. אשרו את המדפסות שתרצו לנהל דרך המערכת.

🏢 שלב 3: התקנה במחשבים ברשת המקומית (LAN)

העיקרון כאן הוא פשוט: מחשבי הקצה חייבים לשלוח את ההדפסה למדפסת הווירטואלית של SavaPage, ולא ישירות אל מדפסת הרשת של הארגון.

שיטת IPP (Internet Printing Protocol)

בסביבת רשת פנימית (LAN), הדרך הקלה והטובה ביותר היא לחבר את המחשבים למדפסת של SavaPage דרך פרוטוקול IPP המובנה ב-Windows/Mac ללא צורך בהתקנת דרייברים מיוחדים.

5

הוספת המדפסת הווירטואלית ב-Windows

  • כנסו להגדרות (Settings) > Bluetooth & devices > Printers & scanners.
  • לחצו על Add device, ולאחר מכן על Add manually.
  • בחרו באופציה: Select a shared printer by name.
  • הקלידו את נתיב הרשת של שרת ה-SavaPage שלכם. ברירת המחדל למדפסת התור (Queue) היא:
    http://192.168.1.50:8631/printers/savapage
  • בשלב בחירת הדרייבר, בחרו בדרייבר גנרי מסוג Generic PostScript Printer (או הדרייבר הספציפי שהארגון משתמש בו).
6

הזדהות משתמשים (User Authentication)

ברגע שהמשתמש שולח הדפסה, היא מגיעה לשרת. אך איך המערכת יודעת של מי ההדפסה כדי לחייב אותו? ישנן שתי אפשרויות:

  1. SSO של רשת הארגון: אם השרת מחובר ל-Active Directory, והמשתמש מחובר לדומיין במחשב שלו, Windows מעביר אוטומטית את שם המשתמש בפרוטוקול ה-IPP ו-SavaPage משייך זאת עצמאית.
  2. אפליקציית מחשב (SavaPage User Client): במחשבים ציבוריים (בתי ספר, ספריות, אורחים), מתקינים את תוכנת הקליינט הקטנה של SavaPage. כאשר העובד לוחץ "הדפס", יקפוץ לו חלון בו הוא מתבקש להקליד את שם המשתמש והסיסמה שלו כדי לשלוח את העבודה.

🌍 שלב 4: חיבור מחשבים מרוחקים (מחוץ לרשת)

הדפסה ממחשבים בבית או מחוץ לארגון מציבה אתגר אבטחתי. חשיפה ישירה של פרוטוקול הדפסות (IPP) לאינטרנט החיצוני היא סכנת סייבר שיכולה להוביל להשתלטות על השרת.

⚠️ לעולם אל תעשו Port Forwarding לפורט 8631 מחוץ לרשת!

האקרים סורקים את האינטרנט לשרתי CUPS/IPP חשופים. הנה הדרכים הנכונות והמאובטחות להדפסה מרחוק:

7

שיטה 1: VPN ארגוני (הדרך המומלצת)

הפתרון הנקי ביותר והמאובטח ביותר. מחשבים מרוחקים המחוברים דרך IPsec, OpenVPN או WireGuard פועלים בדיוק כמו מחשבים ברשת המקומית.

  • המשתמש מתחבר ל-VPN.
  • הוא מקבל כתובת IP וירטואלית פנימית (למשל `10.8.0.x`).
  • הוא שולח את ההדפסה ל-`http://192.168.1.50:8631/printers/savapage` כרגיל (בדיוק כמו בשלב 5). הכל מוצפן ובטוח.
8

שיטה 2: Web Print (הדפסה דרך הדפדפן)

SavaPage מציעה פתרון גאוני למשתמשים מזדמנים וטלפונים ניידים ללא צורך בהתקנת מדפסת בכלל. המשתמש פשוט נכנס לאתר ה-User Portal, גורר לשם את קובץ ה-PDF או ה-Word, והמערכת מדפיסה אותו.

כדי להנגיש את המערכת הזו בצורה בטוחה לאינטרנט (Web):

  • הגדירו ב-DNS הארגוני כתובת כמו print.yourdomain.com שתפנה ל-IP הציבורי שלכם.
  • הקימו שרת Reverse Proxy (כמו Nginx או HAProxy) ב-DMZ.
  • הנפיקו תעודת הצפנה (SSL) מאובטחת.
  • הגדירו את ה-Proxy לנתב בקשות רק של פורט 8632 (פורט פורטל המשתמשים מבוסס HTTPS) אל השרת הפנימי של ה-SavaPage. חסמו את פורט ההדפסות (8631).

בצורה כזו, עובד יכול להעלות קובץ מכל מקום בעולם, מהסמארטפון או מהמחשב בבית, בצורה מוצפנת, וברגע שהוא יגיע למשרד הוא ישחרר את ההדפסה על ידי העברת הכרטיס שלו במדפסת.

המדריך המעמיק: הקמת SavaPage על Hyper-V וחיבור סליקת פלאקארד

SavaPage היא מערכת ניהול הדפסות ארגונית בקוד פתוח. היא מוסיפה לשרת ההדפסות (CUPS) "שכל": ניהול משתמשים, מעקב אחרי צריכת נייר, גביית תשלומים, והדפסה מאובטחת. במדריך זה נבנה את תשתית השרת מאפס, נגדיר חיבורים למחשבים בתוך ומחוץ לרשת, ולבסוף נדגים כיצד לשלב סליקת אשראי עצמאית בעזרת חברת פלאקארד (Pelecard) לטעינת יתרות אוטומטית.

🖥️ שלבים 1-4: הקמת השרת, התקנה וחיבור תחנות קצה

1

הכנת המכונה הוירטואלית (VM)

הורידו קובץ ISO של Ubuntu Server 22.04 LTS. ב-Hyper-V צרו מכונה חדשה עם: vCPU (לפחות 2 ליבות), RAM (מינימום 4GB לעיבוד PDF של Java), ואחסון (50GB לפחות כי עבודות ההדפסה נשמרות באופן זמני בדיסק). הגדירו Static IP.

2

התקנת תשתיות הליבה (CUPS ו-PostgreSQL)

התחברו לשרת והתקינו את סביבת העבודה הדרושה:

# עדכון המערכת והתקנת תשתיות sudo apt-get update && sudo apt-get install -y cups cups-pdf postgresql openjdk-11-jre # צירוף המשתמש למנהלי ההדפסות והפעלת השירות לרשת sudo usermod -aG lpadmin $USER sudo cupsctl –remote-any sudo systemctl restart cups
3

הורדה והתקנת SavaPage

הורידו את החבילה והריצו את סקריפט ההתקנה (וודאו שגרסת הקישור היא העדכנית מהאתר):

cd /opt sudo wget https://www.savapage.org/download/savapage-linux-x64-latest.tar.gz sudo tar -xzf savapage-linux-x64-latest.tar.gz cd savapage/server/bin/linux-x64 sudo ./savapage-setup.sh

בסיום ההתקנה, היכנסו לממשק בכתובת https://your-server-ip:8632/admin להגדרת סיסמה ראשונית ושאיבת המדפסות הפיזיות מה-CUPS.

4

חיבור תחנות קצה (LAN ו-WAN)

  • ברשת הפנימית (LAN): המשתמש מוסיף מדפסת רשת ידנית ב-Windows בכתובת http://192.168.1.50:8631/printers/savapage באמצעות דרייבר "Generic PostScript".
  • מחוץ לרשת (WAN / עבודה מהבית): אבטחת מידע אוסרת על פתיחת פורט 8631 לאינטרנט. יש להשתמש ב-VPN ארגוני, או להגדיר Reverse Proxy (כמו Nginx) רק לפורט 8632 כדי לאפשר הדפסה מבוססת דפדפן ב-Web Portal.

💳 שלב 5: מודול התשלומים – חיבור לפלאקארד (Pelecard)

מכיוון ש-SavaPage אינה תומכת "מהקופסה" בחברות אשראי ישראליות, נבנה ארכיטקטורה של Webhooks מול API. המטרה: סטודנט/עובד משלם באתר, וברגע שהעסקה מאושרת, המערכת שלנו מטעינה לו כסף ליתרת ההדפסות.

🔄 הארכיטקטורה: איך זה עובד?
  1. בתוך ה-User Portal של SavaPage, אנו מוסיפים קישור חיצוני "טען יתרה" (Top-Up).
  2. הקישור מעביר את המשתמש לעמוד נחיתה שלנו (או ישר למסוף התשלום של Pelecard), שם הוא בוחר סכום לטעינה ומזין אשראי.
  3. חברת פלאקארד סולקת את הכסף, ושולחת אישור שקט (Server-to-Server / IPN) לסקריפט המתווך שלנו.
  4. הסקריפט שלנו מקבל את האישור מפלאקארד, פונה ל-API של SavaPage (דרך פרוטוקול XML-RPC) ומפקיד למשתמש את היתרה לחשבון הפנימי שלו.
5

הפקת מפתח אבטחה ב-SavaPage

כדי שהסקריפט שלנו יוכל להזרים כסף למערכת, נצטרך הרשאות.

  • היכנסו לממשק הניהול של SavaPage ללשונית: Options > Advanced.
  • הפעילו את שירות ה-XML-RPC API.
  • ייצרו Auth Token חדש ושמרו אותו בסוד. (נקרא לו לדוגמה MySecretToken123).
6

הכנת סקריפט הגישור (Middleware)

הנה דוגמה לסקריפט קצר בפייתון (Python) שמקבל את חיווי הסליקה מפלאקארד ומבצע את העדכון בפועל בתוך ה-SavaPage.

# סקריפט Python לדוגמה המדגים פנייה ל-API של SavaPage import xmlrpc.client # הגדרות שרת ה-SavaPage SAVAPAGE_URL = "http://localhost:8631/rpc/api/xmlrpc" AUTH_TOKEN = "MySecretToken123" def top_up_user_balance(username, amount, pelecard_transaction_id): try: # התחברות לשרת server = xmlrpc.client.ServerProxy(SAVAPAGE_URL) # הכנת ההערה שתישמר בדוחות (Audit Logs) למטרות הנהלת חשבונות comment = f"Pelecard Charge Success – Trans ID: {pelecard_transaction_id}" # קריאה לפונקציה המובנית שמוסיפה יתרה # server.api.adjustUserAccountBalance(Token, Username, Amount, Comment) server.api.adjustUserAccountBalance(AUTH_TOKEN, username, float(amount), comment) print(f"✅ סך של {amount} ש"ח הוטען בהצלחה למשתמש {username}") return True except Exception as e: print(f"❌ שגיאה בהתחברות ל-SavaPage: {e}") return False # ברגע שהסקריפט מקבל Webhook אישור מפלאקארד, הוא מריץ: # top_up_user_balance("moran.admin", 50.00, "12345678")
⚠️ אמצעי זהירות קריטיים באינטגרציות אשראי:

הסקריפט המתווך שלכם יושב על שרת ציבורי וממתין לפלאקארד. האקרים עלולים לנסות "לזייף" פניות לסקריפט הזה כדי לטעון לעצמם כסף בחינם להדפסות. חובה:

  • לבדוק את כתובת ה-IP של השולח – לוודא שהפנייה אכן הגיעה משרתי פלאקארד הרשמיים.
  • לאמת את החתימה (Hash/Signature) שפלאקארד מצרפת לבקשה (לרוב שילוב של סכום + מפתח סודי). רק אם החתימה תואמת – מריצים את פקודת ההפקדה.

⚙️ שלב 6: הקמת קוד הגישור (Pelecard IPN Webhook)

כדי לבצע את טעינת היתרה בפועל, ניצור קובץ PHP בשרת הכללי שלנו (היכן שדף הנחיתה יושב, או על שרת ה-SavaPage עצמו אם מותקן עליו Apache/Nginx). הקוד מקבל את הפרמטרים של פלאקארד, מוודא אבטחה, ומבצע פנייה פנימית מאובטחת ל-SavaPage.

💡 מיפוי פרמטרים בפלאקארד:

כאשר אתם מקימים את דף התשלום (המסוף) בפלאקארד, הגדירו להם להעביר בפרמטר המותאם אישית prm1 את שם המשתמש הארגוני של הסטודנט/עובד (התואם ל-Active Directory שלכם ב-SavaPage). פלאקארד יחזירו את הנתון הזה ל-Webhook יחד עם סכום העסקה ומספר האישור.

pelecard-webhook.php
<?php
// 1. הגדרות אבטחה ואימות כתובות IP של פלאקארד (Whitelisting)
// חובה לעדכן רשימה זו מול התמיכה של פלאקארד בהתאם לשרתי הפרודקשן שלהם
$allowed_ips = [
    '194.90.234.10', 
    '194.90.234.11',
    '127.0.0.1' // מיועד לבדיקות מקומיות (Localhost)
];

$client_ip = $_SERVER['REMOTE_ADDR'];

// חסימת גישה מיידית אם ה-IP אינו מורשה
if (!in_array($client_ip, $allowed_ips)) {
    file_put_contents('payment_errors.log', date('Y-m-d H:i:s') . " - Unauthorized IP: $client_ip\n", FILE_APPEND);
    header('HTTP/1.0 403 Forbidden');
    exit('Access Denied');
}

// 2. וידאו שהבקשה הגיעה בפורמט POST הרשמי של פלאקארד
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
    header('HTTP/1.0 405 Method Not Allowed');
    exit('Invalid Request Method');
}

// 3. קליטת הפרמטרים מפלאקארד וניקוי הנתונים (Sanitization)
$username = isset($_POST['prm1']) ? preg_replace('/[^a-zA-Z0-9\.\-_]/', '', $_POST['prm1']) : '';
$amount = isset($_POST['total']) ? floatval($_POST['total']) : 0.0;
$transaction_id = isset($_POST['confirmation_number']) ? preg_replace('/[^a-zA-Z0-9]/', '', $_POST['confirmation_number']) : '';
$status = isset($_POST['status']) ? $_POST['status'] : '';

// בדיקה שהעסקה אכן סולקה בהצלחה (בפלאקארד סטטוס 00 פירושו הצלחה)
if ($status !== '00' || empty($username) || $amount <= 0) {
    file_put_contents('payment_errors.log', date('Y-m-d H:i:s') . " - Invalid Transaction Data or Status: $status\n", FILE_APPEND);
    exit('Invalid Transaction');
}

// 4. הגדרות חיבור ל-SavaPage XML-RPC API
$savapage_url = "http://localhost:8631/rpc/api/xmlrpc";
$auth_token = "MySecretToken123"; // המפתח שהפקתם בשלב 5
$comment = "Pelecard IPN Success. Trans ID: " . $transaction_id;

// 5. בניית שלד ה-XML הרשמי לפרוטוקול XML-RPC עבור SavaPage
$xml_payload = '<?xml version="1.0" encoding="UTF-8"?>
<methodCall>
    <methodName>api.adjustUserAccountBalance</methodName>
    <params>
        <param><value><string>' . htmlspecialchars($auth_token) . '</string></value></param>
        <param><value><string>' . htmlspecialchars($username) . '</string></value></param>
        <param><value><double>' . $amount . '</double></value></param>
        <param><value><string>' . htmlspecialchars($comment) . '</string></value></param>
    </params>
</methodCall>';

// 6. שליחת הנתונים ב-cURL לשרת ה-SavaPage הפנימי
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $savapage_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml_payload);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: text/xml',
    'Content-Length: ' . strlen($xml_payload)
]);

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

// 7. ניתוח תשובת השרת וכתיבה ללוגים
if ($http_code === 200 && strpos($response, '<fault>') === false) {
    // היתרה עודכנה בהצלחה! נדווח לפלאקארד שהכל תקין
    file_put_contents('payment_success.log', date('Y-m-d H:i:s') . " - Successfully credited $amount ILS to user: $username\n", FILE_APPEND);
    echo "OK"; // פלאקארד מצפה לקבל תשובה חיובית כדי לדעת שה-Webhook נקלט
} else {
    // שגיאה פנימית של SavaPage (למשל המשתמש לא קיים במערכת)
    file_put_contents('payment_errors.log', date('Y-m-d H:i:s') . " - SavaPage API Error. Response: $response\n", FILE_APPEND);
    header('HTTP/1.0 500 Internal Server Error');
    echo "SavaPage Core Rejected the Transaction";
}
?>

🧪 שלב 7: בדיקת המערכת (Testing)

לפני שאתם מעבירים את המערכת לפלאקארד, מומלץ לבצע סימולציה (מתוך שרת הלינוקס עצמו) כדי לוודא שקוד ה-PHP שלכם אכן מתקשר נכון עם ה-SavaPage ומטעין כסף בהצלחה.

הריצו את פקודת ה-cURL הבאה בטרמינל כדי לדמות חיווי תשלום מוצלח שמגיע מפלאקארד עבור המשתמש test.user על סך 50 ש"ח:

Bash / Linux Terminal
curl -X POST http://localhost/pelecard-webhook.php \
  -d "prm1=test.user" \
  -d "total=50.00" \
  -d "confirmation_number=PEL998877" \
  -d "status=00"

אם הכל מוגדר נכון, הטרמינל יחזיר לכם את התשובה OK, ובמסך הניהול של SavaPage תחת המשתמש test.user תוכלו לראות שנוספו לו 50 ש"ח עם הערת המעקב של פלאקארד.

Go to Top