Search code examples
pythonherokufastapiuvicorn

How to run UVICORN in Heroku?


So I have figured out how to code a fastAPI and I am ready to deploy my script to heroku that I have worked with fastAPI (https://fastapi.tiangolo.com/) however the problem is that when I do a request to heroku it will just return:

<html>
  <head>
    <title>Internal Server Error</title>
  </head>
  <body>
    <h1><p>Internal Server Error</p></h1>

  </body>
</html>

Which means the script is on but I can't see the error and locally it works totally fine I would say.

I am not able to see any logs where the problem is however I would say my problem might be that I am not sure if my procfile is correct because I haven't edited it at all and I am quite new at this and I am here to ask how I am able to run my fastapi script in heroku?

What I know is that to be able to run the script, you have to use command uvicorn main:app --reload and it won't work if you do etc py main.py What am I doing wrong?


Solution

  • I've tested your setup and after some checking (never used Heroku before) I'm guessing your uvicorn never binds to the appointed port (was the heroku-cli command heroku local working for you?)

    Your Procfile could look like this;

    web: uvicorn src.main:app --host=0.0.0.0 --port=${PORT:-5000}
    

    This example assumes you have your source code within a subfolder named 'src' which has an empty __init__.py (indicating a Python module, you probably want to add src to the PYTHONPATH instead, see app.json) and main.py containing your fastapi app;

    import socket
    import sys
    
    from fastapi import FastAPI
    
    app = FastAPI()
    
    hostname = socket.gethostname()
    
    version = f"{sys.version_info.major}.{sys.version_info.minor}"
    
    
    @app.get("/")
    async def read_root():
        return {
            "name": "my-app",
            "host": hostname,
            "version": f"Hello world! From FastAPI running on Uvicorn. Using Python {version}"
        }
    

    I have added this example to github which you can view on heroku (for now)