SeaweedFS
אחסון אובייקטים תואם S3 באירוח עצמי, כתוב ב-Go ברישיון Apache-2.0. container אחד מגיש את ה-API של S3 לגיבויים, להעלאות של אפליקציות ולמדיה. מתאים לשרת יחיד שצריך buckets משלו במקום bucket בענן.
משאבים לפי רמת עומס
מה האפליקציה עצמה צריכה בכל רמה, לצד מה שאנחנו ממליצים לשרת שמריץ רק אותה.
| רמה | מה זה אומר | דרישות האפליקציה | מומלץ |
|---|---|---|---|
| קלהערכה | עד 50 GiB שמורים, כ-250,000 אובייקטים בכמה buckets, עד 5 העברות בו-זמנית (גיבויים של כמה מחשבים, העלאות של אפליקציה אחת). | 0.5 vCPU · 0.5 GiB RAM · 64 GiB דיסק | 0.72 vCPU · 2.1 GiB RAM · 82.915 GiB דיסק |
| בינוניהערכה | עד 500 GiB שמורים, כ-2 מיליון אובייקטים, עד 20 העברות בו-זמנית (כמה אפליקציות וגיבויי לילה של משרד קטן). | 1 vCPU · 1 GiB RAM · 626 GiB דיסק | 1.32 vCPU · 2.7 GiB RAM · 729.215 GiB דיסק |
| כבדהערכה | עד 2,000 GiB שמורים, כ-10 מיליון אובייקטים, עד 50 העברות בו-זמנית, עדיין צומת אחד בלי replication. | 2 vCPU · 2 GiB RAM · 2,501 GiB דיסק | 2.52 vCPU · 3.9 GiB RAM · 2,885.465 GiB דיסק |
מומלץ = דרישות האפליקציה + baseline של המערכת + מרווח ביטחון (headroom), לפי מדיניות ה-sizing 2026.10.0. האפשרויות נשארות בברירת המחדל. ״הערכה״ פירושה שהמקורות לא נותנים מספר למקרה הזה, ולכן הוא מחושב מהם בשיטה שמפורטת תחת רכיבים. איך המספרים נבנים
קבצים מוכנים להפעלה
רמת תמיכה נתמך
תבנית Compose מהמקורות הרשמיים; עוד לא נבדקה בהרצה.
רכיבים
מה כל רכיב צריך בכל רמת עומס, לפני baseline ו-headroom.
| רכיב | קל | בינוני | כבד | מקורות |
|---|---|---|---|---|
| SeaweedFS (weed mini) (app) | 0.5 / 0.5 / 64 | 1 / 1 / 626 | 2 / 2 / 2,501 | [1][5][6][19][20][22][34][36] |
איך ההערכות מחושבות
- SeaweedFS (weed mini) · קל: אין מספר כולל רשמי ל-mini. RAM: אינדקס של כ-20 B לקובץ × 250,000 = 5 MB, קריאות 5 × chunks של 4 MB = 20 MB, ועוד כ-0.2 GiB משוערים ל-runtime של Go של master, volume, filer, S3, admin ו-worker בתהליך אחד; ×2 למרווח ה-GC של Go ← 0.5 GiB. vCPU: בדיקות SigV4 ו-ETag של MD5 לכל העלאה ← חצי ליבה. Disk: image דחוס 193,556,478 B (0.18 GiB) ועוד 529,553,408 B פרוס (0.493 GiB), ה-containerd store שומר את שניהם = 0.673 GiB; הנתונים השמורים ×1.25 למקום של מחיקות שעוד לא עברו vacuum (volume נדחס ב-30% זבל) ול-metadata של ה-filer (מרווח משוער). 0.673 ועוד 50 × 1.25 = 63.2 ← 64.
- SeaweedFS (weed mini) · בינוני: RAM: אינדקס 20 B × 2,000,000 = 40 MB, 20 קריאות ו-20 העלאות × chunks של 4 MB = 160 MB, runtime 0.2 GiB ← כ-0.4 GiB בשימוש, ×2 ל-GC של Go ← 0.8, מעוגל ל-1 GiB בשביל ה-caches של LevelDB ב-filer. vCPU: ליבה אחת לבדיקת חתימות, ל-hashing ול-vacuum ברקע. Disk: image דחוס 193,556,478 B (0.18 GiB) ועוד 529,553,408 B פרוס (0.493 GiB), ה-containerd store שומר את שניהם = 0.673 GiB; הנתונים השמורים ×1.25 למקום של מחיקות שעוד לא עברו vacuum (volume נדחס ב-30% זבל) ול-metadata של ה-filer (מרווח משוער). 0.673 ועוד 500 × 1.25 = 625.7 ← 626.
- SeaweedFS (weed mini) · כבד: RAM: אינדקס 20 B × 10,000,000 = 200 MB (אינדקס leveldb, לפי הויקי, מקטין אותו), 50 קריאות ו-50 העלאות × 4 MB = 400 MB, runtime 0.2 GiB ← כ-0.8 GiB בשימוש, ×2 ל-GC של Go ← 1.6, מעוגל ל-2 GiB. vCPU: שתי ליבות ל-hashing בקצב גבוה יותר ול-vacuum ו-compaction של volumes בגודל 1 GiB. Disk: image דחוס 193,556,478 B (0.18 GiB) ועוד 529,553,408 B פרוס (0.493 GiB), ה-containerd store שומר את שניהם = 0.673 GiB; הנתונים השמורים ×1.25 למקום של מחיקות שעוד לא עברו vacuum (volume נדחס ב-30% זבל) ול-metadata של ה-filer (מרווח משוער). 0.673 ועוד 2,000 × 1.25 = 2,500.7 ← 2,501.
פורטים
פורטים ציבוריים נועדו לגישה מחוץ ל-stack, בדרך כלל דרך reverse proxy; פורטים פנימיים נשארים ברשת של ה-stack עצמו.
| רכיב | פורט | חשיפה | שימוש | מקורות |
|---|---|---|---|---|
| SeaweedFS (weed mini) | 8333/tcp | ציבורי, דרך proxy | S3 API (SigV4, path-style) and the /healthz probe; serve only through an HTTPS reverse proxy | [1][6][8] |
| SeaweedFS (weed mini) | 9333/tcp | פנימי בלבד | Master HTTP API and UI (volume assignment); no authentication | [6][25] |
| SeaweedFS (weed mini) | 19333/tcp | פנימי בלבד | Master gRPC (HTTP port + 10000); mutual TLS only when configured | [6][25] |
| SeaweedFS (weed mini) | 9340/tcp | פנימי בלבד | Volume server HTTP (object data); writes unprotected without a JWT signing key | [6][25] |
| SeaweedFS (weed mini) | 19340/tcp | פנימי בלבד | Volume server gRPC (HTTP port + 10000) | [6][25] |
| SeaweedFS (weed mini) | 8888/tcp | פנימי בלבד | Filer HTTP API and UI; reads and writes every file without auth unless JWT keys are set | [6][25] |
| SeaweedFS (weed mini) | 18888/tcp | פנימי בלבד | Filer gRPC (HTTP port + 10000), used by the S3 gateway | [6][25] |
| SeaweedFS (weed mini) | 18333/tcp | פנימי בלבד | S3 gateway gRPC (HTTP port + 10000) | [6] |
| SeaweedFS (weed mini) | 23646/tcp | פנימי בלבד | Admin server; with -admin.ui=false only /health and /metrics | [6][11] |
| SeaweedFS (weed mini) | 33646/tcp | פנימי בלבד | Admin worker gRPC (HTTP port + 10000) for the maintenance worker; no password auth | [6][28] |
משתמש והרשאות (UID/GID)
המשתמש שהתהליך של כל קונטיינר רץ תחתיו, והנתיבים שהוא כותב אליהם. bind mount לאחד הנתיבים האלה חייב להיות ניתן לכתיבה על ידי ה-UID:GID הזה.
| רכיב | UID:GID | משתמש | מתחיל כ-root | כותב אל | מקורות |
|---|---|---|---|---|---|
| SeaweedFS (weed mini) | 1000:1000 | seaweed | כן, מכין את התיקיות שלו ואז עובר למשתמש הזה | /data | [4][5][12] |
- SeaweedFS (weed mini): אין USER ב-image: entrypoint.sh מתחיל כ-root, מעביר את /data לבעלות seaweed (1000:1000) רק כשהבעלים שונה, ויורד להרשאות עם su-exec. לכן bind mount של /data לא צריך chown ידני.
צמיחת אחסון
בכמה הנתונים של כל רכיב גדלים בחודש בכל רמת עומס, מעבר לדיסק שבפרופיל. ערך שמסומן ״הנחה״ הוא הנחה מוצהרת של ANAROQ ולא מספר מהמקורות; ההערות מפרטות על מה היא נשענת.
על מה מספרי הצמיחה נשענים
- SeaweedFS (weed mini): הגידול הוא מה שהלקוחות מעלים פחות מה שהם מוחקים; SeaweedFS לא מוחק דבר בעצמו (לא מוגדר lifecycle rule). העלאה נטו משוערת: 2, 20 ו-80 GiB בחודש. אובייקטים שנמחקו מפנים מקום רק כש-vacuum דוחס volume עם 30% זבל (נבדק כל 840 שניות).
שדרוג וחזרה לאחור
איך עוברים לגרסה חדשה בבטחה, ואיך חוזרים אחורה אם משהו נכשל.
קודם גיבוי
עוצרים את ה-container (docker compose stop seaweedfs) ומעתיקים את כל ה-volume של /data: קובצי .dat/.idx של ה-volumes, ה-metadata של ה-filer ב-LevelDB, מצב ה-master וקובצי המפתחות .mini_*. הנתונים וה-metadata חייבים להיות מאותו רגע. [6][21][27]
שלבי השדרוג
- קודם מגבים את /data (ראו גיבוי). אחר כך מגדירים בקובץ ה-Compose את ה-tag המוצמד החדש ומריצים docker compose pull ו-docker compose up -d. נשארים על ה-tag הרגיל: גרסאות _large_disk משתמשות בפורמט אינדקס אחר ולא יכולות לעבוד על אותם נתונים. [20][35]
- בודקים את docker compose logs seaweedfs ואת בדיקת /healthz, ואז מציגים את התוכן של bucket מלקוח S3. ברירות המחדל של mini (גודל volume, פורטים, שירותים מובנים) יכולות להשתנות בין גרסאות, ולכן משווים את הדגלים ב-mini.go החדש. [1][6][8]
חזרה לאחור
עוצרים את ה-stack, משחזרים את העותק של /data שנלקח לפני השדרוג, מצמידים את ה-tag הקודם ומריצים docker compose up -d. [20][27]נגזרה-FAQ מבטיח שדרוגים תואמים לאחור אבל לא מתעד downgrade, ולכן לא מניחים שהרצת binary ישן על נתונים שגרסה חדשה כתבה היא בטוחה; שחזור העותק כן.
שינויים שוברים ידועים
- בגרסה 4.41: mini ו-master שולחים כברירת מחדל סטטיסטיקות אנונימיות של ה-cluster ל-telemetry.seaweedfs.com (קודם: כבוי). מבטלים עם -master.telemetry=false, כמו בתבנית. [6][33]נגזרה-release notes לא היו נגישים מסביבת המחקר; נלקח מברירת המחדל של הדגל ב-mini.go בגרסה 4.40 (false) וב-4.41 (true).
- בגרסה 4.23: פקודת ברירת המחדל של ה-image הפכה ל-mini -dir=/data (קודם: בלי פקודה, וה-container היה צריך פקודה כמו server). קובצי Compose שמעבירים פקודה משלהם לא מושפעים. [32]נגזרנלקח מ-docker/Dockerfile.go_build בגרסאות 4.22 ו-4.23; ה-release notes לא היו נגישים.
- בגרסה 4.00: ה-image הפסיק לרוץ כ-root: 4.00 הגדיר USER seaweed (uid 1000), ולכן נתונים שגרסה 3.x כתבה כ-root לא נפתחו. מאז 4.01 ה-entrypoint מתחיל כ-root ומעביר קודם את /data לבעלותו; משדרגים מ-3.x ישירות ל-4.01 ומעלה. [30][31]נגזרנלקח מ-docker/Dockerfile.go_build בגרסאות 3.99 ו-4.00 ומ-docker/entrypoint.sh בגרסה 4.01; ה-release notes לא היו נגישים.
מגבלות
- צומת אחד בלי replication: weed mini מריץ master יחיד ושומר עותק אחד של כל אובייקט, ולכן דיסק שנכשל מאבד נתונים. מגינים על /data עם RAID או גיבויים; multi-master ו-replication דורשים את ההתקנה מרובת הרכיבים. [1][6]
- הלקוחות צריכים כתובות path-style (https://host/bucket/key): התבנית לא מגדירה -s3.domainName, ולכן כתובות bucket.host לא מנותבות. לרוב ה-SDKs ול-rclone יש הגדרת force-path-style. [8][13]
- ה-API של S3 מכסה buckets, אובייקטים, multipart, versioning, object lock ו-lifecycle, אבל לא bucket notifications, bucket replication, SelectObjectContent או Object Lambda; כדאי לבדוק את רשימת ה-API בויקי לפני שמסתמכים על יכולת. [23][24]
- בתבנית יש זהות admin אחת ממשתני סביבה, עם גישה מלאה לכל ה-buckets. משתמשים מוגבלים דורשים weed shell (s3.configure) או קובץ -s3.config, ומפתחות הסביבה משתנים רק בהפעלה מחדש. [1][15]
- מאחורי reverse proxy ההעלאות צריכות לעבור ב-streaming: request buffering שובר חתימות SigV4 של chunked, ומגבלת גודל גוף מגבילה את גודל האובייקט. Caddy עובד ב-streaming כברירת מחדל. [13]
אבטחה
- בלי AWS_ACCESS_KEY_ID ו-AWS_SECRET_ACCESS_KEY שער ה-S3 רץ במצב Allow-All ומקבל בקשות לא חתומות. התבנית הופכת את שניהם לחובה; אסור להסיר אותם מ-.env. [1][7][15]
- רק פורט 8333 מאומת ב-S3. פורטי ה-HTTP של ה-master (9333), ה-volume (9340) וה-filer (8888) ופורטי ה-gRPC הם בלי התחברות ולא מפורסמים, אבל containers באותה רשת Docker יכולים להגיע אליהם; במצב caddy או proxy-network זה כולל את רשת ה-proxy. [6][25]
- כדי לסגור את פורטי ה-HTTP של ה-filer וה-volume, הויקי מתעד מפתחות JWT כמשתני סביבה (WEED_JWT_SIGNING_KEY, WEED_JWT_FILER_SIGNING_KEY וגרסאות ה-_READ_ שלהם), ששער ה-S3 משתמש בהם. לא בתבנית; כדאי לבדוק לפני שמסתמכים על זה. [25][26]
- ה-Admin UI כבוי: בלי סיסמה, ה-UI ונתיבי /api שלו פתוחים לכל מי שמגיע לפורט 23646. כדי להפעיל אותו מגדירים WEED_ADMIN_PASSWORD, מסירים את -admin.ui=false וניגשים אליו רק דרך SSH tunnel. [11][28][29]
- ה-images חתומים ב-cosign מספטמבר 2026; מאמתים את chrislusf/seaweedfs:4.48 מול זהות ה-workflow של ה-release שב-docker/README.md ופורסים לפי ה-digest שנבדק. [18]
גיבוי
- הגיבוי העקבי הפשוט ביותר: לעצור את ה-container ולהעתיק את כל ה-volume של /data, או לסנכרן כל bucket ליעד S3 אחר בלקוח S3 בזמן שהוא רץ. שומרים את הקבצים .mini_sse_kek ו-.mini_kek_passphrase: אי אפשר לקרוא אובייקטי SSE-S3 בלעדיהם. [6][27]
- קובצי ה-volume וה-metadata של ה-filer חייבים להתאים: הויקי משלב weed backup של כל volume עם fs.meta.save של ה-metadata, בזמן שהכתיבה מושהית. עותק של ה-volumes לבד לא משחזר את שמות האובייקטים. [27]
גרסה אחרונה
- הגרסה האחרונה של הפרויקט
- SeaweedFS 4.48 [35]
- הפרופיל נבדק מול
SeaweedFS 4.48
הפרופיל נבדק מול הגרסה האחרונה.
- נבדק ב-
- 14 באוק׳ 2026
- מצב
- נבדק ב-90 הימים האחרונים
- איפה הגרסאות מתפרסמות
- תגיות ב-Docker Hub
גרסה
- סטטוס הפרופיל
- פורסם
- נבדק מול גרסה
- SeaweedFS 4.48
- גרסת הפרופיל
- 1.0.0
- המספרים אומתו
- 14 באוק׳ 2026
- גרסת הקטלוג
- 2026.10.10
- מדיניות sizing
- 2026.10.0
- קובץ Compose
- לא אומת
הפרויקט וחלופות
- האתר הרשמי
- github.com/seaweedfs/seaweedfs
- קוד מקור
- github.com/seaweedfs/seaweedfs
מקורות
- SeaweedFS wiki: Quick Start with weed mini (docker run with /data, AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY, S3_BUCKET; no keys = Allow All; -s3.externalUrl behind a proxy) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Docker Compose for S3 (weed server -s3 with an inline config.json, port 8333, no data volume) (Compose רשמי · נקרא 14 באוק׳ 2026)
- docker/seaweedfs-compose.yml at 4.48: one container per component (master, volume, filer, s3, webdav), untagged image (Compose רשמי · נקרא 14 באוק׳ 2026)
- docker/Dockerfile.go_build at 4.48: Alpine, curl installed, user seaweed (1000:1000), VOLUME /data, ENTRYPOINT /entrypoint.sh, CMD mini -dir=/data, no HEALTHCHECK (מאגר רשמי · נקרא 14 באוק׳ 2026)
- docker/entrypoint.sh at 4.48: as root, chown -R /data to seaweed when ownership differs, then su-exec seaweed; mini adds -dir=/data unless given (מאגר רשמי · נקרא 14 באוק׳ 2026)
- weed/command/mini.go at 4.48: ports 8333/9333/9340/8888/23646 (gRPC +10000), -webdav, -admin.ui, -s3.port.iceberg/lance, -master.telemetry (on), auto volume size (מאגר רשמי · נקרא 14 באוק׳ 2026)
- weed/s3api/auth_credentials.go at 4.48: AWS_ACCESS_KEY_ID + AWS_SECRET_ACCESS_KEY add a static admin identity; auth is enforced once any identity exists (מאגר רשמי · נקרא 14 באוק׳ 2026)
- weed/s3api/s3api_server.go at 4.48: /status, /healthz and /readyz probes; -domainName for virtual-host style; a host-less path-style route always registered (מאגר רשמי · נקרא 14 באוק׳ 2026)
- weed/s3api/s3api_status_handlers.go at 4.48: StatusHandler answers 200 with an empty body (מאגר רשמי · נקרא 14 באוק׳ 2026)
- weed/command/s3.go at 4.48: externalUrl falls back to the S3_EXTERNAL_URL env var and is tried first when verifying signatures behind a proxy (מאגר רשמי · נקרא 14 באוק׳ 2026)
- weed/admin/handlers/admin_handlers.go at 4.48: /health and /metrics without auth; with the UI disabled no other route; without a password every UI and /api route is public (מאגר רשמי · נקרא 14 באוק׳ 2026)
- Registry config of chrislusf/seaweedfs:4.48 (linux/amd64): no User, Entrypoint /entrypoint.sh, Cmd mini -dir=/data, Volumes /data, 8 ExposedPorts, no Healthcheck (מדידה · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: S3 Nginx Proxy (SigV4 signs the Host header; X-Forwarded-Host or -s3.externalUrl; no request buffering; path or virtual-host style) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: WebDAV (current implementation does not enforce authentication yet) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: S3 Credentials (env vars give one global admin, restart to change them; Allow-All mode until any credential exists; config file, filer or weed shell for more users) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS README at 4.48: blob store with O(1) disk reads, filer, S3 gateway; compares itself with MinIO, which it says ceased development on Apr 25, 2026 (מאגר רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS LICENSE at 4.48: Apache License 2.0 (image label Apache-2.0) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- docker/README.md at 4.48: images on Docker Hub and ghcr.io signed with cosign (keyless) since September 2026 (מאגר רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Optimization (in-memory index about 20 bytes per file; memory for concurrent reads = file or chunk size × readers; leveldb index variants) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: FAQ (16 bytes per index entry, 17 in large_disk builds, which cannot be mixed with standard ones; upgrades backward compatible unless noted) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Production Setup (leveldb index for many volumes; filer.toml leveldb2 store keeps metadata on local disk and supports one filer) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Volume Management (maintenance worker script every 17 min: volume.deleteEmpty, s3.clean.uploads -timeAgo=24h for unfinished multipart uploads) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Amazon S3 API (supported operations: buckets, objects, multipart, versioning, object lock and retention, lifecycle without transition rules) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Supported APIs vs MinIO (no bucket notifications, bucket replication, SelectObjectContent or Object Lambda) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Security Overview (master HTTP unsecured; filer HTTP and volume writes secured only with JWT keys; gRPC with mutual TLS) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Security Configuration (security.toml values as WEED_* env vars, e.g. WEED_JWT_SIGNING_KEY and WEED_JWT_FILER_SIGNING_KEY) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Data Backup (weed backup per volume, fs.meta.save for filer metadata; volumes and metadata must be copied while writes are paused) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- SeaweedFS wiki: Admin UI (adminPassword enables login; worker gRPC has no password auth; WEED_ADMIN_* env vars) (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- weed/command/admin.go at 4.48: admin interface password, if empty auth is disabled; startAdminServer serves the routes on the given ip (מאגר רשמי · נקרא 14 באוק׳ 2026)
- docker/Dockerfile.go_build at 4.00: USER seaweed (uid 1000) added, image no longer runs as root; 3.99 had no USER (מאגר רשמי · נקרא 14 באוק׳ 2026)
- docker/entrypoint.sh at 4.01: starts as root, chowns /data to seaweed when needed, then su-exec (USER line removed from the Dockerfile) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- docker/Dockerfile.go_build at 4.23: first release with CMD mini -dir=/data (4.22 has no CMD, a command had to be given) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- weed/command/mini.go at 4.41: -master.telemetry defaults to true (anonymous cluster statistics; 4.40 defaulted to false) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- Docker Hub tag chrislusf/seaweedfs:4.48 (linux/amd64): 193,556,478 B compressed; 10 layers decompressed and counted: 529,553,408 B (מדידה · נקרא 14 באוק׳ 2026)
- Docker Hub tags of chrislusf/seaweedfs (4.48 newest release on 2026-10-14, pushed 2026-09-28; dev is an unreleased build; _large_disk and _full are variants) (מאגר רשמי · נקרא 14 באוק׳ 2026)
- Docker: containerd image store is the default on fresh Engine 29+ installs and keeps images compressed and uncompressed (תיעוד רשמי · נקרא 14 באוק׳ 2026)
- Amazon Web Services: Amazon S3 pricing (hosted object storage) (תיעוד רשמי · נקרא 14 באוק׳ 2026)