Framework

Flask

Flask applications served by Gunicorn.

Container port5000

Requirements

requirements.txt with flask

DropDeploy also installs gunicorn automatically alongside your requirements.

app.py in the repo root with app = Flask(__name__)

Gunicorn starts with app:app — module is app.py, instance is app.

Demo app

A minimal app that is ready to push and deploy. Copy the files below into a new repository, commit, and deploy — it should go live without any changes.

requirements.txt
flask
app.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return """
    <html>
      <body style="font-family:system-ui;display:flex;justify-content:center;
                   align-items:center;min-height:100vh;margin:0;
                   background:#0f172a;color:#f1f5f9">
        <div style="text-align:center">
          <h1 style="color:#a3a3a3">Hello from DropDeploy!</h1>
          <p style="color:#94a3b8">Flask app is live.</p>
        </div>
      </body>
    </html>
    """

@app.route('/api/health')
def health():
    return {'status': 'ok'}
Two files — requirements.txt and app.py. Gunicorn is installed automatically by DropDeploy.

Build & start commands

DropDeploy runs these steps inside the container when you click Deploy.

pip install -r requirements.txt gunicorn
gunicorn app:app --bind 0.0.0.0:5000 --workers 2

Environment variables

Set these in Project → Env Vars in the dashboard. Never commit secrets.

VariableRequiredDescription
SECRET_KEYYesRequired for sessions and flash messages.
DATABASE_URLNoPass to Flask-SQLAlchemy or another ORM.

Common issues

Flask app not named app

If your Flask instance is named server, update gunicorn to app:server.

Debug mode in production

Gunicorn ignores app.run(debug=True) but it's still a security risk. Remove it.