Recentemente eu tive de colocar uma aplicação Streamlit para rodar em https. Para ter um certificado gratuito e confiável, nada melhor que o Let’s Encrypt

Imagem de skylarvision por Pixabay

Graças ao excelente trabalho do SteveLTN, isso foi possível utilizando alguns simples comandos.

A imagem do Docker junto com o docker-compose criado, facilitaram demais o meu trabalho, tornando possível eu instalar um certificado para qualquer aplicação web, seja ela WordPress, Django, Flask, etc…E hoje, uma app do Streamlit.

O Streamlit, para quem não conhece, utiliza protocolo websocket além do http. Por padrão, o docker-compose redireciona conexões http. No entanto, com a adição de uma linha no docker-compose é possível resolver isso também para websockets.

Vamos lá. Primeiramente, minha aplicação não tem https. Criei um subdomínio como exemplo.operar.io, nesse caso, criei o apontamento na Digital Ocean (Use este link se você quiser um desconto de $ 100)

Para resolver isto, eu apenas utilizei esse docker-compose.

version: '3'
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    links:
      - app
    restart: always
    environment:
      DOMAINS: 'exemplo.operar.io -> http://app:8501' # troque este subdomínio pelo seu endereço
      STAGE: staging # mantenha em staging até o total funcionamento
  app:
    image: operar/app
    build:
      context: .
    ports:
      - "8501:8501"

Reparem que eu coloquei meu subdomínio nos DOMAINS, apontando para a minha aplicação Streamlit.

Outro detalhe é que eu deixei o STAGE como staging, por um motivo muito simples, porém importante. O Let’sencrypt tem um rate limit que impede a geração de muitos certificados para um mesmo dominio. Para testes, você deve usar um ambiente de staging. Após toda a aplicação estar funcionando, mudamos para production. Fazendo isso você evita ficar gerando certificado até bater no rate limit e ter de esperar alguns dias para tentar novamente.

O meu Dockerfile é algo bem simples assim:

# base image
FROM python:3.7

# exposing default port for streamlit
EXPOSE 8501

RUN pip3 install streamlit

# run app
CMD streamlit hello

Depois, no server, basta rodar no mesmo diretório do Dockerfile e docker-compose, o comando:

docker-compose up — build -d

O –build serve pra “construir” sua aplicação, refazendo os containers que estão desatualizados em relação ao docker-compose ou Dockerfile. O -d serve para que os containers rodarem em background.

Podemos acessar o endereço da aplicação, exemplo.operar.io e checar…

Reparem que o browser dispara um alerta de segurança. Significa que funcionou! O alerta é devido ao certificado ser inválido (ambiente de staging). Podemos voltar agora e colocar em production no docker-compose:

version: '3'
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    links:
      - app
    restart: always
    environment:
      DOMAINS: 'exemplo.operar.io -> http://app:8501' # troque este subdomínio pelo seu endereço
      STAGE: production # mantenha em staging até o total funcionamento
  app:
    image: operar/app
    build:
      context: .
    ports:
      - "8501:8501"

Pronto. Quer dizer… quase, se formos testar a página novamente, a aplicação do Streamlit não vai passar do “Please wait”, isso porque ela tenta rodar conexões ws (websockets).

Para resolver isso, basta adicionarmos um WEBSOCKET: ‘true’ no docker-compose.

Agora temos a versão final do nosso docker-compose:

version: '3'
services:
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    links:
      - app
    restart: always
    environment:
      WEBSOCKET: 'true'
      DOMAINS: 'exemplo.operar.io -> http://app:8501' # troque este subdomínio pelo seu endereço
      STAGE: production # mantenha em staging até o total funcionamento
  app:
    image: operar/app
    build:
      context: .
    ports:
      - "8501:8501"

Basta rodarmos o docker-compose up — build -d novamente e tudo irá funcionar.

Com isso é possível instalar um certificado gratuito e confiável em questão de minutos.

Leave a Reply

Your email address will not be published. Required fields are marked *