كيفية تثبيت MinIO على VPS بنظام Ubuntu 24.04
شغّل MinIO على VPS واحد بواجهة S3 تملكها: ثبّت الملف الثنائي الموثّق، وأنشئ وحدة systemd، واستخدم mc والروابط الموقّعة وrestic للنسخ الاحتياطي.
ما الذي يوفّره لك تخزين الكائنات المستضاف ذاتيًا باستخدام MinIO
MinIO هو تخزين كائنات مستضاف ذاتيًا، ويتحدث باستخدام واجهة Amazon S3 البرمجية. وجّه restic أو أي S3 SDK إلى خادمك، وغيّر إعداد نقطة نهاية واحدة، ولن يتمكن العميل من تمييز الفرق. ينشئ هذا الدليل عقدة واحدة على Ubuntu 24.04: ملفًا ثنائيًا تم التحقق منه، ومستخدم نظام مخصصًا، ووحدة systemd تُبقي بيانات اعتماد root خارج ملف الوحدة، وحاوية ينسخ restic البيانات الاحتياطية إليها.
S3 (خدمة التخزين البسيط) هي واجهة HTTP وليست نظام ملفات. تضع كائنًا باستخدام PUT داخل حاوية تحت مفتاح، ثم تسترجعه باستخدام GET. لا توجد كتابة جزئية ولا إعادة تسمية. يناسب هذا النموذج أدوات النسخ الاحتياطي، لأن الكائن إما أن يصل كاملًا أو لا يصل.
تحتفظ عقدة واحدة بنسخة واحدة من بياناتك. هذه هي المقايضة التي تختارها. تحصل على نقطة نهاية S3 تتحكم فيها، مقابل تكلفة VPS، كما تتحمل كل المهام التي كان مزود الخدمة السحابية ينفذها، بدءًا من استبدال قرص فاشل ووصولًا إلى تصحيح برنامج الخادم. يوضح القسم القريب من النهاية بوضوح متى تكون هذه المقايضة مناسبة.
حالة إصدار MinIO المجتمعي في يوليو 2026
اقرأ هذا القسم قبل أن تبني عليه، لأن الوضع تغيّر مؤخرًا. في مايو 2025 أزالت MinIO ميزات الإدارة من وحدة تحكم الويب في الإصدار المجتمعي. ما تبقى في المتصفح هو متصفح للكائنات، لذلك تُدار الحاويات ومفاتيح الوصول باستخدام عميل سطر الأوامر mc بدلًا من ذلك.
لاحقًا في 2025، توقفت MinIO عن نشر الملفات الثنائية المجمّعة مسبقًا للإصدار المجتمعي. يذكر الملف التمهيدي للمشروع الآن أن الإصدار المجتمعي يُوزّع على شكل شيفرة مصدر فقط. ما تزال عناوين التنزيل الأقدم تعمل؛ واعتبارًا من يوليو 2026، توفّر إصدار الخادم RELEASE.2025-09-07T16-13-09Z وإصدار العميل RELEASE.2025-08-13T08-35-41Z، ولم يظهر أي إصدار مجتمعي أحدث. لذلك فإن الملف الثنائي أدناه حقيقي ويعمل، لكنه مجمّد. ولا يتضمن إصلاحات الأمان المنشورة بعد سبتمبر 2025.
هذه الحقيقة تحدد بقية خطوات هذا الدليل. ولهذا يستمع MinIO هنا على 127.0.0.1 ولا يصل إلى الإنترنت إلا من خلال وكيل تتحكم فيه. إذا كنت تفضّل متابعة الإصلاحات، فابنِ البرنامج من الشيفرة المصدرية. يوفّر الملف التمهيدي للمورّد أمرًا واحدًا هو go install github.com/minio/minio@latest، ويتطلب سلسلة أدوات Go ويكتب الملف الثنائي إلى ~/go/bin/minio. ثبّت ذلك الملف الثنائي في /usr/local/bin/minio، وستبقى جميع الخطوات الأخرى هنا كما هي.
تثبيت الملف الثنائي لـ MinIO والتحقق من التنزيل
نزّل الإصدار المحدد وقيمة checksum المنشورة له. يجعل الخيار -f الأمر curl يفشل عند حدوث خطأ HTTP بدلًا من حفظ صفحة الخطأ بالاسم الذي طلبته. بهذه الطريقة ينتهي الأمر ببعض المستخدمين إلى تثبيت صفحة 404 ثم يتساءلون عن سبب عدم تنفيذها.
cd /tmp
REL=RELEASE.2025-09-07T16-13-09Z
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL" -o minio
curl -fsSL "https://dl.min.io/server/minio/release/linux-amd64/archive/minio.$REL.sha256sum" -o minio.sha256sumقارن قيمتي التجزئة، وقارن قيم التجزئة فقط.
published=$(awk '{print $1}' minio.sha256sum)
downloaded=$(sha256sum minio | awk '{print $1}')
[ "$published" = "$downloaded" ] && echo "checksum ok"لا تستخدم sha256sum -c minio.sha256sum هنا. الاسم المكتوب بعد قيمة التجزئة داخل ذلك الملف هو minio.RELEASE.2025-09-07T16-13-09Z، بينما حفظنا التنزيل باسم minio، لذلك يبحث -c عن ملف غير موجود. يعرض No such file or directory ثم WARNING: 1 listed file could not be read، ما يوحي بأن التنزيل تالف، لكنه ليس كذلك. الاسم مجرد تسمية. أما قيمة التجزئة فهي الجزء الذي يضمن سلامة الملف.
كن واضحًا بشأن ما يثبته هذا الفحص. يأتي الملف الثنائي وقيمة التجزئة من المورّد نفسه عبر الاتصال نفسه، لذلك يثبت التطابق أن التنزيل مكتمل ولم يتلف أو يتغير أثناء النقل. لكنه لا يثبت أن المورّد جدير بالثقة. هذه مشكلة مختلفة، ولا يحلها أي أمر sha256sum.
sudo install -o root -g root -m 755 minio /usr/local/bin/minio
minio --versionيطبع minio --version القيمة minio version RELEASE.2025-09-07T16-13-09Z متبوعة بسطرَي بناء تقريبًا. تعني Permission denied هنا أن الوضع غير صحيح، وتعني command not found أن /usr/local/bin غير موجود في PATH لديك.
إنشاء مستخدم للنظام ودليل للبيانات
يقبل MinIO التحميلات من الشبكة، لذلك يجب ألا يعمل بصفة root. امنحه حسابًا بلا دليل رئيسي وبلا shell لتسجيل الدخول.
sudo groupadd -r minio-user
sudo useradd -M -r -g minio-user -s /usr/sbin/nologin minio-user
sudo mkdir -p /var/lib/minio/data
sudo chown -R minio-user:minio-user /var/lib/minio
sudo chmod 750 /var/lib/minioينشئ -r حسابًا للنظام بمعرّف UID أقل من 1000، وبذلك يبقيه خارج النطاق المستخدم لحسابات الأشخاص. يتخطى -M إنشاء الدليل الرئيسي، لأن الحساب الذي لا يسجّل الدخول مطلقًا لا يحتاج إلى الاحتفاظ بدليل رئيسي. تحقّق من النتيجة باستخدام id minio-user، وباستخدام stat -c '%U %a' /var/lib/minio، الذي ينبغي أن يطبع minio-user 750.
يجب أن يكون دليل البيانات قابلًا للكتابة من ذلك المستخدم، وليس قابلًا للقراءة فقط. عند التشغيل لأول مرة، ينشئ MinIO دليل .minio.sys داخل وحدة التخزين للاحتفاظ بإعداداته الخاصة. لذلك يؤدي امتلاك root للدليل إلى خروج MinIO أثناء بدء التشغيل برسالة تنتهي بـ permission denied. تنطبق القاعدة نفسها على كل خدمة تشغّلها بهذه الطريقة، ويتناول مستخدمو الخدمة ذوو أقل قدر من الصلاحيات على VPS هذا الأمر بالتفصيل.
ضع بيانات اعتماد root في ملف بيئة
تتيح بيانات اعتماد root الوصول إلى كل حاوية، لذلك لا تضعها في ملف الوحدة، لأنه مقروء من الجميع. أنشئ الملف بالوضع الصحيح أولًا، ثم اكتب البيانات فيه ثانيًا، حتى لا تبقى كلمة المرور في ملف مقروء ولو للحظة واحدة.
sudo install -o root -g root -m 600 /dev/null /etc/default/minio
printf 'MINIO_ROOT_USER=minio-root\nMINIO_ROOT_PASSWORD=%s\nMINIO_VOLUMES="/var/lib/minio/data"\nMINIO_OPTS="--address 127.0.0.1:9000 --console-address 127.0.0.1:9001"\n' "$(openssl rand -base64 24)" | sudo tee /etc/default/minio > /dev/null
sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minioيؤدي tee إلى تفريغ ملف موجود بدلًا من إعادة إنشائه، لذلك يبقى الوضع 600 ويبقى المالك هو root. هذا مقصود. يقرأ systemd الملف EnvironmentFile بصفته root قبل أن يخفض الامتيازات إلى User=، وهذا يعني أن حساب الخدمة لا يحتاج إلى قراءة بيانات اعتماده بنفسه. بعد تشغيل الخدمة، تحقّق من ذلك باستخدام sudo -u minio-user cat /etc/default/minio. يجب أن يطبع هذا الأمر Permission denied.
هناك سلوكان في MinIO يجب معرفتهما قبل تشغيله. عند غياب MINIO_ROOT_USER وMINIO_ROOT_PASSWORD من بيئته، لا يرفض MinIO بدء التشغيل. بل يبدأ باستخدام بيانات الاعتماد الافتراضية الموثقة minioadmin:minioadmin، وهي أول زوج تجربه أي أداة فحص، ويبدو سليمًا تمامًا أثناء ذلك. أما كلمة المرور التي يقل طولها عن 8 محارف فيُرفض استخدامها بدلًا من ذلك: يخرج MinIO عند بدء التشغيل مع رسالة تفيد بأن بيانات الاعتماد غير صالحة، لأن مفتاح الوصول يحتاج إلى 3 محارف على الأقل، ويحتاج المفتاح السري إلى 8 محارف على الأقل.
يمثل MINIO_VOLUMES مسار البيانات، ويحتوي MINIO_OPTS على الخيارات. يعني الربط بالعنوان 127.0.0.1 أن أي جهاز خارج هذا VPS لا يستطيع الوصول إلى S3 API بعد، وهذا هو الإعداد الافتراضي الصحيح. تفتح الوصول إليه لاحقًا بشكل مقصود، عبر وكيل يحتفظ بشهادة.
كتابة وحدة systemd
أنشئ /etc/systemd/system/minio.service:
[Unit]
Description=MinIO object storage
Documentation=https://github.com/minio/minio
Wants=network-online.target
After=network-online.target
[Service]
User=minio-user
Group=minio-user
EnvironmentFile=/etc/default/minio
ExecStart=/usr/local/bin/minio server $MINIO_VOLUMES $MINIO_OPTS
Restart=always
RestartSec=5
LimitNOFILE=65536
NoNewPrivileges=true
[Install]
WantedBy=multi-user.targetلا توجد بادئة - في EnvironmentFile، وهذا قرار مقصود وليس خطأ مطبعيًا. عند استخدام الشرطة، يتجاهل systemd الملف المفقود ويشغّل MinIO على أي حال. لذلك، يؤدي حذف الملف أو كتابة المسار بشكل خاطئ بصمت إلى تشغيل خادم باستخدام minioadmin:minioadmin. من دون الشرطة، يؤدي غياب الملف إلى فشل الوحدة قبل تشغيل MinIO، ويعرض journalctl -u minio القيمة Failed to load environment files: No such file or directory. من الأسهل بكثير ملاحظة وحدة ترفض التشغيل من ملاحظة خادم يقبل كلمة المرور الافتراضية بصمت.
استخدام $MINIO_VOLUMES و$MINIO_OPTS من دون علامات اقتباس مقصود، لأن systemd يقسّم المتغيرات غير المحاطة بعلامات اقتباس عند المسافات إلى وسائط منفصلة. بهذه الطريقة تتحول الكلمات الأربع في MINIO_OPTS إلى أربعة وسائط تُمرّر إلى minio server. يرفع LimitNOFILE=65536 حد واصفات الملفات، لأن كل اتصال مفتوح وكل ملف بيانات مفتوح يستهلك واصفًا واحدًا، والحد الافتراضي البالغ 1024 ينفد تحت الحمل.
sudo systemctl daemon-reload
sudo systemctl enable --now minio
systemctl is-active minio
curl -fsS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:9000/minio/health/liveيجب أن يطبع is-active القيمة active، ويجب أن تستجيب نقطة فحص الصحة بالقيمة 200. يعرض journalctl -u minio -n 20 --no-pager عنوان API الذي يستمع إليه الخادم. إذا استمرت الوحدة في إعادة التشغيل، يتوقف systemd عن المحاولة ويسجّل Start request repeated too quickly. وهذا يعني أن MinIO يخرج عند كل محاولة. يظهر السبب في الأسطر التي تسبق هذه الرسالة، لذا اقرأ إلى الأعلى.
لمزيد من العزل، أضف ProtectSystem=full وProtectHome=true إلى القسم [Service]. يتطلب كلاهما مساحات أسماء للوصل من نواة المضيف. في المحاكاة الافتراضية المعتمدة على الحاويات التي تشارك نواة المضيف، مثل OpenVZ أو LXC، قد يفشلان، وعندها تعرض الوحدة status=226/NAMESPACE. احذف هذين السطرين وستبدأ الوحدة. الوحدة نفسها عادية، ويغطي خدمات systemd والمؤقتات على VPS بقية التوجيهات.
ثبّت mc وأثبت نجاح دورة كاملة
عميل MinIO هو mc. لا تثبّته باستخدام apt install mc. هذه الحزمة هي Midnight Commander، وهو مدير ملفات لا علاقة له بـ MinIO.
cd /tmp
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o mc
curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc.sha256sum -o mc.sha256sum
[ "$(awk '{print $1}' mc.sha256sum)" = "$(sha256sum mc | awk '{print $1}')" ] && echo "checksum ok"
sudo install -o root -g root -m 755 mc /usr/local/bin/mcسجّل الخادم كاسم مستعار، ثم انقل كائنًا عبره.
MINIO_PASS=$(sudo sed -n 's/^MINIO_ROOT_PASSWORD=//p' /etc/default/minio)
mc alias set local http://127.0.0.1:9000 minio-root "$MINIO_PASS"
mc mb local/backups
echo "hello object storage" > /tmp/hello.txt
mc cp /tmp/hello.txt local/backups/hello.txt
mc ls local/backups
mc cat local/backups/hello.txtيجب أن يعرض mc ls قائمة hello.txt مع حجمه، ويجب أن يطبع mc cat القيمة hello object storage. هذه الدورة الكاملة هي الإثبات الفعلي لعمل الخادم، لأنها تنفّذ طلبات S3 الموقّعة نفسها التي سينفّذها أي عميل آخر. يعرض mc admin info local حالة الخادم إذا أردت تحققًا إضافيًا.
أجرِ فحصًا آخر الآن، ما دام الخادم لا يحتوي على بيانات بعد.
mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadminيجب أن يفشل هذا الأمر. إذا نجح، فهذا يعني أن ملف البيئة لم يصل إلى العملية وأن الخادم يعمل ببيانات الاعتماد الافتراضية. أصلح ذلك قبل أن يصل أي شيء آخر إلى الجهاز.
يخزّن mc الأسماء المستعارة في ~/.mc/config.json كنص عادي، لذلك تبقى بيانات الاعتماد في الدليل المنزلي للمستخدم الذي نفّذ الأمر. يؤدي تشغيل mc باستخدام sudo إلى وضع بيانات اعتماد root في /root/.mc/config.json. احتفظ بالاسم المستعار الخاص بـ root في حساب مسؤول واحد، وامنح كل تطبيق مفتاحه الخاص.
مشاركة كائن واحد باستخدام عنوان URL موقّع مسبقًا
عنوان URL موقّع مسبقًا هو رابط HTTPS عادي مرفق به توقيع ومدة صلاحية. يمكن لأي شخص يملك الرابط جلب ذلك الكائن الواحد دون حساب ودون استخدام عميل.
mc share download --expire 12h local/backups/hello.txtيحتوي الناتج على X-Amz-Signature وX-Amz-Expires في سلسلة الاستعلام. هناك أمران قد يفاجئان المستخدمين. يُنشأ الرابط من نقطة النهاية في الاسم المستعار الذي استخدمته، لذلك فإن الاسم المستعار على 127.0.0.1 ينتج رابطًا لا يمكن فتحه إلا من هذا الجهاز. أنشئ اسمًا مستعارًا ثانيًا على اسم المضيف العام للروابط التي تنوي إرسالها. ولا يوجد زر لإلغاء الصلاحية. يظل التوقيع صالحًا حتى تنتهي مدة صلاحيته، لذلك فإن تقصير مدة الصلاحية هو عنصر التحكم الوحيد المتاح لك. سبعة أيام هي الحد الأقصى الذي يسمح به تنسيق توقيع S3.
امنح restic مفتاحًا وحاويةً خاصين به
يمكن لبيانات اعتماد root قراءة كل حاوية وحذفها، لذلك يجب ألا تحتوي مهمة النسخ الاحتياطي عليها. أنشئ حاوية، وسياسة تقتصر على هذه الحاوية، ومستخدمًا لا يحصل على أي صلاحيات أخرى.
mc mb local/restic
cat > /tmp/restic-rw.json <<'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket", "s3:GetBucketLocation"],
"Resource": ["arn:aws:s3:::restic"]
},
{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject"],
"Resource": ["arn:aws:s3:::restic/*"]
}
]
}
EOF
RESTIC_KEY=$(openssl rand -base64 24)
mc admin policy create local restic-rw /tmp/restic-rw.json
mc admin user add local restic-backup "$RESTIC_KEY"
mc admin policy attach local restic-rw --user restic-backupيتضمن MinIO سياسة readwrite مضمّنة، وكانت ستختصر الأمر بمقدار أمر واحد، لكنها تمنح وصولًا كاملًا إلى كل حاوية على الخادم. تسمي السياسة أعلاه الحاوية مرتين عمدًا: مرة باسم arn:aws:s3:::restic لكي يعمل سرد الحاوية، ومرة باسم arn:aws:s3:::restic/* للكائنات الموجودة داخلها. في S3، الحاوية وكائناتها موردان منفصلان، لذلك تفشل السياسة التي تسمي أحدهما فقط بطريقة تبدو كأن العميل معطّل.
اختبر هذا القيد قبل الاعتماد عليه.
mc alias set resticuser http://127.0.0.1:9000 restic-backup "$RESTIC_KEY"
mc ls resticuser/restic
mc ls resticuser/backupsينجح الأمر ls الأول، ويفشل الثاني مع Access Denied. السياسة التي لم تختبرها ليست سوى تخمين.
وجّه restic الآن إلى الحاوية. يقرأ restic بيانات اعتماد S3 من متغيرات بيئة AWS القياسية، لذلك لا يوجد ملف بيانات اعتماد خاص بـ restic.
sudo apt install -y restic
export AWS_ACCESS_KEY_ID=restic-backup
export AWS_SECRET_ACCESS_KEY="$RESTIC_KEY"
restic -r s3:http://127.0.0.1:9000/restic init
restic -r s3:http://127.0.0.1:9000/restic backup /etc
restic -r s3:http://127.0.0.1:9000/restic snapshotsيطلب restic init كلمة مرور للمستودع. تشفّر كلمة المرور هذه المستودع، لذلك لا يخزن MinIO إلا النص المشفر، ويؤدي فقدان كلمة المرور إلى فقدان النسخة الاحتياطية. لا يملك التشغيل الذي يبدأه مؤقت systemd طرفية لإدخال كلمة المرور فيها، لذلك اضبط RESTIC_PASSWORD_FILE على ملف ذي وضع 600 للنسخ الاحتياطية المجدولة.
هناك قاعدة لوضع المستودع أهم من أي أمر أعلاه. يحمي مستودع restic الموجود على VPS نفسه الذي توجد عليه البيانات من rm سيئ، ولا يحميه من أي شيء آخر. يجب أن تكون عقدة MinIO على جهاز مختلف، ويفضل أن تكون في منطقة مختلفة. يشرح نسخ restic الاحتياطية على VPS كيفية إعداد الجدولة والاحتفاظ بالنسخ استنادًا إلى ذلك.
إنهاء TLS باستخدام nginx
يعمل MinIO على localhost، لذلك فإن nginx هو الواجهة العامة. أصدر الشهادة أولًا، كما هو موضح في شهادات Let's Encrypt باستخدام certbot وnginx، ثم استخدم كتلة الخادم التالية.
server {
listen 443 ssl;
server_name s3.example.com;
ignore_invalid_headers off;
client_max_body_size 0;
proxy_buffering off;
proxy_request_buffering off;
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 300;
proxy_http_version 1.1;
proxy_set_header Connection "";
chunked_transfer_encoding off;
proxy_pass http://127.0.0.1:9000;
}
}عدة أسطر هنا أساسية. يزيل client_max_body_size 0 الحد الافتراضي لحجم الطلب البالغ 1 MB، وإلا سيرفض أي رفع أكبر باستخدام 413 Request Entity Too Large قبل أن يرى MinIO الطلب أصلًا. يمرر proxy_request_buffering off عملية الرفع مباشرة، لأن الإعداد الافتراضي يكتب الطلب كاملًا أولًا في ملف مؤقت، ولذلك يحتاج الكائن الكبير إلى مساحة على القرص مرتين. أما proxy_set_header Host $http_host فهو السطر الدقيق: يوقّع S3 على ترويسة Host، لذلك يؤدي الوكيل الذي يعيد كتابتها إلى فشل كل طلب باستخدام SignatureDoesNotMatch، رغم أن سجل الوصول يعرض وصول طلب عادي.
أخبر MinIO أيضًا باسمه العام، حتى تشير الروابط التي ينشئها إلى الوكيل بدلًا من localhost.
echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minioتبقى قواعد جدار الحماية قليلة. اسمح بـ SSH وHTTPS، واترك المنفذين 9000 و9001 من دون أي قاعدة، لأن العنوان المرتبط بـ 127.0.0.1 لا يمكن الوصول إليه من جهاز آخر، بغض النظر عما يقوله جدار الحماية. تتضمن أساسيات جدار الحماية ufw على VPS الأوامر اللازمة.
متى يكون MinIO أحادي العقدة كافيًا، ومتى تحتاج إلى S3 فعلي
تعني العقدة الواحدة هنا قرصًا واحدًا من دون أي تكافؤ. تصف وثائق MinIO الخاصة بهذا التخطيط بأنه مناسب للاختبار ولأحمال العمل الصغيرة التي لا تتطلب التوافر. لا توجد نسخة ثانية داخل عملية النشر، لذلك تكون متانة كل كائن مساوية لمتانة قرص VPS واحد. تنتمي الميزات التي تفترض وجود خلفية موزعة ومشفرة بمحو البيانات، ومنها نسخ الحاويات المتماثل وقفل الكائنات، إلى عمليات النشر متعددة الأقراص. لذلك لا تَعِد أحدًا بسياسة احتفاظ غير قابلة للتغيير على هذا الإعداد.
يناسب هذا الإعداد استخدامه كهدف لـ restic على VPS ثانٍ في منطقة أخرى، وكواجهة S3 لنطاقات التطوير وعناصر CI، حيث لا يكلفك فقدان حاوية سوى إعادة بنائها. وهو مناسب أيضًا لتحميلات المستخدمين في تطبيق صغير، ما دمت تملك خطة استرداد واختبرت استعادة فعلية.
اختر S3 مُدارًا عندما يطلب عقد أو جهة تنظيمية قفل الكائنات أو متانة متعددة المناطق، أو عندما تفضل ألا تكون الشخص الذي يتلقى تنبيهًا عند الساعة 03:00 لأن أحد الأقراص امتلأ. والبنية المجمّدة سبب صريح آخر. اعتبارًا من July 2026، يعود تاريخ الملف الثنائي المجمع مسبقًا للمجتمع إلى September 2025 ولا يتلقى أي إصلاحات. لذلك يعني تشغيله قبول هذا الوضع، أو البناء من المصدر ومتابعة المشروع بنفسك.
تجدر الإشارة إلى حد فاصل لأنه يتكرر كثيرًا. تخزين الكائنات ليس قاعدة بيانات. كل عملية كتابة تستبدل كائنًا كاملًا، لذلك يكون وضع ملف SQL قيد الاستخدام على حاوية S3 بطيئًا وغير آمن. احتفظ بقاعدة البيانات على القرص المحلي، وانسخها احتياطيًا إلى الحاوية بدلًا من ذلك: يشرح تشغيل SQLite في بيئة الإنتاج على VPS هذا الفصل.
حالات الفشل والرسائل التي ستراها
تفشل الوحدة مباشرة بعد systemctl enable --now. اقرأ journalctl -u minio -n 30 --no-pager. يعني Failed to load environment files: No such file or directory أن /etc/default/minio مفقود أو أن مساره مكتوب بصورة غير صحيحة في الوحدة. تعني رسالة تنتهي بـ permission denied أن دليل البيانات غير قابل للكتابة بواسطة حساب الخدمة، لذا تحقّق من أن stat -c '%U' /var/lib/minio/data يطبع minio-user.
لا يزال minioadmin:minioadmin يسجّل الدخول. لم يصل ملف البيئة إلى العملية. تأكّد من أن الوحدة تتضمن EnvironmentFile=/etc/default/minio، وشغّل sudo systemctl daemon-reload، ثم أعد تشغيل الخدمة. يقرأ MinIO بيانات اعتماد root مرة واحدة عند بدء التشغيل، لذا فإن تعديل ذلك الملف من دون إعادة التشغيل لا يغيّر شيئًا.
Address already in use عند بدء التشغيل. توجد عملية أخرى تستخدم المنفذ 9000. اعثر عليها باستخدام sudo ss -ltnp | grep :9000 قبل تغيير منفذ MinIO.
تفشل عمليات الرفع التي تتجاوز 1 MB عبر الوكيل. أعاد nginx الاستجابة 413 Request Entity Too Large، ولم يرَ MinIO الطلب. اضبط client_max_body_size 0 في كتلة الخادم.
SignatureDoesNotMatch. إما أن المفتاح السري غير صحيح، أو أن شيئًا ما بين العميل وMinIO أعاد كتابة ترويسة Host التي يشملها التوقيع.
RequestTimeTooSkewed. ساعة العميل أو الخادم غير صحيحة. يحمل كل طلب S3 طابعًا زمنيًا، ويُرفض خارج نافذة مدتها 15 دقيقة. تحقّق من timedatectl وتأكد من أن مزامنة الوقت نشطة.
Access Denied في حاوية تعرف أنها موجودة. المفتاح مقيّد بحاوية أخرى. اطبع ما تسمح به السياسة فعليًا باستخدام mc admin policy info local restic-rw، وقارن اسم الحاوية في أسطر المورد.
FAQ
هل يكفي MinIO بعقدة واحدة للنسخ الاحتياطية الفعلية؟
يكفي ذلك كهدف لـ restic يعمل على جهاز منفصل عن البيانات التي يحميها. لكنه لا يكفي ليكون نسختك الوحيدة. لا يحتوي النشر على محرك واحد على أي تكافؤ، لذلك لا توجد نسخة ثانية داخل MinIO. وإذا فقد قرص VPS البيانات، فستفقد الكائنات. احتفظ بهدف ثانٍ في مكان آخر، واستعد البيانات من الهدفين مرة واحدة على الأقل للتأكد من أن العملية تعمل.
لماذا يفشل sha256sum -c في ملف checksum الخاص بـ MinIO؟
لأن التسمية التي تأتي بعد التجزئة داخل هذا الملف تشير إلى الإصدار، minio.RELEASE.2025-09-07T16-13-09Z، بينما يُسمى الملف الذي نزّلته عادةً minio. يبحث sha256sum -c عن ملف يحمل الاسم المكتوب داخل ملف checksum، ولا يعثر عليه، ثم يعرض No such file or directory وWARNING: 1 listed file could not be read. عملية التنزيل سليمة. قارن سلاسل التجزئة مباشرةً وتجاهل التسمية، لأنها لا تحمل أي معنى أمني.
أين اختفت وحدة تحكم إدارة MinIO على الويب؟
أزالت MinIO ميزات الإدارة من وحدة تحكم إصدار المجتمع في May 2025، وأبقت مستعرضًا للكائنات في واجهة الويب. تُدار الحاويات والمستخدمون الآن باستخدام عميل mc، وباستخدام أوامر مثل mc admin user add وmc admin policy attach. هذا هو المسار المدعوم في إصدار المجتمع، وليس حلًا التفافيًا. لذلك ينفذ هذا الدليل كل شيء من سطر الأوامر.
كيف أوجّه restic إلى MinIO كواجهة خلفية لـ S3؟
عيّن AWS_ACCESS_KEY_ID وAWS_SECRET_ACCESS_KEY إلى مفتاح وصول MinIO وسره، ثم استخدم سلسلة مستودع بالصيغة s3:https://s3.example.com/restic، حيث يكون آخر عنصر في المسار هو اسم الحاوية. أنشئ الحاوية أولًا باستخدام mc mb، لأن المفتاح المقيّد بحاوية واحدة لا يملك صلاحية إنشاء الحاويات. يشفّر restic كل شيء باستخدام كلمة مرور المستودع الخاصة به قبل الرفع، لذلك يخزّن MinIO نصًا مشفرًا ولا يطّلع على ملفاتك.
هل يجب أن أشغّل MinIO خلف nginx؟
تحتاج إلى TLS (أمان طبقة النقل) عندما لا يكون العميل على الجهاز نفسه، لأن بيانات اعتماد S3 وبيانات الكائنات تنتقل كلتاهما داخل الطلب. ويُعد الوكيل على المنفذ 443 مع شهادة من certbot أبسط طريقة لتحقيق ذلك، كما أنه يُبقي تجديد الشهادة خارج MinIO. يستطيع MinIO أيضًا إنهاء TLS بنفسه إذا وجّهت --certs-dir إلى دليل يحتوي على public.crt وprivate.key، لكن حساب الخدمة سيحتاج إلى صلاحية القراءة للمفتاح الخاص المتجدد، وهذا يتطلب عملًا إضافيًا لتحقيق النتيجة نفسها.