SSD Nodes Learn 🎉 VPS kutoka $5.50/mwezi
Mwongozo Matt ConnorNa Matt Connor · Imeboreshwa 2026-08-13

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 Julai 2026, tag ya sasa iliyo thabiti ni v3.22.0. Weka toleo maalum badala ya kutumia latest: kwa kutumia latest, docker compose pull isiyotarajiwa inaweza kukuhamisha 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.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:

Mistari miwili inahitaji kuzingatiwa kabla ya kuanza.

Port imeandikwa kama 127.0.0.1:9925:9000 na si kama 9925:9000. Container husikiliza kwenye 9000 kwa ndani, na host huipangia 9925. Kufunga 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 kama firewall yako inasema port imefungwa. Mshangao huo unastahili kueleweka mara moja: angalia kwa nini published Docker ports 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 kama 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 SQLite database na kuendesha migrations, jambo linalochukua sekunde chache. Log ikitulia na kuacha kuchapisha mistari ya migration, thibitisha 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 iliyoacha na code 137 ilisitishwa kwa sababu ilizidi kikomo cha 1000M cha kumbukumbu, jambo linalotokea kwenye mipango midogo zaidi ya seva.

Kuingia kwa mara ya kwanza, na kuzima usajili wa wazi

Akaunti ya awali ni changeme@example.com yenye nenosiri MyPassword. Ingia ukitumia akaunti hiyo, kisha ubadilishe yote mawili mara moja, kwa sababu jozi hiyo imechapishwa 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 kuunda akaunti katika kisanduku chako cha mapishi. Usajili 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 vile mfano wa Authentik unaojiendesha.

Mealie hupanga watumiaji katika kaya. Kila mtu katika kaya moja hushiriki mkusanyiko wa mapishi, mpango wa mlo na orodha ya manunuzi, jambo ambalo familia huhitaji. Kaya tofauti kwenye seva moja huweka makusanyo tofauti, jambo ambalo watu wanaoishi pamoja (flatshare) huhitaji wakati hakuna anayekubaliana kuhusu anchovies.

Kipakuzi, ambacho ndicho sababu ya kukiendesha

Fungua mkusanyiko wa mapishi, chagua kuunda mapishi kutoka kwa URL, kisha ubandike link. Mealie huchota ukurasa na kutafuta data za mapishi zilizopangwa, yaani kizuizi kinachoweza kusomwa na mashine ambacho tovuti nyingi za mapishi huweka kwa ajili ya injini za utafutaji. Kizuizi hicho kinapokuwepo, uingizaji huwa safi na wa papo hapo.

Unaweza pia kuingiza kutoka kwa picha au maandishi ya kawaida unayobandika, ambayo hufunika picha ya ukurasa kutoka kwenye kitabu cha mapishi. Hizo hupitia njia ya polepole zaidi na zinahitaji kukaguliwa baadaye, kwa sababu sehemu ya namba iliyoandikwa kwa mkono ni rahisi kusomwa vibaya.

Uingizaji wa wingi (bulk imports) hufanyika kutoka kwenye skrini hiyo hiyo: bandika orodha ya anwani, moja kwa kila mstari, na Mealie hufanya kazi hiyo kwa nyuma. Mkusanyiko wa bookmark 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.

Backup, na kile ambacho urejeshaji hufanya kwa hakika

Kila kitu ambacho Mealie inamiliki kipo ndani ya /app/data/ ndani ya container, ambayo ni volume ya mealie-data. Nakili volume hiyo na utakuwa umenakili mapishi, picha, na database kwa pamoja.

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 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 container kwanza ni muhimu, kwa sababu SQLite mara nyingi huwa katikati ya uandishi kiasi kwamba nakala ya moja kwa moja inaweza kurejesha data isiyosomeka.

Mealie pia ina ukurasa wake wa backup katika eneo la admin, ambao huandika archive inayoweza kubebeka inayoshikilia database kama JSON pamoja na picha zako. Itumie kwa ajili ya kuhama kati ya seva, kwa kuwa inastahimili mabadiliko ya toleo ambayo nakala ya faili ghafi inaweza isistahimili. Kurejesha moja ni kitendo cha uharibifu kwa muundo wake: hufuta database ya sasa kabla ya kupakia archive, na haiwezi kutenduliwa. Unatolewa nje ya mfumo (log out) mchakato utakapokamilika.

Hakuna nakala kati ya hizo mbili inayoweza kuitwa backup ikiwa imehifadhiwa kwenye seva hiyo hiyo. Tuma archive hiyo mahali pengine kwa ratiba, jambo ambalo ndilo kusudi la encrypted off-server backups with 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 katika orodha pana ya vitu vinavyofaa kujihostia mwaka huu. Seva moja ndogo inaweza kuhifadhi zote mbili. Immich si mgombea pekee kwa kazi hiyo ya pili, na kama bado unaamua, viwango vya chini vya kumbukumbu na amri za chelezo za PhotoPrism na Immich vinatofautiana vya kutosha kiasi cha kufaa kusomwa kabla ya kutoa nafasi iliyobaki ya diski.

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 bot 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 uliowekwa 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, ninahitaji PostgreSQL, au SQLite inatosha?

SQLite inatosha kwa matumizi ya nyumbani, na ndiyo chaguo-msingi. Hamia kwenye PostgreSQL wakati saraka ya data inapokaa kwenye network attached storage, kwa sababu SQLite juu ya mfumo wa faili wa mtandao husababisha makosa ya locked-database na inaweza kuharibu faili. Urejeshaji wa data 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 mialiko na kuweka upya nenosiri hutengenezwa kutoka BASE_URL, kwa hivyo thamani isiyo sahihi hutoa viungo ambavyo hakuna mtu mwingine anayeweza kuvifungua. Usiifunue kwenye mtandao kupitia HTTP ya kawaida, kwa sababu kuingia (login) kutatumwa bila ulinzi wowote.

Ninawezaje kuwapa wanafamilia wangu 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 mapishi, mpango wa milo, na orodha ya manunuzi. Kaya tofauti kwenye seva moja huweka makusanyo tofauti.

Nini kitatokea kwa mapishi yangu nikisimamisha kuendesha Mealie?

Yatabaki. 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. Fanya usafirishaji mmoja kabla ya kuuhitaji na uhakikishe kuwa unaweza kuufungua.