با mc روی Bucket کار کنید
mc به نصبکننده یا Runtime جداگانه نیاز ندارد. مشخصات پارسپک را یک بار با نام parspack ثبت میکنید و بعد مسیرها را مانند parspack/bucket/key مینویسید. نقطهٔ قوت mc در این مجموعه، ساخت هر دو نوع لینک موقت است: یکی برای دانلود و دیگری برای آپلود مستقیم.

برای اینکه نتیجهٔ هر فرمان روشن باشد، کار را با یک Object آزمایشی پیش میبریم: hello.txt را با کلید tutorial/hello.txt میفرستید، فهرست و مشخصاتش را میخوانید، دانلود و لینک موقت را میآزمایید و در پایان آن را حذف میکنید.
اول Alias را بسازید و فهرست Bucket را بگیرید. اگر این دو مرحله موفق باشند، خطاهای بعدی را میتوانید مستقیماً به مسیر یا مجوز همان عملیات مربوط کنید.
نصب mc
باینری را مستقیم از dl.min.io بگیرید. نصبکننده و وابستگی ندارد؛ یک فایل است که باید اجرایی شود و در PATH قرار بگیرد.
روی خیلی از سیستمهای لینوکسی، mc از قبل نام فرمان Midnight Commander است. اگر بعد از نصب، mc --version چیزی دربارهٔ فایلمنیجر گفت، یعنی همان نسخه در PATH جلوتر است. یا باینری MinIO را با نام دیگری (مثلاً mcli — نامی که خود MinIO در بستههای رسمی استفاده میکند) نصب کنید، یا با مسیر کامل صدایش بزنید.
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc
mc --versionbrew install minio/stable/mc
# یا بدون Homebrew (روی Apple Silicon، برای Intel از darwin-amd64 استفاده کنید):
curl -O https://dl.min.io/client/mc/release/darwin-arm64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc
mc --versionInvoke-WebRequest -Uri "https://dl.min.io/client/mc/release/windows-amd64/mc.exe" -OutFile "$env:USERPROFILE\mc.exe"
& "$env:USERPROFILE\mc.exe" --versiondocker run --rm -it \
-v "$PWD":/work -w /work \
--entrypoint /bin/sh minio/mcAlias را با مقدارهای پنل بسازید
Alias یک نام کوتاه است که مقدارهای اتصال پشتش پنهان میشود — دقیقاً مثل مفهوم Remote در rclone. مقدارها همانهایی هستند که در صفحه شروع S3 توضیح داده شدهاند.
mc alias set parspack https://c123456.parspack.net YOUR_ACCESS_KEY YOUR_SECRET_KEY \
--api S3v4 --path on--api S3v4 امضا را روی Signature V4 قفل میکند. --path on به mc میگوید نام باکت را در مسیر URL بگذارد (path-style) نه در نام دامنه — همان حالتی که نمونهٔ rclone این مستندات هم استفاده میکند. اگر این پرچم را ندهید، mc حالت auto را میگیرد و ممکن است سراغ آدرسهای bucket.c123456.parspack.net برود که DNS آنها لزوماً وجود ندارد.~/.mc/config.json ذخیره میشود؛ مسیرش را با mc --config-dir میشود عوض کرد. فهرست Aliasهای ساختهشده را با mc alias list ببینید (کلید مخفی هم در همان خروجی چاپ میشود، پس جایی Paste نکنید).MC_HOST_<alias> را بهعنوان یک Alias آماده میخواند:export MC_HOST_parspack=https://YOUR_ACCESS_KEY:YOUR_SECRET_KEY@c123456.parspack.netدر این حالت کلیدها بخشی از یک URL هستند، پس هر کاراکتر خاصی داخلشان — بهویژه /، +، @ و : — باید URL-encode شود، وگرنه mc آدرس را غلط تجزیه میکند و خطای اتصال یا امضا میگیرید. اسکریپت نمونهٔ examples/mc/run.sh به همین دلیل از این روش استفاده نمیکند: بهجایش یک --config-dir موقت میسازد، Alias را داخل آن تعریف میکند و آخر کار پاکش میکند — هم کدگذاری لازم نیست، هم فایل تنظیمات شخصی شما دست نمیخورد.
Alias باید بتواند Bucket را بخواند
mc ls parspack/c123456
mc ls parspack را بدون نام باکت بزنید.mc ls parspack/c123456آپلود: فایل را در باکت بگذارید
mc cp ./hello.txt parspack/c123456/tutorial/hello.txt
cp در mc دقیقاً مثل cp سیستمعامل کار میکند، فقط یک سمتش میتواند مسیر Alias باشد. مقصد را با نام کامل فایل بنویسید؛ اگر با / تمامش کنید، mc نام فایل محلی را زیر آن مسیر تکرار میکند.printf 'hello ParsPack\n' > hello.txt
mc cp ./hello.txt parspack/c123456/tutorial/hello.txtmc cp --recursive ./dir/ parspack/c123456/prefix/ کل پوشه را میفرستد.--attr Content-Type=text/plain مقدارش را خودتان تعیین کنید.فهرست فایلها و مشخصات یک فایل
اول ببینید فایل در فهرست هست، بعد حجم و نوعش را بدون دانلود بخوانید.
mc ls روی یک مسیر، همان سطح را فهرست میکند؛ با --recursive همهٔ زیرمسیرها را هم میآورد. اگر خروجی خالی بود، یا آپلود انجام نشده یا مسیر را اشتباه نوشتهاید. برای پردازش در اسکریپت، --json اضافه کنید تا بهجای جدول رنگی، هر فایل یک شیء JSON در یک خط باشد.mc ls parspack/c123456/tutorial/stat استفاده کنید. این فرمان یک درخواست HEAD میفرستد و خود فایل را دانلود نمیکند.mc stat parspack/c123456/tutorial/hello.txtترتیب و تعداد سطرهای mc stat بین نسخههای mc و بین فضاهای مختلف S3 کمی فرق میکند؛ نمونهٔ بالا شکل معمول آن است. اگر در اسکریپت به این خروجی تکیه میکنید، حتماً --json بزنید و از فیلدهای JSON بخوانید، نه از متن.
دانلود: فایل را روی سیستم خودتان بنویسید
mc cp parspack/c123456/tutorial/hello.txt ./downloads/hello.txt
cp است با جهت برعکس: مبدأ مسیر Alias، مقصد مسیر محلی. mc پوشهٔ مقصد را در صورت نبودن خودش میسازد و اگر فایلی با همان نام باشد، رویش مینویسد.mc cp parspack/c123456/tutorial/hello.txt ./downloads/hello.txtmc cat parspack/c123456/tutorial/hello.txt کافی است.لینک امضاشده: هم دانلود، هم آپلود
لینک امضاشده یک URL موقت است که تا مدت مشخصی بدون کلید API کار میکند. mc تنها ابزار خط فرمان این مستندات است که هر دو جهت را میسازد.
mc share download یک لینک GET میگیرید که میتوانید به کاربر بدهید تا فایل را از باکت خصوصی بگیرد، بدون اینکه باکت را Public کنید. مقدار --expire را با پسوند زمان بنویسید: 900s، 15m، 24h.mc share download --expire 15m parspack/c123456/tutorial/hello.txtmc share upload جهت برعکس میشود، ولی شکلش با share download فرق اساسی دارد: این یک لینک PUT با هدر نیست، بلکه یک Presigned POST Policy است — همان مکانیزمی که فرم آپلود مستقیم مرورگر به S3 استفاده میکند. خروجی یک فرمان curl آماده است با چند فیلد -F (شامل یک policy رمزنگاریشدهٔ Base64) که همه با هم باید در یک درخواست POST چندبخشی (multipart/form-data) به آدرس ریشهٔ باکت فرستاده شوند — نه یک PUT به آدرس خود فایل. جای <FILE> مسیر فایل واقعی را بگذارید.mc share upload --expire 15m --content-type text/plain \
parspack/c123456/tutorial/upload.txtاجرای موفق همین curl کد 204 No Content برمیگرداند. نکتهٔ مهم: مقصد درخواست، ریشهٔ باکت است (https://c123456.parspack.net/c123456/) نه مسیر خود فایل؛ فیلد key همان جایی است که مقصد واقعی فایل را مشخص میکند. Content-Type و همهٔ فیلدهای x-amz-* بخشی از policy امضا شدهاند — تغییر هرکدام، حتی یک کاراکتر، باعث رد شدن درخواست میشود. سقف انقضا برای این لینک ۷ روز (168h) است.
حذف: نام را از باکت بردارید
mc rm parspack/c123456/tutorial/hello.txt
rm دقیقاً همان یک کلید را حذف میکند و فایل روی سیستم شما دست نمیخورد.mc rm parspack/c123456/tutorial/hello.txtپرچم --recursive (که mc اجبارش میکند با --force همراه شود) همهٔ فایلهای زیر یک مسیر را پاک میکند و برگشتی ندارد. قبلش با mc ls --recursive ببینید چه چیزی قرار است حذف شود.
پیام خطای mc را کامل بخوانید
mc معمولاً کنار توضیح خطا یک شناسهٔ کوتاه هم نشان میدهد و با کد غیرصفر تمام میشود. پیش از تغییر فرمان، چک اتصال را دوباره اجرا کنید.
--debug اضافه کنید؛ برای خروجی ماشینخوان در اسکریپت، --json. این دو با هم بیشترین کمک را در پیدا کردن مشکل امضا یا حالت آدرسدهی میکنند.| خطا | علت معمول | بررسی |
|---|---|---|
خروجی mc --version از Midnight Commander است | فرمان mc در PATH به فایلمنیجر اشاره میکند | which -a mc؛ باینری MinIO را با نام mcli نصب کنید یا با مسیر کامل صدا بزنید |
Unable to initialize new alias | Endpoint اشتباه است یا در دسترس نیست | آدرس HTTPS پنل، بدون / انتها |
The request signature we calculated does not match | کلیدها اشتباهاند یا Alias با --api S3v4 ساخته نشده | Alias را دوباره با هر دو پرچم بسازید |
Bucket name contains invalid characters یا خطای DNS | حالت آدرسدهی virtual-host شده | Alias را با --path on دوباره بسازید |
Object does not exist | کلید در باکت نیست یا املایش فرق دارد | اول mc ls روی مسیر پدر |
Access Denied | کلید به این باکت دسترسی ندارد | باکت و کلید را در پنل چک کنید |
mc: <ERROR> Unable to share | مدت انقضا بیشتر از ۷ روز داده شده | --expire را حداکثر 168h بگذارید |
آزمون را تکرارپذیر کنید
برای اجرا روی سرور دیگر یا CI، اسکریپت نمونه را با متغیرهای محیطی اجرا کنید؛ اطلاعات حساس در خود اسکریپت قرار نمیگیرد.
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc
mc alias set parspack https://c123456.parspack.net YOUR_ACCESS_KEY YOUR_SECRET_KEY \
--api S3v4 --path on
printf 'hello ParsPack\n' > hello.txt
mc ls parspack/c123456
mc cp ./hello.txt parspack/c123456/tutorial/hello.txt
mc ls parspack/c123456/tutorial/
mc stat parspack/c123456/tutorial/hello.txt
mc cp parspack/c123456/tutorial/hello.txt ./downloads/hello.txt
mc share download --expire 15m parspack/c123456/tutorial/hello.txt
mc share upload --expire 15m --content-type text/plain parspack/c123456/tutorial/upload.txt
mc rm parspack/c123456/tutorial/hello.txtexamples/mc/run.sh همین کارها را با قرارداد مشترک همهٔ نمونههای این مستندات انجام میدهد. presign-get همان قالب JSON بقیهٔ زبانها را برمیگرداند؛ presign-put چون Presigned POST است نه PUT، قالب خودش را دارد: {"url": ..., "method": "POST", "fields": {...}} — همان فیلدهایی که باید در یک درخواست multipart/form-data کنار فایل فرستاده شوند.examples/mc/run.sh upload ./hello.txt tutorial/hello.txt
examples/mc/run.sh list tutorial/
examples/mc/run.sh head tutorial/hello.txt
examples/mc/run.sh download tutorial/hello.txt ./downloaded.txt
examples/mc/run.sh presign-get tutorial/hello.txt 900
examples/mc/run.sh presign-put tutorial/upload.txt text/plain 900
examples/mc/run.sh delete tutorial/hello.txtexamples/
├── .env.example
└── mc/
└── run.sh # هفت عملیات فایل با MinIO Client