На рабочем сервере Elixir Phoenix возникла проблема с продлением Letsencrypt

У меня есть сайт, созданный с помощью фреймворка Elixir Phoenix. Веб-сайт отлично работает как в режиме разработки, так и в режиме производства.

Когда сервер phoenix работает в режиме разработки, у меня нет проблем с обновлением сертификата Let's Encrypt, но когда точно такое же приложение работает в режиме prod, я продолжаю получать ошибку разрешения при попытке обновления. Обратите внимание, что я говорю об точно таком же приложении на том же сервере FreeBSD, выполняемом одним и тем же пользователем — обе команды без sudo. Единственная разница MIX_ENV=prod

Я также заметил, что в режиме prod сервер phoenix регистрирует ошибку 404, когда Letsencrypt пытается получить доступ к моему priv/static/.well-known/acme-challenge/(some-unique-string) Моя базовая настройка для phoenix + letsencrypt подробно описана в этот пост в блоге

Вопрос: как сервер phoenix по-разному обрабатывает права доступа к каталогам/файлам в режимах `prod' и 'dev'?

  • Использование Эликсира 1.2.4 и Феникса 1.1.4

ОБНОВЛЕНИЕ:

Ребята, поскольку платформа LetsEncrypt и Phoenix быстро развиваются, проблема, которую я перечислил выше, больше не является проблемой, если вы используете последнюю версию cerbot от LetsEncrypt и Phoenix 1.2.0.

Однако это не обязательно ответ на исходные вопросы.


person yial2    schedule 13.05.2016    source источник
comment
Phoenix не обрабатывает разрешения по-разному. Проверьте, к каким файлам у вас нет доступа. Я предполагаю, что есть разница в конфигах между prod и dev. Например, в одном из путей к файлу указана ошибка.   -  person tkowal    schedule 14.05.2016
comment
@tkowal Для работы Let's Encrypt мне не нужна какая-либо конфигурация в dev.exs и prod.exs. В /priv/static/.well-known есть папка, к которой Let's encrypt нужен доступ. Когда я работаю в режиме prod, Let's Encrypt не может получить к нему доступ. Забавно то, что я запускаю сервер в режиме dev, чтобы обновить свой сертификат Let's Encrypt, а затем запускаю его в режиме prod. Режим prod обслуживает правильно обновленный сертификат Let's Encrypt, который я получил в режиме dev. Короче говоря, сервер Phoenix может нормально обслуживать сертификат, но НЕ позволяет let's encrypt каким-либо образом обновлять его в рабочем режиме!   -  person yial2    schedule 16.05.2016
comment
Каковы разрешения и владельцы этого файла? Можете ли вы опубликовать ls -al вывод в этом файле?   -  person tkowal    schedule 16.05.2016
comment
@tkowal drwxr-xr-x 3 freebsd freebsd 512 Feb 28 20:05 .well-known, а для папки acme-challenge, к которой, как я полагаю, требуется доступ для шифрования, используется drwxr-xr-x 2 freebsd freebsd 512 May 12 17:16 .acme-challenge. freebsd — это пользователь, который запускает mix phoenix.server как в режиме dev, так и в режиме prod — оба без sudo   -  person yial2    schedule 16.05.2016
comment
Есть ли у вас активные перенаправления в рабочем режиме, которых нет в режиме разработчика?   -  person Lexib0y    schedule 20.05.2016
comment
@Lexib0y Lexib0y в производственном режиме нет активных перенаправлений - единственная разница между dev.exs и prod.exs заключается в том, что у dev.exs есть некоторые настройки перезагрузки в реальном времени.   -  person yial2    schedule 21.05.2016
comment
Можете ли вы в рабочем режиме получить доступ к файлу hello world › ./priv/static/.well-known/XXXYYY.html через браузер?   -  person Lexib0y    schedule 21.05.2016
comment
@ Lexib0y Lexib0y да, я могу добраться до него без проблем. Собственно, вот ссылка, моя ссылка   -  person yial2    schedule 23.05.2016
comment
Привет, ребята, есть новости?   -  person webdeb    schedule 26.05.2016
comment
@webdeb у тебя такая же проблема? Мне пока не повезло решить эту проблему, но я обязательно опубликую здесь ответ, если у меня будет решение.   -  person yial2    schedule 31.05.2016
comment
@ yial2 извините, я еще не готов к развертыванию. Меня просто интересовало как и возможности. Когда я подойду ближе к производственной версии своего приложения, я посмотрю на него глубже, потому что я хотел бы также использовать let's encrypt.   -  person webdeb    schedule 31.05.2016
comment
Я работаю над той же проблемой из той же статьи, и в настоящее время у меня такой же опыт. Я заметил, что когда я запускаю сервер в dev с моим prod.exs, переименованным в dev.exs, certbot работает успешно, а регистратор молчит. Когда я запускаю его в prod с правильным именем prod.exs, маршрутизатор регистрирует запрос GET для /.well-known/acme-challenge/random_file_name. Кто-нибудь знает об опции конфигурации по умолчанию на маршрутизаторе, когда для env установлено значение prod, или это не проблема?   -  person brittonjb    schedule 08.06.2016
comment
@brittonjb просто для двойного подтверждения, регистрировал ли регистратор 404, когда вы запускали его в prod, когда certbot пытается получить доступ к /.well-known/acme-challenge/random_file_name? Возможно, мне придется повторить эту проблему на IRC-канале elixir-lang и посмотреть, сможет ли какая-нибудь мощная пушка пролить свет на наши проблемы.   -  person yial2    schedule 08.06.2016
comment
@ yial2 Я думал о том же. При запуске prod он регистрировал ошибку 404, когда certbot пытался получить доступ к этому файлу. При запуске в dev со всеми скопированными производственными настройками он не 404, он успешно завершен.   -  person brittonjb    schedule 08.06.2016
comment
Возможно, я упрощаю, но не помешает спросить... Вы запускаете MIX_ENV=prod mix compile перед запуском сервера в продакшене (я знаю, что в какой-то момент вы запускали эту команду, но после добавления файла?). Файлы, используемые в производстве, находятся в _build/prod/lib/{yourApp}/priv/static и копируются в эту папку при компиляции проекта. Можете ли вы проверить эту папку, чтобы увидеть, есть ли там файлы и правильные ли разрешения?   -  person Tiago Engel    schedule 23.08.2016
comment
@tiagohngl да, я запустил MIX_ENV=prod mix compile после получения всех сертификатов/файлов Letsencrypt на сервере dev. Я запустил его перед запуском сервера prod. Что касается файлов в разделе _build/prod/lib/{yourApp}/priv/static/.well-known/acme-challenge и _build/dev/lib/{yourApp}/priv/ static//.well-known/acme-challenge Разрешения одинаковые для всех файлов между dev и prod   -  person yial2    schedule 24.08.2016
comment
Я сказал, что добавлю некоторую ценность в это обсуждение, когда проведу свои собственные исследования, файловый подход тоже не сработал для меня, но я справился с этим с помощью маршрута.. посмотрите мой ответ, ребята   -  person webdeb    schedule 03.11.2016
comment
Ребята, поскольку платформа LetsEncrypt и Phoenix быстро развивается, проблема, которую я перечислил выше, больше не является проблемой, если вы используете последнюю версию cerbot от LetsEncrypt и Phoenix 1.2.0. Однако это не обязательно ответ на исходные вопросы.   -  person yial2    schedule 01.03.2017
comment
Я использую Phoenix 1.3.0 и последнюю версию cerbot (полагаю, не могли бы вы поделиться со мной, какую последнюю версию cerbot вы здесь имеете в виду?), и проблема все еще существует. Мне действительно нужно использовать маршрутный подход? Спасибо за ваш совет.   -  person Paul Wang    schedule 14.03.2018
comment
@PaulWang тогда я использовал certbot 0.9.3 - это то, что мне помогло. Я помню, что у более нового certbot есть какой-то пользовательский интерфейс для процесса настройки. Убедитесь, что вы указали правильный путь к файлу .well-know!   -  person yial2    schedule 16.03.2018
comment
@PaulWang в основном webroot_path должен указывать на /[ваше приложение]/priv/static НЕ прямо на файл .well-know   -  person yial2    schedule 16.03.2018
comment
@yial2, спасибо за информацию. Вы правы, с последним церботом и Фениксом больше нет проблем. В моем случае следующие две вещи исправили мою проблему:   -  person Paul Wang    schedule 17.03.2018
comment
В моем случае следующие две вещи исправили мою проблему: 1) в моем файле /etc/nginx/sites-available/deploy-appname мне нужно установить местоположение ~ /priv/static/.well-known { allow all; } 2) в моем .deleliver/config мне нужно сделать символическую ссылку на каталог priv/static, на который указывает letencrypt webroot. (github.com/edeliver/edeliver/issues/215)   -  person Paul Wang    schedule 17.03.2018


Ответы (1)


Я решил это, используя маршрут вместо файла:

scope "/.well-known", MyApp do
   get "/acme-challenge/:challenge", AcmeChallengeController, :show
end

И простой контроллер...

defmodule AcmeChallengeController do
   use MyApp, :controller

   def show(conn, %{"challenge" => "the_random_file_name"}) do
      send_resp(conn, 200, "TheHashInTheFile")
   end

   def show(conn, _) do
      send_resp(conn, 200, "Not valid")
   end
end

Это жестко закодировано, скомпилировано и быстрее, чем отправка файлов, но также можно было бы использовать какое-то хранилище ключей/значений и управлять (добавлять/удалять) вызовами из пользовательского интерфейса без повторного развертывания.

person webdeb    schedule 03.11.2016
comment
Спасибо! Я очень хочу попробовать. Не могли бы вы подробнее рассказать о ""TheHashInTheFile"? Какой файл вы имеете в виду? - person yial2; 08.11.2016