<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Services%2FMealie</id>
	<title>Services/Mealie - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wilsoz.com/index.php?action=history&amp;feed=atom&amp;title=Services%2FMealie"/>
	<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Services/Mealie&amp;action=history"/>
	<updated>2026-07-06T07:35:36Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.wilsoz.com/index.php?title=Services/Mealie&amp;diff=18&amp;oldid=prev</id>
		<title>Wikibot: Genericize example password placeholder</title>
		<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Services/Mealie&amp;diff=18&amp;oldid=prev"/>
		<updated>2026-07-05T18:16:42Z</updated>

		<summary type="html">&lt;p&gt;Genericize example password placeholder&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 18:16, 5 July 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l290&quot;&gt;Line 290:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 290:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Set new password for marcus&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;# Set new password for marcus&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;new_password = &#039;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;TempPassword123456!&lt;/del&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;new_password = &#039;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;choose-a-new-password-here&amp;gt;&lt;/ins&gt;&#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;salt = bcrypt.gensalt(rounds=10)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;salt = bcrypt.gensalt(rounds=10)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;hashed = bcrypt.hashpw(new_password.encode(&amp;#039;utf-8&amp;#039;), salt).decode(&amp;#039;utf-8&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;hashed = bcrypt.hashpw(new_password.encode(&amp;#039;utf-8&amp;#039;), salt).decode(&amp;#039;utf-8&amp;#039;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff:1.41:old-11:rev-18:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Wikibot</name></author>
	</entry>
	<entry>
		<id>https://wiki.wilsoz.com/index.php?title=Services/Mealie&amp;diff=11&amp;oldid=prev</id>
		<title>Wikibot: Migrated from services/MEALIE.md</title>
		<link rel="alternate" type="text/html" href="https://wiki.wilsoz.com/index.php?title=Services/Mealie&amp;diff=11&amp;oldid=prev"/>
		<updated>2026-07-05T18:16:19Z</updated>

		<summary type="html">&lt;p&gt;Migrated from services/MEALIE.md&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;#039;&amp;#039;As of: 2026-07-05 — migrated from `services/MEALIE.md`&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
= Mealie — Recipe Manager =&lt;br /&gt;
&lt;br /&gt;
Complete setup &amp;amp; operations guide for Mealie (recipe management app) with Authentik OAuth integration.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Mealie&amp;#039;&amp;#039;&amp;#039; is a self-hosted recipe management app. We run it on Stronghold with:&lt;br /&gt;
* Authentik OAuth2 for user authentication&lt;br /&gt;
* Group-based access control (admin vs user roles)&lt;br /&gt;
* HTTPS via Cloudflare (cook.wilsoz.com)&lt;br /&gt;
* Persistent data storage in Docker volume&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Current Users:&amp;#039;&amp;#039;&amp;#039; marcus (admin via Authentik)  &lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Access:&amp;#039;&amp;#039;&amp;#039; https://cook.wilsoz.com&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Service Information ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property&lt;br /&gt;
! Value&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;URL&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| https://cook.wilsoz.com&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Container name&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| mealie&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Compose file&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;/library/mealie-app/docker-compose.yml&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Data volume&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;mealie-app_mealie-data:/app/data&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Internal port&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 9000&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Host port&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| 9925&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Network&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;mealie-app_mealie&amp;lt;/code&amp;gt; (MTU 1280)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;#039;&amp;#039;&amp;#039;Image&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;ghcr.io/mealie-recipes/mealie:latest&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Initial Setup from Scratch ==&lt;br /&gt;
&lt;br /&gt;
=== 1. Create Directory &amp;amp; Files ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
mkdir -p /library/mealie-app&lt;br /&gt;
cd /library/mealie-app&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 2. Create docker-compose.yml ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
version: &amp;quot;3.8&amp;quot;&lt;br /&gt;
services:&lt;br /&gt;
  mealie:&lt;br /&gt;
    image: ghcr.io/mealie-recipes/mealie:latest&lt;br /&gt;
    container_name: mealie&lt;br /&gt;
    restart: unless-stopped&lt;br /&gt;
    env_file:&lt;br /&gt;
      - .env&lt;br /&gt;
    volumes:&lt;br /&gt;
      - mealie-data:/app/data&lt;br /&gt;
    ports:&lt;br /&gt;
      - &amp;quot;9925:9000&amp;quot;&lt;br /&gt;
    networks:&lt;br /&gt;
      - mealie&lt;br /&gt;
&lt;br /&gt;
volumes:&lt;br /&gt;
  mealie-data:&lt;br /&gt;
&lt;br /&gt;
networks:&lt;br /&gt;
  mealie:&lt;br /&gt;
    driver: bridge&lt;br /&gt;
    driver_opts:&lt;br /&gt;
      com.docker.network.driver.mtu: 1280&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 3. Create .env File ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# App Configuration&lt;br /&gt;
PUID=1000&lt;br /&gt;
PGID=1000&lt;br /&gt;
TZ=America/Chicago&lt;br /&gt;
BASE_URL=https://cook.wilsoz.com&lt;br /&gt;
ALLOW_SIGNUP=false&lt;br /&gt;
&lt;br /&gt;
# OIDC Authentication (Authentik)&lt;br /&gt;
OIDC_AUTH_ENABLED=true&lt;br /&gt;
OIDC_PROVIDER_NAME=Authentik&lt;br /&gt;
OIDC_CONFIGURATION_URL=https://key.wilsoz.com/application/o/mealie/.well-known/openid-configuration&lt;br /&gt;
OIDC_CLIENT_ID=3fUfT5FALoAqvWHzqiD0eLNYKd3fsyYjdUkEUVy5&lt;br /&gt;
OIDC_CLIENT_SECRET=D5IbtoxMgx6Kkmry296bXUz6G3NcvzT70wIBrr7RFu8&lt;br /&gt;
OIDC_SIGNUP_ENABLED=true&lt;br /&gt;
OIDC_AUTO_REDIRECT=false&lt;br /&gt;
OIDC_USER_GROUP=family-and-friends&lt;br /&gt;
OIDC_ADMIN_GROUP=authentik Admins&lt;br /&gt;
OIDC_GROUPS_CLAIM=groups&lt;br /&gt;
OIDC_USER_CLAIM=email&lt;br /&gt;
OIDC_NAME_CLAIM=name&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 4. Set Up Authentik OAuth Provider ===&lt;br /&gt;
&lt;br /&gt;
==== Create OAuth2 Provider in Authentik ====&lt;br /&gt;
&lt;br /&gt;
# Go to https://key.wilsoz.com/if/admin/&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Applications → Providers → Create OAuth2/OpenID Provider&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Fill in:&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Name:** mealie-oauth&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Authorization flow:** (default-authentication-flow)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Client type:** Confidential&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Redirect URIs:** (one per line)&lt;br /&gt;
     ```&lt;br /&gt;
     https://cook.wilsoz.com/login&lt;br /&gt;
     https://cook.wilsoz.com/login?direct=1&lt;br /&gt;
     ```&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Save&amp;#039;&amp;#039;&amp;#039; — note the &amp;#039;&amp;#039;&amp;#039;Client ID&amp;#039;&amp;#039;&amp;#039; and &amp;#039;&amp;#039;&amp;#039;Client Secret&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==== Configure Provider: Signing Key ====&lt;br /&gt;
&lt;br /&gt;
⚠️ &amp;#039;&amp;#039;&amp;#039;CRITICAL:&amp;#039;&amp;#039;&amp;#039; Assign the signing key or JWKS endpoint will return &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt; and OAuth will fail.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec authentik-app_server_1 ak shell -c &amp;quot;&lt;br /&gt;
from authentik.providers.oauth2.models import OAuth2Provider&lt;br /&gt;
from authentik.crypto.models import CertificateKeyPair&lt;br /&gt;
&lt;br /&gt;
p = OAuth2Provider.objects.get(name=&amp;#039;mealie-oauth&amp;#039;)&lt;br /&gt;
jwt_key = CertificateKeyPair.objects.get(name=&amp;#039;authentik Internal JWT Certificate&amp;#039;)&lt;br /&gt;
p.signing_key = jwt_key&lt;br /&gt;
p.save()&lt;br /&gt;
print(&amp;#039;Assigned JWT Certificate signing key&amp;#039;)&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Why JWT Certificate?&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
* Uses HS256 algorithm (Mealie&amp;#039;s OIDC library supports it)&lt;br /&gt;
* Self-signed Certificate uses RS256 (rejected by Mealie)&lt;br /&gt;
&lt;br /&gt;
==== Configure Provider: Property Mappings ====&lt;br /&gt;
&lt;br /&gt;
Add OAuth scope property mappings:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec authentik-app_server_1 ak shell -c &amp;quot;&lt;br /&gt;
from authentik.providers.oauth2.models import OAuth2Provider&lt;br /&gt;
from authentik.core.models import PropertyMapping&lt;br /&gt;
&lt;br /&gt;
p = OAuth2Provider.objects.get(name=&amp;#039;mealie-oauth&amp;#039;)&lt;br /&gt;
email_pm = PropertyMapping.objects.get(name=&amp;#039;authentik default OAuth Mapping: OpenID \\&amp;#039;email\\&amp;#039;&amp;#039;)&lt;br /&gt;
profile_pm = PropertyMapping.objects.get(name=&amp;#039;authentik default OAuth Mapping: OpenID \\&amp;#039;profile\\&amp;#039;&amp;#039;)&lt;br /&gt;
openid_pm = PropertyMapping.objects.get(name=&amp;#039;authentik default OAuth Mapping: OpenID \\&amp;#039;openid\\&amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
p.property_mappings.add(email_pm, profile_pm, openid_pm)&lt;br /&gt;
p.include_claims_in_id_token = True&lt;br /&gt;
p.save()&lt;br /&gt;
print(&amp;#039;Added property mappings and enabled claims in ID token&amp;#039;)&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Create Application in Authentik ====&lt;br /&gt;
&lt;br /&gt;
# Go to &amp;#039;&amp;#039;&amp;#039;Applications → Applications → Create&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
# Fill in:&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Name:** Mealie&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Slug:** mealie&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Provider:** mealie-oauth (select from dropdown)&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;Authorization flow:** default-authorization-flow&lt;br /&gt;
# &amp;#039;&amp;#039;&amp;#039;Save&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== 5. Start Mealie ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /library/mealie-app&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Wait ~10 seconds for startup, then check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker logs mealie --tail=20&lt;br /&gt;
# Should show: &amp;quot;Application startup complete&amp;quot;&lt;br /&gt;
# And: &amp;quot;Enabled: True&amp;quot; under the OIDC section&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6. Configure VPS Nginx Proxy ===&lt;br /&gt;
&lt;br /&gt;
On VPS, add server block to nginx config (or update if exists):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;nginx&amp;quot;&amp;gt;&lt;br /&gt;
server {&lt;br /&gt;
    listen 443 ssl http2;&lt;br /&gt;
    server_name cook.wilsoz.com;&lt;br /&gt;
&lt;br /&gt;
    ssl_certificate /etc/letsencrypt/live/cook.wilsoz.com/fullchain.pem;&lt;br /&gt;
    ssl_certificate_key /etc/letsencrypt/live/cook.wilsoz.com/privkey.pem;&lt;br /&gt;
&lt;br /&gt;
    location / {&lt;br /&gt;
        proxy_pass http://100.64.207.155:9925;&lt;br /&gt;
        proxy_set_header Host $host;&lt;br /&gt;
        proxy_set_header X-Real-IP $remote_addr;&lt;br /&gt;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;&lt;br /&gt;
        proxy_set_header X-Forwarded-Proto $scheme;&lt;br /&gt;
        proxy_http_version 1.1;&lt;br /&gt;
        proxy_set_header Upgrade $http_upgrade;&lt;br /&gt;
        proxy_set_header Connection &amp;quot;upgrade&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
sudo systemctl reload nginx&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 7. Create First Admin User (In-App) ===&lt;br /&gt;
&lt;br /&gt;
# Navigate to https://cook.wilsoz.com&lt;br /&gt;
# You&amp;#039;ll see the login page with &amp;quot;Authentik&amp;quot; button&lt;br /&gt;
# If Mealie is brand new with no users, it may show an initial setup screen&lt;br /&gt;
# Use Authentik to log in with an account in the &amp;#039;&amp;#039;&amp;#039;authentik Admins&amp;#039;&amp;#039;&amp;#039; group&lt;br /&gt;
** This account gets Mealie admin role automatically&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Operations ==&lt;br /&gt;
&lt;br /&gt;
=== Start/Stop/Restart ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
cd /library/mealie-app&lt;br /&gt;
&lt;br /&gt;
# Start&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&lt;br /&gt;
# Stop&lt;br /&gt;
docker compose down&lt;br /&gt;
&lt;br /&gt;
# Restart&lt;br /&gt;
docker compose restart mealie&lt;br /&gt;
&lt;br /&gt;
# Full restart (clears cached config)&lt;br /&gt;
docker compose down &amp;amp;&amp;amp; sleep 2 &amp;amp;&amp;amp; docker compose up -d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== View Logs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Live logs&lt;br /&gt;
docker logs -f mealie&lt;br /&gt;
&lt;br /&gt;
# Last 50 lines&lt;br /&gt;
docker logs mealie --tail=50&lt;br /&gt;
&lt;br /&gt;
# Filter for errors&lt;br /&gt;
docker logs mealie 2&amp;gt;&amp;amp;1 | grep -i &amp;quot;error\|exception&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Filter for OIDC&lt;br /&gt;
docker logs mealie 2&amp;gt;&amp;amp;1 | grep -i &amp;quot;oidc&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Reset Admin Password (Database) ===&lt;br /&gt;
&lt;br /&gt;
If you lose the admin password:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec mealie python3 -c &amp;quot;&lt;br /&gt;
import sqlite3&lt;br /&gt;
import bcrypt&lt;br /&gt;
&lt;br /&gt;
db = sqlite3.connect(&amp;#039;/app/data/mealie.db&amp;#039;)&lt;br /&gt;
cursor = db.cursor()&lt;br /&gt;
&lt;br /&gt;
# Set new password for marcus&lt;br /&gt;
new_password = &amp;#039;TempPassword123456!&amp;#039;&lt;br /&gt;
salt = bcrypt.gensalt(rounds=10)&lt;br /&gt;
hashed = bcrypt.hashpw(new_password.encode(&amp;#039;utf-8&amp;#039;), salt).decode(&amp;#039;utf-8&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
cursor.execute(&amp;#039;UPDATE users SET password = ? WHERE username = ?&amp;#039;, (hashed, &amp;#039;marcus&amp;#039;))&lt;br /&gt;
db.commit()&lt;br /&gt;
print(f&amp;#039;Password reset to: {new_password}&amp;#039;)&lt;br /&gt;
db.close()&lt;br /&gt;
&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then log in and change it in Mealie settings.&lt;br /&gt;
&lt;br /&gt;
=== Manage Users &amp;amp; Groups ===&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Via Authentik:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Users must be added to Authentik first&lt;br /&gt;
* Create/manage groups: &amp;#039;&amp;#039;&amp;#039;Directory → Groups&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Add users to groups for role assignment&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Via Mealie:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Settings → Users&amp;#039;&amp;#039;&amp;#039; — shows Mealie users (created on first OAuth login)&lt;br /&gt;
* User roles are determined by Authentik group membership:&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;authentik Admins** → Mealie admin&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039; &amp;#039;&amp;#039;&amp;#039;family-and-friends** → Mealie user&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Configuration Reference ==&lt;br /&gt;
&lt;br /&gt;
=== Environment Variables (&amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Variable&lt;br /&gt;
! Purpose&lt;br /&gt;
! Example&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;BASE_URL&amp;lt;/code&amp;gt;&lt;br /&gt;
| External URL for Mealie&lt;br /&gt;
| &amp;lt;code&amp;gt;https://cook.wilsoz.com&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ALLOW_SIGNUP&amp;lt;/code&amp;gt;&lt;br /&gt;
| Allow registration without OIDC&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_AUTH_ENABLED&amp;lt;/code&amp;gt;&lt;br /&gt;
| Enable OAuth login&lt;br /&gt;
| &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_CLIENT_ID&amp;lt;/code&amp;gt;&lt;br /&gt;
| Authentik provider client ID&lt;br /&gt;
| (from Authentik)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_CLIENT_SECRET&amp;lt;/code&amp;gt;&lt;br /&gt;
| Authentik provider secret&lt;br /&gt;
| (from Authentik)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_CONFIGURATION_URL&amp;lt;/code&amp;gt;&lt;br /&gt;
| OIDC discovery endpoint&lt;br /&gt;
| &amp;lt;code&amp;gt;https://key.wilsoz.com/application/o/mealie/.well-known/openid-configuration&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_USER_GROUP&amp;lt;/code&amp;gt;&lt;br /&gt;
| Authentik group for regular users&lt;br /&gt;
| &amp;lt;code&amp;gt;family-and-friends&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_ADMIN_GROUP&amp;lt;/code&amp;gt;&lt;br /&gt;
| Authentik group for admins&lt;br /&gt;
| &amp;lt;code&amp;gt;authentik Admins&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_GROUPS_CLAIM&amp;lt;/code&amp;gt;&lt;br /&gt;
| OIDC claim name for groups&lt;br /&gt;
| &amp;lt;code&amp;gt;groups&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_SIGNUP_ENABLED&amp;lt;/code&amp;gt;&lt;br /&gt;
| Auto-create users on first OIDC login&lt;br /&gt;
| &amp;lt;code&amp;gt;true&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;OIDC_AUTO_REDIRECT&amp;lt;/code&amp;gt;&lt;br /&gt;
| Skip login page, go straight to Authentik&lt;br /&gt;
| &amp;lt;code&amp;gt;false&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TZ&amp;lt;/code&amp;gt;&lt;br /&gt;
| Timezone&lt;br /&gt;
| &amp;lt;code&amp;gt;America/Chicago&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;PUID&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;PGID&amp;lt;/code&amp;gt;&lt;br /&gt;
| Linux user/group for file permissions&lt;br /&gt;
| &amp;lt;code&amp;gt;1000&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Data &amp;amp; Backups ==&lt;br /&gt;
&lt;br /&gt;
=== Data Location ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
/library/mealie-app/mealie-data:/app/data&lt;br /&gt;
&lt;br /&gt;
Contents:&lt;br /&gt;
- mealie.db              (SQLite database — all recipes, users, settings)&lt;br /&gt;
- recipes/               (recipe files)&lt;br /&gt;
- users/                 (user data)&lt;br /&gt;
- backups/               (exported recipe backups)&lt;br /&gt;
- templates/             (custom templates)&lt;br /&gt;
- groups/                (group/household data)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Backup Procedure ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Backup the entire data volume&lt;br /&gt;
docker run --rm \&lt;br /&gt;
  -v mealie-app_mealie-data:/data \&lt;br /&gt;
  -v /home/mnw/backups:/backup \&lt;br /&gt;
  ubuntu tar czf /backup/mealie-$(date +%Y%m%d).tar.gz /data&lt;br /&gt;
&lt;br /&gt;
# List backups&lt;br /&gt;
ls -lh /home/mnw/backups/mealie-*.tar.gz&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Restore from Backup ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Stop Mealie&lt;br /&gt;
cd /library/mealie-app &amp;amp;&amp;amp; docker compose down&lt;br /&gt;
&lt;br /&gt;
# Restore data&lt;br /&gt;
docker run --rm \&lt;br /&gt;
  -v mealie-app_mealie-data:/data \&lt;br /&gt;
  -v /home/mnw/backups:/backup \&lt;br /&gt;
  ubuntu bash -c &amp;quot;rm -rf /data/* &amp;amp;&amp;amp; tar xzf /backup/mealie-20260513.tar.gz -C /data&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Restart&lt;br /&gt;
docker compose up -d&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Troubleshooting ==&lt;br /&gt;
&lt;br /&gt;
=== Login Issues ===&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Something went wrong&amp;quot; on OAuth callback ====&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Symptoms:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Authentik login succeeds, but Mealie shows error when redirected back&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Common causes &amp;amp; fixes:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Error&lt;br /&gt;
! Cause&lt;br /&gt;
! Fix&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;KeyError: &amp;#039;keys&amp;#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
| JWKS endpoint returns &amp;lt;code&amp;gt;{}&amp;lt;/code&amp;gt;&lt;br /&gt;
| Assign signing key to OAuth provider (see Setup step 4)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;UnsupportedAlgorithmError: RS256 not allowed&amp;lt;/code&amp;gt;&lt;br /&gt;
| Wrong signing key algorithm&lt;br /&gt;
| Use &amp;quot;authentik Internal JWT Certificate&amp;quot; (HS256), not &amp;quot;Self-signed Certificate&amp;quot; (RS256)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;invalid_client: Client authentication failed&amp;lt;/code&amp;gt;&lt;br /&gt;
| Client secret mismatch&lt;br /&gt;
| Verify &amp;lt;code&amp;gt;OIDC_CLIENT_SECRET&amp;lt;/code&amp;gt; in .env matches Authentik provider&lt;br /&gt;
|-&lt;br /&gt;
| HTTP 500 at &amp;lt;code&amp;gt;/api/auth/oauth/callback&amp;lt;/code&amp;gt;&lt;br /&gt;
| Mealie can&amp;#039;t reach Authentik&amp;#039;s token endpoint&lt;br /&gt;
| Check network connectivity, SSL certificates, DNS&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Debug steps:&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# Check OIDC config is loaded&lt;br /&gt;
docker logs mealie | grep -i &amp;quot;oidc\|enabled&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Test discovery endpoint&lt;br /&gt;
docker exec mealie curl -s &amp;quot;https://key.wilsoz.com/application/o/mealie/.well-known/openid-configuration&amp;quot; -k | jq .&lt;br /&gt;
&lt;br /&gt;
# Check JWKS endpoint has keys&lt;br /&gt;
docker exec mealie curl -s &amp;quot;https://key.wilsoz.com/application/o/mealie/jwks/&amp;quot; -k | jq &amp;#039;.keys | length&amp;#039;&lt;br /&gt;
&lt;br /&gt;
# View OAuth errors&lt;br /&gt;
docker logs mealie --tail=100 | grep -i &amp;quot;oauth\|error\|exception&amp;quot; | tail -20&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;OIDC not appearing on login page&amp;quot; ====&lt;br /&gt;
&lt;br /&gt;
* Verify &amp;lt;code&amp;gt;OIDC_AUTH_ENABLED=true&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&lt;br /&gt;
* Restart container: &amp;lt;code&amp;gt;docker compose down &amp;amp;&amp;amp; docker compose up -d&amp;lt;/code&amp;gt;&lt;br /&gt;
* Check logs for startup errors&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;Redirect URI mismatch&amp;quot; error ====&lt;br /&gt;
&lt;br /&gt;
* Ensure Authentik provider redirect URIs match exactly:&lt;br /&gt;
** &amp;lt;code&amp;gt;https://cook.wilsoz.com/login&amp;lt;/code&amp;gt;&lt;br /&gt;
** &amp;lt;code&amp;gt;https://cook.wilsoz.com/login?direct=1&amp;lt;/code&amp;gt;&lt;br /&gt;
* Verify &amp;lt;code&amp;gt;BASE_URL=https://cook.wilsoz.com&amp;lt;/code&amp;gt; in &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;&lt;br /&gt;
* No trailing slashes or port numbers&lt;br /&gt;
&lt;br /&gt;
==== User not getting admin role ====&lt;br /&gt;
&lt;br /&gt;
* Confirm user is in &amp;#039;&amp;#039;&amp;#039;authentik Admins&amp;#039;&amp;#039;&amp;#039; group (Directory → Groups)&lt;br /&gt;
* Log out and log back in (roles are assigned at login time)&lt;br /&gt;
* Check Mealie Settings → Users to see assigned role&lt;br /&gt;
&lt;br /&gt;
=== Performance ===&lt;br /&gt;
&lt;br /&gt;
==== Slow startup ====&lt;br /&gt;
&lt;br /&gt;
Mealie can take 30-60 seconds on first start or after upgrade. Check:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker logs mealie | tail -20&lt;br /&gt;
# Look for &amp;quot;Application startup complete&amp;quot;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== High memory usage ====&lt;br /&gt;
&lt;br /&gt;
Default image is fine for small recipe collections. For very large:&lt;br /&gt;
* Monitor: &amp;lt;code&amp;gt;docker stats mealie&amp;lt;/code&amp;gt;&lt;br /&gt;
* Limit: Add &amp;lt;code&amp;gt;mem_limit: 2g&amp;lt;/code&amp;gt; to compose file if needed&lt;br /&gt;
&lt;br /&gt;
=== Network Issues ===&lt;br /&gt;
&lt;br /&gt;
==== Can&amp;#039;t access https://cook.wilsoz.com ====&lt;br /&gt;
&lt;br /&gt;
# Check VPS nginx config (see Setup step 6)&lt;br /&gt;
# Verify SSL cert is valid: &amp;lt;code&amp;gt;curl -I https://cook.wilsoz.com&amp;lt;/code&amp;gt;&lt;br /&gt;
# Check Mealie is running: &amp;lt;code&amp;gt;docker ps | grep mealie&amp;lt;/code&amp;gt;&lt;br /&gt;
# Check port: &amp;lt;code&amp;gt;netstat -tlnp | grep 9925&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Mealie can&amp;#039;t reach Authentik (key.wilsoz.com) ====&lt;br /&gt;
&lt;br /&gt;
From Mealie container:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
docker exec mealie curl -v https://key.wilsoz.com/api/v3/ -k&lt;br /&gt;
# Should return 401 (not accessible, but shouldn&amp;#039;t timeout)&lt;br /&gt;
&lt;br /&gt;
docker exec mealie ping -c 1 key.wilsoz.com&lt;br /&gt;
# Should succeed&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Security Notes ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;OIDC_CLIENT_SECRET:&amp;#039;&amp;#039;&amp;#039; Store securely in &amp;lt;code&amp;gt;.env&amp;lt;/code&amp;gt;, never commit to git&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Database:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;/app/data/mealie.db&amp;lt;/code&amp;gt; contains all user data — protect with filesystem permissions&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Backups:&amp;#039;&amp;#039;&amp;#039; Backup volume includes full database — encrypt backups if stored externally&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;User signup:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;ALLOW_SIGNUP=false&amp;lt;/code&amp;gt; means only Authentik users can access (good)&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Groups:&amp;#039;&amp;#039;&amp;#039; Ensure only trusted users are in &amp;lt;code&amp;gt;authentik Admins&amp;lt;/code&amp;gt; group&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Links &amp;amp; References ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Mealie Docs:&amp;#039;&amp;#039;&amp;#039; https://nightly.mealie.io/&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Mealie GitHub:&amp;#039;&amp;#039;&amp;#039; https://github.com/mealie-recipes/mealie&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Authentik OIDC:&amp;#039;&amp;#039;&amp;#039; https://goauthentik.io/docs/providers/oauth2&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Mealie OIDC Integration Guide:&amp;#039;&amp;#039;&amp;#039; https://integrations.goauthentik.io/documentation/mealie/&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Related Services ==&lt;br /&gt;
&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Authentik&amp;#039;&amp;#039;&amp;#039; (auth): &amp;lt;code&amp;gt;/library/authentik-app/&amp;lt;/code&amp;gt; — OAuth provider&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Nginx&amp;#039;&amp;#039;&amp;#039; (proxy): VPS &amp;lt;code&amp;gt;/etc/nginx/sites-available/&amp;lt;/code&amp;gt; — external access&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Backups:&amp;#039;&amp;#039;&amp;#039; &amp;lt;code&amp;gt;/home/mnw/backups/&amp;lt;/code&amp;gt; — data snapshots&lt;/div&gt;</summary>
		<author><name>Wikibot</name></author>
	</entry>
</feed>