SSD Nodes Learn 8GB RAM — $66/साल
गाइड Matt Connorलेखक: Matt Connor · अपडेट किया गया: 2026-08-01

Ubuntu 24.04 पर MinIO कैसे सेटअप करें: गाइड

Ubuntu 24.04 VPS पर MinIO इंस्टॉल करने का पूरा तरीका जानें। इसमें बाइनरी सेटअप, systemd कॉन्फ़िगरेशन, mc कमांड्स और restic बैकअप के लिए S3 एंडपॉइंट बनाने की पूरी प्रक्रिया शामिल है।

Verified Every command ran end-to-end on a fresh Ubuntu 24.04 server, July 30, 2026.

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 एंडपॉइंट मिलता है जिसे आप नियंत्रित करते हैं, और आप उन सभी कार्यों की जिम्मेदारी भी लेते हैं जो क्लाउड प्रदाता करता था, जैसे खराब डिस्क को बदलना या सर्वर सॉफ़्टवेयर को पैच करना। अंत के पास का अनुभाग स्पष्ट रूप से बताता है कि यह समझौता कब फायदेमंद होता है।

जुलाई 2026 में MinIO कम्युनिटी एडिशन की स्थिति

इस पर काम शुरू करने से पहले इस भाग को पढ़ें, क्योंकि हाल ही में इसमें बदलाव हुए हैं। मई 2025 में MinIO ने कम्युनिटी एडिशन के वेब कंसोल से एडमिनिस्ट्रेशन फीचर्स को हटा दिया है। ब्राउज़र में अब केवल एक ऑब्जेक्ट ब्राउज़र बचा है, इसलिए बकेट्स और एक्सेस कीज़ को अब mc कमांड लाइन क्लाइंट के साथ मैनेज किया जाता है।

2025 के अंत में MinIO ने प्री-कंपाइल की गई कम्युनिटी बाइनरीज़ को पब्लिश करना बंद कर दिया। प्रोजेक्ट README अब कहता है कि कम्युनिटी एडिशन केवल सोर्स कोड के रूप में वितरित किया जाता है। पुराने डाउनलोड URL अभी भी काम करते हैं: जुलाई 2026 तक वे सर्वर बिल्ड RELEASE.2025-09-07T16-13-09Z और क्लाइंट बिल्ड RELEASE.2025-08-13T08-35-41Z प्रदान करते हैं, और कोई नया कम्युनिटी बिल्ड नहीं आया है। इसलिए नीचे दी गई बाइनरी वास्तविक है और यह चलती है, लेकिन यह फ्रोजन (स्थिर) है। सितंबर 2025 के बाद पब्लिश किए गए सुरक्षा फिक्स इसमें शामिल नहीं हैं।

यह एक तथ्य इस गाइड के बाकी हिस्सों को निर्धारित करता है। यही कारण है कि MinIO यहाँ 127.0.0.1 पर लिसन करता है और इंटरनेट तक केवल आपके द्वारा नियंत्रित प्रॉक्सी के माध्यम से पहुँचता है। यदि आप फिक्स को ट्रैक करना चाहते हैं, तो सोर्स से बिल्ड करें। वेंडर README एक सिंगल कमांड, go install github.com/minio/minio@latest देता है, जिसके लिए Go टूलचेन की आवश्यकता होती है और यह बाइनरी को ~/go/bin/minio में लिखता है। उस बाइनरी को /usr/local/bin/minio में इंस्टॉल करें और यहाँ बाकी सभी स्टेप्स अपरिवर्तित रहेंगे।

MinIO बाइनरी इंस्टॉल करें और डाउनलोड की पुष्टि करें

पिन किया गया रिलीज़ और उसका प्रकाशित चेकसम डाउनलोड करें। -f फ्लैग यह सुनिश्चित करता है कि HTTP त्रुटि होने पर curl विफल हो जाए, बजाय इसके कि वह त्रुटि पृष्ठ को आपके द्वारा दिए गए नाम से सहेज ले। इसी कारण से लोग अक्सर 404 पृष्ठ इंस्टॉल कर लेते हैं और फिर सोचते हैं कि वह निष्पादित (execute) क्यों नहीं हो रहा है।

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 के रूप में नहीं चलना चाहिए। इसे एक ऐसा अकाउंट दें जिसमें कोई होम डायरेक्टरी और कोई लॉगिन शेल न हो।

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 1000 से कम UID वाला एक सिस्टम अकाउंट बनाता है, जो इसे उन अकाउंट्स की रेंज से बाहर रखता है जिनका उपयोग लोग करते हैं। -M होम डायरेक्टरी को छोड़ देता है, क्योंकि जिस अकाउंट से कभी लॉगिन नहीं किया जाता, उसमें रखने के लिए कुछ नहीं होता। परिणाम की जांच id minio-user के साथ करें, और stat -c '%U %a' /var/lib/minio के साथ, जिसे minio-user 750 प्रिंट करना चाहिए।

डेटा डायरेक्टरी उस यूजर द्वारा लिखने योग्य (writable) होनी चाहिए, न कि केवल पढ़ने योग्य। पहली बार शुरू होने पर 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 मौजूदा फ़ाइल को फिर से बनाने के बजाय उसे ट्रंकेट (truncate) करता है, इसलिए मोड 600 पर बना रहता है और ओनर root ही रहता है। यह जानबूझकर किया गया है। systemd, User= पर प्रिविलेज ड्रॉप करने से पहले EnvironmentFile को root के रूप में पढ़ता है, जिसका अर्थ है कि सर्विस अकाउंट को कभी भी अपने क्रेडेंशियल्स पढ़ने की आवश्यकता नहीं होती है। एक बार सर्विस चल जाने के बाद, 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.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 हर प्रयास पर बाहर निकल जाता है: इसका कारण उस संदेश के ऊपर की पंक्तियों में प्रिंट किया गया है, इसलिए ऊपर की ओर पढ़ें।

अधिक आइसोलेशन के लिए, [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.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 में सादे टेक्स्ट में स्टोर करता है, इसलिए वे क्रेडेंशियल्स उस व्यक्ति की होम डायरेक्टरी में रहते हैं जिसने कमांड चलाई है। sudo के तहत mc चलाने से रूट क्रेडेंशियल्स /root/.mc/config.json में चले जाते हैं। रूट उपनाम को एक एडमिनिस्ट्रेटर अकाउंट पर रखें और प्रत्येक एप्लिकेशन को उसकी अपनी की (key) दें।

एक presigned URL के साथ एक ऑब्जेक्ट प्रदान करना

एक presigned URL एक सामान्य HTTPS लिंक होता है जिसमें एक सिग्नेचर और एक समाप्ति समय (expiry) जुड़ा होता है। जिसके पास भी यह लिंक होगा, वह बिना किसी अकाउंट और बिना किसी क्लाइंट के उस एक ऑब्जेक्ट को प्राप्त कर सकता है।

mc share download --expire 12h local/backups/hello.txt

आउटपुट की क्वेरी स्ट्रिंग में X-Amz-Signature और X-Amz-Expires शामिल होते हैं। इसके बारे में दो बातें लोगों को आश्चर्यचकित करती हैं। लिंक आपके द्वारा उपयोग किए गए alias में मौजूद endpoint से बनाया जाता है, इसलिए 127.0.0.1 पर बना एक alias ऐसा लिंक बनाता है जिसे केवल यह मशीन ही खोल सकती है: जिन लिंक को आप भेजना चाहते हैं, उनके लिए अपने public hostname पर एक दूसरा alias बनाएं। और इसमें कोई revoke बटन नहीं होता है। सिग्नेचर तब तक मान्य रहता है जब तक कि वह समाप्त नहीं हो जाता, इसलिए कम समय की expiry ही एकमात्र नियंत्रण है जो आपके पास है। S3 सिग्नेचर फॉर्मेट के अनुसार सात दिन अधिकतम समय सीमा है।

restic को अपनी स्वयं की key और bucket दें

root क्रेडेंशियल्स हर bucket को पढ़ और हटा सकते हैं, इसलिए बैकअप जॉब के पास ये नहीं होने चाहिए। एक bucket, उस bucket तक सीमित एक policy, और एक ऐसा user बनाएं जिसे इसके अलावा कुछ न मिले।

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 policy होती है जो एक कमांड कम कर सकती थी, लेकिन वह सर्वर पर हर bucket का पूर्ण एक्सेस प्रदान करती है। ऊपर दी गई policy में bucket का नाम जानबूझकर दो बार दिया गया है: एक बार arn:aws:s3:::restic के रूप में ताकि bucket को लिस्ट करना काम करे, और एक बार इसके अंदर की वस्तुओं के लिए arn:aws:s3:::restic/* के रूप में। S3 में एक bucket और उसकी वस्तुएं अलग-अलग संसाधन हैं, इसलिए केवल एक का नाम लेने वाली policy इस तरह विफल हो जाती है जैसे कि क्लाइंट खराब हो।

उस पर भरोसा करने से पहले सीमा का परीक्षण करें।

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 के साथ विफल हो जाता है। जिस policy का आपने परीक्षण नहीं किया है, वह केवल एक अनुमान है।

अब restic को bucket की ओर निर्देशित करें। restic मानक AWS एनवायरनमेंट वेरिएबल्स से 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 snapshots

restic init एक रिपॉजिटरी पासवर्ड मांगता है। वह पासवर्ड रिपॉजिटरी को एन्क्रिप्ट करता है, इसलिए MinIO केवल सिफरटेक्स्ट स्टोर करता है, और पासवर्ड खोने का मतलब है बैकअप खोना। systemd टाइमर द्वारा शुरू किए गए रन में टाइप करने के लिए कोई टर्मिनल नहीं होता है, इसलिए निर्धारित बैकअप के लिए RESTIC_PASSWORD_FILE को मोड 600 फ़ाइल पर सेट करें।

एक प्लेसमेंट नियम ऊपर दिए गए किसी भी कमांड से अधिक मायने रखता है। जिस डेटा की सुरक्षा की जा रही है, उसी VPS पर स्थित restic रिपॉजिटरी आपको केवल एक खराब rm से बचाती है, और किसी चीज़ से नहीं। MinIO नोड एक अलग मशीन होनी चाहिए, आदर्श रूप से एक अलग क्षेत्र में। VPS पर restic बैकअप इसके ऊपर शेड्यूलिंग और रिटेंशन को कवर करता है।

nginx के साथ TLS समाप्त करना

MinIO localhost पर स्थित है, इसलिए nginx सार्वजनिक इंटरफ़ेस है। सबसे पहले certbot और nginx के साथ Let's Encrypt प्रमाणपत्र में बताए अनुसार प्रमाणपत्र जारी करें, फिर इस server ब्लॉक का उपयोग करें।

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 का अपना दस्तावेज़ीकरण इस लेआउट को परीक्षण और बिना उपलब्धता आवश्यकता वाले छोटे वर्कलोड के लिए उपयुक्त बताता है। डिप्लॉयमेंट के भीतर कोई दूसरी कॉपी नहीं होती है, इसलिए प्रत्येक ऑब्जेक्ट की टिकाऊपन एक VPS डिस्क की टिकाऊपन के बराबर होती है। जो सुविधाएँ डिस्ट्रीब्यूटेड इरेज़र-कोडेड बैकएंड पर निर्भर करती हैं, जैसे कि बकेट रेप्लिकेशन और ऑब्जेक्ट लॉकिंग, वे मल्टी-ड्राइव डिप्लॉयमेंट का हिस्सा हैं, इसलिए इस सेटअप पर किसी को भी अपरिवर्तनीय रिटेंशन पॉलिसी का वादा न करें।

यह किसी अन्य क्षेत्र में दूसरे VPS पर restic टारगेट के रूप में, और डेवलपमेंट कार्य तथा CI आर्टिफैक्ट्स के लिए S3 एंडपॉइंट के रूप में एक अच्छा विकल्प है, जहाँ बकेट खोने का अर्थ केवल एक रीबिल्ड है। यदि आप रिकवरी प्लान के मालिक हैं और आपने वास्तव में रिस्टोर का परीक्षण किया है, तो छोटे एप्लिकेशन में यूजर अपलोड के लिए भी यह उचित है।

मैनेज्ड S3 तब चुनें जब कोई अनुबंध या नियामक संस्था ऑब्जेक्ट लॉक या मल्टी-रीजन टिकाऊपन की मांग करे, या जब आप नहीं चाहते कि डिस्क भर जाने के कारण रात के 03:00 बजे आपको कॉल किया जाए। फ्रोजन बिल्ड एक और ईमानदार कारण है। जुलाई 2026 तक, प्री-कंपाइल की गई कम्युनिटी बाइनरी सितंबर 2025 की है और इसे कोई फिक्स नहीं मिलता है, इसलिए इसे चलाने का अर्थ है इसे स्वीकार करना, या स्वयं सोर्स से बिल्ड करना और प्रोजेक्ट के साथ अपडेट रहना।

एक सीमा का उल्लेख करना आवश्यक है क्योंकि यह अक्सर सामने आती है। ऑब्जेक्ट स्टोरेज डेटाबेस नहीं है। प्रत्येक राइट पूरे ऑब्जेक्ट को बदल देता है, इसलिए 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 पर समाप्त होने वाले संदेश का अर्थ है कि सर्विस अकाउंट के पास डेटा डायरेक्टरी में लिखने की अनुमति नहीं है, इसलिए जांचें कि stat -c '%U' /var/lib/minio/data, minio-user आउटपुट देता है या नहीं।

minioadmin:minioadmin अभी भी लॉग इन कर पा रहा है। एनवायरनमेंट फाइल प्रोसेस तक नहीं पहुँची। पुष्टि करें कि यूनिट में EnvironmentFile=/etc/default/minio शामिल है, sudo systemctl daemon-reload चलाएं, और फिर सर्विस को रीस्टार्ट करें। MinIO स्टार्टअप के समय अपने रूट क्रेडेंशियल्स को केवल एक बार पढ़ता है, इसलिए रीस्टार्ट किए बिना उस फाइल को संपादित करने से कुछ भी नहीं बदलता है।

स्टार्टअप पर 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 या तो सीक्रेट की गलत है, या क्लाइंट और MinIO के बीच किसी चीज़ ने Host हेडर को बदल दिया है, जिसे सिग्नेचर कवर करता है।

RequestTimeTooSkewed क्लाइंट या सर्वर की घड़ी गलत है। प्रत्येक S3 अनुरोध में एक टाइमस्टैम्प होता है और 15 मिनट की विंडो के बाहर होने पर इसे अस्वीकार कर दिया जाता है। timedatectl की जांच करें और पुष्टि करें कि टाइम सिंक्रोनाइज़ेशन सक्रिय है।

ऐसे बकेट पर Access Denied जिसके बारे में आप जानते हैं कि वह मौजूद है। की (key) एक अलग बकेट तक सीमित है। mc admin policy info local restic-rw के साथ प्रिंट करें कि पॉलिसी वास्तव में क्या अनुमति देती है और रिसोर्स लाइनों में बकेट के नाम की तुलना करें।

FAQ

क्या सिंगल-नोड MinIO वास्तविक बैकअप के लिए पर्याप्त है?

यह उन डेटा से अलग मशीन पर चलने वाले restic टारगेट के रूप में पर्याप्त है जिसकी यह सुरक्षा करता है। यह आपकी एकमात्र कॉपी के रूप में पर्याप्त नहीं है। सिंगल-ड्राइव डिप्लॉयमेंट में शून्य पैरिटी (parity) होती है, इसलिए MinIO के भीतर कोई दूसरी कॉपी नहीं होती है। यदि वह VPS डिस्क डेटा खो देती है, तो ऑब्जेक्ट्स नष्ट हो जाते हैं। कहीं और एक दूसरा टारगेट रखें, और कम से कम एक बार दोनों से रिस्टोर करके देखें ताकि आप सुनिश्चित हो सकें कि प्रक्रिया काम करती है।

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 में कम्युनिटी एडिशन कंसोल से एडमिनिस्ट्रेशन सुविधाओं को हटा दिया है, जिससे वेब इंटरफ़ेस में केवल एक ऑब्जेक्ट ब्राउज़र बचा है। बकेट्स और यूज़र्स को अब mc क्लाइंट के साथ प्रबंधित किया जाता है, जिसमें mc admin user add और mc admin policy attach जैसे कमांड का उपयोग होता है। यह कम्युनिटी एडिशन में समर्थित तरीका है, न कि कोई वर्कअराउंड, इसीलिए यह गाइड सब कुछ कमांड लाइन से करती है।

मैं restic को S3 बैकएंड के रूप में MinIO की ओर कैसे इंगित करूँ?

AWS_ACCESS_KEY_ID और AWS_SECRET_ACCESS_KEY को MinIO एक्सेस की और उसके सीक्रेट पर सेट करें, फिर s3:https://s3.example.com/restic के रूप का रिपॉजिटरी स्ट्रिंग उपयोग करें, जहाँ अंतिम पाथ एलिमेंट बकेट का नाम है। पहले mc mb के साथ बकेट बनाएँ, क्योंकि एक बकेट तक सीमित की (key) के पास बकेट बनाने की अनुमति नहीं होती है। restic अपलोड करने से पहले सब कुछ अपने स्वयं के रिपॉजिटरी पासवर्ड से एन्क्रिप्ट करता है, इसलिए MinIO केवल सिफरटेक्स्ट स्टोर करता है और आपकी फ़ाइलों को कभी नहीं देखता है।

क्या मुझे MinIO को nginx के पीछे चलाना होगा?

जब कोई क्लाइंट उसी मशीन पर न हो, तो आपको TLS (ट्रांसपोर्ट लेयर सिक्योरिटी) की आवश्यकता होती है, क्योंकि S3 क्रेडेंशियल्स और ऑब्जेक्ट डेटा दोनों रिक्वेस्ट के भीतर यात्रा करते हैं। certbot से सर्टिफिकेट के साथ पोर्ट 443 पर एक प्रॉक्सी इसे प्राप्त करने का सबसे सरल तरीका है, और यह सर्टिफिकेट रिन्यूअल को MinIO से दूर रखता है। यदि आप --certs-dir को public.crt और private.key रखने वाली डायरेक्टरी की ओर इंगित करते हैं, तो MinIO स्वयं भी TLS को टर्मिनेट कर सकता है, लेकिन तब सर्विस अकाउंट को रिन्यू की गई प्राइवेट की तक रीड एक्सेस की आवश्यकता होती है, जो समान परिणाम के लिए अतिरिक्त कार्य है।

#minio#s3#object-storage#self-hosted#vps