@@ -51,23 +51,46 @@ def all_cors_origins(self) -> list[str]:
5151
5252 PROJECT_NAME : str
5353 SENTRY_DSN : HttpUrl | None = None
54- POSTGRES_SERVER : str
55- POSTGRES_PORT : int = 5432
56- POSTGRES_USER : str
57- POSTGRES_PASSWORD : str = ""
58- POSTGRES_DB : str = ""
54+
55+ # Add DATABASE_URL as an optional field
56+ DATABASE_URL : PostgresDsn | None = None
57+
58+ # Make individual PG fields optional
59+ POSTGRES_SERVER : str | None = None
60+ POSTGRES_PORT : int | None = 5432
61+ POSTGRES_USER : str | None = None
62+ POSTGRES_PASSWORD : str | None = None
63+ POSTGRES_DB : str | None = None
5964
6065 @computed_field # type: ignore[prop-decorator]
6166 @property
6267 def SQLALCHEMY_DATABASE_URI (self ) -> PostgresDsn :
63- return MultiHostUrl .build (
64- scheme = "postgresql+psycopg" ,
65- username = self .POSTGRES_USER ,
66- password = self .POSTGRES_PASSWORD ,
67- host = self .POSTGRES_SERVER ,
68- port = self .POSTGRES_PORT ,
69- path = self .POSTGRES_DB ,
70- )
68+ if self .DATABASE_URL :
69+ print ("Using DATABASE_URL from environment" )
70+ return self .DATABASE_URL
71+ elif (
72+ self .POSTGRES_SERVER
73+ and self .POSTGRES_USER
74+ # Password can be None or empty
75+ and self .POSTGRES_DB
76+ and self .POSTGRES_PORT
77+ ):
78+ print ("Using individual POSTGRES variables from environment" )
79+ # Ensure password is a string, even if None was provided
80+ pg_password = self .POSTGRES_PASSWORD or ""
81+ return MultiHostUrl .build (
82+ scheme = "postgresql+psycopg" ,
83+ username = self .POSTGRES_USER ,
84+ password = pg_password ,
85+ host = self .POSTGRES_SERVER ,
86+ port = self .POSTGRES_PORT ,
87+ path = self .POSTGRES_DB ,
88+ )
89+ else :
90+ raise ValueError (
91+ "Database configuration error: Set DATABASE_URL or all individual "
92+ "POSTGRES_SERVER, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, POSTGRES_PORT variables."
93+ )
7194
7295 SMTP_TLS : bool = True
7396 SMTP_SSL : bool = False
@@ -109,7 +132,9 @@ def _check_default_secret(self, var_name: str, value: str | None) -> None:
109132 @model_validator (mode = "after" )
110133 def _enforce_non_default_secrets (self ) -> Self :
111134 self ._check_default_secret ("SECRET_KEY" , self .SECRET_KEY )
112- self ._check_default_secret ("POSTGRES_PASSWORD" , self .POSTGRES_PASSWORD )
135+ # Only check PG password if individual variables are used
136+ if not self .DATABASE_URL and self .POSTGRES_PASSWORD :
137+ self ._check_default_secret ("POSTGRES_PASSWORD" , self .POSTGRES_PASSWORD )
113138 self ._check_default_secret (
114139 "FIRST_SUPERUSER_PASSWORD" , self .FIRST_SUPERUSER_PASSWORD
115140 )
0 commit comments