Ubuntu 24.04 पर MinIO कैसे सेटअप करें
Ubuntu 24.04 VPS पर MinIO को इंस्टॉल करने का पूरा तरीका जानें। इस गाइड में verified binary, systemd unit, mc कमांड्स और restic बैकअप के साथ S3 API सेटअप शामिल है।
MinIO के साथ self-hosted object storage आपको क्या देता है
MinIO एक self-hosted object storage है जो Amazon S3 API का उपयोग करता है। restic या किसी भी S3 SDK को अपने सर्वर की ओर point करें, एक endpoint setting बदलें, और client को कोई अंतर पता नहीं चलेगा। यह गाइड Ubuntu 24.04 पर एक single node तैयार करती है: एक verified binary, एक dedicated system user, एक systemd unit जो root credentials को unit file से बाहर रखती है, और एक bucket जिसमें restic backup लेता है।
S3 (simple storage service) एक filesystem के बजाय एक HTTP API है। आप एक bucket में एक key के तहत object को PUT करते हैं और उसे GET करते हैं, इसमें न तो partial write होता है और न ही rename। Backup tools इस model को पसंद करते हैं, क्योंकि object या तो पूरा पहुँचता है या बिल्कुल नहीं पहुँचता।
एक node आपके डेटा की एक copy रखता है। यही वह समझौता है जो आप कर रहे हैं। आपको एक VPS की कीमत पर एक S3 endpoint मिलता है जिसे आप नियंत्रित करते हैं, और साथ ही आप वे सभी काम भी अपने जिम्मे ले लेते हैं जो cloud provider करता था, जैसे कि खराब disk को बदलना या server software को patch करना। अंत के पास वाला section स्पष्ट रूप से बताता है कि यह समझौता कब फायदेमंद होता है।
जुलाई 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 दिखाता है, जो एक दूषित (corrupted) डाउनलोड जैसा लगता है जबकि वास्तव में ऐसा नहीं है। लेबल केवल एक नाम है। हैश वह हिस्सा है जो गारंटी देता है।
स्पष्ट रहें कि यह जाँच क्या सिद्ध करती है। बाइनरी और हैश एक ही कनेक्शन के माध्यम से एक ही वेंडर से आते हैं, इसलिए मिलान यह सिद्ध करता है कि डाउनलोड पूर्ण है और ट्रांज़िट के दौरान क्षतिग्रस्त या परिवर्तित नहीं हुआ है। यह सिद्ध नहीं करता कि वेंडर विश्वसनीय है। यह एक अलग समस्या है और कोई भी 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 में नहीं है।
एक system user और एक data directory बनाएँ
MinIO नेटवर्क से uploads स्वीकार करता है, इसलिए इसे root के रूप में नहीं चलना चाहिए। इसे एक ऐसा account दें जिसका कोई home directory न हो और न ही कोई login 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 एक system account बनाता है जिसका UID 1000 से कम होता है, जो इसे सामान्य users की range से बाहर रखता है। -M home directory को छोड़ देता है, क्योंकि जिस account से कभी login नहीं किया जाता, उसे इसकी आवश्यकता नहीं होती। परिणाम की जाँच id minio-user से करें, और stat -c '%U %a' /var/lib/minio के साथ, जिसे minio-user 750 print करना चाहिए।
Data directory उस user द्वारा writable होनी चाहिए, न कि केवल readable। पहली बार start होने पर MinIO अपने configuration को रखने के लिए volume के अंदर एक .minio.sys directory बनाता है, इसलिए root के स्वामित्व वाली directory होने पर MinIO startup के दौरान बंद हो जाता है और एक message देता है जो permission denied पर समाप्त होता है। यही नियम हर उस service पर लागू होता है जिसे आप इस तरह चलाते हैं, और VPS पर least-privilege service users में इसे विस्तार से समझाया गया है।
root credentials को एक environment file में रखें
root credentials हर bucket को खोल सकते हैं, इसलिए उन्हें unit file में नहीं रखना चाहिए, जिसे कोई भी पढ़ सकता है। पहले सही mode के साथ file बनाएँ और फिर उसमें लिखें, ताकि password कभी भी ऐसी file में न रहे जिसे कोई पढ़ सके।
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 मौजूदा file को recreate करने के बजाय उसे truncate करता है, इसलिए mode 600 पर और owner root ही रहता है। यह जानबूझकर किया गया है। systemd, EnvironmentFile को root के रूप में पढ़ता है, इससे पहले कि वह privileges को User= पर drop करे। इसका मतलब है कि service account को कभी भी अपने credentials पढ़ने की आवश्यकता नहीं होती। एक बार service चल जाने के बाद, sudo -u minio-user cat /etc/default/minio के साथ इसकी पुष्टि करें। उस command को Permission denied print करना चाहिए।
MinIO के दो व्यवहारों को शुरू करने से पहले जानना उपयोगी है। यदि environment में MINIO_ROOT_USER और MINIO_ROOT_PASSWORD न हों, तो MinIO start होने से मना नहीं करता है। यह दस्तावेज़ में दिए गए default credentials minioadmin:minioadmin के साथ start होता है, जो कि पहला pair है जिसे कोई भी scanner आज़माता है, और ऐसा करते समय यह पूरी तरह से ठीक दिखता है। इसके विपरीत, 8 अक्षरों से कम का password reject कर दिया जाता है: MinIO startup पर यह error देते हुए बंद हो जाता है कि credentials अमान्य हैं, क्योंकि access key के लिए कम से कम 3 अक्षर और secret key के लिए कम से कम 8 अक्षरों की आवश्यकता होती है।
MINIO_VOLUMES data path है और MINIO_OPTS में flags होते हैं। 127.0.0.1 पर bind करने का मतलब है कि अभी इस VPS के बाहर से कोई भी S3 API तक नहीं पहुँच सकता, जो कि एक सही default है। आप इसे बाद में जानबूझकर, certificate रखने वाले proxy के माध्यम से खोलते हैं।
systemd unit लिखें
/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 पर कोई leading - नहीं है, और यह एक टाइपो के बजाय एक निर्णय है। डैश के साथ, systemd गायब फाइल को अनदेखा कर देता है और MinIO को फिर भी start कर देता है, इसलिए डिलीट की गई फाइल या गलत स्पेलिंग वाला पाथ चुपचाप आपको minioadmin:minioadmin पर चल रहा सर्वर दे देता है। डैश के बिना, गायब फाइल MinIO के चलने से पहले ही unit को fail कर देती है, और journalctl -u minio में Failed to load environment files: No such file or directory दिखाई देता है। start होने से मना करने वाली unit को नोटिस करना, चुपचाप डिफ़ॉल्ट पासवर्ड स्वीकार करने वाले सर्वर की तुलना में बहुत आसान है।
$MINIO_VOLUMES और $MINIO_OPTS को जानबूझकर unquoted रखा गया है, क्योंकि systemd unquoted variables को whitespace पर अलग-अलग arguments में विभाजित करता है। इसी तरह MINIO_OPTS के चार शब्द minio server के लिए चार arguments बन जाते हैं। LimitNOFILE=65536 फाइल डिस्क्रिप्टर लिमिट को बढ़ाता है, क्योंकि प्रत्येक open connection और प्रत्येक open data फाइल एक डिस्क्रिप्टर की लागत लेती है और 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 प्रिंट करना चाहिए, और health endpoint को 200 का उत्तर देना चाहिए। journalctl -u minio -n 20 --no-pager वह API एड्रेस दिखाता है जिस पर सर्वर listen कर रहा है। यदि unit बार-बार restart होती रहती है, तो systemd हार मान लेता है और Start request repeated too quickly लॉग करता है, जिसका अर्थ है कि MinIO हर प्रयास पर exit हो रहा है: इसका कारण उस मैसेज के ऊपर की लाइनों में प्रिंट होता है, इसलिए ऊपर की ओर पढ़ें।
अधिक isolation के लिए, [Service] सेक्शन में ProtectSystem=full और ProtectHome=true जोड़ें। दोनों को host kernel से mount namespaces की आवश्यकता होती है। OpenVZ या LXC जैसे कंटेनर वर्चुअलाइजेशन पर जो host kernel साझा करते हैं, वे fail हो सकते हैं, और फिर unit status=226/NAMESPACE रिपोर्ट करती है। उन दो लाइनों को हटा दें और यह start हो जाएगी। unit स्वयं एक सामान्य unit है, और VPS पर systemd services और timers बाकी directives को कवर करता है।
Install mc and prove a round trip
The MinIO client is mc. Do not install it with apt install mc. That package is Midnight Commander, a file manager unrelated to 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/mcRegister the server as an alias, then move an object through it.
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 should list hello.txt with its size, and mc cat should print hello object storage. That round trip is the real proof the server works, because it makes the same signed S3 requests every other client will make. mc admin info local prints the server status if you want a second opinion.
Run one more check now, while the box is still empty.
mc alias set defaultcheck http://127.0.0.1:9000 minioadmin minioadminThis command must fail. If it succeeds, the environment file never reached the process and your server is running on the default credentials. Fix that before anything else touches the machine.
mc stores aliases in ~/.mc/config.json in plain text, so those credentials sit in the home directory of whoever ran the command. Running mc under sudo puts the root credentials in /root/.mc/config.json. Keep the root alias on one administrator account and give every application its own key.
Presigned URL के माध्यम से एक ऑब्जेक्ट प्रदान करना
Presigned URL एक सामान्य HTTPS लिंक होता है जिसमें एक signature और expiry जुड़ी होती है। इस लिंक को रखने वाला कोई भी व्यक्ति बिना किसी अकाउंट या क्लाइंट के उस विशिष्ट ऑब्जेक्ट को प्राप्त कर सकता है।
mc share download --expire 12h local/backups/hello.txtआउटपुट की query string में X-Amz-Signature और X-Amz-Expires शामिल होते हैं। इसके बारे में दो बातें लोगों को आश्चर्यचकित करती हैं। लिंक उस alias के endpoint से बनाया जाता है जिसका आपने उपयोग किया है, इसलिए 127.0.0.1 पर बना alias एक ऐसा लिंक तैयार करता है जिसे केवल वही मशीन खोल सकती है: जिन लिंक को आप भेजना चाहते हैं, उनके लिए अपने public hostname पर एक दूसरा alias बनाएँ। साथ ही, इसमें कोई revoke बटन नहीं होता है। signature तब तक मान्य रहता है जब तक कि वह expire न हो जाए, इसलिए कम expiry समय ही एकमात्र नियंत्रण है जो आपके पास होता है। S3 signature format अधिकतम सात दिनों की अनुमति देता है।
restic को अपनी अलग key और bucket दें
root credentials हर bucket को पढ़ और मिटा सकते हैं, इसलिए backup job के पास ये नहीं होने चाहिए। एक bucket बनाएँ, उस bucket तक सीमित एक policy बनाएँ, और एक ऐसा user बनाएँ जिसे इसके अलावा और कोई access न हो।
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 में एक built-in readwrite policy होती है जो एक command कम कर सकती थी, लेकिन वह सर्वर की हर bucket का पूर्ण access दे देती है। ऊपर दी गई policy में bucket का नाम जानबूझकर दो बार लिखा गया है: एक बार arn:aws:s3:::restic के रूप में ताकि bucket की listing काम करे, और एक बार arn:aws:s3:::restic/* के रूप में ताकि उसके अंदर के objects तक पहुँचा जा सके। S3 में bucket और उसके objects अलग-अलग resources होते हैं, इसलिए ऐसी policy जो केवल एक का नाम लेती है, वह इस तरह विफल होती है जैसे कि client खराब हो।
भरोसा करने से पहले सीमा का परीक्षण करें।
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 environment variables से S3 credentials पढ़ता है, इसलिए इसमें restic-विशिष्ट किसी credential file की आवश्यकता नहीं होती।
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 एक repository password मांगता है। वह password repository को encrypt करता है, इसलिए MinIO केवल ciphertext ही store करता है, और password खोने का अर्थ है backup का खो जाना। systemd timer द्वारा शुरू किए गए run में type करने के लिए कोई terminal नहीं होता, इसलिए scheduled backups के लिए RESTIC_PASSWORD_FILE को mode 600 वाली file पर set करें।
एक placement rule ऊपर दी गई किसी भी command से अधिक महत्वपूर्ण है। जिस VPS पर data है, उसी पर restic repository रखने से आप केवल एक खराब rm से बच सकते हैं, और किसी चीज़ से नहीं। MinIO node एक अलग machine होनी चाहिए, आदर्श रूप से एक अलग region में। VPS पर restic backups इसमें scheduling और retention के बारे में विस्तार से बताता है।
nginx के साथ TLS terminate करें
MinIO localhost पर चलता है, इसलिए nginx सार्वजनिक इंटरफ़ेस है। सबसे पहले certbot और nginx के साथ Let's Encrypt certificates में बताए अनुसार certificate जारी करें, फिर इस server block का उपयोग करें।
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 body limit को हटा देता है, जो अन्यथा MinIO द्वारा अनुरोध देखने से पहले ही किसी भी बड़ी अपलोड को 413 Request Entity Too Large के साथ अस्वीकार कर देगा। proxy_request_buffering off अपलोड को सीधे स्ट्रीम करता है, क्योंकि डिफ़ॉल्ट सेटिंग पहले पूरे अनुरोध को एक अस्थायी फ़ाइल में spool करती है, जिससे बड़ी ऑब्जेक्ट के लिए डिस्क स्पेस की दोगुनी आवश्यकता होती है। proxy_set_header Host $http_host सूक्ष्म है: एक S3 signature Host header को कवर करता है, इसलिए जो proxy इसे rewrite करता है, वह हर अनुरोध को SignatureDoesNotMatch के साथ विफल कर देता है, जबकि access log में सामान्य अनुरोध आता हुआ दिखता है।
MinIO को उसका सार्वजनिक नाम भी बताएं, ताकि उसके द्वारा उत्पन्न लिंक localhost के बजाय proxy की ओर इशारा करें।
echo 'MINIO_SERVER_URL=https://s3.example.com' | sudo tee -a /etc/default/minio
sudo systemctl restart minioFirewall को छोटा रखें। SSH और HTTPS को अनुमति दें, और ports 9000 और 9001 के लिए कोई नियम न बनाएं, क्योंकि 127.0.0.1 पर bind किया गया पता किसी अन्य मशीन से तब भी पहुंच योग्य नहीं होता, चाहे firewall कुछ भी कहे। VPS पर ufw firewall की बुनियादी जानकारी में इसके कमांड दिए गए हैं।
कब सिंगल-नोड MinIO पर्याप्त है, और कब आपको वास्तविक S3 की आवश्यकता है
यहाँ सिंगल-नोड का अर्थ है एक ड्राइव जिसमें कोई पैरिटी (parity) नहीं है। MinIO का अपना डॉक्यूमेंटेशन इस लेआउट को टेस्टिंग और उन छोटे वर्कलोड के लिए उपयुक्त बताता है जहाँ उपलब्धता (availability) की कोई आवश्यकता नहीं है। डिप्लॉयमेंट के भीतर कोई दूसरी कॉपी नहीं होती, इसलिए प्रत्येक ऑब्जेक्ट की ड्यूरेबिलिटी (durability) एक VPS डिस्क की ड्यूरेबिलिटी के बराबर होती है। जो फीचर्स डिस्ट्रीब्यूटेड इरेज़र-कोडेड बैकएंड पर निर्भर करते हैं, जैसे कि बकेट रेप्लिकेशन और ऑब्जेक्ट लॉकिंग, वे मल्टी-ड्राइव डिप्लॉयमेंट के लिए हैं, इसलिए इस सेटअप पर किसी को भी इम्यूटेबल रिटेंशन पॉलिसी का वादा न करें।
यह किसी दूसरे रीजन में स्थित दूसरे VPS पर restic टारगेट के रूप में, और डेवलपमेंट कार्य तथा CI आर्टिफैक्ट्स के लिए S3 एंडपॉइंट के रूप में एक अच्छा विकल्प है, जहाँ बकेट खोने का मतलब केवल रीबिल्ड करना है और कुछ नहीं। यह एक छोटे एप्लिकेशन में यूजर अपलोड्स के लिए भी उचित है, बशर्ते आपके पास रिकवरी प्लान हो और आपने वास्तव में रिस्टोर का परीक्षण किया हो।
मैनेज्ड S3 तब चुनें जब कोई कॉन्ट्रैक्ट या रेगुलेटर ऑब्जेक्ट लॉक या मल्टी-रीजन ड्यूरेबिलिटी की मांग करे, या जब आप नहीं चाहते कि डिस्क भर जाने पर रात के 03:00 बजे आपको कॉल आए। फ्रोजन बिल्ड (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 पर समाप्त होने वाले संदेश का अर्थ है कि सर्विस अकाउंट के पास डेटा डायरेक्टरी में लिखने की अनुमति नहीं है, इसलिए जांचें कि 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
क्या single-node MinIO वास्तविक बैकअप के लिए पर्याप्त है?
यह तब पर्याप्त है जब आप इसे उस डेटा से अलग मशीन पर restic target के रूप में चला रहे हों जिसकी आप सुरक्षा कर रहे हैं। यह आपकी एकमात्र प्रति (copy) के रूप में पर्याप्त नहीं है। single-drive deployment में कोई parity नहीं होती है, इसलिए MinIO के भीतर कोई दूसरी प्रति नहीं होती है। यदि उस VPS डिस्क का डेटा नष्ट हो जाता है, तो objects भी खो जाते हैं। कहीं और एक दूसरा target रखें और कम से कम एक बार दोनों से restore करके देखें ताकि आप सुनिश्चित हो सकें कि प्रक्रिया काम करती है।
sha256sum -c, MinIO की checksum फ़ाइल पर विफल क्यों होता है?
क्योंकि उस फ़ाइल के अंदर hash के बाद का लेबल release, minio.RELEASE.2025-09-07T16-13-09Z का नाम बताता है, जबकि आपकी डाउनलोड की गई फ़ाइल को सामान्यतः minio कहा जाता है। sha256sum -c, checksum फ़ाइल के अंदर लिखे नाम वाली फ़ाइल को खोजता है, उसे नहीं पाता है, और No such file or directory तथा WARNING: 1 listed file could not be read रिपोर्ट करता है। डाउनलोड ठीक है। hash strings की सीधे तुलना करें और लेबल को अनदेखा करें, जिसका कोई सुरक्षा महत्व नहीं है।
MinIO admin web console कहाँ गया?
MinIO ने मई 2025 में community edition console से administration सुविधाओं को हटा दिया है, और web interface में केवल एक object browser छोड़ दिया है। Buckets और users को अब mc client के साथ manage किया जाता है, जिसमें mc admin user add और mc admin policy attach जैसे commands का उपयोग होता है। community edition में यही समर्थित तरीका है, न कि कोई workaround, और इसीलिए यह गाइड सब कुछ command line से करती है।
मैं restic को S3 backend के रूप में MinIO पर कैसे point करूँ?
AWS_ACCESS_KEY_ID और AWS_SECRET_ACCESS_KEY को MinIO access key और उसके secret पर सेट करें, फिर s3:https://s3.example.com/restic के रूप में repository string का उपयोग करें, जहाँ अंतिम path element bucket का नाम है। पहले mc mb के साथ bucket बनाएँ, क्योंकि एक bucket तक सीमित key के पास bucket बनाने की अनुमति नहीं होती है। restic upload से पहले सब कुछ अपने स्वयं के repository password के साथ encrypt करता है, इसलिए MinIO केवल ciphertext को store करता है और आपकी फ़ाइलों को कभी नहीं देख पाता है।
क्या मुझे MinIO को nginx के पीछे चलाना होगा?
जब कोई client उसी मशीन पर न हो, तो आपको TLS (transport layer security) की आवश्यकता होती है, क्योंकि S3 credentials और object data दोनों request के अंदर यात्रा करते हैं। certbot से प्राप्त certificate के साथ port 443 पर एक proxy इसे प्राप्त करने का सबसे सरल तरीका है, और यह certificate renewal को MinIO से दूर रखता है। यदि आप --certs-dir को public.crt और private.key रखने वाली directory पर point करते हैं, तो MinIO स्वयं भी TLS terminate कर सकता है, लेकिन तब service account को renewed private key तक read access की आवश्यकता होती है, जो समान परिणाम के लिए अतिरिक्त काम है।