{"id":40729,"date":"2026-01-11T15:55:31","date_gmt":"2026-01-11T15:55:31","guid":{"rendered":"https:\/\/green.cloud\/docs\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/"},"modified":"2026-01-30T04:32:18","modified_gmt":"2026-01-30T04:32:18","slug":"mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy","status":"publish","type":"docs","link":"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/","title":{"rendered":"Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy)"},"content":{"rendered":"<h2 data-start=\"319\" data-end=\"334\">Introduction<\/h2>\n<p data-start=\"335\" data-end=\"559\"><strong data-start=\"335\" data-end=\"345\">Mealie<\/strong> is a self-hosted recipe manager designed for personal and family use. It provides a clean web interface for saving recipes, organizing them into categories, importing recipes from URLs, and managing meal planning.<\/p>\n<p data-start=\"561\" data-end=\"807\">In this guide, you will install Mealie on an <strong data-start=\"606\" data-end=\"621\">AlmaLinux 9<\/strong> server using <strong data-start=\"635\" data-end=\"653\">Docker Compose<\/strong> with a <strong data-start=\"661\" data-end=\"675\">PostgreSQL<\/strong> database. Mealie will run privately on localhost, and <strong data-start=\"730\" data-end=\"739\">Nginx<\/strong> will be used as a reverse proxy to expose the application publicly.<\/p>\n<p data-start=\"809\" data-end=\"865\">This deployment is stable, secure, and easy to maintain.<\/p>\n<p><iframe title=\"How to Install Mealie on AlmaLinux 9 | VPS Tutorial\" width=\"1170\" height=\"658\" src=\"https:\/\/www.youtube.com\/embed\/iPNHipK2EKM?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe><\/p>\n<h3 data-start=\"872\" data-end=\"895\">Step 1: Requirements<\/h3>\n<p data-start=\"897\" data-end=\"933\">Before starting, make sure you have:<\/p>\n<ul data-start=\"935\" data-end=\"1066\">\n<li data-start=\"935\" data-end=\"962\">\n<p data-start=\"937\" data-end=\"962\">An <strong data-start=\"940\" data-end=\"955\">AlmaLinux 9<\/strong> server<\/p>\n<\/li>\n<li data-start=\"963\" data-end=\"980\">\n<p data-start=\"965\" data-end=\"980\">Root SSH access<\/p>\n<\/li>\n<li data-start=\"981\" data-end=\"1035\">\n<p data-start=\"983\" data-end=\"1035\">Port <strong data-start=\"988\" data-end=\"994\">80<\/strong> open\/allowed (Firewall \/ Security Group)<\/p>\n<\/li>\n<li data-start=\"1036\" data-end=\"1066\">\n<p data-start=\"1038\" data-end=\"1066\">Basic command-line knowledge<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"1068\" data-end=\"1071\" \/>\n<h3 data-start=\"1073\" data-end=\"1117\">Step 2: Connect to the AlmaLinux 9 Server<\/h3>\n<h3 data-start=\"1119\" data-end=\"1136\">Linux \/ macOS<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">ssh root@YOUR_SERVER_IP<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<h3 data-start=\"1174\" data-end=\"1185\">Windows<\/h3>\n<p data-start=\"1186\" data-end=\"1229\">Use PowerShell, Windows Terminal, or PuTTY:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">ssh root@YOUR_SERVER_IP<code class=\"whitespace-pre! language-powershell\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"1273\" data-end=\"1325\">Once connected, you should be logged in as <strong data-start=\"1316\" data-end=\"1324\">root<\/strong>.<\/p>\n<hr data-start=\"1327\" data-end=\"1330\" \/>\n<h3 data-start=\"1332\" data-end=\"1376\">Step 3: Install Docker and Docker Compose<\/h3>\n<h3 data-start=\"1378\" data-end=\"1403\">3.1 Update the System<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">dnf update -y<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"1430\" data-end=\"1481\">Updates all system packages to the latest versions.<\/p>\n<hr data-start=\"1483\" data-end=\"1486\" \/>\n<h3 data-start=\"1488\" data-end=\"1525\">3.2 Install Required Dependencies<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">dnf install -y ca-certificates curl gnupg2 dnf-utils<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"1591\" data-end=\"1660\">Installs tools required for secure repository and package management.<\/p>\n<hr data-start=\"1662\" data-end=\"1665\" \/>\n<h3 data-start=\"1667\" data-end=\"1696\">3.3 Add Docker Repository<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">dnf config-manager --add-repo https:\/\/download.docker.com\/linux\/centos\/docker-ce.repo<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"1795\" data-end=\"1859\">Adds the official Docker repository compatible with AlmaLinux 9.<\/p>\n<p data-start=\"1861\" data-end=\"1889\">Refresh repository metadata:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">dnf makecache<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<hr data-start=\"1917\" data-end=\"1920\" \/>\n<h3 data-start=\"1922\" data-end=\"1977\">3.4 Install Docker Engine and Docker Compose Plugin<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"2086\" data-end=\"2135\">Installs Docker Engine and Docker Compose plugin.<\/p>\n<p data-start=\"2137\" data-end=\"2159\">Enable Docker at boot:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">systemctl enable docker<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"2197\" data-end=\"2218\">Start Docker service:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">systemctl start docker<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"2255\" data-end=\"2282\">Verify Docker installation:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">docker --version<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"2313\" data-end=\"2348\">Verify Docker Compose availability:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">docker compose version<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<hr data-start=\"2385\" data-end=\"2388\" \/>\n<h3 data-start=\"2390\" data-end=\"2437\">Step 4: Configure Mealie with Docker Compose<\/h3>\n<h3 data-start=\"2439\" data-end=\"2471\">4.1 Create Project Directory<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">mkdir -p \/opt\/mealie\r\ncd \/opt\/mealie<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<hr data-start=\"2521\" data-end=\"2524\" \/>\n<h3 data-start=\"2526\" data-end=\"2560\">4.2 Create Docker Compose File<\/h3>\n<p data-start=\"2561\" data-end=\"2583\">Create a compose file:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">nano docker-compose.yml<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"2621\" data-end=\"2655\">Paste the following configuration:<\/p>\n<pre>services:\r\n  db:\r\n    image: postgres:16\r\n    container_name: mealie-db\r\n    restart: unless-stopped\r\n    environment:\r\n      POSTGRES_DB: mealie\r\n      POSTGRES_USER: mealie\r\n      POSTGRES_PASSWORD: strong_db_password\r\n    volumes:\r\n      - \/opt\/mealie\/db:\/var\/lib\/postgresql\/data\r\n\r\n  mealie:\r\n   image: ghcr.io\/mealie-recipes\/mealie:latest\r\n   container_name: mealie\r\n   restart: unless-stopped\r\n   ports:\r\n     - \"127.0.0.1:9000:9000\"\r\n   environment:\r\n     ALLOW_SIGNUP: \"false\"\r\n     DB_ENGINE: postgres\r\n     POSTGRES_DB: mealie\r\n     POSTGRES_USER: mealie\r\n     POSTGRES_PASSWORD: strong_db_password\r\n     POSTGRES_SERVER: db\r\n     POSTGRES_PORT: 5432\r\n     BASE_URL: https:\/\/mealie.example.com\r\nvolumes:\r\n     - \/opt\/mealie\/data:\/app\/data\r\ndepends_on:\r\n     - db<\/pre>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p data-start=\"3432\" data-end=\"3451\">This configuration:<\/p>\n<ul data-start=\"3452\" data-end=\"3711\">\n<li data-start=\"3452\" data-end=\"3496\">\n<p data-start=\"3454\" data-end=\"3496\">Uses PostgreSQL 16 as the database backend<\/p>\n<\/li>\n<li data-start=\"3497\" data-end=\"3554\">\n<p data-start=\"3499\" data-end=\"3554\">Restricts Mealie to localhost access only (<code data-start=\"3542\" data-end=\"3553\">127.0.0.1<\/code>)<\/p>\n<\/li>\n<li data-start=\"3555\" data-end=\"3605\">\n<p data-start=\"3557\" data-end=\"3605\">Prepares the application for reverse proxy usage<\/p>\n<\/li>\n<li data-start=\"3606\" data-end=\"3648\">\n<p data-start=\"3608\" data-end=\"3648\">Stores persistent data in <code data-start=\"3634\" data-end=\"3648\">\/opt\/mealie\/<\/code><\/p>\n<\/li>\n<li data-start=\"3649\" data-end=\"3711\">\n<p data-start=\"3651\" data-end=\"3711\">Disables public account registration (<code data-start=\"3689\" data-end=\"3710\">ALLOW_SIGNUP: false<\/code>)<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"3713\" data-end=\"3716\" \/>\n<h3 data-start=\"3718\" data-end=\"3763\">4.3 Create Persistent Storage Directories<\/h3>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">mkdir -p \/opt\/mealie\/db\r\nmkdir -p \/opt\/mealie\/data<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<hr data-start=\"3827\" data-end=\"3830\" \/>\n<h3 data-start=\"3832\" data-end=\"3852\">4.4 Start Mealie<\/h3>\n<p data-start=\"3853\" data-end=\"3882\">Download the required images:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">docker compose pull<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"3916\" data-end=\"3954\">Start the containers in detached mode:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">docker compose up -d<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"3989\" data-end=\"4020\">Confirm containers are running:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">docker compose ps<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<hr data-start=\"4052\" data-end=\"4055\" \/>\n<h3 data-start=\"4057\" data-end=\"4097\">Step 5: Configure Nginx Reverse Proxy<\/h3>\n<h3 data-start=\"4099\" data-end=\"4131\">5.1 Install and Enable Nginx<\/h3>\n<p data-start=\"4132\" data-end=\"4146\">Install Nginx:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">dnf install -y nginx<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"4181\" data-end=\"4202\">Enable Nginx at boot:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">systemctl enable nginx<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"4239\" data-end=\"4251\">Start Nginx:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre dir=\"ltr\">systemctl start nginx\r\n<\/pre>\n<\/div>\n<p data-start=\"4287\" data-end=\"4311\">Verify Nginx is running:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">systemctl status nginx<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<hr data-start=\"4348\" data-end=\"4351\" \/>\n<h3 data-start=\"4353\" data-end=\"4398\">5.2 Create Nginx Configuration for Mealie<\/h3>\n<p data-start=\"4399\" data-end=\"4422\">Create the config file:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(--spacing(9)+var(--header-height))] @w-xl\/main:top-9\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">nano \/etc\/nginx\/conf.d\/mealie.conf<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"4471\" data-end=\"4505\">Paste the following configuration:<\/p>\n<pre>server {\r\n    listen 80 default_server;;\r\n    server_name _;\r\n\r\n    client_max_body_size 100M;\r\n\r\n    location \/ {\r\n        proxy_pass http:\/\/127.0.0.1:9000;\r\n        proxy_http_version 1.1;\r\n\r\n        proxy_set_header Host $host;\r\n        proxy_set_header X-Real-IP $remote_addr;\r\n        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\r\n        proxy_set_header X-Forwarded-Proto $scheme;\r\n    }\r\n}<\/pre>\n<p data-start=\"4904\" data-end=\"4923\">This configuration:<\/p>\n<ul data-start=\"4924\" data-end=\"5107\">\n<li data-start=\"4924\" data-end=\"4951\">\n<p data-start=\"4926\" data-end=\"4951\">Listens on port 80 (HTTP)<\/p>\n<\/li>\n<li data-start=\"4952\" data-end=\"5002\">\n<p data-start=\"4954\" data-end=\"5002\">Accepts requests without requiring a domain name<\/p>\n<\/li>\n<li data-start=\"5003\" data-end=\"5058\">\n<p data-start=\"5005\" data-end=\"5058\">Proxies traffic to Mealie running on <code data-start=\"5042\" data-end=\"5058\">127.0.0.1:9000<\/code><\/p>\n<\/li>\n<li data-start=\"5059\" data-end=\"5107\">\n<p data-start=\"5061\" data-end=\"5107\">Allows large recipe\/media uploads up to <code data-start=\"5101\" data-end=\"5107\">100M<\/code><\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"5109\" data-end=\"5112\" \/>\n<h3 data-start=\"5114\" data-end=\"5143\">5.3 Test and Reload Nginx<\/h3>\n<p data-start=\"5144\" data-end=\"5163\">Test configuration:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">nginx -t<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"5186\" data-end=\"5199\">Reload Nginx:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">systemctl reload nginx<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<hr data-start=\"5236\" data-end=\"5239\" \/>\n<h3 data-start=\"5241\" data-end=\"5275\">Step 6: Verify the Installation<\/h3>\n<p data-start=\"5277\" data-end=\"5293\">Open in browser:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">http:\/\/YOUR_SERVER_IP<code class=\"whitespace-pre!\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"5325\" data-end=\"5348\">Check container status:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">docker compose ps<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"5380\" data-end=\"5393\">Verify Nginx:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<pre class=\"overflow-y-auto p-4\" dir=\"ltr\">systemctl status nginx<code class=\"whitespace-pre! language-bash\">\r\n<\/code><\/pre>\n<\/div>\n<p data-start=\"5430\" data-end=\"5502\">If Mealie loads correctly in your browser, the installation is complete.<\/p>\n<hr data-start=\"5504\" data-end=\"5507\" \/>\n<h2 data-start=\"5509\" data-end=\"5522\">Conclusion<\/h2>\n<p data-start=\"5523\" data-end=\"5716\">You have successfully installed <strong data-start=\"5555\" data-end=\"5565\">Mealie<\/strong> on <strong data-start=\"5569\" data-end=\"5584\">AlmaLinux 9<\/strong> using <strong data-start=\"5591\" data-end=\"5609\">Docker Compose<\/strong>, connected it to a <strong data-start=\"5629\" data-end=\"5646\">PostgreSQL 16<\/strong> database, and exposed it publicly through an <strong data-start=\"5692\" data-end=\"5715\">Nginx reverse proxy<\/strong>.<\/p>\n<p data-start=\"5718\" data-end=\"5763\">This setup is stable and production-friendly:<\/p>\n<ul data-start=\"5764\" data-end=\"5972\">\n<li data-start=\"5764\" data-end=\"5817\">\n<p data-start=\"5766\" data-end=\"5817\">Mealie is protected by running locally on 127.0.0.1<\/p>\n<\/li>\n<li data-start=\"5818\" data-end=\"5870\">\n<p data-start=\"5820\" data-end=\"5870\">PostgreSQL runs as a separate persistent container<\/p>\n<\/li>\n<li data-start=\"5871\" data-end=\"5914\">\n<p data-start=\"5873\" data-end=\"5914\">Nginx provides a clean public entry point<\/p>\n<\/li>\n<li data-start=\"5915\" data-end=\"5972\">\n<p data-start=\"5917\" data-end=\"5972\">Easy upgrades can be done using Docker Compose commands<\/p>\n<\/li>\n<\/ul>\n<p data-start=\"5974\" data-end=\"6047\">Your Mealie server is now ready for personal or family recipe management.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Mealie is a self-hosted recipe manager designed for personal and family use. It provides a clean web interface for saving recipes, organizing them into categories, importing recipes from URLs, and managing meal planning. In this guide, you will install Mealie on an AlmaLinux 9 server using Docker Compose with a PostgreSQL database. Mealie will [&hellip;]<\/p>\n","protected":false},"author":27,"featured_media":0,"parent":17817,"menu_order":445,"comment_status":"closed","ping_status":"closed","template":"","doc_tag":[],"class_list":["post-40729","docs","type-docs","status-publish","hentry","no-post-thumbnail"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy) - GreenCloud Documentation<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy) - GreenCloud Documentation\" \/>\n<meta property=\"og:description\" content=\"Introduction Mealie is a self-hosted recipe manager designed for personal and family use. It provides a clean web interface for saving recipes, organizing them into categories, importing recipes from URLs, and managing meal planning. In this guide, you will install Mealie on an AlmaLinux 9 server using Docker Compose with a PostgreSQL database. Mealie will [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/\" \/>\n<meta property=\"og:site_name\" content=\"GreenCloud Documentation\" \/>\n<meta property=\"article:modified_time\" content=\"2026-01-30T04:32:18+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/green.cloud\\\/docs\\\/greencloud-documents\\\/linux-operating-systems\\\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\\\/\",\"url\":\"https:\\\/\\\/green.cloud\\\/docs\\\/greencloud-documents\\\/linux-operating-systems\\\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\\\/\",\"name\":\"Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy) - GreenCloud Documentation\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/green.cloud\\\/docs\\\/#website\"},\"datePublished\":\"2026-01-11T15:55:31+00:00\",\"dateModified\":\"2026-01-30T04:32:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/green.cloud\\\/docs\\\/greencloud-documents\\\/linux-operating-systems\\\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/green.cloud\\\/docs\\\/greencloud-documents\\\/linux-operating-systems\\\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/green.cloud\\\/docs\\\/greencloud-documents\\\/linux-operating-systems\\\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/green.cloud\\\/docs\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"GreenCloud Documents\",\"item\":\"https:\\\/\\\/green.cloud\\\/docs\\\/docs\\\/greencloud-documents\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Linux Operating Systems\",\"item\":\"https:\\\/\\\/green.cloud\\\/docs\\\/linux-operating-systems\\\/\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/green.cloud\\\/docs\\\/#website\",\"url\":\"https:\\\/\\\/green.cloud\\\/docs\\\/\",\"name\":\"GreenCloud Documentation\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/green.cloud\\\/docs\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy) - GreenCloud Documentation","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/","og_locale":"en_US","og_type":"article","og_title":"Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy) - GreenCloud Documentation","og_description":"Introduction Mealie is a self-hosted recipe manager designed for personal and family use. It provides a clean web interface for saving recipes, organizing them into categories, importing recipes from URLs, and managing meal planning. In this guide, you will install Mealie on an AlmaLinux 9 server using Docker Compose with a PostgreSQL database. Mealie will [&hellip;]","og_url":"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/","og_site_name":"GreenCloud Documentation","article_modified_time":"2026-01-30T04:32:18+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/","url":"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/","name":"Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy) - GreenCloud Documentation","isPartOf":{"@id":"https:\/\/green.cloud\/docs\/#website"},"datePublished":"2026-01-11T15:55:31+00:00","dateModified":"2026-01-30T04:32:18+00:00","breadcrumb":{"@id":"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/green.cloud\/docs\/greencloud-documents\/linux-operating-systems\/mealie-installation-guide-on-almalinux-9-docker-compose-ezd_plus-postgresql-ezd_plus-nginx-reverse-proxy\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/green.cloud\/docs\/"},{"@type":"ListItem","position":2,"name":"GreenCloud Documents","item":"https:\/\/green.cloud\/docs\/docs\/greencloud-documents\/"},{"@type":"ListItem","position":3,"name":"Linux Operating Systems","item":"https:\/\/green.cloud\/docs\/linux-operating-systems\/"},{"@type":"ListItem","position":4,"name":"Mealie Installation Guide on AlmaLinux 9 (Docker Compose + PostgreSQL + Nginx Reverse Proxy)"}]},{"@type":"WebSite","@id":"https:\/\/green.cloud\/docs\/#website","url":"https:\/\/green.cloud\/docs\/","name":"GreenCloud Documentation","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/green.cloud\/docs\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"}]}},"_links":{"self":[{"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/docs\/40729","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/docs"}],"about":[{"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/types\/docs"}],"author":[{"embeddable":true,"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/users\/27"}],"replies":[{"embeddable":true,"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/comments?post=40729"}],"version-history":[{"count":5,"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/docs\/40729\/revisions"}],"predecessor-version":[{"id":40989,"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/docs\/40729\/revisions\/40989"}],"up":[{"embeddable":true,"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/docs\/17817"}],"wp:attachment":[{"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/media?parent=40729"}],"wp:term":[{"taxonomy":"doc_tag","embeddable":true,"href":"https:\/\/green.cloud\/docs\/wp-json\/wp\/v2\/doc_tag?post=40729"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}