用于管理docker环境的Portainer的使用方法

85 阅读2分钟

Let's Encrypt Wildcard Cert

我写这篇文章更多的是作为自己的文档,因为我有几个域,我经常把它们作为某些事情的游乐场。这可能是一个kubernetes环境或一个docker集群,我在其中部署了几个应用程序,但不想为我部署的每个应用程序建立一个nginx站点。

最近,我发现了用于管理docker环境的Portainer。可以把它看作是kubernetes-lite。这并不适合任何类型的生产用例,但对于在家管理本地的docker实例确实有一些好处。

Let's Encrypt Wildcard Cert

所以在这个例子中,我们有一个请求从443进来。这个请求可能使用的是域名c1.mydomain.com ,还有一个请求可能来自c2.mydomain.com

以前,你会为这两个子域准备一个证书,并需要为每个子域设置适当的端口转发到相应的服务器。这是一个巨大的痛苦,所以,这就是通配符证书可以派上用场的地方。

在这个特定的情况下,我有一个nginx代理,它将被用来路由所有进入我的网络的流量。这很方便,因为我可以使用这个反向代理进行SSL终端,也可以根据域名将流量路由到各种服务器。这不一定是一个强大的服务器。你甚至可以使用Raspberry Pi来路由这些流量。同样,这是为家庭服务器准备的,并不是真正的生产级。

你将需要一些先决条件。而且我还使用CloudFlare的DNS来处理这些通配符域名。这很好,因为certbot和cloudflare发挥得很好,通过他们的API自动验证挑战。

apt install certbot letsencrypt python3-certbot-dns-cloudflare

如果你已经安装了certbot和必要的扩展,你可以简单地运行这个脚本来获得一个通配符证书。

sudo certbot certonly \
     --cert-name mydomain.com \
     --dns-cloudflare \
     --dns-cloudflare-credentials /etc/letsencrypt/cloudflareapi.cfg \
     --server https://acme-v02.api.letsencrypt.org/directory \
     -d "*.mydomain.com" \
     -d mydomain.com

所以,现在我们可以配置nginx代理来接收来自这个域名的任何请求,并将其转发给我的docker主机。

server {
  server_name *.mydomain.com;
  server_name ~^(?<subdomain>.+)\.mydomain\.com$;
  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  # proxy_next_upstream error timeout http_502;
  location / {
    proxy_pass http://DOCKER_HOST_IP_ADDRESS;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_buffering off;
  }
  listen 443 ssl;
  ssl_certificate /etc/letsencrypt/live/mydomain.com/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/mydomain.com/privkey.pem;
  include /etc/letsencrypt/options-ssl-nginx.conf;
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
}

server {
  return 301 https://$host$request_uri;
  listen 80 ;
  listen [::]:80 ;
  server_name *.mydomain.com;
  server_name ~^(?<subdomain>.+)\.mydomain\.com$;
}