diff --git a/.gitignore b/.gitignore index 29c296915..618e3d874 100644 --- a/.gitignore +++ b/.gitignore @@ -31,3 +31,4 @@ proxy_server_config_@.yaml .gitignore proxy_server_config_2.yaml litellm/proxy/secret_managers/credentials.json +hosted_config.yaml diff --git a/Dockerfile b/Dockerfile index 87d6bcb74..da54ba0af 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,10 +1,36 @@ +# Base image for building +ARG LITELLM_BUILD_IMAGE=python:3.9 # Runtime image ARG LITELLM_RUNTIME_IMAGE=python:3.9-slim # Builder stage FROM $LITELLM_BUILD_IMAGE as builder - @@ -35,8 +34,12 @@ RUN pip wheel --no-cache-dir --wheel-dir=/wheels/ -r requirements.txt +# Set the working directory to /app +WORKDIR /app + +# Install build dependencies +RUN apt-get clean && apt-get update && \ + apt-get install -y gcc python3-dev && \ + rm -rf /var/lib/apt/lists/* + +RUN pip install --upgrade pip && \ + pip install build + +# Copy the current directory contents into the container at /app +COPY . . + +# Build the package +RUN rm -rf dist/* && python -m build + +# There should be only one wheel file now, assume the build only creates one +RUN ls -1 dist/*.whl | head -1 + +# Install the package +RUN pip install dist/*.whl + +# install dependencies as wheels +RUN pip wheel --no-cache-dir --wheel-dir=/wheels/ -r requirements.txt # Runtime stage FROM $LITELLM_RUNTIME_IMAGE as runtime @@ -17,7 +43,8 @@ RUN ls -la /app # Copy the built wheel from the builder stage to the runtime stage; assumes only one wheel file is present COPY --from=builder /app/dist/*.whl . - @@ -45,9 +48,17 @@ COPY --from=builder /wheels/ /wheels/ +COPY --from=builder /wheels/ /wheels/ + # Install the built wheel using pip; again using a wildcard if it's the only file RUN pip install *.whl /wheels/* --no-index --find-links=/wheels/ && rm -f *.whl && rm -rf /wheels diff --git a/litellm/proxy/proxy_server.py b/litellm/proxy/proxy_server.py index 55518141d..4402764a6 100644 --- a/litellm/proxy/proxy_server.py +++ b/litellm/proxy/proxy_server.py @@ -1103,6 +1103,11 @@ async def startup_event(): # check if master key set in environment - load from there master_key = litellm.get_secret("LITELLM_MASTER_KEY", None) + ### CONNECT TO DB ### + # check if DATABASE_URL in environment - load from there + if os.getenv("DATABASE_URL", None) is not None and prisma_client is None: + prisma_setup(database_url=os.getenv("DATABASE_URL")) + ### LOAD CONFIG ### worker_config = litellm.get_secret("WORKER_CONFIG") print_verbose(f"worker_config: {worker_config}") diff --git a/litellm/proxy/utils.py b/litellm/proxy/utils.py index 0e5b3e0e5..3412b97a4 100644 --- a/litellm/proxy/utils.py +++ b/litellm/proxy/utils.py @@ -253,23 +253,25 @@ class PrismaClient: print_verbose( "LiteLLM: DATABASE_URL Set in config, trying to 'pip install prisma'" ) - ## init logging object + ## init logging object self.proxy_logging_obj = proxy_logging_obj - os.environ["DATABASE_URL"] = database_url - # Save the current working directory - original_dir = os.getcwd() - # set the working directory to where this script is - abspath = os.path.abspath(__file__) - dname = os.path.dirname(abspath) - os.chdir(dname) - try: - subprocess.run(["prisma", "generate"]) - subprocess.run( - ["prisma", "db", "push", "--accept-data-loss"] - ) # this looks like a weird edge case when prisma just wont start on render. we need to have the --accept-data-loss - finally: - os.chdir(original_dir) + if os.getenv("DATABASE_URL", None) is None: # setup hasn't taken place + os.environ["DATABASE_URL"] = database_url + # Save the current working directory + original_dir = os.getcwd() + # set the working directory to where this script is + abspath = os.path.abspath(__file__) + dname = os.path.dirname(abspath) + os.chdir(dname) + + try: + subprocess.run(["prisma", "generate"]) + subprocess.run( + ["prisma", "db", "push", "--accept-data-loss"] + ) # this looks like a weird edge case when prisma just wont start on render. we need to have the --accept-data-loss + finally: + os.chdir(original_dir) # Now you can import the Prisma Client from prisma import Prisma # type: ignore