diff --git a/mealie/core/settings/db_providers.py b/mealie/core/settings/db_providers.py index fff25bdcc14a..7de9a63c03e4 100644 --- a/mealie/core/settings/db_providers.py +++ b/mealie/core/settings/db_providers.py @@ -1,5 +1,6 @@ from abc import ABC, abstractmethod from pathlib import Path +from urllib import parse as urlparse from pydantic import BaseModel, PostgresDsn from pydantic_settings import BaseSettings, SettingsConfigDict @@ -44,15 +45,28 @@ class PostgresProvider(AbstractDBProvider, BaseSettings): @property def db_url(self) -> str: host = f"{self.POSTGRES_SERVER}:{self.POSTGRES_PORT}" - return str( - PostgresDsn.build( + try: + url = PostgresDsn.build( scheme="postgresql", username=self.POSTGRES_USER, password=self.POSTGRES_PASSWORD, host=host, path=f"{self.POSTGRES_DB or ''}", ) - ) + except ValueError as outer_error: + try: + # if the password contains special characters, it needs to be URL encoded + url = PostgresDsn.build( + scheme="postgresql", + username=self.POSTGRES_USER, + password=urlparse.quote_plus(self.POSTGRES_PASSWORD), + host=host, + path=f"{self.POSTGRES_DB or ''}", + ) + except Exception: + raise outer_error + + return str(url) @property def db_url_public(self) -> str: