המדריך המעמיק: הקמת SavaPage על Hyper-V וחיבור תחנות קצה
SavaPage היא מערכת ניהול הדפסות ארגונית בקוד פתוח (Open Source). היא עוטפת את שרת ההדפסות של לינוקס (CUPS) ומוסיפה לו "שכל": ניהול משתמשים, מעקב אחרי צריכת נייר, גביית תשלומים, והדפסה מאובטחת (הדפסה שמשוחררת למדפסת רק כשהעובד מזהה את עצמו פיזית בעמדה). במדריך זה נבנה את תשתית השרת מאפס, ונלמד כיצד להגדיר חיבורים למחשבים בתוך הרשת ומחוצה לה.
כדי לחבר מחשבים נכון, צריך להבין את המסלול של מסמך מודפס בארגון:
- תחנת הקצה (המשתמש): לא מתקינה ישירות את המדפסת של ה-HP/Xerox, אלא מתקינה מדפסת רשת וירטואלית של SavaPage.
- שרת ה-SavaPage: קולט את העבודה, עוצר אותה, מנתח אותה (כמה דפים, צבעוני או שחור לבן), ומחשב את העלות מול חשבון המשתמש.
- שחרור ההדפסה: המשתמש מאשר את העבודה (בממשק הרשת, באפליקציה, או דרך כרטיס קרבה), ו-SavaPage מעביר את הפקודה ל-CUPS שמדפיס אותה פיזית.
שלב 1: הקמת השרת בסביבת Hyper-V
הכנת המכונה הוירטואלית (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) כדי שמחשבי הקצה ימצאו את המדפסת תמיד באותה כתובת.
התקנת תשתיות הליבה בלינוקס
התחברו לשרת (SSH) והתקינו את סביבת העבודה הדרושה ל-SavaPage: מסד נתונים (PostgreSQL), שרת הדפסות (CUPS) וסביבת ריצה (Java).
שלב 2: התקנה והגדרת SavaPage
הורדה והתקנת המערכת
הורידו את החבילה העדכנית ביותר של SavaPage מהאתר הרשמי, חלצו אותה והריצו את סקריפט ההתקנה שייצור את מסד הנתונים ויגדיר את השירותים.
במהלך ההתקנה תתבקשו לאשר הגדרות בסיסיות. בסיום, שירות SavaPage ירוץ ברקע באופן אוטומטי.
כניסה לממשק והגדרות ראשוניות
פתחו דפדפן מהמחשב שלכם והקלידו את כתובת השרת על פורט 8632:
https://192.168.1.50:8632/admin
בהפעלה הראשונה, תתבקשו ליצור משתמש מנהל (Admin) וסיסמה.
חיבור למדפסות פיזיות: בתוך הממשק, גשו ל-Printers. המערכת תשלוף אוטומטית את כל המדפסות שהותקנו בשרת ה-CUPS הלינוקסי. אשרו את המדפסות שתרצו לנהל דרך המערכת.
שלב 3: התקנה במחשבים ברשת המקומית (LAN)
העיקרון כאן הוא פשוט: מחשבי הקצה חייבים לשלוח את ההדפסה למדפסת הווירטואלית של SavaPage, ולא ישירות אל מדפסת הרשת של הארגון.
בסביבת רשת פנימית (LAN), הדרך הקלה והטובה ביותר היא לחבר את המחשבים למדפסת של SavaPage דרך פרוטוקול IPP המובנה ב-Windows/Mac ללא צורך בהתקנת דרייברים מיוחדים.
הוספת המדפסת הווירטואלית ב-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 (או הדרייבר הספציפי שהארגון משתמש בו).
הזדהות משתמשים (User Authentication)
ברגע שהמשתמש שולח הדפסה, היא מגיעה לשרת. אך איך המערכת יודעת של מי ההדפסה כדי לחייב אותו? ישנן שתי אפשרויות:
- SSO של רשת הארגון: אם השרת מחובר ל-Active Directory, והמשתמש מחובר לדומיין במחשב שלו, Windows מעביר אוטומטית את שם המשתמש בפרוטוקול ה-IPP ו-SavaPage משייך זאת עצמאית.
- אפליקציית מחשב (SavaPage User Client): במחשבים ציבוריים (בתי ספר, ספריות, אורחים), מתקינים את תוכנת הקליינט הקטנה של SavaPage. כאשר העובד לוחץ "הדפס", יקפוץ לו חלון בו הוא מתבקש להקליד את שם המשתמש והסיסמה שלו כדי לשלוח את העבודה.
שלב 4: חיבור מחשבים מרוחקים (מחוץ לרשת)
הדפסה ממחשבים בבית או מחוץ לארגון מציבה אתגר אבטחתי. חשיפה ישירה של פרוטוקול הדפסות (IPP) לאינטרנט החיצוני היא סכנת סייבר שיכולה להוביל להשתלטות על השרת.
האקרים סורקים את האינטרנט לשרתי CUPS/IPP חשופים. הנה הדרכים הנכונות והמאובטחות להדפסה מרחוק:
שיטה 1: VPN ארגוני (הדרך המומלצת)
הפתרון הנקי ביותר והמאובטח ביותר. מחשבים מרוחקים המחוברים דרך IPsec, OpenVPN או WireGuard פועלים בדיוק כמו מחשבים ברשת המקומית.
- המשתמש מתחבר ל-VPN.
- הוא מקבל כתובת IP וירטואלית פנימית (למשל `10.8.0.x`).
- הוא שולח את ההדפסה ל-`http://192.168.1.50:8631/printers/savapage` כרגיל (בדיוק כמו בשלב 5). הכל מוצפן ובטוח.
שיטה 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: הקמת השרת, התקנה וחיבור תחנות קצה
הכנת המכונה הוירטואלית (VM)
הורידו קובץ ISO של Ubuntu Server 22.04 LTS. ב-Hyper-V צרו מכונה חדשה עם: vCPU (לפחות 2 ליבות), RAM (מינימום 4GB לעיבוד PDF של Java), ואחסון (50GB לפחות כי עבודות ההדפסה נשמרות באופן זמני בדיסק). הגדירו Static IP.
התקנת תשתיות הליבה (CUPS ו-PostgreSQL)
התחברו לשרת והתקינו את סביבת העבודה הדרושה:
הורדה והתקנת SavaPage
הורידו את החבילה והריצו את סקריפט ההתקנה (וודאו שגרסת הקישור היא העדכנית מהאתר):
בסיום ההתקנה, היכנסו לממשק בכתובת https://your-server-ip:8632/admin להגדרת סיסמה ראשונית ושאיבת המדפסות הפיזיות מה-CUPS.
חיבור תחנות קצה (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. המטרה: סטודנט/עובד משלם באתר, וברגע שהעסקה מאושרת, המערכת שלנו מטעינה לו כסף ליתרת ההדפסות.
- בתוך ה-User Portal של SavaPage, אנו מוסיפים קישור חיצוני "טען יתרה" (Top-Up).
- הקישור מעביר את המשתמש לעמוד נחיתה שלנו (או ישר למסוף התשלום של Pelecard), שם הוא בוחר סכום לטעינה ומזין אשראי.
- חברת פלאקארד סולקת את הכסף, ושולחת אישור שקט (Server-to-Server / IPN) לסקריפט המתווך שלנו.
- הסקריפט שלנו מקבל את האישור מפלאקארד, פונה ל-API של SavaPage (דרך פרוטוקול XML-RPC) ומפקיד למשתמש את היתרה לחשבון הפנימי שלו.
הפקת מפתח אבטחה ב-SavaPage
כדי שהסקריפט שלנו יוכל להזרים כסף למערכת, נצטרך הרשאות.
- היכנסו לממשק הניהול של SavaPage ללשונית: Options > Advanced.
- הפעילו את שירות ה-XML-RPC API.
- ייצרו Auth Token חדש ושמרו אותו בסוד. (נקרא לו לדוגמה
MySecretToken123).
הכנת סקריפט הגישור (Middleware)
הנה דוגמה לסקריפט קצר בפייתון (Python) שמקבל את חיווי הסליקה מפלאקארד ומבצע את העדכון בפועל בתוך ה-SavaPage.
הסקריפט המתווך שלכם יושב על שרת ציבורי וממתין לפלאקארד. האקרים עלולים לנסות "לזייף" פניות לסקריפט הזה כדי לטעון לעצמם כסף בחינם להדפסות. חובה:
- לבדוק את כתובת ה-IP של השולח – לוודא שהפנייה אכן הגיעה משרתי פלאקארד הרשמיים.
- לאמת את החתימה (Hash/Signature) שפלאקארד מצרפת לבקשה (לרוב שילוב של סכום + מפתח סודי). רק אם החתימה תואמת – מריצים את פקודת ההפקדה.
שלב 6: הקמת קוד הגישור (Pelecard IPN Webhook)
כדי לבצע את טעינת היתרה בפועל, ניצור קובץ PHP בשרת הכללי שלנו (היכן שדף הנחיתה יושב, או על שרת ה-SavaPage עצמו אם מותקן עליו Apache/Nginx). הקוד מקבל את הפרמטרים של פלאקארד, מוודא אבטחה, ומבצע פנייה פנימית מאובטחת ל-SavaPage.
כאשר אתם מקימים את דף התשלום (המסוף) בפלאקארד, הגדירו להם להעביר בפרמטר המותאם אישית prm1 את שם המשתמש הארגוני של הסטודנט/עובד (התואם ל-Active Directory שלכם ב-SavaPage). פלאקארד יחזירו את הנתון הזה ל-Webhook יחד עם סכום העסקה ומספר האישור.
<?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 ש"ח:
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 ש"ח עם הערת המעקב של פלאקארד.