docker-machine(DigitalOcean)を介してデプロイされたdocker-composeでNginxに自動TLS/SSL終了を追加しようとしています。
私はいくつかの素敵なリソースを見つけました[ humankode/how-to-set-up ... 、 medium/nginx-and-lets-encrypt ... ]どのようにdocker-composeを使用して行いますが、どちらもサーバー上にいるという観点から言っています。本当に避けたいです。私は自分のラップトップでローカルにそれを行い、それをすべて一緒にバンドルして送りたいと思っています。または、sshを実行せずにリモートで実行することもできます。
いくつかの試みは失敗しましたが、それらは近いように感じました。主な障害はファイル/ボリュームにあるようです。 medium/nginx-and-lets-encrytp ...ガイドに従って、OpenSSL privkey.pemの保存に問題があります。他のチュートリアル(humankode)は、私の知る限り、サーバー上ですべてを実行し、そこにボリュームが存在します。
私の最新の試みは、 DigitalOceanチュートリアル を使用してマシンに証明書を設定し、それらを私のdocker-composeビルドに含めることです。運が悪い。
多くの変更がありましたが、私の設定は次のようになります。
version: '3.7'
services:
nginx:
image: nginx:1.15.9-Alpine
container_name: nginx
build:
context: ./nginx
dockerfile: Dockerfile
restart: always
volumes:
- /etc/letsencrypt
- /var/www/certbot
ports:
- "80:80"
- "443:443"
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
certbot:
image: certbot/certbot
restart: unless-stopped
volumes:
- "/etc/letsencrypt"
- "/var/www/certbot"
entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"
FROM nginx:1.15.9-Alpine
RUN rm /etc/nginx/conf.d/default.conf
COPY prod.conf /etc/nginx/conf.d/
# PRODUCTION
server {
listen 80;
listen [::]:80;
server_name example.site;
location ~ /.well-known/acme-challenge {
allow all;
root /usr/share/nginx/html;
}
location / {
return 301 https://$Host$request_uri;
}
}
server {
listen 443 ssl;
server_name example.site;
ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
あなたが受け取っているエラーの詳細が必要ですが、基本的にはすべての設定で大体問題ありません。ボリューム部分にエラーの可能性があります。しかし、あなたがいくつかの興味深い質問をしているので、一歩一歩。
ローカルですべてをテストできますが、certbotがインターネットで適切な利用可能なドメインを見つけるため(ローカルではアクセスできないため)、Let'sで自動的に暗号化することはできません(または方法を見つけることができませんでした)と思います。私がやったことは、証明書を生成し(私は証明書を検証しました)、有効な証明書で選択しているlocalhost(またはWindowsの場合はDockerツールボックスIP)を指すドメインでマシンのホストを変更することです。回避策ですが、機能します。
中規模の例では、volumes
は両方のコンテナに対してHost volumes
として作成されます。
volumes:
- ./data/certbot/conf:/etc/letsencrypt
- ./data/certbot/www:/var/www/certbot
つまり、証明書はdocker Hostマシンの./data/certbot/conf
または/path/to/Host
フォルダーに配置する必要があり、それらはコンテナーの/etc/letsencrypt
フォルダーにマップされます。匿名ボリュームを使用しています(以前に使用したときに問題が発生しました)。ボリュームのタイプに関する詳細な説明については、この stackoverflowの質問 を確認してください。
最後に、自動的にhttps
を含む別のより動的なソリューションが必要な場合は、展開を容易にするために、 nginxをリバースプロキシとして使用する方法に関するスタックオーバーフローの回答 を確認できます。 docker compose ELKデプロイメントの例 も利用できます