1

I am running a Flask application on Docker with uwsgi. I have been running it for years now, but we need to add https to it. I know I can use an HAProxy and do ssl offloading, but in our current setup we cant do it this way, at least not right now. We need to do the SSL directly on the application. I have tried multiple options and I keep getting "The -s/--socket option is missing and stdin is not a socket." Not sure what else to try. The server is uWSGI==2.0.26. Please help. below is my uwsgi.ini file.

[uwsgi]
module = wsgi:app
master = true
processes = 5
enable-threads = true
single-interpreter = true
buffer-size = 32768
# protocol = http
# socket = 0.0.0.0:5000
# protocol = https
shared-socket = 0.0.0.0:5000
https = 0,/app/ssl/app_cert.crt,/app/ssl/app_cert.key
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes = 0
stderr_logfile = /dev/stdout
stderr_logfile_maxbytes = 0
chmod-socket = 660
vacuum = true
die-on-term = true
py-autoreload = 1
asked Jan 7, 2025 at 15:57

1 Answer 1

0

You can use the following example to run your flask application with uwsgi and docker.

I will provide a minimal example and you can use it to expand to your needs.

The uwsgi conf were extracted from docs.

uwsgi.ini

[uwsgi]
shared-socket = 0.0.0.0:443
https = =0,ssl/server.crt,ssl/server.key
master = true
module = app:app
uid = uwsgi
gid = uwsgi

app.py

from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
 return "Hello, World!"
if __name__ == "__main__":
 app.run() 

requirements.txt

Flask
uWSGI==2.0.26

Dockerfile

FROM python:3.10-slim
RUN apt-get update && apt-get install -y \
 build-essential \
 gcc \
 libssl-dev \
 && apt-get clean \
 && rm -rf /var/lib/apt/lists/*
RUN groupadd -r uwsgi && useradd -r -g uwsgi -m uwsgi
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
COPY ssl/ /app/ssl/
RUN chown -R uwsgi:uwsgi /app
EXPOSE 443
USER uwsgi
CMD ["uwsgi", "--ini", "uwsgi.ini"]

Create an ssl directory and generate a self-signed cert.

mkdir ssl
openssl req -x509 \
 -newkey rsa:2048 \
 -keyout ssl/server.key \
 -out ssl/server.crt \
 -days 365 -nodes -subj "/CN=localhost"

Now you should have this folder structure:

.
├── app.py
├── Dockerfile
├── requirements.txt
├── ssl
│  ├── server.crt
│  └── server.key
└── uwsgi.ini

Now build and run:

docker build -t flask-uwsgi-example .
docker run --rm --name flask -p 443:443 flask-uwsgi-example

And test with curl:

$ curl -k https://localhost:443
Hello, World!
answered Jan 8, 2025 at 15:20
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.