Docker феникс с ssl по порту 443 ничего не получает - PullRequest
0 голосов
/ 04 мая 2020

Привет, ребята, разработчики,

Ради всего святого, я не могу заставить это работать ... У меня есть контейнер docker с приложением феникс. Он размещен на поддомене «sub.example.com», и мне нужно обслужить его с помощью https.

Итак, я получил сертификат SSL с подстановочным знаком, установил его, настроил рабочий файл и открыл порты 80 и 443 контейнера docker.

Попробовал и порт 80 работает нормально, но 443 всегда возвращает "ERR_CONNECTION_RESET". В логах ничего не показывается на 443, но на 80 работает нормально.

Уже некоторое время пытаюсь, а теперь мне нужна ваша помощь. Есть идеи, что случилось? Проверьте код ниже:

Dockerfile

FROM bitwalker/alpine-elixir-phoenix:latest

# create app folder
RUN mkdir /app
WORKDIR /app
COPY . .

# setting the port and the environment (prod = PRODUCTION!)
EXPOSE 80
EXPOSE 443

# install dependencies (production only)
RUN mix local.rebar --force
RUN mix deps.get --only prod
RUN mix compile

prod.exs

config :example, ExampleWeb.Endpoint,
  http: [port: 80],
  url: [host: "sub.example.com"],
  cache_static_manifest: "priv/static/cache_manifest.json",
  https: [
    cipher_suite: :strong,
    otp_app: :example,
    port: 443,
    keyfile: System.get_env("SSL_KEY_PATH"),
    certfile: System.get_env("SSL_CERT_PATH"),
    cacertfile: System.get_env("SSL_CHAINED_CERT_PATH")
  ]

curl https://sub.example.com/ - подробный результат:

*   Trying 64.225.24.82...
* TCP_NODELAY set
* Connected to sub.example.com (64.225.24.82) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/cert.pem
  CApath: none
* TLSv1.2 (OUT), TLS handshake, Client hello (1):
* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to sub.example.com:443
* Closing connection 0
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to sub.example.com:443

EDIT: я устанавливаю переменные ENV внутри контейнера вручную. Например, в bash:

SSL_KEY_PATH=path/example.key SSL_CERT_PATH=path/example.crt SSL_CHAINED_CERT_PATH=path/example_chained.crt MIX_ENV=prod mix phx.server

Ответы [ 2 ]

0 голосов
/ 11 мая 2020

После нескольких дней поиска, проб и ошибок и спарринга с другими разработчиками. Я решил проблему с помощью прокси-сервера с nginx. Вот конфиги, которые сделали все это возможным!

phoenix - prod.exs

config :example, ExampleWeb.Endpoint,
  http: [port: 5000],
  url: [host: "sub.example.com", port: 5000]

nginx config

upstream phoenix {
  server 0.0.0.0:5000;
}

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

server {
  server_name sub.example.com;
  listen 443 ssl http2;
  listen [::]:443 ssl http2;

  ssl_certificate /etc/nginx/ssl/example_chained.pem;
  ssl_certificate_key /etc/nginx/ssl/example.pem;

  large_client_header_buffers 4 16k;

  location ~ live/websocket {
    proxy_http_version 1.1;
    proxy_set_header Origin '';
    proxy_set_header X-Forwarded-Host $proxy_add_x_forwarded_for;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_ssl_server_name on;
    proxy_pass http://0.0.0.0:5000;
    break;
  }

  location / {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_ssl_server_name on;
    proxy_pass http://0.0.0.0:5000;
    break;
  }
}

Дальнейшее обсуждение найдено здесь:

https://elixirforum.com/t/phoenix-app-in-docker-with-ssl-not-receiving-anything-on-port-443/31229

0 голосов
/ 06 мая 2020

Ваш Dockerfile не указывает MIX_ENV, поэтому он, вероятно, собирается и работает со значением по умолчанию MIX_ENV=dev.

Также не указывается команда, используемая для запуска реального приложения, обычно mix phx.server локально.

Вот пример Dockerfile, который я использовал для локального запуска приложения; не оптимизирован для размера или скорости сборки, и его не следует использовать в производстве (для этого сделайте полную версию микса), но в случае, если это поможет:

FROM elixir:1.10.1-alpine AS dev_img

# Environment
ENV MIX_ENV prod
ENV PORT 4000
ENV SSL_PORT 4001

# Install required system dependencies
RUN apk update; \
  apk upgrade --no-cache; \
  apk add --no-cache libsodium libsodium-dev nodejs npm curl git inotify-tools build-base; \
  mix local.rebar --force; \
  mix local.hex --force

WORKDIR /opt/app
COPY . .

RUN mix do deps.get, compile

RUN cd assets; \
  npm ci; \
  cd ..

ENV PG_DB_PORT 5432
ENV PG_DB_HOST db-container-name
ENV SSL_KEY_PATH
ENV OTHER_VARS

CMD ["mix", "phx.server"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...