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 वर प्रकाशित करते. October 2026 पर्यंतचा सध्याचा stable tag v3.28.0 आहे. latest वापरण्याऐवजी version निश्चित करा: 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.28.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 पर्यंत पोहोचू शकतो, पण internet वरून ते शक्य होत नाही. Docker packet filter मध्ये स्वतःचे rules लिहितो. त्यामुळे firewall मध्ये पोर्ट बंद असल्याचे दाखवत असले तरी साधा 9925:9000 बाहेरून पोहोचण्याजोगा असतो. हा अनपेक्षित परिणाम एकदा समजून घेणे उपयुक्त आहे: published Docker ports ufw चे नियम का दुर्लक्षित करतात.
BASE_URL हा scheme सह आणि शेवटी slash नसलेला, तुम्ही वापरणार असलेला अचूक public address असला पाहिजे. Mealie त्यावरून password reset links आणि invitation links तयार करते. ते http://localhost:9925 वर सेट केल्यास, तुम्ही तुमच्या सहकाऱ्याला पाठवलेल्या invitation मधील link फक्त server वरच कार्य करेल.
ते सुरू करा आणि पहिला boot monitor करा.
sudo docker compose up -d
sudo docker compose logs -f mealieपहिल्यांदा सुरू केल्यावर SQLite database तयार होतो आणि migrations चालतात. यासाठी काही सेकंद लागतात. Log स्थिर झाल्यावर आणि migration lines येणे थांबल्यावर, अॅपची स्थानिक पातळीवर तपासणी करा.
curl -I http://127.0.0.1:9925200 OK याचा अर्थ अॅप सुरू आहे. 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 आहे. त्याद्वारे 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 वर अनेक अॅप्स चालवायचे असतील आणि सर्वांसाठी एकच password वापरायचा असेल, तर Mealie त्याचे login self-hosted Authentik instance सारख्या external identity provider कडे सोपवू शकते.
Mealie वापरकर्त्यांना household मध्ये ठेवते आणि households एका group मध्ये असतात. एका household मधील सर्वजण meal plan आणि shopping list share करतात. कुटुंबासाठी ही रचना उपयुक्त असते. Recipe collection मात्र त्यापेक्षा व्यापक असते: एका group मधील प्रत्येक household इतर सर्व households सोबत त्यांचे recipes, tags आणि categories share करते. त्यामुळे एकाच server वरील स्वतंत्र households चे plans आणि lists वेगळे राहतात, पण ते समान recipes वापरतात. Anchovies बद्दल कोणाचेही एकमत नसलेल्या flatshare साठीही ही रचना योग्य ठरते. पूर्णपणे स्वतंत्र collections आवश्यक असल्यास, त्यांना स्वतंत्र groups द्या, कारण groups दरम्यान काहीही share केले जात नाही.
इम्पोर्टर चालवण्याचे कारण
रेसिपी संग्रह उघडा, URL वरून रेसिपी तयार करण्याचा पर्याय निवडा आणि लिंक paste करा. Mealie हे पृष्ठ fetch करून structured recipe data शोधते. हा machine-readable block बहुतेक recipe sites search engines साठी embed करतात. हा block उपलब्ध असल्यास import स्वच्छपणे आणि लगेच पूर्ण होते.
AI provider configure केल्यास image किंवा तुम्ही paste केलेल्या plain text मधूनही import करता येतो. त्यामुळे cookbook मधील पानाचा photograph वापरता येतो. Image import साठी images वाचू शकणारा provider आवश्यक आहे. Provider नसल्यास हे imports उपलब्ध नसतात. ही प्रक्रिया धीम्या मार्गाने पूर्ण होते. त्यानंतर तपासणी करणे आवश्यक आहे, कारण हस्तलिखित अपूर्णांक सहज चुकीचा वाचला जाऊ शकतो.
Bulk imports त्याच screen वरून चालवता येतात. Addresses ची list paste करा आणि प्रत्येक address स्वतंत्र ओळीत ठेवा. Mealie ती list background मध्ये process करते. दोनशे bookmarks एकाच वेळी import करता येतात.
जेवणाचे नियोजन आणि खरेदीची यादी
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 एकत्र कॉपी होतात. Mealie च्या अधिकृत documentation नुसार, SQLite install चा बॅकअप घेण्याची सर्वोत्तम पद्धत म्हणजे कंटेनर थांबवून ही directory कॉपी करणे.
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 ने दाखवलेले नाव वापरा. आधी कंटेनर थांबवणे महत्त्वाचे आहे. SQLite मध्ये त्या वेळी write सुरू असण्याची शक्यता असते. त्यामुळे चालू अवस्थेतील कॉपी restore केल्यावर ती वाचता न येण्याची शक्यता असते.
Mealie मध्ये admin area मधील स्वतंत्र backup page देखील आहे. त्यातून database database.json म्हणून असलेला zip archive तयार होतो. Version बदलताना हा archive थेट वापरता येईल असे गृहीत धरू नका. Archive तयार करणाऱ्या त्याच Mealie version नेच restore करावा लागतो. वेगळ्या version ने restore केल्यास error येतो आणि प्रक्रिया थांबते. Servers मध्ये डेटा हलवताना नवीन server वर तोच pinned version चालवा. त्यानंतर volume कॉपी करा किंवा archive तेथे restore करा. Restore करणे मूलतः destructive आहे. Archive लोड करण्यापूर्वी ते सध्याचा database delete करते. ही कृती पूर्ववत करता येत नाही. प्रक्रिया पूर्ण झाल्यावर तुमचे login session संपते.
ही दोन्हीपैकी कोणतीही कॉपी त्याच server वर ठेवलेली असेल, तर ती बॅकअप नाही. Archive ठरावीक वेळापत्रकानुसार दुसऱ्या ठिकाणी पाठवा. यासाठी restic वापरून encrypted off-server backups उपयुक्त आहेत.
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 मध्ये पुरेसा फरक आहे. त्यामुळे उरलेली disk जागा देण्यापूर्वी ते वाचणे उपयुक्त ठरेल. घरातील लोक त्यांच्या जेवणांसोबत योजना आणि नोंदीही कुठेतरी ठेवत असतील, तर self-hosted AFFiNE workspace हा पुन्हा त्याच compose-file प्रकारचा सराव आहे. मात्र त्याला चार containers आणि Mealie पेक्षा बरीच अधिक memory लागते. त्यामुळे आधी सर्व्हरवर किती resources शिल्लक आहेत ते तपासा. घरातील लोकांना जेवणांसोबत त्यांच्या training चा मागोवाही ठेवायचा असेल, तर openGym workouts ची नोंद ठेवते. त्यासाठी तुम्ही नुकतेच वापरलेले pinned tag, compose file आणि certificate पुन्हा लागतात. जेवणानंतरच्या संध्याकाळीसाठी याचे वेगळे रूप आहे. Halcyon आधीपासून चालू असलेल्या Jellyfin library चे 1990s rental shop मध्ये रूपांतर करते, ज्यामध्ये तुम्ही फिरू शकता. त्यामुळे आधीपासून चालू असलेल्या सेवेपुढे आणखी एक छोटा container येतो; backup घ्यावयाचा आणखी एक database तयार होत नाही. या गटातील प्रत्येक गोष्ट household app नाही. हीच पद्धत कधीतरी कामासाठी वापरावी लागली, तर self-hosted Chatwoot support desk हा पुन्हा pinned tag आणि certificate वापरतो. त्यामागे Postgres, Redis आणि कार्यरत outbound mail आवश्यक असतात. त्यामुळे तो recipe box पेक्षा खूप जड tenant आहे आणि त्यासाठी स्वतंत्र सर्व्हर ठेवणे योग्य आहे.
FAQ
रेसिपी URL आयात करताना अपयश का येते?
याची दोन सामान्य कारणे आहेत. पेजवर structured recipe data प्रकाशित केलेले नसते. त्यामुळे scraper ला काहीही सापडत नाही आणि ingredients नसलेले title मिळते. किंवा साइटसमोर bot-protection layer असतो. तो रेसिपीऐवजी challenge page परत करतो. दुसऱ्या प्रकरणात Mealie ला चांगली address reputation असलेल्या proxy कडे निर्देशित करता येते. किंवा वास्तविक browser मध्ये challenge सोडवणाऱ्या self-hosted FlareSolverr instance कडे निर्देशित करता येते. काहीही बदलण्यापूर्वी तुमचा server त्या पेजपर्यंत पोहोचू शकतो का, हे curl -I वापरून निश्चित करा.
मला PostgreSQL आवश्यक आहे का, की SQLite पुरेसे आहे?
घरगुती वापरासाठी SQLite पुरेसे आहे आणि ते default आहे. Data directory network attached storage वर असल्यास PostgreSQL वापरा. Network filesystem वर SQLite वापरल्यास locked-database errors येतात आणि file खराब होऊ शकते. PostgreSQL अंतर्गत restore करण्यासाठी database user superuser असणे आवश्यक आहे, कारण archive load करण्यापूर्वी restore प्रक्रिया सर्व data हटवते.
Domain name शिवाय Mealie चालवता येईल का?
होय, तुमच्या स्वतःच्या network वर ते चालवता येते. BASE_URL मध्ये तुम्ही प्रत्यक्षात type करणार असलेला address सेट करा, उदाहरणार्थ http://192.168.1.20:9925, आणि nginx वगळा. Invitation आणि password reset links BASE_URL पासून तयार होतात. त्यामुळे चुकीची value असल्यास इतर कोणीही उघडू शकणार नाहीत असे links तयार होतात. ते plain HTTP वर internet समोर उपलब्ध करू नका, कारण अशा वेळी login माहिती उघडपणे पाठवली जाते.
माझ्या कुटुंबातील सदस्यांना त्यांचे स्वतंत्र logins कसे द्यायचे?
ALLOW_SIGNUP ची value "false" ठेवून admin area मधून लोकांना जोडा. यामुळे त्यांना पाठवता येईल असा invitation link तयार होतो. एकाच kitchen चा वापर करणाऱ्या सर्वांना त्याच household मध्ये ठेवा, म्हणजे ते meal plan आणि shopping list share करतील. Recipes कोणत्याही परिस्थितीत group मधील प्रत्येक household सोबत share होतात. त्यामुळे स्वतंत्र collections आवश्यक असलेल्या लोकांसाठी स्वतंत्र groups तयार करा.
मी Mealie चालवणे थांबवल्यास माझ्या recipes चे काय होईल?
त्या उपलब्ध राहतील. Admin backup तुमचा data JSON स्वरूपात लिहितो. Mealie recipes plain markdown files म्हणूनही export करू शकते. या files कोणतेही software नसतानाही कोणत्याही text editor मध्ये वाचता येतात. गरज पडण्यापूर्वी एक export घ्या आणि तो उघडता येतो का ते तपासा.