from typing import Optional, Dict from phi.app.db_app import DbApp from phi.docker.app.base import DockerApp, ContainerContext # noqa: F401 class PostgresDb(DockerApp, DbApp): # -*- App Name name: str = "postgres" # -*- Image Configuration image_name: str = "postgres" image_tag: str = "15.4" # -*- App Ports # Open a container port if open_port=True open_port: bool = True port_number: int = 5432 # -*- Postgres Volume # Create a volume for postgres storage create_volume: bool = True # Path to mount the volume inside the container volume_container_path: str = "/var/lib/postgresql/data" # -*- Postgres Configuration # Provide POSTGRES_USER as pg_user or POSTGRES_USER in secrets_file pg_user: Optional[str] = None # Provide POSTGRES_PASSWORD as pg_password or POSTGRES_PASSWORD in secrets_file pg_password: Optional[str] = None # Provide POSTGRES_DB as pg_database or POSTGRES_DB in secrets_file pg_database: Optional[str] = None pg_driver: str = "postgresql+psycopg" pgdata: Optional[str] = "/var/lib/postgresql/data/pgdata" postgres_initdb_args: Optional[str] = None postgres_initdb_waldir: Optional[str] = None postgres_host_auth_method: Optional[str] = None postgres_password_file: Optional[str] = None postgres_user_file: Optional[str] = None postgres_db_file: Optional[str] = None postgres_initdb_args_file: Optional[str] = None def get_db_user(self) -> Optional[str]: return self.pg_user or self.get_secret_from_file("POSTGRES_USER") def get_db_password(self) -> Optional[str]: return self.pg_password or self.get_secret_from_file("POSTGRES_PASSWORD") def get_db_database(self) -> Optional[str]: return self.pg_database or self.get_secret_from_file("POSTGRES_DB") def get_db_driver(self) -> Optional[str]: return self.pg_driver def get_db_host(self) -> Optional[str]: return self.get_container_name() def get_db_port(self) -> Optional[int]: return self.container_port def get_container_env(self, container_context: ContainerContext) -> Dict[str, str]: # Container Environment container_env: Dict[str, str] = self.container_env or {} # Set postgres env vars # Check: https://hub.docker.com/_/postgres db_user = self.get_db_user() if db_user: container_env["POSTGRES_USER"] = db_user db_password = self.get_db_password() if db_password: container_env["POSTGRES_PASSWORD"] = db_password db_database = self.get_db_database() if db_database: container_env["POSTGRES_DB"] = db_database if self.pgdata: container_env["PGDATA"] = self.pgdata if self.postgres_initdb_args: container_env["POSTGRES_INITDB_ARGS"] = self.postgres_initdb_args if self.postgres_initdb_waldir: container_env["POSTGRES_INITDB_WALDIR"] = self.postgres_initdb_waldir if self.postgres_host_auth_method: container_env["POSTGRES_HOST_AUTH_METHOD"] = self.postgres_host_auth_method if self.postgres_password_file: container_env["POSTGRES_PASSWORD_FILE"] = self.postgres_password_file if self.postgres_user_file: container_env["POSTGRES_USER_FILE"] = self.postgres_user_file if self.postgres_db_file: container_env["POSTGRES_DB_FILE"] = self.postgres_db_file if self.postgres_initdb_args_file: container_env["POSTGRES_INITDB_ARGS_FILE"] = self.postgres_initdb_args_file # Set aws region and profile self.set_aws_env_vars(env_dict=container_env) # Update the container env using env_file env_data_from_file = self.get_env_file_data() if env_data_from_file is not None: container_env.update({k: str(v) for k, v in env_data_from_file.items() if v is not None}) # Update the container env using secrets_file secret_data_from_file = self.get_secret_file_data() if secret_data_from_file is not None: container_env.update({k: str(v) for k, v in secret_data_from_file.items() if v is not None}) # Update the container env with user provided env_vars # this overwrites any existing variables with the same key if self.env_vars is not None and isinstance(self.env_vars, dict): container_env.update({k: str(v) for k, v in self.env_vars.items() if v is not None}) return container_env