Я использую docker-compose для приложения rails для приложения и контейнера db. Чтобы проверить некоторые функции приложения, мне нужен SSL ... так что я собираюсь с LetsEncrypt против самозаверяющего.LetsEncrypt в контейнере приложения Docker (docker-compose) не работает
Приложение использует Nginx, и сервер убунту 14.04 LTS, с Phusion пассажирской Docker изображения в качестве базового изображения (легкая DEBiAN)
Обычно с LetsEncrypt, я бегу обычный ./certbot-auto certonly --webroot -w /path/to/app/public -d www.example.com
Мой сервер запускает nginx (прокси-сервер, передающий приложение в контейнер), поэтому я прыгнул в контейнер, чтобы запустить команду certbot без проблем.
Однако, когда я пытаюсь перейти на https://test-app.example.com, он не работает. Я не могу понять, почему.
Ошибка на сайте (Chrome):
This site can’t be reached
The connection was reset.
Curl дает немного лучше ошибку:
curl: (35) Unknown SSL protocol error in connection to test-app.example.com
сервер Nginx Nginx приложение app.conf
upstream test_app { server localhost:4200; }
server {
listen 80;
listen 443 default ssl;
server_name test-app.example.com;
# for SSL
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam /etc/ssl/dhparam.pem;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-blahblahblah-SHA';
location/{
proxy_set_header Host $http_host;
proxy_pass http://test_app;
}
}
контейнера .conf
server {
server_name _;
root /home/app/test/public;
ssl_certificate /etc/letsencrypt/live/test-app.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/test-app.example.com/privkey.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_dhparam /etc/ssl/dhparam.pem;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-RSA-blahblah-SHA';
passenger_enabled on;
passenger_user app;
passenger_ruby /usr/bin/ruby2.3;
passenger_app_env staging;
location /app_test/assets/ {
passenger_enabled off;
alias /home/app/test/public/assets/;
gzip_static on;
expires +7d;
add_header Cache-Control public;
break;
}
}
В моей Dockerfile, у меня есть:
# expose port
EXPOSE 80
EXPOSE 443
В моей докер-compose.yml файл у меня есть:
test_app_app:
build: "."
env_file: config/test_app-application.env
links:
- test_app_db:postgres
environment:
app_url: https://test-app.example.com
ports:
- 4200:80
И docker ps
он показывает, как :
Up About an hour 443/tcp, 0.0.0.0:4200->80/tcp
Я теперь подозреваю, что это потому, что сервер nginx сервера - «front-front» server - не имеет сертификатов, но я не могу запустить команду LetsEncrypt без местоположения приложения.
Я попробовал запустить команду LetsEncrypt на сервере, но, поскольку я предположительно обнаружил порт 80, я получаю следующее: socket.error: [Errno 98] Address already in use
Я что-то пропустил?
Что мне делать?
спасибо @ nick-burke, я сделаю простое решение (поскольку это действительно тестовое приложение, которое не будет продолжаться даже 90 дней), хотя после прочтения остальной части вашего сообщения это звучит как покупка сертификата возможно, будет лучшим вариантом. то nginx хост-сервера может правильно разобраться в деталях и до сих пор иметь контейнер докеров без особых проблем. (к сожалению, нам нужно использовать докер - я лично не выбрал бы его, но это то, как печенье рухнуло). надеюсь, простое решение работает! –
@rbatta Мне действительно очень нравится докер, просто нужно знать, что это сильные и слабые стороны. Я использую Lets Encrypt for - это среды разработки или среды тестирования по требованию.Таким образом, у вас нет средств для запроса или вы можете перехватить запрос на $$, чтобы присвоить реальный сертификат. –
К сожалению, простое решение не сработало. Но, поговорив с руководством по работе с клиентами, я пропустил простейшее их решение ... просто копируя сертификаты SSL для хост-сервера, чтобы узнать об этом. –