Spaces:
Paused
Paused
| # What is this? | |
| ## Script to apply initial prisma migration on Docker setup | |
| import os | |
| import subprocess | |
| import sys | |
| import time | |
| sys.path.insert( | |
| 0, os.path.abspath("./") | |
| ) # Adds the parent directory to the system path | |
| from litellm._logging import verbose_proxy_logger | |
| from litellm.secret_managers.aws_secret_manager import decrypt_env_var | |
| if os.getenv("USE_AWS_KMS", None) is not None and os.getenv("USE_AWS_KMS") == "True": | |
| ## V2 IMPLEMENTATION OF AWS KMS - USER WANTS TO DECRYPT MULTIPLE KEYS IN THEIR ENV | |
| new_env_var = decrypt_env_var() | |
| for k, v in new_env_var.items(): | |
| os.environ[k] = v | |
| # Check if DATABASE_URL is not set | |
| database_url = os.getenv("DATABASE_URL") | |
| if not database_url: | |
| verbose_proxy_logger.info("Constructing DATABASE_URL from environment variables") | |
| # Check if all required variables are provided | |
| database_host = os.getenv("DATABASE_HOST") | |
| database_username = os.getenv("DATABASE_USERNAME") | |
| database_password = os.getenv("DATABASE_PASSWORD") | |
| database_name = os.getenv("DATABASE_NAME") | |
| if database_host and database_username and database_password and database_name: | |
| # Construct DATABASE_URL from the provided variables | |
| database_url = f"postgresql://{database_username}:{database_password}@{database_host}/{database_name}" | |
| os.environ["DATABASE_URL"] = database_url # Log the constructed URL | |
| else: | |
| verbose_proxy_logger.error( | |
| "Error: Required database environment variables are not set. Provide a postgres url for DATABASE_URL." # noqa | |
| ) | |
| exit(1) | |
| else: | |
| verbose_proxy_logger.info( | |
| "Using existing DATABASE_URL environment variable" | |
| ) # Log existing DATABASE_URL | |
| # Set DIRECT_URL to the value of DATABASE_URL if it is not set, required for migrations | |
| direct_url = os.getenv("DIRECT_URL") | |
| if not direct_url: | |
| os.environ["DIRECT_URL"] = database_url | |
| # Apply migrations | |
| retry_count = 0 | |
| max_retries = 3 | |
| exit_code = 1 | |
| disable_schema_update = os.getenv("DISABLE_SCHEMA_UPDATE") | |
| if disable_schema_update is not None and disable_schema_update == "True": | |
| verbose_proxy_logger.info("Skipping schema update...") | |
| exit(0) | |
| while retry_count < max_retries and exit_code != 0: | |
| retry_count += 1 | |
| verbose_proxy_logger.info(f"Attempt {retry_count}...") | |
| # run prisma generate | |
| verbose_proxy_logger.info("Running 'prisma generate'...") | |
| result = subprocess.run(["prisma", "generate"], capture_output=True, text=True) | |
| verbose_proxy_logger.info( | |
| f"'prisma generate' stdout: {result.stdout}" | |
| ) # Log stdout | |
| exit_code = result.returncode | |
| if exit_code != 0: | |
| verbose_proxy_logger.info( | |
| f"'prisma generate' failed with exit code {exit_code}." | |
| ) | |
| verbose_proxy_logger.error( | |
| f"'prisma generate' stderr: {result.stderr}" | |
| ) # Log stderr | |
| # Run the Prisma db push command | |
| verbose_proxy_logger.info("Running 'prisma db push --accept-data-loss'...") | |
| result = subprocess.run( | |
| ["prisma", "db", "push", "--accept-data-loss"], capture_output=True, text=True | |
| ) | |
| verbose_proxy_logger.info(f"'prisma db push' stdout: {result.stdout}") # Log stdout | |
| exit_code = result.returncode | |
| if exit_code != 0: | |
| verbose_proxy_logger.info( | |
| f"'prisma db push' stderr: {result.stderr}" | |
| ) # Log stderr | |
| verbose_proxy_logger.error( | |
| f"'prisma db push' failed with exit code {exit_code}." | |
| ) | |
| if retry_count < max_retries: | |
| verbose_proxy_logger.info("Retrying in 10 seconds...") | |
| time.sleep(10) | |
| if retry_count == max_retries and exit_code != 0: | |
| verbose_proxy_logger.error( | |
| f"Unable to push database changes after {max_retries} retries." | |
| ) | |
| exit(1) | |
| verbose_proxy_logger.info("Database push successful!") | |