SSD Nodes Learn 🎉 VPS $5.50/aydan başlayan
Rehberler Matt ConnorYazan Matt Connor · Güncellendi 2026-08-13

VPS Uzerinde Docker ile Mealie Yemek Tarifi Yoneticisi

Docker Compose kullanarak kendi VPS sunucunuzda Mealie kurulumunu yapin. Tarif linklerini otomatik ayiklayin, alisveris listeleri olusturun ve Nginx ile TLS destegi saglayin.

Self-hosted bir yemek tarifi yöneticisi ne işe yarar

Self-hosted bir yemek tarifi yöneticisi, tariflerinizi kendi sunucunuzdaki bir veritabanında tutar; Mealie, çoğu hanenin tercih ettiği bu alandaki en popüler çözümdür. Bir yemek tarifi sayfasının adresini yapıştırdığınızda Mealie; malzemeleri, hazırlık adımlarını, porsiyon miktarını ve pişirme süresini ayrıştırır; hikaye kısımlarını ve reklamları ayıklar. Koleksiyonunuza yalnızca yemek tarifi eklenir.

Uygulamanın geri kalan özellikleri oldukça sadedir. Tariflerinizi sürükleyip bırakabileceğiniz haftalık bir yemek planlayıcı ve bu plandan otomatik olarak oluşturulan bir alışveriş listesi bulunur. Yemek yapan her kullanıcı için ayrı bir oturum açma hesabı tanımlanabilir. Tüm sistem tek bir container içerisinde çalışır ve istek gelmediği sürece boşta bekler; bu nedenle mütevazı bir VPS üzerinde kaynak tüketimi hissedilmeyecek kadar azdır.

Bu rehber Docker Compose kullanmaktadır. Eğer services: ve volumes: terimleri size yabancıysa, öncelikle Docker Compose dosyalarının yapısı hakkındaki bölümü okuyun; çünkü aşağıda yer alan tüm yapı tek bir compose dosyası ve dört komuttan oluşmaktadır.

Docker Compose ile Mealie Kurulumu

Mealie, imajlarını GitHub container registry üzerinde yayınlar. Temmuz 2026 itibarıyla güncel kararlı etiket v3.22.0 şeklindedir. latest kullanmak yerine bir sürümü sabitleyin: latest ile, alakasız bir günde gerçekleşen docker compose pull, sizi hazırlıklı olmadığınız bir veritabanı migrasyonuna zorlayabilir.

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:

Başlatmadan önce iki satıra dikkat edilmelidir.

Port, 9925:9000 olarak değil, 127.0.0.1:9925:9000 olarak yazılmıştır. Container içeride 9000 portunu dinler ve ana makine 9925 portunu buna eşler. Bu eşlemeyi loopback adresine bağlamak, nginx'in Mealie'ye erişebilmesini sağlarken internetin erişimini engeller. Docker, kendi kurallarını paket filtresine yazar; bu nedenle güvenlik duvarınız portun kapalı olduğunu söylese bile, düz bir 9925:9000 dışarıdan erişilebilir durumdadır. Bu sürprizin bir kez anlaşılması faydalıdır: bkz. Docker tarafından yayınlanan portlar neden ufw kurallarını yok sayar.

BASE_URL, şema ile birlikte ve sonunda eğik çizgi (slash) olmadan, kullanacağınız tam genel adres olmalıdır. Mealie, parola sıfırlama ve davet bağlantılarını bu adresi kullanarak oluşturur. Bunu http://localhost:9925 olarak ayarlarsanız, partnerinize gönderdiğiniz davet, yalnızca sunucunun kendisinde çalışan bir bağlantı içerecektir.

Başlatın ve ilk açılışı izleyin.

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

İlk başlatma, SQLite veritabanını oluşturur ve birkaç saniye süren migrasyonları çalıştırır. Günlük kayıtları (log) durulduğunda ve migrasyon satırlarını yazdırmayı bıraktığında, uygulamayı yerel olarak kontrol edin.

curl -I http://127.0.0.1:9925

200 OK, uygulamanın çalıştığı anlamına gelir. Connection refused, container'ın çalışmadığını gösterir: sudo docker compose ps komutunu çalıştırın ve çıkış kodunu okuyun. 137 koduyla duran bir container, 1000M bellek sınırını aştığı için sonlandırılmıştır; bu durum en küçük planlarda gerçekleşebilir.

İlk giriş ve açık kayıt özelliğinin kapatılması

Varsayılan hesap changeme@example.com olup parola MyPassword şeklindedir. Bu bilgilerle giriş yapın ve her ikisini de derhal değiştirin; zira bu ikili dokümantasyonda yer aldığından tüm tarayıcıların hedefindedir.

Compose dosyasındaki ALLOW_SIGNUP: "false" ayarı kasıtlıdır. Kayıt özelliği açık olduğunda, adresi bulan herkes yemek tarifi kutunuzda bir hesap oluşturabilir. Özellik kapalıyken, kullanıcıları yönetim panelinden eklersiniz; bu işlem, kişiye bizzat göndereceğiniz bir davet bağlantısı oluşturur. Söz konusu bağlantı BASE_URL üzerinden oluşturulduğu için bu değer önemlidir. Aynı sunucuda birden fazla uygulama çalıştırıyorsanız ve hepsinde tek bir parola kullanmak istiyorsanız, Mealie giriş işlemlerini kendi sunucunuzda barındırdığınız bir Authentik örneği gibi harici bir kimlik sağlayıcısına devredebilir.

Mealie, kullanıcıları bir hane halkı altında gruplandırır. Aynı hanedeki herkes yemek tarifi koleksiyonunu, yemek planını ve alışveriş listesini paylaşır; bu da ailelerin ihtiyaç duyduğu yapıdır. Aynı sunucudaki ayrı hane halkları ise kendi koleksiyonlarını ayrı tutar; bu da hamsi konusunda anlaşamayan ev arkadaşları için uygun olan yöntemdir.

İçe aktarıcı: Çalıştırmanın temel nedeni

Tarif koleksiyonunu açın, bir URL'den tarif oluşturmayı seçin ve bir bağlantı yapıştırın. Mealie sayfayı getirir ve çoğu tarif sitesinin arama motorları için gömdüğü, makine tarafından okunabilir bir blok olan yapılandırılmış tarif verisini arar. Bu blok mevcut olduğunda içe aktarma işlemi temiz ve anında gerçekleşir.

Ayrıca bir görselden veya yapıştırdığınız düz metinden de içe aktarma yapabilirsiniz; bu yöntem bir yemek kitabındaki sayfanın fotoğrafı için de geçerlidir. Bu yöntem daha yavaş bir süreçten geçer ve sonrasında kontrol edilmesini gerektirir, çünkü el yazısı bir kesri yanlış okumak kolaydır.

Toplu içe aktarma işlemleri aynı ekrandan yürütülür: her satıra bir tane gelecek şekilde adres listesini yapıştırın; Mealie bunları arka planda işleyecektir. İki yüz yer işaretinden oluşan bir koleksiyon tek seferde aktarılabilir.

Yemek planları ve alışveriş listesi

Yemek planlayıcı bir takvimdir. Bir tarifi bir günün üzerine sürüklediğinizde planlanmış olur. Alışveriş listesi, planlanan tariflerdeki malzemeleri tek bir listede toplar ve mükerrer kayıtları birleştirir; böylece soğan gerektiren iki tarif, iki satır yerine tek bir satır oluşturur.

Liste, markette telefonunuz üzerinden erişebileceğiniz canlı bir sayfadır. Kendi sunucunuzda barındırıldığı için, evdeki herkes aynı listeyi aynı anda görür ve bir kişi sütü işaretlediğinde, bu öğe diğer kişinin ekranından da silinir.

Nginx ve TLS yapılandırmasını öne alın

Mealie yalnızca düz HTTP üzerinden çalışır ve kendi sertifika yönetimi bulunmaz. Bu nedenle, taşıma katmanı güvenliğini (TLS) Mealie'nin önündeki Nginx üzerinde sonlandırın. Sertifika doğrulama süreci alan adını kontrol edeceği için, öncelikle sunucunuza bir DNS A kaydı tanımlayın.

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 komutunu çalıştırmak, syntax is ok ve test is successful dosyalarının doğruluğunu denetleyen bir kapı görevi görür. Yapılandırmayı yalnızca bu denetim başarılı olduktan sonra yeniden yükleyin; hatalı bir yapılandırmayı yeniden yüklemek, eski yapılandırmanın çalışmaya devam etmesine ve hatanın bir sonraki yeniden başlatmaya kadar gizli kalmasına neden olur.

client_max_body_size 64M satırı gereklidir çünkü Nginx varsayılan değeri 1 MB'tır. Tarayıcı üzerinden bir yemek tarifi fotoğrafı yüklemek veya yedekleme dosyası geri yüklemek bu değerden daha büyük bir veri gövdesi gönderir. Bu satır eklenmediği takdirde, uygulama günlüklerinde hiçbir hata görünmezken Nginx üzerinden 413 Request Entity Too Large hatası alırsınız.

Ardından sertifikayı oluşturun. Bu adım ve sertifika yenileme zamanlayıcısı, certbot ile Nginx için Let's Encrypt sertifikası alma bölümünde açıklanmıştır.

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

Certbot, sunucu bloğunu 443 numaralı portu dinleyecek şekilde yeniden yazar ve 80 numaralı porttan yönlendirme ekler. Siteyi https:// üzerinden yükleyin ve tarayıcının sertifikayı kabul ettiğini doğrulayın. Mealie yükleniyor ancak kendi bağlantıları sizi http:// adresine yönlendiriyorsa, BASE_URL değişkeni hala http değerini içeriyor demektir; bu değer düzeltilmeli ve ardından konteyneri yeni değerle yeniden oluşturmak için sudo docker compose up -d komutu çalıştırılmalıdır.

Mealie'yi example.com/recipes gibi bir alt dizin altında sunmak çalışmaz, çünkü arayüz bir alt dizinden servis edilemez. Bir alt alan adı (subdomain) kullanın.

Yedeklemeler ve geri yükleme işleminin gerçekte yaptığı

Mealie'ye ait her şey, container içindeki /app/data/ dizininde, yani mealie-data biriminde (volume) bulunur. Bu birimi kopyaladığınızda tarifleri, görselleri ve veritabanını bir bütün olarak kopyalamış olursunuz.

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

Birim adı, önek olarak proje adını taşır; proje adı ise compose dosyasını barındıran dizindir. /srv/mealie dizininden bakıldığında birim adı mealie_mealie-data şeklindedir; bu nedenle ilk komut docker volume ls şeklindedir: bu rehberdeki ismi değil, komutun çıktı olarak verdiği ismi kullanın. Container'ı önceden durdurmak önemlidir, çünkü SQLite sık sık yazma işlemi gerçekleştirdiğinden, canlı bir kopyanın geri yüklenmesi durumunda veriler okunamayabilir.

Mealie'nin ayrıca yönetim panelinde kendi yedekleme sayfası bulunur; bu sayfa, veritabanını JSON formatında ve görsellerinizle birlikte taşınabilir bir arşiv dosyasına yazar. Sunucular arası geçiş yaparken bunu kullanın, çünkü bu yöntem ham dosya kopyalamanın aksine sürüm değişikliklerinde de çalışır. Bir yedeği geri yüklemek, tasarımı gereği yıkıcı bir işlemdir: arşivi yüklemeden önce mevcut veritabanını siler ve bu işlem geri alınamaz. İşlem tamamlandığında oturumunuz kapatılır.

Her iki kopya da aynı sunucuda durduğu sürece yedek sayılmaz. Arşiv dosyasını düzenli olarak başka bir yere aktarın; restic ile şifrelenmiş sunucu dışı yedeklemeler bu amaçla kullanılır.

Mealie Güncelleme

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

Dosya içerisindeki sabitlenmiş sürümü yükseltin, ardından imajı çekip konteyneri yeniden oluşturun. Veritabanı geçişleri (migrations), yeni imajın ilk başlatılması sırasında otomatik olarak çalıştırılır. Büyük bir sürüm değişikliği öncesinde mutlaka birim (volume) yedeği alın; çünkü yarıda kalan bir geçiş işlemi, veritabanını önceki imajın artık açamayacağı bir duruma getirebilir. Mevcut sürümünüz ile yeni sürüm arasındaki tüm sürümlere ait sürüm notlarını (release notes) mutlaka okuyun.

İçe aktarma başarısız olduğunda

Bazı siteler hiçbir yapılandırılmış tarif verisi yayınlamaz; bu durumda Mealie, boş bir malzeme listesiyle yalnızca başlığı içe aktarır. Bu, yapılandırma ile çözülebilecek bir durum değildir. Tarif metnini manuel olarak yapıştırın.

Diğer hatalar, tarif sitesinin önündeki bot korumasından kaynaklanır; bu koruma, Mealie'ye tarif yerine bir doğrulama sayfası döndürür. Mealie, bunu azaltmak için halihazırda bir tarayıcıyı taklit eder ve user agent bilgisini değiştirir. Bir site yine de erişimi reddediyorsa, belgelenmiş seçenekler kazıyıcıyı daha iyi bir adres itibarına sahip bir proxy üzerinden yönlendirmek veya doğrulama işlemini gerçek bir tarayıcıda çözen bir FlareSolverr örneği çalıştırmaktır. Her iki seçenek de isteğe bağlıdır ve container üzerindeki ortam değişkenleri aracılığıyla ayarlanır.

Sunucunuzun siteye hiçbir şekilde ulaşamaması nedeniyle başarısız olan bir içe aktarma işlemi farklı bir sorundur. Kazıyıcıyı suçlamadan önce curl -I https://the-site.example/recipe ile sunucudan siteye erişimi test edin ve durum satırını okuyun.

Konumlandırma

Mealie, ev halkının kendiliğinden kullanacağı bir uygulama olduğu için ev ortamında kendi kendine barındırılan (self-hosted) ilk uygulamalardan biri olarak iyi bir tercihtir. Bu görev, kendi fotoğraf kütüphanenizi Immich ile yönetmek ile benzer bir yapıya sahip olsa da çok daha hafiftir ve bu yıl kendi kendine barındırmaya değer şeyler listesinin daha geniş bir bölümünde yer alır. Küçük bir sunucu her ikisini de barındırabilir. Immich bu ikinci görev için tek aday değildir; hala karar aşamasındaysanız, PhotoPrism ve Immich'in bellek alt sınırları ve yedekleme komutları, diskin geri kalanını ayırmadan önce okumaya değer ölçüde farklılık gösterir.

FAQ

Bir tarif URL'sini içe aktarma işlemi neden başarısız olur?

Bunun iki yaygın nedeni vardır. Ya sayfa yapılandırılmış tarif verisi yayınlamıyordur, bu durumda kazıyıcı (scraper) hiçbir şey bulamaz ve içeriksiz bir başlık elde edersiniz; ya da sitenin önündeki bir bot koruma katmanı, tarif yerine bir doğrulama sayfası döndürüyordur. İkinci durum için Mealie, daha iyi bir adres itibarına sahip bir proxy'ye veya zorluğu gerçek bir tarayıcıda çözen, kendi barındırdığınız bir FlareSolverr örneğine yönlendirilebilir. Herhangi bir değişiklik yapmadan önce, sunucunuzun curl -I ile sayfaya erişebildiğini doğrulayın.

PostgreSQL kullanmam gerekiyor mu, yoksa SQLite yeterli mi?

SQLite bir hane halkı için yeterlidir ve varsayılan seçenektir. Veri dizini ağa bağlı depolama (NAS) üzerinde bulunuyorsa PostgreSQL'e geçin; çünkü ağ dosya sistemi üzerinden SQLite kullanımı kilitli veritabanı hatalarına yol açar ve dosyanın bozulmasına neden olabilir. PostgreSQL altında geri yükleme işlemleri, veritabanı kullanıcısının süper kullanıcı (superuser) olmasını gerektirir; çünkü geri yükleme işlemi arşivi yüklemeden önce mevcut her şeyi siler.

Mealie'yi bir alan adı olmadan çalıştırabilir miyim?

Evet, kendi ağınızda çalıştırabilirsiniz. BASE_URL değerini, tarayıcınıza yazacağınız adresle (örneğin http://192.168.1.20:9925) değiştirin ve nginx adımını atlayın. Davet ve parola sıfırlama bağlantıları BASE_URL değerinden oluşturulur; bu nedenle yanlış bir değer, kimsenin açamayacağı bağlantılar üretilmesine neden olur. Giriş bilgileri açık metin olarak gönderileceğinden, sistemi düz HTTP üzerinden internete açmayın.

Aileme nasıl kendi giriş bilgilerini verebilirim?

ALLOW_SIGNUP değerini "false" olarak bırakın ve yönetim panelinden kişileri ekleyin; bu işlem, onlara göndereceğiniz bir davet bağlantısı oluşturur. Mutfağı paylaşan herkesi aynı hane (household) içerisine dahil edin; böylece tarifleri, yemek planını ve alışveriş listesini ortak kullanabilirler. Tek bir sunucudaki farklı haneler, birbirinden bağımsız koleksiyonlar tutar.

Mealie'yi çalıştırmayı bırakırsam tariflerime ne olur?

Tarifleriniz elinizde kalır. Yönetici yedekleme özelliği verilerinizi JSON formatında yazar; ayrıca Mealie, tarifleri herhangi bir metin düzenleyicide hiçbir yazılıma ihtiyaç duymadan okunabilir kalan düz markdown dosyaları olarak da dışa aktarabilir. İhtiyaç duymadan önce bir kez dışa aktarma yapın ve dosyaları açabildiğinizi kontrol edin.