SSD Nodes Learn Hosting plans →
Mwongozo Matt ConnorNa Matt Connor

Jinsi ya kusakinisha Mealie kwenye VPS kwa Docker Compose

Jifunze kusakinisha Mealie kwenye seva yako ya VPS kwa kutumia Docker Compose. Pata mwongozo kamili wa kusanidi Nginx, TLS, na nakala rudufu ili kudhibiti mapishi yako kwa usalama.

Kile ambacho meneja wa mapishi wa self-hosted hufanya

Meneja wa mapishi wa self-hosted huhifadhi mapishi yako kwenye database iliyo kwenye seva unayomiliki, na Mealie ndiyo chaguo ambalo kaya nyingi hupendelea. Unabandika anwani ya ukurasa wa mapishi na Mealie husoma viungo, hatua, kiasi kinachopatikana na muda wa kupika, kisha huacha hadithi na matangazo. Kile kinachoingia kwenye mkusanyiko wako ni chakula pekee.

Sehemu nyingine ya programu hii ni ndogo. Kuna mpango wa chakula wa kila wiki ambapo unaweza kuburuta mapishi, na orodha ya manunuzi inayotengenezwa kutoka kwa mpango huo. Kila mtu anayepikia anapata akaunti yake ya kuingia. Yote haya huendeshwa kwenye container moja, na hubaki bila shughuli kati ya maombi, kwa hivyo VPS ya kawaida huimudu bila kuathiri utendaji wake.

Mwongozo huu unatumia Docker Compose. Ikiwa maneno services: na volumes: ni mapya kwako, soma jinsi faili za Docker Compose zinavyoundwa kwanza, kwa sababu kila kitu hapa chini ni faili moja ya compose na amri nne.

Sakinisha Mealie kwa kutumia Docker Compose

Mealie huchapisha images zake kwenye GitHub container registry. Kufikia Oktoba 2026, tag ya sasa iliyo thabiti ni v3.28.0. Weka toleo maalum badala ya kutumia latest: kwa kutumia latest, docker compose pull katika siku isiyotarajiwa inaweza kukuhamishia kwenye database migration ambayo hukuwa umejiandaa nayo.

sudo mkdir -p /srv/mealie
cd /srv/mealie
sudo nano docker-compose.yml
services:
  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:

Mistari miwili inastahili kuzingatiwa kabla ya kuianzisha.

Port imeandikwa kama 127.0.0.1:9925:9000 na si kama 9925:9000. Container husikiliza kwenye 9000 kwa ndani, na host hupanga 9925 kuelekea huko. Kuunganisha ramani hiyo kwenye loopback address kunamaanisha kuwa Nginx inaweza kufikia Mealie na Internet haiwezi. Docker huandika sheria zake kwenye packet filter, kwa hivyo 9925:9000 ya kawaida inaweza kufikiwa kutoka nje hata wakati firewall yako inasema port imefungwa. Mshangao huo unastahili kueleweka mara moja: tazama kwa nini ports za Docker zilizochapishwa hupuuza ufw.

BASE_URL lazima iwe anwani kamili ya umma utakayotumia, ikiwa na scheme na bila slash mwishoni. Mealie hutengeneza viungo vya kubadilisha nenosiri na viungo vya mwaliko kutoka hapo. Ikiwekwa kuwa http://localhost:9925, mwaliko utakaomtumia mwenzako utakuwa na kiungo kinachofanya kazi kwenye seva yenyewe pekee.

Ianzishe na ufuatilie boot ya kwanza.

sudo docker compose up -d
sudo docker compose logs -f mealie

Boot ya kwanza hutengeneza database ya SQLite na kuendesha migrations, jambo linalochukua sekunde chache. Log ikitulia na kuacha kuchapisha mistari ya migration, kagua programu hiyo ndani ya seva.

curl -I http://127.0.0.1:9925

200 OK inamaanisha programu inafanya kazi. Connection refused inamaanisha container haifanyi kazi: endesha sudo docker compose ps na usome exit code. Container iliyosimama na code 137 ilisitishwa kwa sababu ya kuzidi kikomo cha kumbukumbu cha 1000M, jambo linalotokea kwenye mipango midogo zaidi.

Kuingia kwa mara ya kwanza, na kuzima usajili wa wazi

Akaunti ya awali ni changeme@example.com yenye nenosiri MyPassword. Ingia nayo, kisha ubadilishe yote mawili mara moja, kwa sababu jozi hiyo imeandikwa kwenye nyaraka na hivyo inajulikana na kila skana.

ALLOW_SIGNUP: "false" katika faili ya compose imewekwa kwa makusudi. Usajili ukiwa wazi, mtu yeyote anayepata anwani hiyo anaweza kutengeneza akaunti kwenye kisanduku chako cha mapishi. Ukiwa umefungwa, unaongeza watu kutoka eneo la admin, jambo linalozalisha kiungo cha mwaliko unachowatumia wewe mwenyewe. Kiungo hicho hujengwa kutoka BASE_URL, ndiyo maana thamani hiyo ni muhimu. Ikiwa utaishia kuendesha programu kadhaa kwenye seva moja na unataka nenosiri moja kwa zote, Mealie inaweza kukabidhi uingiaji wake kwa mtoa huduma wa utambulisho wa nje kama mfano wa Authentik unaojiendesha.

Mealie huwaweka watumiaji katika kaya, na kaya hukaa ndani ya kikundi. Kila mtu katika kaya moja hushiriki mpango wa mlo na orodha ya manunuzi, jambo ambalo familia huhitaji. Mkusanyiko wa mapishi ni mpana zaidi ya hapo: kaya hushiriki mapishi yao, vitambulisho (tags) na kategoria na kila kaya nyingine katika kikundi kimoja. Kwa hivyo, kaya tofauti kwenye seva moja huweka mipango na orodha tofauti lakini hupika kutoka kwa mapishi yaleyale, jambo ambalo bado linafaa kwa nyumba ya kupanga ambapo hakuna anayekubaliana kuhusu anchovies. Ikiwa watu wanahitaji mikusanyiko tofauti kabisa, wape vikundi tofauti, kwa sababu hakuna kitu kinachoshirikiwa kati ya vikundi.

Kipakuzi, ambacho ndicho sababu ya kuendesha programu hii

Fungua mkusanyiko wa mapishi, chagua kuunda mapishi kutoka kwa URL, na ubandike kiungo. Mealie huchota ukurasa na kutafuta data ya mapishi iliyopangiliwa, ambayo ni sehemu inayoweza kusomwa na mashine ambayo tovuti nyingi za mapishi huiweka kwa ajili ya injini za utafutaji. Wakati sehemu hiyo ipo, upakiaji huwa safi na wa haraka.

Ukiweka mtoa huduma wa AI, unaweza pia kupakia kutoka kwa picha au kutoka kwa maandishi ya kawaida unayobandika, jambo linalofaa kwa picha ya ukurasa kutoka kwenye kitabu cha mapishi. Upakiaji wa picha unahitaji mtoa huduma anayeweza kusoma picha. Bila mtoa huduma, upakiaji huu haupatikani. Hupitia njia ya polepole zaidi na unahitaji kukaguliwa baadaye, kwa sababu sehemu za mapishi zilizoandikwa kwa mkono ni rahisi kusomwa vibaya.

Upakiaji wa wingi (bulk imports) huendeshwa kutoka skrini hiyo hiyo: bandika orodha ya anwani, moja kwa kila mstari, na Mealie hufanya kazi hiyo kwa nyuma. Mkusanyiko wa alamisho (bookmarks) mia mbili huhamia kwa wakati mmoja.

Mipango ya milo na orodha ya manunuzi

Kipanga milo ni kalenda. Buruta mapishi kwenye siku husika ili kuyapanga. Orodha ya manunuzi kisha hukusanya viungo kutoka kwenye mapishi yaliyopangwa na kuviunganisha, hivyo mapishi mawili yanayohitaji vitunguu yataleta mstari mmoja badala ya miwili.

Orodha hii ni ukurasa unaosasika moja kwa moja kwenye simu yako ukiwa dukani. Kwa sababu seva yako binafsi ndiyo inayoiendesha, kila mtu katika kaya huona orodha ileile kwa wakati mmoja, na mtu mmoja akitia alama kwenye maziwa, yataondoka kwenye skrini ya mtu mwingine.

Weka nginx na TLS mbele

Mealie hutumia HTTP ya kawaida na haina uwezo wa kushughulikia cheti chake. Malizia (terminate) transport layer security (TLS) kwenye nginx iliyo mbele yake. Elekeza DNS A record kwenye seva yako kwanza, kwa sababu hatua ya cheti huhakiki jina hilo.

sudo apt update && sudo apt install -y nginx
sudo nano /etc/nginx/sites-available/mealie
server {
    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 nginx

nginx -t kuchapisha syntax is ok na test is successful ndiyo kizingiti. Pakia upya (reload) tu baada ya usanidi kupita, kwa sababu kupakia upya usanidi mbovu huacha ule wa zamani ukiendelea kufanya kazi na huficha kosa hadi kuanzishwa upya (restart) kwa mfumo.

client_max_body_size 64M ipo kwa sababu thamani chaguo-msingi ya nginx ni 1 MB. Kupakia picha ya mapishi au kurejesha backup kupitia kivinjari hutuma data kubwa zaidi ya hiyo, na bila mstari huo utapata 413 Request Entity Too Large kutoka kwa nginx, si kutoka kwa Mealie, hivyo logi ya programu haitaonyesha chochote.

Kisha toa cheti. Hatua hiyo na kipima muda chake cha kusasisha (renewal timer) vimefafanuliwa katika kutoa cheti cha Let's Encrypt kwa ajili ya nginx kwa kutumia certbot.

sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d recipes.example.com

Certbot huandika upya server block ili isikilize kwenye 443 na huongeza redirect kutoka port 80. Pakia tovuti kupitia https:// na uthibitishe kuwa kivinjari kinakubali cheti hicho. Ikiwa Mealie inapakia lakini viungo vyake vinakupeleka kwenye http://, basi BASE_URL bado inasema http na inahitaji kurekebishwa, ikifuatiwa na sudo docker compose up -d ili kuunda upya container kwa thamani mpya.

Kuhudumia Mealie chini ya subpath kama vile example.com/recipes hakufanyi kazi, kwa sababu frontend haiwezi kuhudumiwa kutoka subpath. Tumia subdomain.

Hifadhi rudufu (backups), na kile ambacho urejeshaji (restore) hufanya kwa hakika

Kila kitu kinachomilikiwa na Mealie kipo ndani ya /app/data/ ndani ya kontena, ambayo ni volume ya mealie-data. Nakili volume hiyo na utakuwa umenakili mapishi, picha, na hifadhidata kwa pamoja. Nyaraka za Mealie zenyewe zinataja kusimamisha kontena na kunakili folda hii kama njia bora zaidi ya kuhifadhi nakala ya usakinishaji wa SQLite.

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 mealie

Jina la volume hubeba jina la mradi kama kiambishi awali, na jina la mradi ni saraka (directory) inayoshikilia faili ya compose. Kutoka /srv/mealie volume ni mealie_mealie-data, ndiyo sababu amri ya kwanza ni docker volume ls: tumia jina linalochapishwa, si jina lililo katika mwongozo huu. Kusimamisha kontena kwanza ni muhimu, kwa sababu SQLite mara nyingi huwa katika mchakato wa kuandika data kiasi kwamba nakala ya moja kwa moja inaweza isisomeke wakati wa kuirejesha.

Mealie pia ina ukurasa wake wa backup katika eneo la admin, ambao huandika kumbukumbu ya zip inayoshikilia hifadhidata kama database.json. Usitegemee njia hii kukuwezesha kuhama kati ya matoleo tofauti ya programu: kumbukumbu lazima irejeshwe na toleo lilelile la Mealie lililoiunda, na urejeshaji usiolingana husimama na kutoa hitilafu. Ili kuhama kati ya seva, endesha toleo lilelile lililofungwa (pinned version) kwenye mashine mpya, kisha nakili volume hiyo au urejeshe kumbukumbu huko. Urejeshaji wa aina yoyote ni wa kuharibu data kwa makusudi: hufuta hifadhidata ya sasa kabla ya kupakia kumbukumbu, na haiwezi kutenduliwa. Unatolewa nje ya mfumo (logged out) pale mchakato unapokamilika.

Hakuna nakala kati ya hizi inayoweza kuitwa backup ikiwa imehifadhiwa kwenye seva ileile. Tuma kumbukumbu hiyo mahali pengine kwa ratiba, jambo ambalo ndilo kusudi la hifadhi rudufu zilizosimbwa nje ya seva kwa kutumia restic.

Kusasisha Mealie

cd /srv/mealie
sudo nano docker-compose.yml
sudo docker compose pull
sudo docker compose up -d
sudo docker compose logs -f mealie

Badilisha toleo lililofungwa (pinned version) kwenye faili, kisha fanya pull na uunde upya kontena. Migrations hujiendesha zenyewe wakati wa kuanza kwa mara ya kwanza kwa image mpya. Tengeneza nakala ya volume kabla ya kubadilisha toleo kubwa (major version), kwa sababu migration ikifeli katikati, database inaweza kuharibika kiasi kwamba image ya awali haitaweza kuifungua tena. Soma maelezo ya toleo (release notes) kwa kila toleo lililopo kati ya toleo lako la sasa na toleo jipya.

Wakati uingizaji data unapofeli

Baadhi ya tovuti hazichapishi data yoyote ya mapishi iliyopangiliwa, na hivyo Mealie huleta kichwa cha habari kikiwa na orodha tupu ya viungo. Hili ni jambo ambalo huwezi kulitatua kwa usanidi. Badala yake, nakili na ubandike maandishi ya mapishi hayo wewe mwenyewe.

Hitilafu nyingine hutokana na ulinzi dhidi ya roboti uliowekwa mbele ya tovuti ya mapishi, ambao huijibu Mealie kwa ukurasa wa changamoto badala ya mapishi yenyewe. Mealie tayari hujifanya kama kivinjari na kubadilisha user agent yake ili kupunguza tatizo hili. Tovuti inapokataa bado, chaguzi zilizoorodheshwa ni kuipitisha scraper kupitia proxy yenye sifa bora ya anwani, au kuendesha mfano wa FlareSolverr unaotatua changamoto hiyo ndani ya kivinjari halisi. Zote ni chaguo za ziada, na zote huwekwa kupitia environment variables kwenye container.

Uingizaji data unaofeli kwa sababu seva yako haiwezi kufikia tovuti hiyo kabisa ni tatizo tofauti. Lifanyie majaribio kutoka kwenye seva hiyo kwa kutumia curl -I https://the-site.example/recipe na usome mstari wa status kabla ya kuilaumu scraper.

Mahali inapofaa

Mealie ni programu nzuri ya kwanza ya kujihostia kwa ajili ya kaya, kwa sababu watu unaoishi nao wataitumia bila kulazimishwa. Ni kazi ya aina moja na kuendesha maktaba yako ya picha ukitumia Immich, ingawa ni nyepesi zaidi, na inakaa kwenye orodha pana ya vitu vinavyofaa kujihostia mwaka huu. Seva moja ndogo inaweza kuhifadhi vyote viwili. Immich si mgombea pekee wa kazi hiyo ya pili, na kama bado unaamua, viwango vya chini vya kumbukumbu na amri za backup za PhotoPrism na Immich vinatofautiana vya kutosha kiasi cha kufaa kusomwa kabla ya kugawa nafasi iliyobaki ya diski. Ikiwa kaya inahifadhi mipango na madokezo yake mahali fulani pamoja na milo yake, workspace ya AFFiNE inayojihostiwa ni zoezi lilelile la compose-file, lakini inahitaji container nne na kumbukumbu nyingi zaidi kuliko Mealie, kwa hivyo angalia kwanza kile ambacho seva imebakiza. Na ikiwa kaya inataka kufuatilia mazoezi yake pamoja na milo yake, openGym inahifadhi mazoezi na inahitaji tag ileile iliyofungwa (pinned), compose file na cheti ambacho umemaliza kukifanyia kazi. Jioni baada ya chakula cha jioni ina toleo lake la hili, kwa kuwa Halcyon inajenga upya maktaba ya Jellyfin iliyopo kama duka la kukodisha la miaka ya 1990 unaloweza kutembea ndani yake, ambayo ni container moja ndogo zaidi mbele ya kitu unachokiendesha tayari badala ya database nyingine ya kuhifadhi backup. Sio kila kitu katika familia hii ni programu ya kaya, na ikiwa mazoea hayo hayo yatabidi kubeba kitu kwa ajili ya kazi, dawati la usaidizi la Chatwoot linalojihostiwa ni tag ileile iliyofungwa na cheti tena kikiwa na Postgres, Redis na barua pepe za kutoka (outbound mail) zinazofanya kazi nyuma yake, ambayo ni mpangaji mzito zaidi kuliko kisanduku cha mapishi na inastahili seva yake yenyewe.

FAQ

Kwa nini kuingiza URL ya mapishi kunafeli?

Kuna sababu mbili kuu. Aidha ukurasa hauchapishi data yoyote ya mapishi iliyopangiliwa, hivyo scraper haipati kitu na unapata kichwa cha habari bila viungo, au safu ya ulinzi dhidi ya bots iliyo mbele ya tovuti inarudisha ukurasa wa changamoto badala ya mapishi. Kwa kisa cha pili, Mealie inaweza kuelekezwa kwenye proxy yenye sifa bora ya anwani, au kwenye mfano wa FlareSolverr uliopo kwenye seva yako ambao hutatua changamoto hiyo katika kivinjari halisi. Thibitisha kuwa seva yako inaweza kufikia ukurasa huo kwa kutumia curl -I kabla ya kubadilisha chochote.

Je, nahitaji PostgreSQL, au SQLite inatosha?

SQLite inatosha kwa matumizi ya nyumbani, na ndiyo chaguo-msingi. Hamia kwenye PostgreSQL wakati saraka ya data inapokaa kwenye hifadhi ya mtandao (network attached storage), kwa sababu SQLite juu ya mfumo wa faili wa mtandao husababisha hitilafu za database iliyofungwa (locked-database errors) na inaweza kuharibu faili. Urejeshaji wa data (restores) chini ya PostgreSQL unahitaji mtumiaji wa database awe superuser, kwa sababu urejeshaji hufuta kila kitu kabla ya kupakia kumbukumbu.

Je, ninaweza kuendesha Mealie bila jina la kikoa (domain name)?

Ndiyo, kwenye mtandao wako wa nyumbani. Weka BASE_URL kwenye anwani utakayoiandika kihalisi, kama vile http://192.168.1.20:9925, na uruke nginx. Viungo vya mwaliko na kuweka upya nenosiri hutengenezwa kutoka BASE_URL, kwa hivyo thamani isiyo sahihi hutoa viungo ambavyo hakuna mtu mwingine anayeweza kuvifungua. Usiifichue kwenye mtandao kupitia HTTP ya kawaida, kwa sababu kuingia (login) kutatumwa bila kufichwa (in the clear).

Ninawezaje kuwapa familia yangu akaunti zao za kuingia?

Acha ALLOW_SIGNUP ikiwa imewekwa kwenye "false" na uongeze watu kutoka eneo la admin, jambo ambalo hutoa kiungo cha mwaliko unachowatumia. Weka kila mtu anayeshiriki jikoni katika kaya moja ili washiriki mpango wa mlo na orodha ya manunuzi. Mapishi hushirikiwa na kila kaya katika kundi kwa vyovyote vile, kwa hivyo watu wanaohitaji makusanyo tofauti wanahitaji makundi tofauti.

Nini kinatokea kwa mapishi yangu nikisitisha kuendesha Mealie?

Yanaweza kutolewa nje. Backup ya admin huandika data yako kama JSON, na Mealie inaweza pia kusafirisha mapishi kama faili za kawaida za markdown, ambazo hubaki kusomeka katika kihariri chochote cha maandishi bila programu yoyote. Chukua nakala moja ya nje (export) kabla ya kuihitaji na uhakikishe kuwa unaweza kuifungua.