PP مستندات فضای ابری پارس‌پک
mc · تک‌باینری، بدون وابستگی

با mc روی Bucket کار کنید

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

نصب سادههفت عملیات اصلیلینک موقت دوطرفهسه سیستم‌عامل
اجرای MinIO Client متصل به فضای ذخیره‌سازی ابری
یک Alias، هفت فرمان

برای اینکه نتیجهٔ هر فرمان روشن باشد، کار را با یک Object آزمایشی پیش می‌بریم: hello.txt را با کلید tutorial/hello.txt می‌فرستید، فهرست و مشخصاتش را می‌خوانید، دانلود و لینک موقت را می‌آزمایید و در پایان آن را حذف می‌کنید.

اول Alias را بسازید و فهرست Bucket را بگیرید. اگر این دو مرحله موفق باشند، خطاهای بعدی را می‌توانید مستقیماً به مسیر یا مجوز همان عملیات مربوط کنید.

۱

نصب mc

باینری را مستقیم از dl.min.io بگیرید. نصب‌کننده و وابستگی ندارد؛ یک فایل است که باید اجرایی شود و در PATH قرار بگیرد.

!

روی خیلی از سیستم‌های لینوکسی، mc از قبل نام فرمان Midnight Commander است. اگر بعد از نصب، mc --version چیزی دربارهٔ فایل‌منیجر گفت، یعنی همان نسخه در PATH جلوتر است. یا باینری MinIO را با نام دیگری (مثلاً mcli — نامی که خود MinIO در بسته‌های رسمی استفاده می‌کند) نصب کنید، یا با مسیر کامل صدایش بزنید.

Linux · دانلود باینری
curl -O https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/mc
mc --version
macOS · Homebrew یا باینری
brew 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 --version
Windows · PowerShell
Invoke-WebRequest -Uri "https://dl.min.io/client/mc/release/windows-amd64/mc.exe" -OutFile "$env:USERPROFILE\mc.exe"
& "$env:USERPROFILE\mc.exe" --version
روی ویندوز فایل را جایی بگذارید که در PATH باشد، وگرنه هر بار باید مسیر کاملش را بنویسید. اگر اصلاً نمی‌خواهید چیزی روی سیستم نصب کنید، تصویر رسمی Docker همین باینری را دارد:
بدون نصب · Docker
docker run --rm -it \
  -v "$PWD":/work -w /work \
  --entrypoint /bin/sh minio/mc
۲

Alias را با مقدارهای پنل بسازید

Alias یک نام کوتاه است که مقدارهای اتصال پشتش پنهان می‌شود — دقیقاً مثل مفهوم Remote در rclone. مقدارها همان‌هایی هستند که در صفحه شروع S3 توضیح داده شده‌اند.

terminal · ساخت Alias
mc alias set parspack https://c123456.parspack.net YOUR_ACCESS_KEY YOUR_SECRET_KEY \
  --api S3v4 --path on
خروجی نمونه
Added `parspack` successfully.
دو پرچم انتهایی مهم‌اند و پیش‌فرض نیستند. --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 هر متغیری با الگوی MC_HOST_<alias> را به‌عنوان یک Alias آماده می‌خواند:
terminal · 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

این فرمان محتوای سطح بالای باکت را نشان می‌دهد و هنوز کاری با فایل شما ندارد. اگر Endpoint یا کلیدها اشتباه باشند، همین‌جا خطا می‌گیرید نه در آپلود. برای فهرست خود باکت‌ها، mc ls parspack را بدون نام باکت بزنید.
terminal
mc ls parspack/c123456
خروجی نمونه
[2026-08-18 10:00:00 UTC] 0B tutorial/
۴

آپلود: فایل را در باکت بگذارید

mc cp ./hello.txt parspack/c123456/tutorial/hello.txt

فرمان cp در mc دقیقاً مثل cp سیستم‌عامل کار می‌کند، فقط یک سمتش می‌تواند مسیر Alias باشد. مقصد را با نام کامل فایل بنویسید؛ اگر با / تمامش کنید، mc نام فایل محلی را زیر آن مسیر تکرار می‌کند.
terminal · ساخت فایل و آپلود
printf 'hello ParsPack\n' > hello.txt
mc cp ./hello.txt parspack/c123456/tutorial/hello.txt
خروجی نمونه
...ello.txt: 15 B / 15 B ┃▓▓▓▓▓▓▓▓▓▓┃ 100.00% 1.20 KiB/s 0s
جایگزینیآپلود روی کلید موجود، بدون سؤال رویش می‌نویسد؛ نسخهٔ جدا ساخته نمی‌شود.
پوشهٔ کاملmc cp --recursive ./dir/ parspack/c123456/prefix/ کل پوشه را می‌فرستد.
نوع محتوابا --attr Content-Type=text/plain مقدارش را خودتان تعیین کنید.
۵

فهرست فایل‌ها و مشخصات یک فایل

اول ببینید فایل در فهرست هست، بعد حجم و نوعش را بدون دانلود بخوانید.

mc ls روی یک مسیر، همان سطح را فهرست می‌کند؛ با --recursive همهٔ زیرمسیرها را هم می‌آورد. اگر خروجی خالی بود، یا آپلود انجام نشده یا مسیر را اشتباه نوشته‌اید. برای پردازش در اسکریپت، --json اضافه کنید تا به‌جای جدول رنگی، هر فایل یک شیء JSON در یک خط باشد.
terminal · فهرست یک مسیر
mc ls parspack/c123456/tutorial/
خروجی نمونه
[2026-08-18 10:00:00 UTC] 15B STANDARD hello.txt
برای مشخصات یک فایل از stat استفاده کنید. این فرمان یک درخواست HEAD می‌فرستد و خود فایل را دانلود نمی‌کند.
terminal · مشخصات یک فایل
mc stat parspack/c123456/tutorial/hello.txt
خروجی نمونه
Name : hello.txt Date : 2026-08-18 10:00:00 UTC Size : 15 B ETag : 6f5902ac237024bdd0c176cb93063dc4 Type : file Metadata : Content-Type: text/plain
!

ترتیب و تعداد سطرهای mc stat بین نسخه‌های mc و بین فضاهای مختلف S3 کمی فرق می‌کند؛ نمونهٔ بالا شکل معمول آن است. اگر در اسکریپت به این خروجی تکیه می‌کنید، حتماً --json بزنید و از فیلدهای JSON بخوانید، نه از متن.

۶

دانلود: فایل را روی سیستم خودتان بنویسید

mc cp parspack/c123456/tutorial/hello.txt ./downloads/hello.txt

همان cp است با جهت برعکس: مبدأ مسیر Alias، مقصد مسیر محلی. mc پوشهٔ مقصد را در صورت نبودن خودش می‌سازد و اگر فایلی با همان نام باشد، رویش می‌نویسد.
terminal
mc cp parspack/c123456/tutorial/hello.txt ./downloads/hello.txt
خروجی نمونه
...ello.txt: 15 B / 15 B ┃▓▓▓▓▓▓▓▓▓▓┃ 100.00% 2.10 KiB/s 0s
اگر فقط می‌خواهید محتوای فایل را ببینید و لازم نیست روی دیسک بنشیند، mc cat parspack/c123456/tutorial/hello.txt کافی است.
۷

لینک امضاشده: هم دانلود، هم آپلود

لینک امضاشده یک URL موقت است که تا مدت مشخصی بدون کلید API کار می‌کند. mc تنها ابزار خط فرمان این مستندات است که هر دو جهت را می‌سازد.

با mc share download یک لینک GET می‌گیرید که می‌توانید به کاربر بدهید تا فایل را از باکت خصوصی بگیرد، بدون اینکه باکت را Public کنید. مقدار --expire را با پسوند زمان بنویسید: 900s، 15m، 24h.
terminal · لینک دانلود ۱۵ دقیقه‌ای
mc share download --expire 15m parspack/c123456/tutorial/hello.txt
خروجی نمونه
URL: https://c123456.parspack.net/c123456/tutorial/hello.txt Expire: 15 minutes Share: https://c123456.parspack.net/c123456/tutorial/hello.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=...&X-Amz-Signature=...
با mc share upload جهت برعکس می‌شود، ولی شکلش با share download فرق اساسی دارد: این یک لینک PUT با هدر نیست، بلکه یک Presigned POST Policy است — همان مکانیزمی که فرم آپلود مستقیم مرورگر به S3 استفاده می‌کند. خروجی یک فرمان curl آماده است با چند فیلد -F (شامل یک policy رمزنگاری‌شدهٔ Base64) که همه با هم باید در یک درخواست POST چندبخشی (multipart/form-data) به آدرس ریشهٔ باکت فرستاده شوند — نه یک PUT به آدرس خود فایل. جای <FILE> مسیر فایل واقعی را بگذارید.
terminal · لینک آپلود ۱۵ دقیقه‌ای
mc share upload --expire 15m --content-type text/plain \
  parspack/c123456/tutorial/upload.txt
خروجی نمونه
URL: https://c123456.parspack.net/c123456/tutorial/upload.txt Expire: 15 minutes Share: curl https://c123456.parspack.net/c123456/ -F x-amz-algorithm=AWS4-HMAC-SHA256 -F x-amz-credential=... -F x-amz-date=... -F x-amz-signature=... -F Content-Type=text/plain -F bucket=c123456 -F policy=eyJl... -F key=tutorial/upload.txt -F file=@<FILE>
!

اجرای موفق همین curl کد 204 No Content برمی‌گرداند. نکتهٔ مهم: مقصد درخواست، ریشهٔ باکت است (https://c123456.parspack.net/c123456/) نه مسیر خود فایل؛ فیلد key همان جایی است که مقصد واقعی فایل را مشخص می‌کند. Content-Type و همهٔ فیلدهای x-amz-* بخشی از policy امضا شده‌اند — تغییر هرکدام، حتی یک کاراکتر، باعث رد شدن درخواست می‌شود. سقف انقضا برای این لینک ۷ روز (168h) است.

اگر می‌خواهید همین لینک‌ها را از داخل کد برنامه بسازید نه از خط فرمان، بخش لینک امضاشده در صفحه S3 همین کار را در هشت زبان نشان می‌دهد. کلید مخفی هیچ‌وقت نباید به مرورگر یا اپ موبایل برسد؛ لینک را روی سرور بسازید.
۸

حذف: نام را از باکت بردارید

mc rm parspack/c123456/tutorial/hello.txt

rm دقیقاً همان یک کلید را حذف می‌کند و فایل روی سیستم شما دست نمی‌خورد.
terminal
mc rm parspack/c123456/tutorial/hello.txt
خروجی نمونه
Removed `parspack/c123456/tutorial/hello.txt`.
!

پرچم --recursive (که mc اجبارش می‌کند با --force همراه شود) همهٔ فایل‌های زیر یک مسیر را پاک می‌کند و برگشتی ندارد. قبلش با mc ls --recursive ببینید چه چیزی قرار است حذف شود.

۹

پیام خطای mc را کامل بخوانید

mc معمولاً کنار توضیح خطا یک شناسهٔ کوتاه هم نشان می‌دهد و با کد غیرصفر تمام می‌شود. پیش از تغییر فرمان، چک اتصال را دوباره اجرا کنید.

برای دیدن درخواست و پاسخ واقعی HTTP، --debug اضافه کنید؛ برای خروجی ماشین‌خوان در اسکریپت، --json. این دو با هم بیشترین کمک را در پیدا کردن مشکل امضا یا حالت آدرس‌دهی می‌کنند.
خطاعلت معمولبررسی
خروجی mc --version از Midnight Commander استفرمان mc در PATH به فایل‌منیجر اشاره می‌کندwhich -a mc؛ باینری MinIO را با نام mcli نصب کنید یا با مسیر کامل صدا بزنید
Unable to initialize new aliasEndpoint اشتباه است یا در دسترس نیستآدرس 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، اسکریپت نمونه را با متغیرهای محیطی اجرا کنید؛ اطلاعات حساس در خود اسکریپت قرار نمی‌گیرد.

terminal · از ابتدا تا انتها
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.txt
اسکریپت نمونهٔ examples/mc/run.sh همین کارها را با قرارداد مشترک همهٔ نمونه‌های این مستندات انجام می‌دهد. presign-get همان قالب JSON بقیهٔ زبان‌ها را برمی‌گرداند؛ presign-put چون Presigned POST است نه PUT، قالب خودش را دارد: {"url": ..., "method": "POST", "fields": {...}} — همان فیلدهایی که باید در یک درخواست multipart/form-data کنار فایل فرستاده شوند.
terminal · اسکریپت نمونه
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.txt
ساختار فایل‌ها
examples/
├── .env.example
└── mc/
  └── run.sh      # هفت عملیات فایل با MinIO Client
ابزار دیگری می‌خواهید؟s3cmd با یک فایل تنظیمات ساده کار می‌کند و AWS CLI را می‌شود بدون نصب داخل Docker اجرا کرد.