這篇文章主要是要教大家如何透過 letsencrypt 完成 https🔥
建議閱讀這篇文章之前,先看過以下這篇文章,因為會使用這個範例的 repo。
Docker + Django + Nginx + uWSGI + Postgres 基本教學 - 從無到有
-
Youtube Tutorial PART 1 - Docker + Letsencrypt + Django + Nginx-Proxy + uWSGI 實作教學
-
Youtube Tutorial PART 2 - Docker + Letsencrypt + Django + Nginx-Proxy + uWSGI 實作教學
使用別人的 image ( 站在巨人的肩膀上 😄 ),以下兩個 repo,分別是
docker-letsencrypt-nginx-proxy-companion 以及 nginx-proxy。
非常建議閱讀 ( 也可以玩玩看 ),裡面也有介紹整個原理以及功能,所以這邊
不會再詳細介紹,因為文章內已經非常詳細了。
提供直接可以 run 的 docker-compose 給大家。
目標是在 here 加上 https,這時候就需要搭配 nginx-proxy 以及 docker-letsencrypt-nginx-proxy-companion。
提供兩種方法,一種是統一在同一個 docker-compose 內,詳細請參考 method_1。
version: '3.5'
services:
nginx-proxy:
image: jwilder/nginx-proxy:alpine
restart: always
container_name: nginx-proxy
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- html:/usr/share/nginx/html
- dhparam:/etc/nginx/dhparam
- vhost:/etc/nginx/vhost.d
- certs:/etc/nginx/certs:ro
- ./custom_nginx.tmpl:/app/nginx.tmpl
- ./nginx_log:/var/log/nginx
nginx-proxy-letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
restart: always
depends_on:
- "nginx-proxy"
volumes:
- certs:/etc/nginx/certs
- vhost:/etc/nginx/vhost.d
- html:/usr/share/nginx/html
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
- ACME_CA_URI=https://acme-staging-v02.api.letsencrypt.org/directory
- NGINX_PROXY_CONTAINER=nginx-proxy
- DEFAULT_EMAIL=xxx@xxx.xxx
nginx:
container_name: nginx-container
build: ./nginx
restart: always
volumes:
- api_data:/docker_api
- ./log:/var/log/nginx
depends_on:
- api
environment:
- VIRTUAL_HOST=twtrubiks.com.tw
- VIRTUAL_NETWORK=nginx-proxy
- VIRTUAL_PORT=80
- LETSENCRYPT_HOST=twtrubiks.com.tw
- LETSENCRYPT_EMAIL=xxxx@gmail.com
......
以下稍微說明一下,首先是 ACME_CA_URI=https://acme-staging-v02.api.letsencrypt.org/directory
,
這個的目的就是測試用 ( staging ),詳細以及一些限制可參考 Staging Environment,
建議可以先用這個測試,確認沒問題之後,再把它註解掉 ( 正式機 )。
接下來說明,
environment:
- VIRTUAL_HOST=twtrubiks.com.tw
- VIRTUAL_NETWORK=nginx-proxy
- VIRTUAL_PORT=80
- LETSENCRYPT_HOST=twtrubiks.com.tw
- LETSENCRYPT_EMAIL=xxxx@gmail.com
這邊先假設你的主機 ip 是 123.456.789,請先去幫他加上一個 domain,例如,我今天的 domain 是 twtrubiks.com.tw,
就把他分別設定到 VIRTUAL_HOST 以及 LETSENCRYPT_HOST,LETSENCRYPT_EMAIL 則填上自己的 e-mail.
如果想要把 nginx log 同步到本機, 直接加上 ./nginx_log:/var/log/nginx
即可.
如果想要修改 nginx log 的格式, 請直接到 custom_nginx.tmpl 底下修改,
然後在 docker-compose.yml
加上,
- ./custom_nginx.tmpl:/app/nginx.tmpl
即可.
原始的 nginx.tmpl 可到這裡查詢.
修改 my_nginx.conf
加上一個位置, 並且指定你的 html 路徑
location /test {
root /usr/share/nginx/html;
index index.html;
}
之後將你的 html 放入 /usr/share/nginx/html/test
即可,
最後重啟 nginx, 瀏覽 https://twtrubiks.com.tw/test/
就會看到你的 html.
直接執行即可
docker-compose up
如果設定都正確,你可以點選 https://twtrubiks.com.tw 會正常 work。
( 如果出現不安全,代表有問題 )
另一種方式是分成兩個 docker-compose,其中一個 docker-compose 是 nginx-proxy 以及 docker-letsencrypt-nginx-proxy-companion,
另一個 docker-compose 則是 here。
這邊你可能會問我,明明一個 docker-compose 能解決的事情,為什麼要拆成兩個 docker-compose:question:
原因是這種方法比較有彈性,如果我今天要加新的 docker container ( 加到 docker-compose 內 ),
可以直接另外寫一個 docker-compose,然後直接 run,nginx-proxy 以及 docker-letsencrypt-nginx-proxy-companion 會自動偵測
到這些 container,這樣就不用把原本的先停止 ( docker-compose down ),也比較好管理,不會一堆東西都塞在一起。
但這方法要多注意 networks 的部分,建議可先參考 docker-compose networks 說明 了解一下觀念。
開始介紹,詳細請參考 method_2,裡面有兩個 docker-compose,
docker-compose-nginx-proxy.yml,主要是 nginx-proxy 以及 docker-letsencrypt-nginx-proxy-companion。
version: '3.5'
services:
nginx-proxy:
image: jwilder/nginx-proxy:alpine
......
networks:
- proxy
nginx-proxy-letsencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
....
networks:
- proxy
....
networks:
proxy:
name: self-nginx-proxy
這邊要注意 networks
的部分,我自己建立的名稱為 self-nginx-proxy,如果其他 container 要連接,
都設定為同一個 networks 即可 ( self-nginx-proxy )。
docker-compose.yml,主要是 Django + Nginx + uWSGI + Postgres。
version: '3.5'
services:
nginx:
container_name: nginx-container
...
networks:
- proxy
depends_on:
- api
environment:
- VIRTUAL_HOST=twtrubiks.com.tw
- VIRTUAL_NETWORK=nginx-proxy
- VIRTUAL_PORT=80
- LETSENCRYPT_HOST=twtrubiks.com.tw
- LETSENCRYPT_EMAIL=xxxx@gmail.com
api:
container_name: api-container
....
networks:
- proxy
...
...
...
networks:
proxy:
external:
name: self-nginx-proxy
一樣注意 networks 的部分,這邊多了 external
,代表說我要用外部的 networks,如果找不到會報錯。
先執行
docker-compose -f docker-compose-nginx-proxy.yml up
( 這個方法是指定 docker-compose )
再執行
docker-compose up
如果設定都正確,你可以點選 https://twtrubiks.com.tw 會正常 work。
( 如果出現不安全,代表有問題 )
也可以進去 docker-letsencrypt-nginx-proxy-companion 的容器中,找到 start.sh,
執行 ./start.sh
測試 https。
letsencrypt 的 challenge 有很多種方式,在這裡是使用 HTTP-01 challenge,其他
的 challenge 方式可參考 challenge-types。
之前剛好碰上要自己建立 https,上網研究了一番,最後選擇這個,也建議大家可以看一下
原理,這篇也算是紀錄,以後需要 https,就直接拿這份 docker-compose 改一改即可。
文章都是我自己研究內化後原創,如果有幫助到您,也想鼓勵我的話,歡迎請我喝一杯咖啡:laughing:
MIT license