[{"data":1,"prerenderedAt":134},["ShallowReactive",2],{"seo-verification":3,"blog-استضافة-garage-على-خادم-vps-تخزين-كائنات-s3-يملكه-أنت-ma-ar":6,"promo-bar-likely":133},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-استضافة-garage-على-خادم-vps-تخزين-كائنات-s3-يملكه-أنت-ma-ar",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":128,"ctaBody":129,"ctaButton":130,"ctaUrl":131,"relatedPosts":132},245,"استضافة-garage-على-خادم-vps-تخزين-كائنات-s3-يملكه-أنت",{"fr":12,"en":13,"ar":10,"es":14},"heberger-garage-s3-vps","host-garage-on-a-vps-s3-object-storage-that-belongs-to-you","alojar-garage-s3-en-un-vps","استضافة ‎Garage على خادم ‎VPS: مساحة تخزين ‎S3 خاصة بك","نشر ‎Garage على ‎VPS للحصول على ‎storage bucket متوافق مع ‎S3 — نسخ احتياطية وملفات تطبيقات ومواقع ثابتة — دون الاعتماد على سحابة خارجية.",9,3,false,"2026-08-10T00:00:00+00:00","2026-11-08T01:13:16+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},7,"الاستضافة الذاتية","self-hosting","bg-indigo-500\u002F10 text-indigo-400","cloud",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fheberger-garage-s3-vps-poster.svg",{"categorySlug":34,"appSlug":35},"قواعد-البيانات","garage","تريد مساحة تخزين ‌S3 خاصة بك — للنسخ الاحتياطية عبر ‌restic، أو ملفات تطبيق ما، أو أصل موقع ثابت — دون فتح حساب لدى مزود سحابي. ‌Garage، الذي طوّره مجمع ‌Deuxfleurs، يؤدي هذه المهمة تحديداً: ملف ثنائي وحيد مكتوب بلغة ‌Rust يكشف واجهة برمجية متوافقة مع ‌S3، خفيف بما يكفي للعمل جنباً إلى جنب مع بقية خدمات الخادم. يأخذك هذا الدليل من الصفر حتى رفع أول ملف، ثم يغطي حالات الاستخدام الشائعة والمزالق الحقيقية التي يجب تجنبها.",[38,42,52,55,58,77,80,89,121,125],{"type":39,"title":40,"body":41},"h2","ما هو ‌Garage وما ليس عليه","‌Garage هو مخزن كائنات متوافق مع ‌S3 مصمم للنشر الذاتي الصغير الحجم، مع إمكانية التوزيع عبر مواقع متعددة. يعمل داخل حاوية، ولا يحتاج إلى قاعدة بيانات مجاورة، ويستهدف المشروع عتادًا متواضعًا: متطلباته الرسمية تكتفي بـ1 غيغابايت من الذاكرة.\n\nما ليس عليه، ينبغي قوله صراحةً: **‌Garage لا يدمج واجهة ويب بعد**. تمر الإدارة عبر أداة سطر الأوامر `garage` وواجهة برمجية للإدارة عبر ‌HTTP. تختبر ‌Deuxfleurs واجهة إدارة في المتصفح، ‌Garage Web Admin، تُنشر منفصلةً كإصدار تجريبي ومن المقرر دمجها في الملف الثنائي. وتقدم مشاريع مجتمعية أيضًا واجهة في المتصفح فوق واجهة الإدارة لمن يحتاجها.\n\nإن كنت تبحث عن هذه النقطة تحديداً لأن ‌MinIO سحبت واجهتها من الإصدار المجتمعي عام 2025 — ثم توقفت عن نشر صور ‌Docker المجتمعية وأرشفت مستودعها — فالجواب الصريح هو أن ‌Garage لا يقدم لك اليوم واجهة مدمجة مماثلة. لكنه يمنحك مشروعاً رخصته ‌AGPLv3 لا تحجب أي ميزة خلف إصدار مدفوع.",{"type":43,"title":44,"items":45},"ul","ما يتميز به ‌Garage على خادم ‌VPS",[46,47,48,49,50,51],"**واجهة ‌S3 قياسية**: متوافقة مع ‌`aws` ‌CLI و‌`rclone` و‌`mc` و‌`restic` وحزم ‌SDK لـ‌Python\u002FGo\u002FRust وجميع عملاء ‌S3 تقريباً.","**بصمة متواضعة**: يستهدف المشروع عتادًا متواضعًا — تتعايش دون احتكاك مع خادم ويب أو قاعدة بيانات أو بروكسي عكسي على نفس الـ‌VPS.","**لا اعتمادية خارجية**: لا ‌PostgreSQL ولا ‌Redis ولا ‌etcd. محرك البيانات الوصفية مدمج (‌LMDB أو ‌SQLite).","**نسخ احتياطي اختياري**: في وضع العقدة الواحدة يكفي قرص واحد؛ في الوضع متعدد العقد يُكرر ‌Garage الكائنات بين الأجهزة وعبر المواقع.","**رخصة ‌AGPLv3 بلا قيود**: لا ميزة محجوبة خلف إصدار مدفوع ولا حد على الحجم أو عدد الدلاء.","**نطاقات فرعية افتراضية**: يدير ‌Garage توجيه `\u003Cbucket>.s3.your-domain.com`، وهو ما تتطلبه بعض عملاء ‌S3 وحزم ‌SDK.",{"type":39,"title":53,"body":54},"المتطلبات الأولية: تحديد حجم الـ‌VPS لـ‌storage bucket","‌Garage بحد ذاته خفيف — ما يحدد حجم القرص هو **حجم البيانات** التي تخزنها، لا الخدمة. يكفي ‌VPS من الفئة الابتدائية لتشغيل العملية. لأعباء العمل الشائعة (نسخ احتياطية، أصول موقع):\n\n- **المعالج**: يكفي ‌vCPU واحد؛ ‌Garage خفيف على الحوسبة.\n- **الذاكرة**: 1 غيغابايت، وهي القيمة الواردة في المتطلبات الرسمية للمشروع؛ يحتفظ محرك ‌LMDB بفهرسه في ملفات مُعيَّنة على الذاكرة.\n- **القرص**: ‌SSD NVMe بحجم بياناتك مضافاً إليه 20 ‌% هامشاً للبيانات الوصفية. العقدة الواحدة تحتفظ بـ**نسخة واحدة** فقط من كائناتك — خطط وفق ذلك.\n- **نظام التشغيل**: ‌Debian 12 أو ‌Ubuntu 22.04 ‌LTS مع ‌Docker وملحق ‌Compose.\n\nلتثبيت ‌Docker بأمر واحد:\n\n```bash\ncurl -fsSL https:\u002F\u002Fget.docker.com | sh\n```",{"type":39,"title":56,"body":57},"الإعداد الأدنى لـ‌storage bucket","يقرأ ‌Garage ملف `garage.toml`. للعقدة المنفردة، تكفي بضعة أسطر — لاحظ `replication_factor = 1` الذي يُفصح صراحةً بغياب النسخ الاحتياطي:\n\n```toml\nmetadata_dir = \"\u002Fvar\u002Flib\u002Fgarage\u002Fmeta\"\ndata_dir = \"\u002Fvar\u002Flib\u002Fgarage\u002Fdata\"\ndb_engine = \"sqlite\"\nreplication_factor = 1\n\nrpc_bind_addr = \"[::]:3901\"\nrpc_public_addr = \"127.0.0.1:3901\"\nrpc_secret = \"\u003C64 حرفاً سداسي عشري>\"\n\n[s3_api]\ns3_region = \"garage\"\napi_bind_addr = \"[::]:3900\"\nroot_domain = \".s3.your-domain.com\"\n\n[admin]\napi_bind_addr = \"[::]:3903\"\nadmin_token = \"\u003Cرمز الإدارة>\"\n```\n\nيجب أن يتكون `rpc_secret` من 32 بايت أي 64 حرفاً سداسي عشري: `openssl rand -hex 32`.",{"type":59,"title":60,"steps":61},"steps","نشر ‌Garage وإنشاء أول ‌bucket تخزين ‌S3",[62,65,68,71,74],{"title":63,"body":64},"إنشاء هيكل المجلدات","أنشئ مجلد عمل وملف الإعداد:\n\n```bash\nmkdir -p \u002Fopt\u002Fgarage\u002Fconfig\nopenssl rand -hex 32   # → الصقه في rpc_secret\nopenssl rand -base64 32 | tr -d '=' | head -c 40  # → admin_token\n\n# معرّفات S3 للدلو الافتراضي، في ملف .env لا يقرؤه سوى root\ncd \u002Fopt\u002Fgarage && umask 077\nprintf 'GARAGE_DEFAULT_ACCESS_KEY=GK%s\\nGARAGE_DEFAULT_SECRET_KEY=%s\\n' \"$(openssl rand -hex 12)\" \"$(openssl rand -hex 32)\" > .env\n```\n\nاكتب `garage.toml` في `\u002Fopt\u002Fgarage\u002Fconfig\u002F` مع استبدال الرمزين المولَّدَين.",{"title":66,"body":67},"كتابة ملف ‌Compose وتشغيله","منذ الإصدار 2.3، يستطيع ‌Garage تهيئة مجموعة عقدة واحدة وإنشاء أول دلو تلقائياً من متغيرات البيئة. هذا يتجنب تسلسل الأوامر اليدوية `layout assign` \u002F `layout apply` \u002F `bucket create` \u002F `key create`:\n\n```yaml\nservices:\n  garage:\n    image: dxflrs\u002Fgarage:v2.5.0\n    restart: unless-stopped\n    command: [\"\u002Fgarage\", \"-c\", \"\u002Fetc\u002Fgarage\u002Fgarage.toml\", \"server\", \"--single-node\", \"--default-bucket\"]\n    environment:\n      GARAGE_DEFAULT_BUCKET: my-bucket\n      GARAGE_DEFAULT_ACCESS_KEY: ${GARAGE_DEFAULT_ACCESS_KEY}\n      GARAGE_DEFAULT_SECRET_KEY: ${GARAGE_DEFAULT_SECRET_KEY}\n    ports:\n      - \"127.0.0.1:3900:3900\"\n      - \"127.0.0.1:3903:3903\"\n    volumes:\n      - .\u002Fconfig:\u002Fetc\u002Fgarage\n      - garage-meta:\u002Fvar\u002Flib\u002Fgarage\u002Fmeta\n      - garage-data:\u002Fvar\u002Flib\u002Fgarage\u002Fdata\n\nvolumes:\n  garage-meta:\n  garage-data:\n```\n\nالصورة **‌distroless**: لا توجد قشرة أوامر ونقطة الدخول فارغة. يجب أن تُسمّي الأمرُ الملفَّ الثنائيَّ بمساره المطلق (`\u002Fgarage`) وتمرّر ملف الإعداد (`-c`).\n\nيأتي المعرّفان من ملف `.env` المُنشأ في الخطوة السابقة، ويقرؤه ‌Compose تلقائيًا؛ فلا يُكتب أي سر صراحةً في الملف. الشكل `GK` متبوعًا بـ24 حرفًا سداسيًا عشريًا، مع سر من 64 حرفًا، هو شكل المفاتيح التي يولّدها ‌Garage؛ ومنذ الإصدار 2.3 يكفي أن يتألف المفتاح المستورد من 8 أحرف على الأقل وسره من 16 حرفًا على الأقل.\n\n```bash\ndocker compose up -d\n```",{"title":69,"body":70},"التحقق من استجابة الواجهة البرمجية","يجب أن يُعيد استدعاء مجهول على واجهة ‌S3 البرمجية **403** — العلامة الصحيحة على أن الخدمة تعمل وترفض الطلب غير الموقَّع:\n\n```bash\ncurl -s -o \u002Fdev\u002Fnull -w '%{http_code}\\n' http:\u002F\u002F127.0.0.1:3900\u002F\n# 403 → الواجهة البرمجية تستجيب\n```\n\nواجهة الإدارة تُعيد 200 بالرمز:\n\n```bash\ncurl -H \"Authorization: Bearer $ADMIN_TOKEN\" http:\u002F\u002F127.0.0.1:3903\u002Fv2\u002FListBuckets\n```",{"title":72,"body":73},"كشف الواجهة البرمجية خلف ‌nginx وشهادة ‌TLS","لا تنشر المنفذ 3900 مباشرةً على الواجهة العامة. اربطه بالحلقة المحلية ودع ‌nginx يتولى البروكسي والشهادة. كتلة ‌nginx أدنى لـ `s3.your-domain.com`:\n\n```nginx\nserver {\n    listen 443 ssl;\n    server_name s3.your-domain.com *.s3.your-domain.com;\n    ssl_certificate \u002Fetc\u002Fletsencrypt\u002Flive\u002Fs3.your-domain.com\u002Ffullchain.pem;\n    ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fs3.your-domain.com\u002Fprivkey.pem;\n    client_max_body_size 0;  # وإلا رفض nginx أي رفع يتجاوز 1 MB (413)\n    location \u002F {\n        proxy_pass http:\u002F\u002F127.0.0.1:3900;\n        proxy_set_header Host $host;\n        proxy_max_temp_file_size 0;\n    }\n}\n```",{"title":75,"body":76},"الاختبار بعميل ‌S3","مع تعيين متغيرات البيئة، تعمل أداة ‌`aws` ‌CLI دون تعديل:\n\n```bash\nexport AWS_ACCESS_KEY_ID=GK...\nexport AWS_SECRET_ACCESS_KEY=...\nexport AWS_DEFAULT_REGION=garage\n\naws --endpoint-url https:\u002F\u002Fs3.your-domain.com s3 ls\naws --endpoint-url https:\u002F\u002Fs3.your-domain.com s3 cp myfile.txt s3:\u002F\u002Fmy-bucket\u002F\n```\n\nلـ‌restic، عيّن `RESTIC_REPOSITORY=s3:https:\u002F\u002Fs3.your-domain.com\u002Fmy-bucket` وشغّل `restic init`.",{"type":39,"title":78,"body":79},"حالات الاستخدام الشائعة لـ‌storage bucket ذاتي الاستضافة","يغطي ‌storage bucket على ‌Garage عدة احتياجات شائعة دون الاعتماد على سحابة خارجية.",{"type":43,"title":81,"items":82},"ما يُنشر خلف ‌Garage",[83,84,85,86,87,88],"**نسخ احتياطية ‌restic**: عيّن `RESTIC_REPOSITORY=s3:https:\u002F\u002Fs3.your-domain.com\u002Fbackups`. التوافق مع ‌S3 في ‌restic أصيل ولا يتطلب إضافات؛ أما ‌Borg فلا يعرف في فرعه المستقر 1.4 سوى المستودعات المحلية أو عبر ‌SSH.","**أصل موقع ثابت**: خزّن أصول الواجهة الأمامية المُجمَّعة وقدّمها عبر ‌nginx أو ‌Cloudflare في وضع البروكسي.","**رفع ملفات التطبيقات**: تكتب تطبيقات ‌Laravel أو ‌Django أو ‌Rails إلى ‌Garage عبر حزمة ‌SDK الخاصة بها — لا يتغير سوى نقطة النهاية.","**إنتاج ‌CI\u002FCD**: ترفع ‌GitHub Actions أو ‌GitLab CI نتائج البناء إلى ‌Garage بـ‌`aws s3 cp` تماماً كما مع ‌S3 الخاص بـ‌AWS.","**أرشفة السجلات والمقاييس**: تستطيع ‌Loki وVector وFluentd الكتابة إلى مخزن كائنات متوافق مع ‌S3 للأرشفة طويلة الأمد.","**مشاركة الملفات بين الخدمات**: تصل حاويتان على نفس الـ‌VPS أو على نظامَين مختلفَين إلى نفس الدلو عبر واجهة ‌S3 البرمجية.",{"type":90,"title":91,"headers":92,"rows":96},"comparison","‌Garage مقابل بدائل ‌S3 ذاتية الاستضافة",[93,94,95],"المعيار","‌Garage","‌MinIO (مجتمعي)",[97,101,105,109,113,117],[98,99,100],"الرخصة","‌AGPLv3 — بدون قيود استخدام","‌AGPLv3، لكن الواجهة سُحبت من الإصدار المجاني عام 2025",[102,103,104],"صور ‌Docker","تُنشر بانتظام على ‌Docker Hub (`dxflrs\u002Fgarage`)","الصور المجتمعية متوقفة منذ 2025؛ ومستودع ‌GitHub مؤرشف اليوم",[106,107,108],"واجهة الويب","غير مدمجة بعد (‌CLI + واجهة إدارة ‌HTTP؛ ‌Web Admin تجريبية)","الواجهة محذوفة من الإصدار المجتمعي",[110,111,112],"متعدد المواقع","مُصمَّم أصلاً للمناطق الجغرافية","ممكن لكنه يستلزم مجموعة مخصصة",[114,115,116],"بصمة الذاكرة","عتاد متواضع (1 غيغابايت ذاكرة في المتطلبات)","موجّهة للأداء العالي والأحمال الكثيفة",[118,119,120],"توافق ‌S3","جيد على السطح الشائع","واسع جداً بما فيه امتدادات ‌AWS الخاصة",{"type":122,"title":123,"body":124},"tip","الدلاء ومفاتيح الوصول والصلاحيات","يدير ‌Garage الوصول على مستوى المفتاح: يمكن تفويض كل مفتاح ‌S3 على دلو واحد أو أكثر، قراءةً فقط أو قراءةً وكتابةً. لعمليات النسخ الاحتياطي الآلي، أنشئ مفتاحاً مخصصاً يصل إلى دلو النسخ الاحتياطي فقط لا إلى الخادم كله.\n\nالأمر `garage key create \u003Cname>` ينشئ المفتاح، و`garage bucket allow --key \u003Cid> --read --write \u003Cbucket>` يمنحه الصلاحيات. يمكنك أيضاً استخدام واجهة الإدارة ‌HTTP لأتمتة ذلك في سكريبت.",{"type":39,"title":126,"body":127},"نقاط يجب استيعابها","**العقدة الواحدة ليست تكراراً**. يستطيع ‌Garage التكرار عبر أجهزة متعددة وعبر مواقع مختلفة — وهذا هدفه الأصلي. لكن طالما لديك عقدة واحدة، تتواجد كائناتك في نسخة واحدة على قرص واحد. احتفظ بانضباط النسخ الاحتياطي الذي تُطبّقه أصلاً.\n\n**اكشف الواجهة البرمجية خلف نطاق وشهادة ‌TLS**، لا على عنوان ‌IP مجرد. عدة عملاء ‌S3 يرفضون العمل بدون ‌TLS، والتوجيه عبر النطاق الفرعي للدلو يستلزم شهادة wildcard.\n\n**توافق ‌S3 يغطي السطح الشائع**، لا كل امتداد خاص بـ‌AWS. العملاء والمكتبات وأدوات النسخ الاحتياطي القياسية تعمل دون تعديل؛ إن كنت تعتمد على استدعاء غير شائع، تحقق من توثيق المشروع قبل الترحيل.\n\n**راقب مساحة القرص**. دلو نسخ احتياطية يتنامى دون سياسة استبقاء يملأ القرص صامتاً. عيّن قاعدة دورة حياة عبر واجهة ‌S3 (`aws s3api put-bucket-lifecycle-configuration`، للانتهاء فقط؛ ومنذ الإصدار 2.5.0 تقتصر على مفتاح مالك للدلو) أو مهمة ‌cron تحذف اللقطات القديمة (`restic forget --prune`).","‌Garage بنقرة واحدة على ‌VPS الخاص بك","يثبّت Marketplace الخاص بـ‌ServOrbit ‌Garage وينشئ دلوه وبيانات اعتماد ‌S3 عند أول تشغيل. ما عليك سوى توصيل العميل.","نشر ‌Garage","\u002Fapplications\u002Fقواعد-البيانات\u002Fgarage",[],true,1794270220567]