Backend Configuration
API Environment Variables
General
| Variables | Default | Description |
|---|---|---|
| PUID | 911 | UserID permissions between host OS and container |
| PGID | 911 | GroupID permissions between host OS and container |
| DEFAULT_GROUP | Home | The default group for users |
| DEFAULT_HOUSEHOLD | Family | The default household for users in each group |
| BASE_URL | http://localhost:8080 | Used for notifications and the OIDC callback url |
| TOKEN_TIME | 48 | The time in hours a login session lasts. Must be <= 9600 (400 days, in hours). |
| API_PORT | 9000 | The port exposed by backend API. Do not change this if you're running in Docker |
| API_HOST | (empty) | Listening address. Empty binds IPv4 and IPv6 automatically. An explicit address is used unchanged. See below. |
| API_DOCS | True | Turns on/off access to the API documentation locally |
| TZ | UTC | Must be set to get correct date/time on the server |
| ALLOW_SIGNUP |
false | Allow user sign-up without token |
| ALLOW_PASSWORD_LOGIN | true | Whether or not to display the username+password input fields. Keep set to true unless you use OIDC authentication |
| LOG_CONFIG_OVERRIDE | Override the config for logging with a custom path | |
| LOG_LEVEL | info | Logging level (e.g. critical, error, warning, info, debug) |
| DAILY_SCHEDULE_TIME | 23:45 | The time of day to run daily server tasks, in HH:MM format. Use the server's local time, not UTC |
false as part of a security review of the application.
Listening address
API_HOST defaults to an empty string, which is automatic wildcard binding. Mealie opens one dual-stack IPv6 socket so the same API_PORT accepts IPv4 and IPv6 connections. When the host cannot provide that socket, Mealie listens on IPv4 0.0.0.0 instead. The IPv4 listener is only a fallback for missing IPv6 dual-stack support. A port that is already in use, or a bind the process is not allowed to perform, stops startup with that error.
Set API_HOST to choose an exact address: 0.0.0.0 (IPv4 on every interface), 127.0.0.1 (IPv4 loopback only), :: (IPv6 wildcard), or ::1 (IPv6 loopback only). Explicit values stay on the address you set.
HOST_IP lists reverse proxies trusted to send forwarded headers. The listening address is API_HOST.
Docker delivers IPv6 to a container when the Docker network has IPv6 enabled and the published port is reachable over IPv6. A dual-stack listener on an IPv4-only Docker network is reachable over IPv4 alone.
Security
Reverse proxy headers
HOST_IP controls which connecting proxy IP addresses or CIDR ranges Uvicorn trusts for X-Forwarded-For and X-Forwarded-Proto.
Set a comma-separated list matching your reverse proxy or Kubernetes ingress, for example HOST_IP=127.0.0.1,10.42.1.0/24.
Depending on your container environment and network, the container's default gateway may not be the address of the proxy.
The default is * for compatibility, which trusts forwarding headers from every connecting source.
Use that setting only when access to the application is limited to trusted proxies!
Set HOST_IP to an empty string to trust no forwarding proxies.
Application security
| Variables | Default | Description |
|---|---|---|
| SECURITY_MAX_LOGIN_ATTEMPTS | 5 | Maximum times a user can provide an invalid password before their account is locked |
| SECURITY_USER_LOCKOUT_TIME | 24 | Time in hours for how long a users account is locked |
| ALLOWED_IFRAME_HOSTS | "" |
Comma-separated extra hostnames allowed as <iframe> sources in recipe content. Extends the built-in list of trusted video providers (YouTube, Vimeo). Subdomains are included automatically. Only https sources are permitted. Adding hosts here opts into rendering embeds from those origins to all viewers, including the public, so add only origins you trust. |
| HTTP_ALLOW_LIST | "" |
Comma-separated hosts or CIDRs that server-initiated requests (recipe scraping, webhooks, recipe actions, OIDC profile images) may reach even when they resolve to an otherwise-blocked private/internal address. Use to allow a known internal server. |
| HTTP_DISALLOW_LIST | "" |
Comma-separated hosts or CIDRs that server-initiated requests may never reach, even if public. Takes precedence over HTTP_ALLOW_LIST. |
Database
| Variables | Default | Description |
|---|---|---|
| DB_ENGINE | sqlite | Optional: 'sqlite', 'postgres' |
| SQLITE_MIGRATE_JOURNAL_WAL | False | If set to true, switches SQLite's journal mode to WAL, which allows for multiple concurrent accesses. This can be useful when you have a decent amount of concurrency or when using certain remote storage systems such as Ceph. |
| POSTGRES_USER |
mealie | Postgres database user |
| POSTGRES_PASSWORD |
mealie | Postgres database password |
| POSTGRES_SERVER |
postgres | Postgres database server address |
| POSTGRES_PORT |
5432 | Postgres database port |
| POSTGRES_DB |
mealie | Postgres database name |
| POSTGRES_URL_OVERRIDE |
None | Optional Postgres URL override to use instead of POSTGRES_* variables |
| Variables | Default | Description |
|---|---|---|
| SMTP_HOST |
None | Required For email |
| SMTP_PORT |
587 | Required For email |
| SMTP_FROM_NAME | Mealie | Required For email |
| SMTP_AUTH_STRATEGY | TLS | Required For email, Options: 'TLS', 'SSL', 'NONE' |
| SMTP_FROM_EMAIL | None | Required For email |
| SMTP_USER |
None | Optional; must be set together with SMTP_PASSWORD |
| SMTP_PASSWORD |
None | Optional; must be set together with SMTP_USER |
Webworker
Changing the webworker settings may cause unforeseen memory leak issues with Mealie. It's best to leave these at the defaults unless you begin to experience issues with multiple users. Exercise caution when changing these settings
| Variables | Default | Description |
|---|---|---|
| UVICORN_WORKERS | 1 | Sets the number of workers for the web server. More info here |
TLS
Use this only when mealie is run without a webserver or reverse proxy.
| Variables | Default | Description |
|---|---|---|
| TLS_CERTIFICATE_PATH | None | File path to Certificate |
| TLS_PRIVATE_KEY_PATH | None | File path to private key |
LDAP
| Variables | Default | Description |
|---|---|---|
| LDAP_AUTH_ENABLED | False | Authenticate via an external LDAP server in addidion to built-in Mealie auth |
| LDAP_SERVER_URL |
None | LDAP server URL (e.g. ldap://ldap.example.com) |
| LDAP_TLS_INSECURE | False | Do not verify server certificate when using secure LDAP |
| LDAP_TLS_CACERTFILE | None | File path to Certificate Authority used to verify server certificate (e.g. /path/to/ca.crt) |
| LDAP_ENABLE_STARTTLS | False | Optional. Use STARTTLS to connect to the server |
| LDAP_BASE_DN | None | Starting point when searching for users authentication (e.g. CN=Users,DC=xx,DC=yy,DC=de) |
| LDAP_QUERY_BIND | None | Optional bind user for LDAP search queries (e.g. cn=admin,cn=users,dc=example,dc=com). If None then anonymous bind will be used |
| LDAP_QUERY_PASSWORD |
None | Optional password for the bind user used in LDAP_QUERY_BIND |
| LDAP_USER_FILTER | None | Optional LDAP filter to narrow down eligible users (e.g. (memberOf=cn=mealie_user,dc=example,dc=com)) |
| LDAP_ADMIN_FILTER | None | Optional LDAP filter, which tells Mealie the LDAP user is an admin (e.g. (memberOf=cn=admins,dc=example,dc=com)) |
| LDAP_ID_ATTRIBUTE | uid | The LDAP attribute that maps to the user's id |
| LDAP_NAME_ATTRIBUTE | name | The LDAP attribute that maps to the user's name |
| LDAP_MAIL_ATTRIBUTE | The LDAP attribute that maps to the user's email |
Reverse Proxy Auth
Mealie can trust a username forwarded by a reverse proxy that has already authenticated the user (e.g. Authelia, Authentik, oauth2-proxy, Tailscale Serve). When enabled, visiting the login page will automatically sign in as the user named in the configured header, with no extra Mealie login step. Password, LDAP, and OIDC login remain available and are not affected by this setting.
Only enable this behind a trusted reverse proxy
Mealie trusts the header's value completely. If Mealie is reachable by any path that bypasses your proxy (directly hitting the container/port, a misconfigured Ingress, etc.), an attacker can set this header themselves and impersonate any user, including admins. Make sure your proxy always overwrites/strips this header for all incoming requests before adding its own, that Mealie is not otherwise reachable, and set REVERSE_PROXY_AUTH_SECRET so Mealie can tell your proxy's requests apart from a direct connection (checking the connecting IP isn't reliable enough for this, since it changes depending on how HOST_IP is configured).
| Variables | Default | Description |
|---|---|---|
| REVERSE_PROXY_AUTH_ENABLED | False | Enables authentication via a trusted reverse proxy header |
| REVERSE_PROXY_AUTH_HEADER | X-Forwarded-User | The name of the header your reverse proxy sets to the authenticated username (or email) |
| REVERSE_PROXY_AUTH_SIGNUP_ENABLED | False | Enables new users to be created automatically the first time they're seen in the trusted header |
| REVERSE_PROXY_AUTH_SECRET | "" |
Shared secret your proxy must send in REVERSE_PROXY_AUTH_SECRET_HEADER. Strongly recommended in production; requests missing it are rejected. |
| REVERSE_PROXY_AUTH_SECRET_HEADER | X-Mealie-Reverse-Proxy-Secret | The name of the header your reverse proxy sets to the value of REVERSE_PROXY_AUTH_SECRET |
OpenID Connect (OIDC)
v1.4.0
For usage, see Usage - OpenID Connect
| Variables | Default | Description |
|---|---|---|
| OIDC_AUTH_ENABLED | False | Enables authentication via OpenID Connect |
| OIDC_SIGNUP_ENABLED | True | Enables new users to be created when signing in for the first time with OIDC |
| OIDC_REQUIRES_EMAIL_VERIFICATION v3.21.0 |
True | Requires the email_verified claim to be true before a user can sign in. This prevents an unverified email from being used to match an existing account. Only disable this if your identity provider does not emit the email_verified claim. For more information see this page |
| OIDC_CONFIGURATION_URL |
None | The URL to the OIDC configuration of your provider. This is usually something like https://auth.example.com/.well-known/openid-configuration |
| OIDC_CLIENT_ID |
None | The client id of your configured client in your provider |
| OIDC_CLIENT_SECRET v2.0.0 |
None | The client secret of your configured client in your provider |
| OIDC_USER_GROUP | None | If specified, only users belonging to this group will be able to successfully authenticate, regardless of the OIDC_ADMIN_GROUP. For more information see this page |
| OIDC_ADMIN_GROUP | None | If specified, users belonging to this group will be made an admin. For more information see this page |
| OIDC_AUTO_REDIRECT | False | If True, then the login page will be bypassed an you will be sent directly to your Identity Provider. You can still get to the login page by adding ?direct=1 to the login URL |
| OIDC_PROVIDER_NAME | OAuth | The provider name is shown in SSO login button. "Login with <OIDC_PROVIDER_NAME>" |
| OIDC_REMEMBER_ME | False | Because redirects bypass the login screen, you can't tick the "Remember Me" checkbox. Setting this to true treats an OIDC login as if it had been checked, so the session survives closing the browser |
| OIDC_USER_CLAIM | This is the claim which Mealie will use to look up an existing user by (e.g. "email", "preferred_username") | |
| OIDC_NAME_CLAIM | name | This is the claim which Mealie will use for the users Full Name |
| OIDC_GROUPS_CLAIM | groups | Optional if not using OIDC_USER_GROUP or OIDC_ADMIN_GROUP. This is the claim Mealie will request from your IdP and will use to compare to OIDC_USER_GROUP or OIDC_ADMIN_GROUP to allow the user to log in to Mealie or is set as an admin. Your IdP must be configured to grant this claim |
| OIDC_SCOPES_OVERRIDE | None | Advanced configuration used to override the scopes requested from the IdP. Most users won't need to change this. At a minimum, 'openid profile email' are required. |
| OIDC_TLS_CACERTFILE | None | File path to Certificate Authority used to verify server certificate (e.g. /path/to/ca.crt) |
| OIDC_VERIFY_X509_STRICT | True | When set to False, disables VERIFY_X509_STRICT introduced in Python 3.13 breaking OIDC with CA certificates not meeting new strict requirements like Authority Key Identifier (AKI). Works with both default system CAs and OIDC_TLS_CACERTFILE. |
| OIDC_CLIENT_TIMEOUT | default | Configures the timeout value of the httpx client used for OIDC communications. If set to the string default, does not configure the value (uses the library's default of 5.0s). If set to the string None, disables the timeout entirely. If set to a numeric value, uses that as the timeout. |
| OIDC_NATIVE_CLIENT_ID |
None | Client ID used by the native (mobile/desktop) OIDC endpoints. Falls back to OIDC_CLIENT_ID when unset. Set this when your provider requires a separate native client, for example Google or Microsoft. |
| OIDC_NATIVE_CONFIDENTIAL | True | When False, the native client is treated as a public client: the client secret is omitted from the token exchange and PKCE alone is used. Only takes effect when OIDC_NATIVE_CLIENT_ID is set. The web login client is not affected. |
AI
v1.7.0
Mealie supports various integrations using AI. For more information, check out our AI Providers documentation.
Recipe import can also transcribe a video's audio with AI (e.g. to import a recipe from a cooking video). This uses yt-dlp to download the video, which you can configure with the env variables below:
| Variables | Default | Description |
|---|---|---|
| YTDLP_COOKIEFILE | None | Cookiefile for yt-dlp to use when downloading a video, needed for content that requires sign-in |
Recipe Scraper
When you import a recipe from a URL, Mealie fetches the page (and its image) before parsing it. Many sites sit behind bot-protection (e.g. Cloudflare) that can block these requests. Out of the box Mealie mitigates this by impersonating real browsers' TLS fingerprints and rotating between several of them, which is enough for most sites and requires no configuration. If you still run into sites that block imports, the opt-in settings below add two further layers.
| Variables | Default | Description |
|---|---|---|
| SCRAPER_PROXY_URL | None | Optional proxy for all outbound scraping and image requests (e.g. http://user:pass@host:port). Routing through an IP with a better reputation helps bypass IP-based blocks. Unset disables it. |
| SCRAPER_PROXY_MODE | always | How the proxy is used (when SCRAPER_PROXY_URL is set): always routes every request through it; fallback tries a direct request first and only retries through the proxy when a block is detected. Any unrecognized value falls back to always. |
| SCRAPER_FLARESOLVERR_URL | None | Optional base URL of a self-hosted FlareSolverr instance (e.g. http://flaresolverr:8191). Used only as a last resort to solve JS/Cloudflare challenges. Unset disables it. |
| SCRAPER_FLARESOLVERR_TIMEOUT | 60 | Maximum seconds FlareSolverr may spend solving a single challenge before giving up. |
How Mealie fetches a page
For each import Mealie escalates only as far as it needs to, stopping at the first step that succeeds:
- Direct fetch with rotating browser TLS impersonations — always on, no configuration.
- Proxy — if
SCRAPER_PROXY_URLis set (see modes below). - FlareSolverr — if
SCRAPER_FLARESOLVERR_URLis set, and only when the page is still blocked.
Steps 2 and 3 are opt-in, so a default install uses only step 1. Genuine "not found" responses (e.g.
404) are treated as real errors and are never retried through the later steps.
Proxy
Most IP-based blocks trigger on the very first request, so always mode (the default when a proxy is
set) is recommended — it routes every request through the proxy from the start. Use fallback mode if
you're on a metered proxy and want to avoid paying for requests that would have succeeded directly;
Mealie will then only route through the proxy after a direct attempt is blocked. The proxy applies to
both the recipe page and its image download.
FlareSolverr
FlareSolverr runs a real headless browser to solve challenges that TLS impersonation alone can't. Mealie neither ships nor manages it — you host it yourself and point Mealie at it. Because it returns rendered HTML, it is only used for the recipe page; image downloads never use FlareSolverr and continue to rely on the direct/proxy path.
Run it as a sidecar container and set SCRAPER_FLARESOLVERR_URL to its address:
services:
mealie:
image: ghcr.io/mealie-recipes/mealie:latest
environment:
SCRAPER_FLARESOLVERR_URL: http://flaresolverr:8191
# optional; default shown
# SCRAPER_FLARESOLVERR_TIMEOUT: 60
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
restart: unless-stopped
# No ports need to be published — Mealie reaches it over the internal Docker network.
Because FlareSolverr drives a browser, requests through it are much slower (seconds) and far more resource-intensive than a direct fetch. That's why Mealie only falls back to it when a page is actually blocked, rather than using it for every import.
Theming
Setting the following environmental variables will change the theme of the frontend. Note that the themes are the same for all users. This is a break-change when migration from v0.x.x -> 1.x.x.
Info
If you're setting these variables but not seeing these changes persist, try removing the # character. Also, depending on which syntax you're using, double-check you're using quotes correctly.
If using YAML mapping syntax, be sure to include quotes around these values, otherwise they will be treated as comments in your YAML file:THEME_LIGHT_PRIMARY: '#E58325' or THEME_LIGHT_PRIMARY: 'E58325'
If using YAML sequence syntax, don't include any quotes:THEME_LIGHT_PRIMARY=#E58325 or THEME_LIGHT_PRIMARY=E58325
| Variables | Default | Description |
|---|---|---|
| THEME_LIGHT_PRIMARY | #E58325 | Main brand color and headers |
| THEME_LIGHT_ACCENT | #007A99 | Buttons and interactive elements |
| THEME_LIGHT_SECONDARY | #973542 | Secondary UI elements and interactive accents |
| THEME_LIGHT_SUCCESS | #43A047 | Success messages and confirmations |
| THEME_LIGHT_INFO | #1976D2 | Information alerts and tooltips |
| THEME_LIGHT_WARNING | #FF6D00 | Warning notifications |
| THEME_LIGHT_ERROR | #EF5350 | Error messages and alerts |
| THEME_DARK_PRIMARY | #E58325 | Main brand color and headers |
| THEME_DARK_ACCENT | #007A99 | Buttons and interactive elements |
| THEME_DARK_SECONDARY | #973542 | Secondary UI elements and interactive accents |
| THEME_DARK_SUCCESS | #43A047 | Success messages and confirmations |
| THEME_DARK_INFO | #1976D2 | Information alerts and tooltips |
| THEME_DARK_WARNING | #FF6D00 | Warning notifications |
| THEME_DARK_ERROR | #EF5350 | Error messages and alerts |
Theming Examples
The examples below provide copy-ready Docker Compose environment configurations for three different color palettes. Copy and paste the desired theme into your docker-compose.yml file's environment section.
Info
These themes are functional and ready to use, but they are provided primarily as examples. The color palettes can be adjusted or refined to better suit your preferences.
environment:
# Light mode colors
THEME_LIGHT_PRIMARY: '#5E9BD1'
THEME_LIGHT_ACCENT: '#A3C9E8'
THEME_LIGHT_SECONDARY: '#4F89BA'
THEME_LIGHT_SUCCESS: '#4CAF50'
THEME_LIGHT_INFO: '#4A9ED8'
THEME_LIGHT_WARNING: '#EAC46B'
THEME_LIGHT_ERROR: '#E57373'
# Dark mode colors
THEME_DARK_PRIMARY: '#5A8FBF'
THEME_DARK_ACCENT: '#90B8D9'
THEME_DARK_SECONDARY: '#406D96'
THEME_DARK_SUCCESS: '#81C784'
THEME_DARK_INFO: '#78B2C0'
THEME_DARK_WARNING: '#EBC86E'
THEME_DARK_ERROR: '#E57373'
environment:
# Light mode colors
THEME_LIGHT_PRIMARY: '#75A86C'
THEME_LIGHT_ACCENT: '#A8D0A6'
THEME_LIGHT_SECONDARY: '#638E5E'
THEME_LIGHT_SUCCESS: '#4CAF50'
THEME_LIGHT_INFO: '#4A9ED8'
THEME_LIGHT_WARNING: '#EAC46B'
THEME_LIGHT_ERROR: '#E57373'
# Dark mode colors
THEME_DARK_PRIMARY: '#739B7A'
THEME_DARK_ACCENT: '#9FBE9D'
THEME_DARK_SECONDARY: '#56775E'
THEME_DARK_SUCCESS: '#81C784'
THEME_DARK_INFO: '#78B2C0'
THEME_DARK_WARNING: '#EBC86E'
THEME_DARK_ERROR: '#E57373'
environment:
# Light mode colors
THEME_LIGHT_PRIMARY: '#D97C96'
THEME_LIGHT_ACCENT: '#E891A7'
THEME_LIGHT_SECONDARY: '#C86C88'
THEME_LIGHT_SUCCESS: '#4CAF50'
THEME_LIGHT_INFO: '#2196F3'
THEME_LIGHT_WARNING: '#FFC107'
THEME_LIGHT_ERROR: '#E57373'
# Dark mode colors
THEME_DARK_PRIMARY: '#C2185B'
THEME_DARK_ACCENT: '#FF80AB'
THEME_DARK_SECONDARY: '#AD1457'
THEME_DARK_SUCCESS: '#81C784'
THEME_DARK_INFO: '#64B5F6'
THEME_DARK_WARNING: '#FFD54F'
THEME_DARK_ERROR: '#E57373'
Info
Browser cookies may cause the client to keep outdated settings. Clearing the cookies can be required for the change to take effect.
Branding
Setting the following environment variables lets you replace Mealie's name and logo in the UI. Any variable left unset falls back to the default Mealie branding, so you can override just the pieces you care about.
This only covers the app name (top navigation bar, browser tab title, installed PWA name) and the logo (top navigation bar, login/setup pages, favicon). It does not change every other place "Mealie" appears — translation strings, outgoing emails, and links to the project's own site/docs are unaffected.
| Variables | Default | Description |
|---|---|---|
| BRANDING_NAME | Mealie | App name shown in the top navigation bar, browser tab title, and installed PWA name |
| BRANDING_LOGO_PATH | unset | Path inside the container to a custom logo (svg, png, ico, webp, jpg/jpeg), used in the top navigation bar, the login/setup pages, and as the favicon |
Info
BRANDING_LOGO_PATH points at a file path, not a URL. To use your own logo, bind-mount the file into the container and point the variable at that in-container path. If the path doesn't exist, isn't a file, or isn't a recognized image type, Mealie silently falls back to the built-in logo.
Like the theme variables, branding is read once at startup — restart the container after changing these values.
volumes:
- ./branding/logo.svg:/app/branding/logo.svg:ro
environment:
BRANDING_NAME: "My Recipes"
BRANDING_LOGO_PATH: "/app/branding/logo.svg"
Docker Secrets
† Starting in version2.4.2, any environment variable in the preceding lists with a dagger symbol next to them support the Docker Compose secrets pattern, below. Docker Compose secrets can be used to secure sensitive information regarding the Mealie implementation by managing control of each secret independently from the single.envfile. This is helpful for users that may need different levels of access for various, sensitive environment variables, such as differentiating between hardening operations (e.g., server endpoints and ports) and user access control (e.g., usernames, passwords, and API keys).
To convert any of these environment variables to a Docker Compose secret, append _FILE to the environment variable and
connect it with a Docker Compose secret, per the Docker documentation.
If both the base environment variable and the secret pattern of the environment variable are set, the secret will always take precedence.
Each configured _FILE path must point to a readable regular file.
Startup stops with an error message if the file is missing, is not a regular file, or cannot be read, even when the base environment variable is also set.
Trailing newlines are removed from the file contents. If the resulting value is empty, startup logs a warning and continues with an empty value, overriding any base environment variable.
The file must be readable by the application user after the container drops privileges (UID/GID 911 by default, or your configured runtime user).
Kubernetes Secret volume symlinks are supported when their target is a readable
regular file. Omit the _FILE variable when an optional setting is unused.
For example, a user that wishes to harden their operations by only giving some access to their database URL, but who wish to place additional security around their user access control, may have a Docker Compose configuration similar to:
services:
mealie:
secrets:
# These secrets will be loaded by Docker into the `/run/secrets` folder within the container.
- postgres-host
- postgres-port
- postgres-db-name
- postgres-user
- postgres-password
environment:
DB_ENGINE: postgres
POSTGRES_SERVER: duplicate.entry.tld # This will be ignored, due to the secret defined, below.
POSTGRES_SERVER_FILE: /run/secrets/postgres-host
POSTGRES_PORT_FILE: /run/secrets/postgres-port
POSTGRES_DB_FILE: /run/secrets/postgres-db-name
POSTGRES_USER_FILE: /run/secrets/postgres-user
POSTGRES_PASSWORD_FILE: /run/secrets/postgres-password
# Each of these secrets are loaded via these local files. Different patterns are available. See the Docker Compose
# documentation for more information.
secrets:
postgres-host:
file: ./secrets/postgres-host.txt
postgres-port:
file: ./secrets/postgres-port.txt
postgres-db-name:
file: ./secrets/sensitive/postgres-db-name.txt
postgres-user:
file: ./secrets/sensitive/postgres-user.txt
postgres-password:
file: ./secrets/sensitive/postgres-password.txt
.
├── docker-compose.yml
└── secrets # Access restricted to anyone that can manage secrets
├── postgres-host.txt
├── postgres-port.txt
└── sensitive # Access further-restricted to anyone managing service accounts
├── postgres-db-name.txt
├── postgres-password.txt
└── postgres-user.txt
How you organize your secrets is ultimately up to you. At minimum, it's highly recommended to use secret patterns for at least these sensitive environment variables when working within shared environments:
POSTGRES_PASSWORDSMTP_PASSWORDLDAP_QUERY_PASSWORD