kms
kms

Reputation: 2024

Dash App Deployed to Heroku : gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>

I am deploying a Dash Application to Heroku. The App works on localhost, however, when attempting to deploy to Heroku, I run the gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>

My file structure is something like this:

app.py
index.py
Procfile
requirements.txt
-- Tabs
--- Tab1.py
--- Tab2.py 

Procfile contents:

web: gunicorn index:server --workers 4

Error Traceback:

Traceback (most recent call last):
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 225, in run
       handler()
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 260, in handle_term
       raise StopIteration
   StopIteration
   During handling of the above exception, another exception occurred:
   Traceback (most recent call last):
     File "/app/.heroku/python/bin/gunicorn", line 11, in <module>
       sys.exit(run())
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/wsgiapp.py", line 61, in run
       WSGIApplication("%(prog)s [OPTIONS] [APP_MODULE]").run()
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 223, in run
       super(Application, self).run()
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/app/base.py", line 72, in run
       Arbiter(self).run()
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 228, in run
       self.halt()
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 345, in halt
       self.stop()
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 393, in stop
       time.sleep(0.1)
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 245, in handle_chld
       self.reap_workers()
     File "/app/.heroku/python/lib/python3.6/site-packages/gunicorn/arbiter.py", line 525, in reap_workers
       raise HaltServer(reason, self.WORKER_BOOT_ERROR)
   gunicorn.errors.HaltServer: <HaltServer 'Worker failed to boot.' 3>

Contents on index.py

import pandas as pd
import dash
from dash.dependencies import Input, Output, State
import dash_html_components as html
import dash_core_components as dcc
import plotly as py
from plotly import graph_objs as go
from plotly.graph_objs import *
import flask
from app import app
import os
from tabs import reporting, portfolio, market, deal, revenue, comps, analysis

app.layout = html.Div([

    # header
    html.Div([

        html.Div(
            html.Img(src='https:///logo.png',height="100%"),
        ],
        className="row header"
    ),

    # body
    #html.Div(className='background')

    # tabs
    html.Div([

        dcc.Tabs(

            id="tabs",
            vertical=True,
            className="mb-3",
            #style={"height":"60"},
            children=[

                 dcc.Tab(label="Portfolio", value="portfolio_tab"),
                 dcc.Tab(label="Revenue", value="revenue_tab",
                 dcc.Tab(label="Deal", value="deal_tab")

            ],
            value="revenue_tab",
        )

        ],

        className="row tabs_div"

    ),

        # Tab content
        html.Div(id="tab_content"),

       )

])

    # In[9]:
    
    # Render tabs/subtabs
    @app.callback(
                    Output("tab_content", "children"),
    
                  [
                      Input("tabs", "value"),
                      Input("subtabs", "value")
                  ],
                 )
    def render_content(tab, subtab):
        """
        For user selections, return the relevant tab
        """
        if tab == "portfolio_tab":
            return portfolio.layout
    
        if tab == "reporting_tab":
            return reporting.layout
    
        if tab == "market_tab":
            return market.layout
    
        elif tab == "deal_tab":
            return deal.layout
    
        else:
            return (dash.no_update)
    
    # In[10]:
    
    if __name__ == '__main__':
        # Production
        app.run_server(debug=True)

Upvotes: 2

Views: 6490

Answers (1)

emher
emher

Reputation: 6024

You Procfile indicates that gunicorn should look for the Flask server as a variable named server in the index.py file (that's basically what gunicorn index:server means). However, it seems like you have not defined that variable, i.e. you should add a line like

server = app.server

in your index.py file (or change your Procfile).

Upvotes: 3

Related Questions