פריסת צומת IPFS: התקנה, תצורה ותפעול
דמיינו: אתם משיקים קולקציית NFT, והמטא-דאטה מאוחסן בשער ציבורי. לפתע השער נופל — הקולקציה שלכם הופכת ל"עיוורת". או שאתם בונים אפליקציה מבוזרת שחייבת לפעול ללא נקודת כשל אחת. בשני המקרים, צומת IPFS משלכם הוא הפתרון האמין היחיד. הניסיון שלנו כולל למעלה מ-30 פרויקטים — משווקי NFT ועד אחסון מבוזר. להלן מדריך מפורט להתקנה ותצורה של צומת מוכן לייצור, כולל מלכודות נפוצות.
מתי שער ציבורי אינו מספיק
IPFS (InterPlanetary File System) הוא מערכת קבצים מבוזרת המבוססת על תוכן. כתובת לפי hash תוכן (CID) פירושה שכל קובץ עם אותו תוכן תמיד יהיה לו אותו CID, ללא קשר למי ואיפה מאחסן אותו. זהו מפתח ל-Web3: מטא-דאטה של NFT המתוחזק לפי CID לא ניתן להחלפה בשקט — שינוי התוכן משנה את ה-CID.
שערים ציבוריים (ipfs.io, Cloudflare) נוחים לבדיקות, אבל בייצור הם מאכזבים: מגבלות בקשות, טעינה איטית, סיכון לחוסר זמינות. צומת אישי מבטיח זמינות נתונים (pinning) ומהירות, ולנפחי תעבורה גדולים (מעל 1 TB לחודש) הוא זול יותר מ-Pinata או NFT.Storage — החיסכון יכול להגיע ל-40% (כ-$150 לחודש לשימוש טיפוסי). בנוסף, זמן התגובה של השער מזנק פי 2–3 בעומס גבוה, מה שקריטי לחוויית המשתמש.
| קריטריון | שער ציבורי | צומת משלך |
|---|---|---|
| זמינות | תלוי במפעיל | תחת שליטתך |
| מהירות | מוגבל על ידי מכסות | מקסימלית |
| Pinning | לפי סשן בלבד | קבוע |
| סודיות | השער רואה CIDs | בידוד מלא |
| עלות מעל 1TB/חודש | גבוהה (מגבלות ציבוריות) | נמוכה (רק חומרה) |
התקנה ותצורה של Kubo
Kubo הוא מימוש הייחוס של IPFS ב-Go. אנו משתמשים בגרסה היציבה העדכנית ביותר:
wget https://dist.ipfs.tech/kubo/v0.28.0/kubo_v0.28.0_linux-amd64.tar.gz tar -xvzf kubo_v0.28.0_linux-amd64.tar.gz cd kubo && sudo bash install.sh ipfs init --profile server ipfs daemon & wget https://dist.ipfs.tech/kubo/v0.28.0/kubo_v0.28.0_linux-amd64.tar.gz tar -xvzf kubo_v0.28.0_linux-amd64.tar.gz cd kubo && sudo bash install.sh ipfs init --profile server ipfs daemon & חשוב לפריסה בענן: בלעדיו, הצומת מבזבז משאבים על גילוי mDNS, חסר תועלת במרכז נתונים. פרופיל השרת גם משבית נקודות קצה מקומיות של HTTP לגילוי LAN.
תצורת ייצור של צומת IPFS
תצורת ייצור דורשת מגבלות משאבים קפדניות. בלעדיהן, הצומת יכול לצרוך את כל הזיכרון והדיסק. הגדר את המגבלות הבאות:
הרחב פקודות תצורה
ipfs config Datastore.StorageMax "100GB" ipfs config --json Swarm.ConnMgr.LowWater 200 ipfs config --json Swarm.ConnMgr.HighWater 400 ipfs config --json Swarm.ConnMgr.GracePeriod '"1m"' ipfs config --json Swarm.Transports.Network.Relay false ipfs config --json Gateway.NoFetch true ipfs config --json Gateway.HTTPHeaders.Access-Control-Allow-Origin '["*"]' --profile server — הצומת לא יוריד CIDs שאינם מאוחסנים מקומית. ללא הגדרה זו, הצומת הופך לשער ציבורי ויכול לצבור נתונים של אחרים, ולהציף את האחסון. מגבלת ipfs config Datastore.StorageMax "100GB" ipfs config --json Swarm.ConnMgr.LowWater 200 ipfs config --json Swarm.ConnMgr.HighWater 400 ipfs config --json Swarm.ConnMgr.GracePeriod '"1m"' ipfs config --json Swarm.Transports.Network.Relay false ipfs config --json Gateway.NoFetch true ipfs config --json Gateway.HTTPHeaders.Access-Control-Allow-Origin '["*"]' מגנה על הדיסק מפני הצפה: בהגעה ל-95% מהמגבלה, IPFS מתחיל לבטל pinning של בלוקים באגרסיביות. אנו ממליצים להשאיר לפחות 20% שטח פנוי לנתוני שירות וקבצים זמניים.
למספר גבוה של עמיתים (>1000), הגדל את Gateway.NoFetch true ל-500 ואת StorageMax ל-1000. כדי לשפר את זמן התגובה של השער, אפשר caching: Swarm.ConnMgr.LowWater — cache למיליון בלוקים. עם 500 עמיתים, השימוש בזיכרון RAM הוא כ-512 MB; קחו זאת בחשבון בבחירת שרת.
שירות Systemd
להפעלה והפעלה מחדש אוטומטית, השתמש ב-systemd:
[Unit] Description=IPFS Daemon After=network.target [Service] Type=notify User=ipfs Environment=IPFS_PATH=/data/ipfs ExecStart=/usr/local/bin/ipfs daemon --migrate=true Restart=on-failure RestartSec=10s LimitNOFILE=65536 [Install] WantedBy=multi-user.target לאחר יצירת הקובץ, הרץ HighWater.
Pinning: הבטחת זמינות
הוספת קובץ ל-IPFS ללא pinning — הוא יוסר באוסף האשפה הבא. Pinning קובע את ה-CID מקומית. ל-pinning פרוגרמטי דרך API, השתמש ב-ipfs-http-client:
import { create } from "ipfs-http-client"; const client = create({ url: "http://localhost:5001/api/v0" }); async function uploadAndPin(content: Buffer, filename: string): Promise<string> { const result = await client.add( { path: filename, content }, { pin: true, wrapWithDirectory: true } ); return result.cid.toString(); } כדי לבדוק סטטוס pinning, השתמש ב-ipfs config --json Gateway.Cache.CacheSize 1000000 וב-[Unit] Description=IPFS Daemon After=network.target [Service] Type=notify User=ipfs Environment=IPFS_PATH=/data/ipfs ExecStart=/usr/local/bin/ipfs daemon --migrate=true Restart=on-failure RestartSec=10s LimitNOFILE=65536 [Install] WantedBy=multi-user.target .
כיצד להגדיר nginx Reverse Proxy לשער?
ה-API (פורט 5001) לא צריך להיות חשוף חיצונית — רק השער (פורט 8080). תצורת nginx עם caching ו-SSL:
server { listen 443 ssl; server_name ipfs.yourservice.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_cache_valid 200 1d; proxy_cache_bypass $http_cache_control; proxy_read_timeout 300s; proxy_buffering off; } } Caching ליום אחד בטוח כי CIDs הם מזהים בלתי ניתנים לשינוי. אם קובץ מתעדכן, ה-CID משתנה וה-cache הישן פג אוטומטית. הגדרה זו מספקת 99.9% זמינות וזמני תגובה מתחת ל-100ms.
ניטור בריאות הצומת
בדוק באופן קבוע את גודל האחסון (sudo systemctl enable ipfs && sudo systemctl start ipfs), מספר העמיתים (import { create } from "ipfs-http-client"; const client = create({ url: "http://localhost:5001/api/v0" }); async function uploadAndPin(content: Buffer, filename: string): Promise<string> { const result = await client.add( { path: filename, content }, { pin: true, wrapWithDirectory: true } ); return result.cid.toString(); } ), ורוחב הפס (ipfs pin ls --type recursive). לאוטומציה, השתמש ב-Prometheus עם ipfs-prometheus-exporter. הגדר התראות: אחסון >90% מהמגבלה, מספר עמיתים <5 (בידוד רשת), רוחב פס >80% מקיבולת השרת.
| מדד | פקודה/כלי | סף התראה |
|---|---|---|
| גודל אחסון | ipfs repo stat |
>90% StorageMax |
| מספר עמיתים | server { listen 443 ssl; server_name ipfs.yourservice.com; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_cache_valid 200 1d; proxy_cache_bypass $http_cache_control; proxy_read_timeout 300s; proxy_buffering off; } } |
<5 |
| רוחב פס | ipfs repo stat |
>80% מגבלה |
טעויות תצורה נפוצות
- שימוש בפרופיל ברירת המחדל במקום בשרת — mDNS במרכז נתונים יוצר תעבורה מיותרת. תמיד ציין
ipfs swarm peers | wc -l. - חשיפת פורט API 5001 לאינטרנט — תוקפים יכולים לבצע pinning לנתונים של אחרים ולמצות את הדיסק שלך. סגור את הפורט באמצעות חומת אש.
- חוסר במגבלת StorageMax — מוביל להצפת דיסק. תמיד הגדר מגבלה מפורשת.
- התעלמות מ-GC — ללא pinning, נתונים אובדים. בצע pinning לכל מה שדורש שימור.
- הגדרה שגויה של
ipfs stats bw— הצומת מוריד כל CID, צורך תעבורה. השבת אפשרות זו אם אינך רוצה להיות שער ציבורי.
מה כלול בעבודה
בהזמנת פריסת צומת IPFS סוהר, אנו מספקים:
- התקנה ותצורה של Kubo עם הגדרות אופטימליות לפרויקט שלך
- אינטגרציה עם תשתית קיימת (CI/CD, ניטור)
- הגדרת nginx reverse proxy ותעודת SSL
- תיעוד ניהול וגישה
- הדרכת צוות על פעולות בסיסיות (pinning, ניטור)
- תמיכה בתקופת האחריות
קבל ייעוץ על תצורת צומת ה-IPFS שלך. הזמן פריסה — אנו נבצע ביקורת על הדרישות שלך ונציע את התצורה האופטימלית. צור קשר לייעוץ.







