Ubuntu 24.04 پر MinIO انسٹال کرنے کا مکمل طریقہ
Ubuntu 24.04 VPS پر MinIO سیٹ اپ کریں۔ اس گائیڈ میں verified binary انسٹالیشن، systemd سروس کنفیگریشن، mc کمانڈ لائن کا استعمال، اور restic بیک اپ کے لیے S3 اینڈ پوائنٹ بنانا شامل ہے۔
MinIO کے ساتھ سیلف ہوسٹڈ آبجیکٹ اسٹوریج آپ کو کیا فراہم کرتا ہے
MinIO ایک سیلف ہوسٹڈ آبجیکٹ اسٹوریج ہے جو Amazon S3 API کو سپورٹ کرتا ہے۔ restic یا کسی بھی S3 SDK کو اپنے سرور کی طرف متوجہ کریں، ایک اینڈ پوائنٹ سیٹنگ تبدیل کریں، اور کلائنٹ کو فرق محسوس نہیں ہوگا۔ یہ گائیڈ Ubuntu 24.04 پر ایک سنگل نوڈ تیار کرتی ہے: ایک تصدیق شدہ بائنری، ایک مخصوص سسٹم یوزر، ایک systemd یونٹ جو root اسناد کو یونٹ فائل سے باہر رکھتا ہے، اور ایک بکٹ جس میں restic بیک اپ لیتا ہے۔
S3 (Simple Storage Service) ایک فائل سسٹم کے بجائے ایک HTTP API ہے۔ آپ کسی بکٹ میں ایک کی (key) کے تحت ایک آبجیکٹ PUT کرتے ہیں اور اسے GET کے ذریعے واپس حاصل کرتے ہیں، اس میں جزوی تحریر (partial write) یا نام تبدیل کرنے کی سہولت نہیں ہوتی۔ بیک اپ ٹولز اس ماڈل کو پسند کرتے ہیں، کیونکہ ایک آبجیکٹ یا تو مکمل طور پر پہنچتا ہے یا بالکل نہیں پہنچتا۔
ایک نوڈ آپ کے ڈیٹا کی ایک کاپی رکھتا ہے۔ یہ وہ سمجھوتہ ہے جو آپ کر رہے ہیں۔ آپ کو ایک VPS کی قیمت پر ایک S3 اینڈ پوائنٹ ملتا ہے جس پر آپ کا کنٹرول ہوتا ہے، اور آپ ان تمام ذمہ داریوں کو بھی سنبھالتے ہیں جو کلاؤڈ پرووائیڈر انجام دیتا تھا، جیسے ناکام ڈسک کو تبدیل کرنا یا سرور سافٹ ویئر کو پیچ کرنا۔ آخر میں موجود سیکشن واضح طور پر بتاتا ہے کہ یہ سمجھوتہ کب فائدہ مند ہوتا ہے۔
MinIO کمیونٹی ایڈیشن کی جولائی 2026 میں صورتحال
اس پر کام شروع کرنے سے پہلے یہ حصہ پڑھ لیں، کیونکہ حال ہی میں اس میں تبدیلی آئی ہے۔ مئی 2025 میں MinIO نے کمیونٹی ایڈیشن کے ویب کنسول سے انتظامی خصوصیات کو ہٹا دیا ہے۔ براؤزر میں اب صرف ایک آبجیکٹ براؤزر باقی ہے، لہذا اب بکٹس (buckets) اور ایکسیس کیز (access keys) کا انتظام mc کمانڈ لائن کلائنٹ کے ذریعے کیا جاتا ہے۔
2025 کے آخر میں MinIO نے پہلے سے کمپائل شدہ کمیونٹی بائنریز کی اشاعت بند کر دی۔ پروجیکٹ کی README فائل اب کہتی ہے کہ کمیونٹی ایڈیشن صرف سورس کوڈ کی شکل میں تقسیم کیا جاتا ہے۔ پرانے ڈاؤن لوڈ URLs اب بھی کام کرتے ہیں: جولائی 2026 تک وہ سرور بلڈ RELEASE.2025-09-07T16-13-09Z اور کلائنٹ بلڈ RELEASE.2025-08-13T08-35-41Z فراہم کر رہے ہیں، اور اس کے بعد کوئی نیا کمیونٹی بلڈ سامنے نہیں آیا ہے۔ لہذا نیچے دی گئی بائنری اصلی ہے اور چلتی ہے، لیکن یہ منجمد (frozen) ہے۔ ستمبر 2025 کے بعد جاری ہونے والی سیکیورٹی اصلاحات اس میں شامل نہیں ہیں۔
یہ ایک حقیقت اس گائیڈ کے باقی حصوں کا تعین کرتی ہے۔ اسی لیے یہاں MinIO پورٹ 127.0.0.1 پر لسن (listen) کرتا ہے اور انٹرنیٹ تک صرف ایک ایسے پراکسی کے ذریعے رسائی حاصل کرتا ہے جو آپ کے کنٹرول میں ہے۔ اگر آپ اصلاحات کو ٹریک کرنا چاہتے ہیں، تو سورس سے بلڈ کریں۔ وینڈر کی README فائل ایک واحد کمانڈ go install github.com/minio/minio@latest دیتی ہے، جس کے لیے Go ٹول چین کی ضرورت ہوتی ہے اور یہ بائنری کو ~/go/bin/minio پر لکھتی ہے۔ اس بائنری کو /usr/local/bin/minio پر انسٹال کریں اور یہاں باقی تمام مراحل غیر تبدیل شدہ رہیں گے۔
MinIO بائنری انسٹال کریں اور ڈاؤن لوڈ کی تصدیق کریں
مخصوص ریلیز اور اس کا شائع شدہ چیک سم ڈاؤن لوڈ کریں۔ -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 --versionminio --version کمانڈ minio version RELEASE.2025-09-07T16-13-09Z اور اس کے بعد کچھ بلڈ لائنز پرنٹ کرتی ہے۔ یہاں Permission denied کا مطلب ہے کہ موڈ غلط ہے، اور command not found کا مطلب ہے کہ /usr/local/bin آپ کے PATH میں موجود نہیں ہے۔
سسٹم صارف اور ڈیٹا ڈائریکٹری بنائیں
MinIO نیٹ ورک سے اپ لوڈز قبول کرتا ہے، لہذا اسے root کے طور پر نہیں چلنا چاہیے۔ اسے ایک ایسا اکاؤنٹ دیں جس کی کوئی ہوم ڈائریکٹری نہ ہو اور نہ ہی کوئی لاگ ان شیل ہو۔
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 پرنٹ کرنا چاہیے۔
ڈیٹا ڈائریکٹری اس صارف کے لیے قابل تحریر (writable) ہونی چاہیے، نہ صرف قابل مطالعہ۔ پہلی بار شروع ہونے پر MinIO اپنی کنفیگریشن رکھنے کے لیے والیوم کے اندر ایک .minio.sys ڈائریکٹری بناتا ہے، لہذا root کی ملکیت والی ڈائریکٹری MinIO کو سٹارٹ اپ کے دوران ایک ایسے پیغام کے ساتھ بند کر دیتی ہے جو permission denied پر ختم ہوتا ہے۔ یہی اصول ہر اس سروس پر لاگو ہوتا ہے جسے آپ اس طرح چلاتے ہیں، اور VPS پر کم سے کم استحقاق والے سروس صارفین اس کی تفصیل سے وضاحت کرتا ہے۔
روٹ اسناد کو ایک انوائرمنٹ فائل میں رکھیں
روٹ اسناد ہر بکٹ تک رسائی دیتی ہیں، اس لیے انہیں یونٹ فائل میں نہیں ہونا چاہیے، جسے ہر کوئی پڑھ سکتا ہے۔ فائل کو پہلے درست موڈ کے ساتھ بنائیں اور پھر اس میں لکھیں، تاکہ پاس ورڈ ایک لمحے کے لیے بھی ایسی فائل میں نہ رہے جسے پڑھا جا سکے۔
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/miniotee موجودہ فائل کو دوبارہ بنانے کے بجائے اسے ٹرنکیٹ (truncate) کرتا ہے، لہذا موڈ 600 پر برقرار رہتا ہے اور مالک روٹ ہی رہتا ہے۔ یہ جان بوجھ کر کیا گیا ہے۔ systemd، EnvironmentFile کو روٹ کے طور پر پڑھتا ہے اس سے پہلے کہ وہ مراعات کو User= تک کم کرے، جس کا مطلب ہے کہ سروس اکاؤنٹ کو اپنی اسناد خود پڑھنے کی ضرورت نہیں ہے۔ ایک بار جب سروس چل جائے، تو اسے sudo -u minio-user cat /etc/default/minio کے ساتھ ثابت کریں۔ اس کمانڈ کو Permission denied پرنٹ کرنا چاہیے۔
MinIO کے دو رویوں کو شروع کرنے سے پہلے جاننا ضروری ہے۔ اگر اس کے انوائرمنٹ میں MINIO_ROOT_USER اور MINIO_ROOT_PASSWORD نہ ہوں، تو MinIO شروع ہونے سے انکار نہیں کرتا۔ یہ دستاویزی ڈیفالٹ اسناد minioadmin:minioadmin کے ساتھ شروع ہوتا ہے، جو کہ پہلا جوڑا ہے جسے کوئی بھی اسکینر آزماتا ہے، اور ایسا کرتے ہوئے یہ مکمل طور پر درست نظر آتا ہے۔ 8 حروف سے کم کا پاس ورڈ مسترد کر دیا جاتا ہے: MinIO اسٹارٹ اپ پر اس غلطی کے ساتھ بند ہو جاتا ہے کہ اسناد غلط ہیں، کیونکہ ایکسیس کی (access key) کو کم از کم 3 حروف اور سیکرٹ کی (secret key) کو کم از کم 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.targetEnvironmentFile پر کوئی ابتدائی - موجود نہیں ہے، اور یہ ایک فیصلہ ہے نہ کہ ٹائپنگ کی غلطی۔ ڈیش کے ساتھ، 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/liveis-active کو active پرنٹ کرنا چاہیے، اور ہیلتھ اینڈ پوائنٹ کو 200 کا جواب دینا چاہیے۔ journalctl -u minio -n 20 --no-pager وہ API ایڈریس دکھاتا ہے جس پر سرور لسن کر رہا ہے۔ اگر یونٹ بار بار ری اسٹارٹ ہوتا رہے، تو systemd ہمت ہار دیتا ہے اور Start request repeated too quickly لاگ کرتا ہے، جس کا مطلب ہے کہ MinIO ہر کوشش پر ایگزٹ ہو رہا ہے: اس کی وجہ اس پیغام کے اوپر والی لائنوں میں درج ہوتی ہے، لہذا اوپر کی طرف پڑھیں۔
مزید آئسولیشن کے لیے، [Service] سیکشن میں ProtectSystem=full اور ProtectHome=true کا اضافہ کریں۔ دونوں کو ہوسٹ کرنل سے ماؤنٹ نیم اسپیسز کی ضرورت ہوتی ہے۔ کنٹینر ورچوئلائزیشن پر جو ہوسٹ کرنل شیئر کرتی ہے، جیسے کہ OpenVZ یا LXC، وہ ناکام ہو سکتے ہیں، اور تب یونٹ status=226/NAMESPACE رپورٹ کرتا ہے۔ ان دو لائنوں کو ہٹا دیں تو یہ شروع ہو جائے گا۔ یونٹ بذات خود ایک عام یونٹ ہے، اور VPS پر systemd سروسز اور ٹائمرز باقی ڈائریکٹوز کا احاطہ کرتا ہے۔
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سرور کو بطور عرف (alias) رجسٹر کریں، پھر اس کے ذریعے ایک آبجیکٹ منتقل کریں۔
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.txtmc 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اس کمانڈ کو ناکام ہونا چاہیے۔ اگر یہ کامیاب ہو جاتی ہے، تو اس کا مطلب ہے کہ انوائرنمنٹ فائل پروسیس تک نہیں پہنچی اور آپ کا سرور ڈیفالٹ اسناد (credentials) پر چل رہا ہے۔ مشین کو مزید استعمال کرنے سے پہلے اسے درست کریں۔
mc عرف ناموں کو ~/.mc/config.json میں سادہ متن (plain text) کے طور پر اسٹور کرتا ہے، لہذا وہ اسناد اس شخص کی ہوم ڈائریکٹری میں موجود رہتی ہیں جس نے کمانڈ چلائی تھی۔ sudo کے تحت mc چلانے سے روٹ اسناد /root/.mc/config.json میں محفوظ ہو جاتی ہیں۔ روٹ عرف کو صرف ایک ایڈمنسٹریٹر اکاؤنٹ پر رکھیں اور ہر ایپلیکیشن کو اس کی اپنی الگ کلید (key) دیں۔
ایک presigned URL کے ساتھ ایک آبجیکٹ فراہم کرنا
ایک presigned URL ایک عام HTTPS لنک ہوتا ہے جس کے ساتھ ایک دستخط (signature) اور میعاد ختم ہونے کا وقت منسلک ہوتا ہے۔ جس کے پاس بھی یہ لنک ہوگا، وہ بغیر کسی اکاؤنٹ اور بغیر کسی کلائنٹ کے اس ایک آبجیکٹ کو حاصل کر سکتا ہے۔
mc share download --expire 12h local/backups/hello.txtآؤٹ پٹ میں کوئری سٹرنگ کے اندر X-Amz-Signature اور X-Amz-Expires شامل ہوتے ہیں۔ اس کے بارے میں دو چیزیں لوگوں کو حیران کرتی ہیں۔ یہ لنک اس اینڈ پوائنٹ سے بنتا ہے جو آپ نے عرفی نام (alias) میں استعمال کیا ہے، لہذا 127.0.0.1 پر موجود ایک عرفی نام ایسا لنک تیار کرتا ہے جسے صرف یہی مشین کھول سکتی ہے: ان لنکس کے لیے جو آپ بھیجنا چاہتے ہیں، اپنے پبلک ہوسٹ نیم پر ایک دوسرا عرفی نام بنائیں۔ اور اس میں منسوخ کرنے (revoke) کا کوئی بٹن نہیں ہے۔ دستخط اس وقت تک درست رہتا ہے جب تک اس کی میعاد ختم نہیں ہو جاتی، لہذا مختصر میعاد ہی وہ واحد کنٹرول ہے جو آپ کے پاس ہے۔ S3 دستخط کا فارمیٹ زیادہ سے زیادہ 7 دن کی اجازت دیتا ہے۔
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-backupMinIO میں ایک بلٹ ان 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 معیاری AWS ماحولیاتی متغیرات (environment variables) سے S3 اسناد پڑھتا ہے، لہذا اس میں 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 snapshotsrestic init ریپوزٹری پاس ورڈ مانگتا ہے۔ وہ پاس ورڈ ریپوزٹری کو انکرپٹ کرتا ہے، لہذا MinIO صرف سائفر ٹیکسٹ اسٹور کرتا ہے، اور پاس ورڈ کھونے کا مطلب بیک اپ کا ضائع ہونا ہے۔ systemd ٹائمر کے ذریعے شروع کی گئی رن میں ٹائپ کرنے کے لیے کوئی ٹرمینل نہیں ہوتا، لہذا شیڈولڈ بیک اپ کے لیے RESTIC_PASSWORD_FILE کو mode 600 فائل پر سیٹ کریں۔
ایک پلیسمنٹ رول اوپر دی گئی کسی بھی کمانڈ سے زیادہ اہم ہے۔ اسی VPS پر restic ریپوزٹری جہاں ڈیٹا موجود ہے، آپ کو صرف ایک خراب rm سے بچاتی ہے اور کسی چیز سے نہیں۔ MinIO نوڈ کو ایک مختلف مشین پر ہونا چاہیے، مثالی طور پر ایک مختلف ریجن میں۔ VPS پر restic بیک اپ اس کے علاوہ شیڈولنگ اور ریٹینشن کا احاطہ کرتا ہے۔
nginx کے ساتھ TLS کو ختم کرنا
MinIO localhost پر موجود ہے، لہذا nginx عوامی سطح (public surface) ہے۔ پہلے سرٹیفکیٹ جاری کریں، جیسا کہ certbot اور nginx کے ساتھ Let's Encrypt سرٹیفکیٹ میں بیان کیا گیا ہے، پھر اس سرور بلاک کا استعمال کریں۔
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 باڈی کی حد کو ہٹا دیتا ہے، جو بصورت دیگر کسی بھی بڑی اپ لوڈ کو MinIO کے درخواست دیکھنے سے پہلے ہی 413 Request Entity Too Large کے ساتھ مسترد کر دیتا ہے۔ 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 سے منسلک ایڈریس کسی دوسری مشین سے ناقابل رسائی ہوتا ہے، چاہے فائر وال کچھ بھی کہے۔ VPS پر ufw فائر وال کی بنیادی باتیں میں کمانڈز موجود ہیں۔
جب سنگل نوڈ MinIO کافی ہو، اور جب آپ کو حقیقی S3 درکار ہو
یہاں سنگل نوڈ کا مطلب ایک ڈرائیو ہے جس میں صفر پیریٹی (parity) ہے۔ MinIO کی اپنی دستاویزات اس لے آؤٹ کو ٹیسٹنگ اور چھوٹے ورک لوڈز کے لیے موزوں قرار دیتی ہیں جن میں دستیابی (availability) کی کوئی ضرورت نہ ہو۔ اس ڈیپلائمنٹ کے اندر کوئی دوسری کاپی موجود نہیں ہوتی، لہذا ہر آبجیکٹ کی پائیداری (durability) ایک VPS ڈسک کی پائیداری کے برابر ہوتی ہے۔ وہ فیچرز جو ڈسٹری بیوٹڈ ایریژر-کوڈڈ (erasure-coded) بیک اینڈ پر انحصار کرتے ہیں، جن میں بکٹ ریپلیکیشن اور آبجیکٹ لاکنگ شامل ہیں، وہ ملٹی ڈرائیو ڈیپلائمنٹس کا حصہ ہیں، لہذا اس سیٹ اپ پر کسی کو بھی ناقابلِ تبدیلی (immutable) ریٹینشن پالیسی کا وعدہ نہ کریں۔
یہ کسی دوسرے ریجن میں موجود دوسرے VPS پر restic ٹارگٹ کے طور پر، اور ڈیولپمنٹ کے کام اور CI آرٹفیکٹس کے لیے S3 اینڈ پوائنٹ کے طور پر ایک اچھا انتخاب ہے، جہاں بکٹ کے ضائع ہونے کا مطلب صرف دوبارہ تعمیر (rebuild) کرنا ہو۔ یہ ایک چھوٹی ایپلی کیشن میں یوزر اپ لوڈز کے لیے بھی مناسب ہے، بشرطیکہ آپ کے پاس ریکوری پلان موجود ہو اور آپ نے حقیقت میں بحالی (restore) کا تجربہ کیا ہو۔
جب کوئی معاہدہ یا ریگولیٹر آبجیکٹ لاک یا ملٹی ریجن پائیداری کا مطالبہ کرے، یا جب آپ یہ نہ چاہیں کہ رات 3 بجے آپ کو ڈسک بھر جانے کی وجہ سے کال کی جائے، تو مینیجڈ S3 کا انتخاب کریں۔ منجمد بلڈ (frozen build) اس کی ایک اور ایماندارانہ وجہ ہے۔ جولائی 2026 تک، پری کمپائلڈ کمیونٹی بائنری ستمبر 2025 کی ہے اور اسے کوئی فکسز نہیں ملتے، لہذا اسے چلانے کا مطلب یہ ہے کہ آپ اسے قبول کریں، یا سورس سے بلڈ کریں اور خود پروجیکٹ کے ساتھ اپ ٹو ڈیٹ رہیں۔
ایک حد کا ذکر کرنا ضروری ہے کیونکہ یہ اکثر سامنے آتی ہے۔ آبجیکٹ اسٹوریج ڈیٹا بیس نہیں ہے۔ ہر رائٹ (write) پورے آبجیکٹ کو تبدیل کر دیتا ہے، لہذا S3 بکٹ پر لائیو SQL فائل سست اور غیر محفوظ ہے۔ ڈیٹا بیس کو لوکل ڈسک پر رکھیں اور اس کا بیک اپ بکٹ میں لیں: VPS پر پروڈکشن میں SQLite چلانا اس تقسیم کی وضاحت کرتا ہے۔
ناکامی کے طریقے اور وہ پیغامات جو آپ دیکھیں گے
یونٹ 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 پر ختم ہونے والے پیغام کا مطلب ہے کہ ڈیٹا ڈائریکٹری سروس اکاؤنٹ کے لیے قابل تحریر (writable) نہیں ہے، لہذا چیک کریں کہ stat -c '%U' /var/lib/minio/data، minio-user پرنٹ کرتا ہے۔
minioadmin:minioadmin اب بھی لاگ ان ہو رہا ہے۔ انوائرمنٹ فائل پروسیس تک نہیں پہنچی۔ تصدیق کریں کہ یونٹ میں EnvironmentFile=/etc/default/minio شامل ہے، sudo systemctl daemon-reload چلائیں، اور پھر سروس کو ری اسٹارٹ کریں۔ MinIO اپنے روٹ اسناد (root credentials) کو اسٹارٹ اپ پر ایک بار پڑھتا ہے، لہذا ری اسٹارٹ کیے بغیر اس فائل میں ترمیم کرنے سے کچھ تبدیل نہیں ہوتا۔
اسٹارٹ اپ پر Address already in use۔ کوئی اور پروسیس پورٹ 9000 استعمال کر رہا ہے۔ MinIO کی پورٹ تبدیل کرنے سے پہلے sudo ss -ltnp | grep :9000 کے ساتھ اسے تلاش کریں۔
پراکسی کے ذریعے 1 MB سے زیادہ کی اپ لوڈز ناکام ہو جاتی ہیں۔ nginx نے 413 Request Entity Too Large کا جواب دیا اور MinIO نے درخواست کبھی نہیں دیکھی۔ سرور بلاک میں client_max_body_size 0 سیٹ کریں۔
SignatureDoesNotMatch۔ یا تو خفیہ کلید (secret key) غلط ہے، یا کلائنٹ اور MinIO کے درمیان کسی چیز نے Host ہیڈر کو دوبارہ لکھا ہے، جس کا احاطہ دستخط (signature) کرتا ہے۔
RequestTimeTooSkewed۔ کلائنٹ یا سرور کی گھڑی غلط ہے۔ ہر S3 درخواست میں ٹائم اسٹیمپ ہوتا ہے اور اسے 15 منٹ کی ونڈو سے باہر مسترد کر دیا جاتا ہے۔ timedatectl چیک کریں اور تصدیق کریں کہ ٹائم سنکرونائزیشن فعال ہے۔
ایسی بکٹ پر Access Denied جس کے بارے میں آپ جانتے ہیں کہ وہ موجود ہے۔ کلید ایک مختلف بکٹ تک محدود ہے۔ mc admin policy info local restic-rw کے ساتھ پرنٹ کریں کہ پالیسی اصل میں کیا اجازت دیتی ہے اور ریسورس لائنوں میں بکٹ کے نام کا موازنہ کریں۔
FAQ
کیا سنگل نوڈ MinIO حقیقی بیک اپ کے لیے کافی ہے؟
یہ ایک الگ مشین پر چلنے والے restic ٹارگٹ کے طور پر کافی ہے، جو اس ڈیٹا سے الگ ہو جس کی یہ حفاظت کر رہا ہے۔ یہ آپ کی واحد کاپی کے طور پر کافی نہیں ہے۔ سنگل ڈرائیو ڈیپلائمنٹ میں صفر پیریٹی (parity) ہوتی ہے، لہذا MinIO کے اندر کوئی دوسری کاپی موجود نہیں ہوتی، اور اگر وہ VPS ڈسک ڈیٹا کھو دے تو آبجیکٹس ضائع ہو جاتے ہیں۔ کہیں اور ایک دوسرا ٹارگٹ رکھیں، اور کم از کم ایک بار دونوں سے بحالی (restore) کر کے دیکھیں تاکہ آپ کو معلوم ہو کہ عمل کام کرتا ہے۔
sha256sum -c، MinIO کی چیک سم فائل پر کیوں ناکام ہوتا ہے؟
اس لیے کہ اس فائل کے اندر ہیش کے بعد کا لیبل ریلیز کا نام minio.RELEASE.2025-09-07T16-13-09Z بتاتا ہے، جبکہ آپ کی ڈاؤن لوڈ کردہ فائل عام طور پر minio کہلاتی ہے۔ sha256sum -c چیک سم فائل میں لکھے ہوئے نام والی فائل تلاش کرتا ہے، اسے نہیں پاتا، اور No such file or directory اور WARNING: 1 listed file could not be read کی رپورٹ دیتا ہے۔ ڈاؤن لوڈ ٹھیک ہے۔ ہیش سٹرنگز کا براہ راست موازنہ کریں اور لیبل کو نظر انداز کریں، جس کا کوئی سیکیورٹی مطلب نہیں ہے۔
MinIO ایڈمن ویب کنسول کہاں گیا؟
MinIO نے مئی 2025 میں کمیونٹی ایڈیشن کنسول سے انتظامی خصوصیات کو ہٹا دیا ہے، اور ویب انٹرفیس میں صرف ایک آبجیکٹ براؤزر چھوڑا ہے۔ اب بکیٹس (buckets) اور صارفین کا انتظام mc کلائنٹ کے ذریعے کیا جاتا ہے، جس میں mc admin user add اور mc admin policy attach جیسے کمانڈز استعمال ہوتے ہیں۔ کمیونٹی ایڈیشن میں یہی معاون طریقہ ہے نہ کہ کوئی عارضی حل، اسی لیے یہ گائیڈ سب کچھ کمانڈ لائن سے کرتی ہے۔
میں restic کو S3 بیک اینڈ کے طور پر MinIO کی طرف کیسے موڑ سکتا ہوں؟
AWS_ACCESS_KEY_ID اور AWS_SECRET_ACCESS_KEY کو MinIO ایکسیس کی (access key) اور اس کے سیکرٹ پر سیٹ کریں، پھر s3:https://s3.example.com/restic کی شکل میں ایک ریپوزٹری سٹرنگ استعمال کریں، جہاں آخری پاتھ ایلیمنٹ بکیٹ کا نام ہے۔ پہلے mc mb کے ساتھ بکیٹ بنائیں، کیونکہ ایک بکیٹ تک محدود کی (key) کو بکیٹ بنانے کی اجازت نہیں ہوتی۔ restic اپ لوڈ کرنے سے پہلے ہر چیز کو اپنے ریپوزٹری پاس ورڈ کے ساتھ انکرپٹ کرتا ہے، لہذا MinIO صرف سائفر ٹیکسٹ (ciphertext) اسٹور کرتا ہے اور آپ کی فائلیں کبھی نہیں دیکھتا۔
کیا مجھے MinIO کو nginx کے پیچھے چلانا ضروری ہے؟
جب کلائنٹ اسی مشین پر نہ ہو تو آپ کو TLS (ٹرانسپورٹ لیئر سیکیورٹی) کی ضرورت ہوتی ہے، کیونکہ S3 اسناد اور آبجیکٹ ڈیٹا دونوں درخواست کے اندر سفر کرتے ہیں۔ certbot سے سرٹیفکیٹ کے ساتھ پورٹ 443 پر پراکسی اسے حاصل کرنے کا آسان ترین طریقہ ہے، اور یہ سرٹیفکیٹ کی تجدید کو MinIO سے دور رکھتا ہے۔ MinIO خود بھی TLS کو ٹرمینیٹ کر سکتا ہے اگر آپ --certs-dir کو اس ڈائریکٹری کی طرف موڑ دیں جہاں public.crt اور private.key موجود ہوں، لیکن پھر سروس اکاؤنٹ کو تجدید شدہ پرائیویٹ کی (private key) تک ریڈ ایکسیس کی ضرورت ہوتی ہے، جو اسی نتیجے کے لیے اضافی کام ہے۔