Как заставить streamlit-приложение работать на HTTPS, не трогая сам Streamlit и его конфиг

У вас все настроено для работы Streamlit, локально все крутится-вертится, вы переносите фреймворк на сервер иии… видите, что тот категорически не хочет работать по https, хотя при этом работает по http. Идем в инструкции, видим там параметры в config.toml для скармливания ключей SSL и неясные перспективы по темам официального форума, будет ли все работать…

Есть способ сразу так настроить Nginx, чтобы он спокойно открывал Streamlit на https. Особенно полезно, когда вы делаете хостинг для своих проектов, используйте прокси-сервер-привратник, перенаправляющий запросы на внутренние виртуальные машины. Единой настройки Nginx на этом «привратнике» хватит, чтобы сколько угодно https-сайтов на Streamlit открывать далее через него.

1. У вас должен быть установлен сам Nginx

sudo apt update
sudo apt install nginx

2. У вас должен быть установлен certbot — это бесплатный инструмент, который получает для ваших доменов автоматически и регулярно сертификаты Let’s Encrypt, чтобы работать по HTTPS. Если у вас уже все с сертификатами готово заранее, и вы просто ищите, почему не работает Streamlit на https, то этот шаг можно пропустить

sudo apt install certbot python3-certbot-nginx

получаем сертификаты

sudo certbot --nginx -d yourdomain.com

Понятно, что здесь и далее меняете yourdomain.com на свой домен

3. Теперь надо настроить конфиг Nginx для своего домена. Это можно сделать в отдельном файле и затем линкануть его (принимаем, что у вас сам такой файл уже готов и слинкован, иначе посмотрите в сети, как это делается)

sudo nano /etc/nginx/sites-available/yourdomain.com.conf 

В редакторе добавляем такой конфиг

server {
    listen 443 ssl;
    server_name yourdomain.com;

    ssl_certificate  etc/letsencrypt/live/yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        proxy_pass http://localhost:8501;
        proxy_http_version 1.1;

        # WebSocket support
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # Standard proxy headers
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$host$request_uri;
}

4. Добавляем в общие настройки Nginx

sudo nano /etc/nginx/nginx.conf

такое содержимое

http {
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
}

5. Проверяем конфиг и перезапускаем Nginx

sudo nginx -t
sudo systemctl reload nginx

Если все сделано правильно, то streamlit-приложение должно заработать на https

***

Мой tg-канал Заметки стартапера