VPS वर Docker Compose ने Mealie recipe manager चालवा
तुमच्या VPS वर Mealie चालवण्यासाठी Docker Compose वापरा. recipe link paste केल्यावर स्वच्छ कृती मिळवा; meal plans, shopping lists, nginx, TLS आणि backups सेट करा.
स्वतःच्या सर्व्हरवर चालणारा recipe manager काय करतो
स्वतःच्या सर्व्हरवर चालणारा recipe manager तुमच्या मालकीच्या सर्व्हरवरील database मध्ये recipes जतन करतो. बहुतेक घरांमध्ये Mealie हा पर्याय स्वीकारला जातो. तुम्ही recipe page चा address paste करता. Mealie त्यातून ingredients, कृती, yield आणि cook time वाचतो. त्यानंतर story आणि जाहिराती वगळतो. तुमच्या collection मध्ये फक्त food साठवले जाते.
अॅपमधील उर्वरित भाग छोटा आहे. Recipes त्यात drag करून ठेवण्यासाठी weekly meal plan असतो. त्या plan वरून shopping list तयार होते. स्वयंपाक करणाऱ्या प्रत्येक व्यक्तीसाठी स्वतंत्र login असतो. हे सर्व एका container मध्ये चालते. Requests नसताना ते idle राहते. त्यामुळे साधा VPS देखील ते सहज चालवू शकतो.
या मार्गदर्शकात Docker Compose वापरले आहे. services: आणि volumes: हे शब्द तुमच्यासाठी नवीन असल्यास, प्रथम Docker Compose files कशा तयार केल्या जातात हे वाचा. कारण पुढील सर्व मजकूर एका compose file आणि चार commands वर आधारित आहे.
Docker Compose वापरून Mealie स्थापित करा
Mealie त्याच्या images GitHub container registry वर प्रकाशित करते. July 2026 नुसार सध्याचा stable tag v3.22.0 आहे. latest वापरण्याऐवजी आवृत्ती निश्चित करा: latest वापरल्यास, एखाद्या अनपेक्षित दिवशी docker compose pull मुळे तुम्ही तयार नसलेल्या database migration वर जाऊ शकता.
sudo mkdir -p /srv/mealie
cd /srv/mealie
sudo nano docker-compose.ymlservices:
mealie:
image: ghcr.io/mealie-recipes/mealie:v3.22.0
container_name: mealie
restart: always
ports:
- "127.0.0.1:9925:9000"
deploy:
resources:
limits:
memory: 1000M
volumes:
- mealie-data:/app/data/
environment:
ALLOW_SIGNUP: "false"
PUID: 1000
PGID: 1000
TZ: Europe/Amsterdam
BASE_URL: https://recipes.example.com
volumes:
mealie-data:सुरू करण्यापूर्वी दोन ओळी तपासा.
पोर्ट 127.0.0.1:9925:9000 असा लिहिला आहे, 9925:9000 असा नाही. Container आतून 9000 वर listen करतो आणि host 9925 हे त्याच्याशी map करतो. हा map loopback address ला bind केल्यामुळे nginx Mealie पर्यंत पोहोचू शकतो, पण इंटरनेटवरून प्रवेश करता येत नाही. Docker packet filter मध्ये स्वतःचे rules लिहिते. त्यामुळे firewall मध्ये पोर्ट बंद असल्याचे दिसत असले तरी साधा 9925:9000 बाहेरून पोहोचण्याजोगा असतो. हा अनपेक्षित परिणाम एकदा समजून घेणे उपयुक्त आहे: published Docker ports ufw चे नियम का दुर्लक्षित करतात.
BASE_URL हा तुम्ही वापरणार असलेला अचूक public address असला पाहिजे. त्यात scheme असावी आणि शेवटी slash नसावा. Mealie त्यावरून password reset links आणि invitation links तयार करते. ते http://localhost:9925 वर सेट केल्यास, तुम्ही तुमच्या partner ला पाठवलेल्या invitation मधील link फक्त server वरच काम करेल.
ते सुरू करा आणि पहिल्या boot वर लक्ष ठेवा.
sudo docker compose up -d
sudo docker compose logs -f mealieपहिल्यांदा सुरू केल्यावर SQLite database तयार होतो आणि migrations चालतात. यासाठी काही seconds लागतात. Log स्थिर झाल्यावर आणि migration lines छापणे थांबल्यावर app ची स्थानिक पातळीवर तपासणी करा.
curl -I http://127.0.0.1:9925200 OK म्हणजे app सुरू आहे. Connection refused म्हणजे container चालू नाही. sudo docker compose ps चालवा आणि exit code वाचा. 137 code ने थांबवलेला container 1000M memory limit ओलांडल्यामुळे बंद केला गेला होता. हे सर्वात लहान plans वर घडते.
पहिला login आणि खुले signup बंद करणे
Default account changeme@example.com असून password MyPassword आहे. या account ने login करा आणि लगेच दोन्ही बदला, कारण ही जोडी documentation मध्ये छापलेली आहे आणि त्यामुळे प्रत्येक scanner मध्ये उपलब्ध आहे.
Compose file मधील ALLOW_SIGNUP: "false" हा जाणीवपूर्वक ठेवलेला पर्याय आहे. Signup खुले असल्यास, address शोधणारी कोणतीही व्यक्ती तुमच्या recipe box मध्ये account तयार करू शकते. Signup बंद असल्यास, तुम्ही admin area मधून लोकांना add करता. त्यातून invitation link तयार होते आणि तो link तुम्ही स्वतः त्यांना पाठवता. हा link BASE_URL पासून तयार केला जातो. म्हणून या value चे महत्त्व आहे. एकाच server वर अनेक apps चालवत असाल आणि सर्वांसाठी एकच password हवा असेल, तर Mealie आपला login self-hosted Authentik instance सारख्या external identity provider कडे सोपवू शकते.
Mealie users ना household मध्ये गटबद्ध करते. एका household मधील सर्वजण recipe collection, meal plan आणि shopping list share करतात. कुटुंबासाठी हेच अपेक्षित असते. एकाच server वरील वेगवेगळे households स्वतंत्र collections ठेवतात. कोणालाही anchovies बद्दल सहमती नसताना flatshare साठी ही रचना उपयुक्त ठरते.
आयातक चालवण्याचे मुख्य कारण
रेसिपी संग्रह उघडा, URL मधून रेसिपी तयार करण्याचा पर्याय निवडा आणि लिंक पेस्ट करा. Mealie हे पृष्ठ मिळवते आणि संरचित रेसिपी डेटा शोधते. हा मशीन-वाचनीय ब्लॉक बहुतेक रेसिपी साइट्स शोध इंजिनसाठी समाविष्ट करतात. हा ब्लॉक उपलब्ध असल्यास आयात स्वच्छ आणि त्वरित होते.
तुम्ही इमेजमधून किंवा पेस्ट केलेल्या साध्या मजकुरातूनही आयात करू शकता. त्यामुळे कुकबुकमधील पृष्ठाच्या छायाचित्रातूनही रेसिपी आयात करता येते. ही प्रक्रिया अधिक वेळ घेते. त्यानंतर तपासणी करणे आवश्यक असते, कारण हस्तलिखित अपूर्णांक चुकीचा वाचला जाणे सहज शक्य आहे.
मोठ्या प्रमाणातील आयात त्याच स्क्रीनवरून करता येते: पत्त्यांची यादी प्रत्येकी एका ओळीवर पेस्ट करा आणि Mealie ती पार्श्वभूमीत प्रक्रिया करते. दोनशे bookmarks एका सत्रात आयात करता येतात.
जेवणाचे नियोजन आणि खरेदीची यादी
Meal planner हे कॅलेंडर असते. एखादी रेसिपी दिवसावर drag करा आणि ती नियोजित होते. त्यानंतर shopping list नियोजित रेसिपींमधील ingredients एकाच यादीत गोळा करते आणि duplicate नोंदी एकत्र करते. त्यामुळे दोन रेसिपींमध्ये onions आवश्यक असले, तरी दोन ओळींऐवजी एकच ओळ दिसते.
दुकानात असताना ही यादी फोनवरील live page म्हणून उघडी ठेवता येते. ही यादी तुमच्या स्वतःच्या server वर असल्यामुळे घरातील प्रत्येकाला तीच यादी त्याच वेळी दिसते. एखाद्या व्यक्तीने milk च्या पुढे tick केल्यावर ते दुसऱ्या व्यक्तीच्या स्क्रीनवरूनही काढले जाते.
nginx आणि TLS समोर ठेवा
Mealie साध्या HTTP वर कार्य करते आणि स्वतः प्रमाणपत्र व्यवस्थापन करत नाही. त्याच्या समोर nginx मध्ये transport layer security (TLS) termination करा. आधी DNS A record तुमच्या सर्व्हरकडे निर्देशित करा, कारण प्रमाणपत्राची प्रक्रिया त्या नावाची पडताळणी करते.
sudo apt update && sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/mealieserver {
listen 80;
server_name recipes.example.com;
client_max_body_size 64M;
location / {
proxy_pass http://127.0.0.1:9925;
proxy_set_header Host $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;
}
}sudo ln -s /etc/nginx/sites-available/mealie /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginxnginx -t मुद्रित करून syntax is ok आणि test is successful तपासणे हा आवश्यक टप्पा आहे. तो यशस्वी झाल्यानंतरच reload करा. चुकीची configuration reload केल्यास जुनी configuration सुरू राहते आणि पुढील restart होईपर्यंत त्रुटी लपून राहते.
nginx चे default मूल्य 1 MB असल्यामुळे client_max_body_size 64M आवश्यक आहे. browser द्वारे recipe photo upload करताना किंवा backup restore करताना यापेक्षा मोठा body पाठवला जातो. ही ओळ नसल्यास nginx कडून 413 Request Entity Too Large मिळतो, Mealie कडून नाही. त्यामुळे application log मध्ये काहीही नोंदवले जात नाही.
यानंतर प्रमाणपत्र जारी करा. हा टप्पा आणि त्याचा renewal timer nginx साठी certbot वापरून Let's Encrypt प्रमाणपत्र जारी करणे येथे स्पष्ट केले आहेत.
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d recipes.example.comCertbot server block मध्ये 443 वर listen करण्यासाठी बदल करतो आणि port 80 वरून redirect जोडतो. https:// वापरून site उघडा आणि browser प्रमाणपत्र स्वीकारत असल्याची खात्री करा. Mealie उघडत असेल, पण त्यातील links तुम्हाला http:// कडे पाठवत असतील, तर BASE_URL मध्ये अजूनही http आहे. ते दुरुस्त करा आणि नवीन value सह container पुन्हा तयार करण्यासाठी sudo docker compose up -d चालवा.
example.com/recipes सारख्या subpath खाली Mealie उपलब्ध करून देणे कार्य करत नाही, कारण frontend subpath मधून serve करता येत नाही. Subdomain वापरा.
बॅकअप आणि restore प्रत्यक्षात काय करते
Mealie च्या मालकीचे सर्व डेटा कंटेनरमधील /app/data/ मध्ये असतात. हे mealie-data volume आहे. हा volume कॉपी केल्यास recipes, images आणि database एकत्र कॉपी होतात.
sudo docker volume ls
sudo docker compose stop mealie
sudo docker run --rm -v mealie_mealie-data:/data -v "$PWD":/backup \
alpine tar czf /backup/mealie-data.tgz -C /data .
sudo docker compose start mealieVolume name च्या सुरुवातीला project name असते. Compose file ज्या directory मध्ये आहे, तेच project name असते. /srv/mealie मधून volume mealie_mealie-data आहे. म्हणून पहिली command docker volume ls आहे: या मार्गदर्शकातील नाव वापरू नका; command ने दाखवलेले नाव वापरा. आधी container थांबवणे महत्त्वाचे आहे. SQLite मध्ये अनेकदा write सुरू असते. त्यामुळे चालू container मधून घेतलेली कॉपी restore केल्यावर ती वाचता न येण्याची शक्यता असते.
Mealie च्या admin area मध्ये स्वतंत्र backup page देखील आहे. ते images सोबत database JSON स्वरूपात असलेला portable archive तयार करते. Servers दरम्यान स्थलांतर करताना हे वापरा. Raw file copy पेक्षा version change नंतरही हा archive अधिक सुरक्षितपणे वापरता येतो. Archive restore करणे मुळात destructive असते. Archive लोड करण्यापूर्वी ते current database हटवते आणि ही कृती पूर्ववत करता येत नाही. प्रक्रिया पूर्ण झाल्यावर तुमचे login session संपते.
यापैकी कोणतीही कॉपी त्याच server वर ठेवली असेल, तर ती backup मानता येत नाही. Archive नियोजित वेळापत्रकानुसार दुसऱ्या ठिकाणी पाठवा. encrypted off-server backups with restic यासाठीच वापरले जाते.
Mealie अपडेट करणे
cd /srv/mealie
sudo nano docker-compose.yml
sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f mealieफाइलमधील pinned version पुढील आवृत्तीवर बदला. त्यानंतर image pull करून container पुन्हा तयार करा. नवीन image पहिल्यांदा सुरू झाल्यावर migrations चालतात. Major version बदलण्यापूर्वी volume ची प्रत तयार करा. Migration अर्धवट अपयशी ठरल्यास असा database तयार होऊ शकतो, जो मागील image पुन्हा उघडू शकत नाही. तुमची सध्याची version आणि नवीन version यांच्यामधील सर्व versions साठी release notes वाचा.
इम्पोर्टर अयशस्वी झाल्यास
काही साइट्स structured recipe data प्रकाशितच करत नाहीत. त्यामुळे Mealie रिकामी ingredient list असलेले title इम्पोर्ट करते. हे configuration बदलून टाळता येत नाही. त्याऐवजी recipe text manually paste करा.
इतर अपयश recipe site च्या समोरील bot protection मुळे येतात. अशा वेळी recipe ऐवजी challenge page Mealie कडे पाठवले जाते. हे कमी करण्यासाठी Mealie आधीपासून browser ची नक्कल करते आणि user agent बदलत राहते. तरीही एखादी site विनंती नाकारत असल्यास, documented options म्हणजे scraper अधिक चांगली address reputation असलेल्या proxy द्वारे पाठवणे किंवा real browser मध्ये challenge सोडवणारा FlareSolverr instance चालवणे. दोन्ही पर्यायी आहेत आणि दोन्ही container वरील environment variables द्वारे सेट केले जातात.
तुमचा server site पर्यंत पोहोचू शकत नसल्यामुळे import अयशस्वी होत असेल, तर ती वेगळी समस्या आहे. scraper ला दोष देण्यापूर्वी server वरून curl -I https://the-site.example/recipe वापरून चाचणी करा आणि status line वाचा.
ते कुठे उपयोगी ठरते
Mealie हे घरासाठी पहिले self-hosted अॅप म्हणून चांगले आहे, कारण तुम्ही ज्यांच्यासोबत राहता ते लोक सांगावे न लागता ते वापरतील. हे Immich वापरून स्वतःची फोटो लायब्ररी चालवण्यासारखेच काम आहे, पण ते त्यापेक्षा बरेच हलके आहे. तसेच ते या वर्षी self-host करण्यासारख्या गोष्टींच्या विस्तृत यादीत बसते. एक छोटा सर्व्हर ही दोन्ही अॅप्स चालवू शकतो. त्या दुसऱ्या कामासाठी Immich हा एकमेव पर्याय नाही. तुम्ही अजून निर्णय घेत असाल, तर उर्वरित डिस्क वापरण्यापूर्वी PhotoPrism आणि Immich ची memory floors आणि backup commands यांमध्ये पुरेसा फरक आहे, त्यामुळे त्याबद्दल वाचणे उपयुक्त ठरेल.
FAQ
रेसिपी URL आयात करताना अपयश का येते?
याची दोन सामान्य कारणे आहेत. पेजवर संरचित रेसिपी डेटा प्रकाशित केलेला नसतो. त्यामुळे scraper ला काहीही सापडत नाही आणि ingredients नसलेले title मिळते. किंवा साइटसमोरील bot-protection layer रेसिपीऐवजी challenge page पाठवते. दुसऱ्या परिस्थितीत Mealie ला चांगली address reputation असलेल्या proxy कडे किंवा प्रत्यक्ष browser मध्ये challenge सोडवणाऱ्या self-hosted FlareSolverr instance कडे निर्देशित करता येते. काहीही बदलण्यापूर्वी curl -I वापरून तुमचा server त्या पेजपर्यंत पोहोचू शकतो का ते निश्चित करा.
मला PostgreSQL आवश्यक आहे का, की SQLite पुरेसे आहे?
घरगुती वापरासाठी SQLite पुरेसे आहे आणि ते default आहे. Data directory network attached storage वर असल्यास PostgreSQL वापरा. Network filesystem वर SQLite वापरल्यास locked-database errors येतात आणि file खराब होऊ शकते. PostgreSQL अंतर्गत restore करण्यासाठी database user superuser असणे आवश्यक आहे, कारण archive लोड करण्यापूर्वी restore सर्व डेटा हटवते.
Domain name शिवाय Mealie चालवता येईल का?
होय, तुमच्या स्वतःच्या network वर चालवता येईल. BASE_URL मध्ये तुम्ही प्रत्यक्षात टाइप करणार असलेला address, जसे http://192.168.1.20:9925, सेट करा आणि nginx वगळा. Invitation आणि password reset links BASE_URL पासून तयार होतात. त्यामुळे चुकीची value असल्यास इतर कोणीही उघडू शकणार नाही अशा links तयार होतात. Plain HTTP द्वारे ते इंटरनेटवर expose करू नका, कारण login माहिती अशा वेळी unencrypted स्वरूपात पाठवली जाते.
माझ्या कुटुंबातील सदस्यांना स्वतंत्र logins कसे द्यायचे?
ALLOW_SIGNUP ची value "false" ठेवून admin area मधून लोक add करा. यामुळे त्यांना पाठवता येणारी invitation link तयार होते. एकच kitchen वापरणाऱ्या सर्वांना त्याच household मध्ये ठेवा. त्यामुळे recipes, meal plan आणि shopping list सर्वांसाठी सामायिक राहतात. एका server वरील स्वतंत्र households मध्ये collections वेगळे राहतात.
Mealie चालवणे बंद केल्यास माझ्या recipes चे काय होते?
त्या नष्ट होत नाहीत. Admin backup तुमचा data JSON स्वरूपात लिहिते. Mealie recipes plain markdown files म्हणूनही export करू शकते. कोणतेही software नसतानाही या files कोणत्याही text editor मध्ये वाचता येतात. गरज पडण्यापूर्वी एक export घ्या आणि तो उघडता येतो का ते तपासा.