安裝完Nextcloud以後,下一步就是啓用https了。在不使用Docker的時候,通常都是去服務器(如apache)裏面啓用https功能並添加證書,可是我在 https://hub.docker.com/_/nextcloud 下面的介紹裏面並無發現相關的說明,相反那兒卻給出了使用 nginx-proxy 和docker-letsencrypt-nginx-proxy-companion 進行反向代理的方式。這種方式使用nginx-proxy創建一個代理服務器,自動查詢docker內部的容器並轉發請求,並且配合letsencrypt自動申請和續期證書。php
這種方式看起來挺牛逼的,能夠對多個容器進行代理,省去了一個一個配置https的麻煩,這麼好的東西,開幹啊!python
固然事情不可能那麼順利,前面有坑在等着呢。nginx
https://github.com/nextcloud/docker/tree/master/.examples 上面說要用docker-compose來安裝,那麼就安裝吧。安裝方法有不少種,有到github上面下載的,有用python安裝pip後在安裝的。其實,用ubuntu的話,直接經過下面一條命令就能夠了。git
順便查了下docker-compose,實際上是用來管理多個鏡像的,把原來須要一個個須要手動啓動配置的容器操做簡化了。而後看了下 jwilder/nginx-proxy 和jrcs/docker-letsencrypt-nginx-proxy-companion。前面的一大堆說明都還好,操做起來應該沒問題,可是後面的一看就有問題了,github
Requirements:
須要公網80和443端口,這就坑爹了,看來免費的ssl證書無法用了。(有公網IP的能夠按照文檔繼續試試,反正到這步我就停了)web
以前在阿里雲買了個域名,能夠申請一個免費證書,可是隻是二級域名的,那就使用這個證書看看能不能在nginx-proxy中使用。docker
若是能夠申請多個二級證書或者*.domain.com類型的證書,能夠實現https://a.domain.com,https://a.domain.com這樣的訪問,域名和容器一一對應;若是隻有一個二級證書,那麼只能實現https://a.domain.com,可是能夠在後面添加路徑,而後藉助nginx-proxy代理到不一樣的容器上面,即https://a.domain.com/nextcloud,https://a.domain.com/wordpress。apache
既然沒法使用let's encrypt申請證書,那麼就只能直接使用nginx-proxy來進行代理了。拉取鏡像啓動容器,直接用portainer或者命令行就好了,不必用docker-compose了。ubuntu
這樣僅僅是啓動了http代理,並無啓動https,啓動https須要另外進行如下操做,服務器
接下來進行代理配置,修改nginx的配置文件,映射自定義的proxy.conf到/etc/nginx/proxy.conf,配置裏面主要是添加https支持,以及主機映射。
因此,最終nginx-proxy的配置應該是這樣的
爲了讓nginx-proxy找到代理對象,須要在建立容器的時候添加環境變量,如VIRTUAL_HOST=nextcloud.bar.com,下面是nextcloud的配置。
通過上述配置,nginx-proxy應該已經能夠正常進行https代理了,可是對於nextcloud還須要進行額外的設置。
編輯/nextcloud/config/config.php文件,
'trusted_domains' 中添加域名foo.bar.com
trusted_proxies 中添加代理地址
'overwriteprotocol' => 'https'
'overwritewebroot' => '/nextcloud'
最後,看看效果圖
sudo apt install docker-compose80443jwilder/nginx-proxy docker run -d -p 80:80 -v /var/run/docker.sock:/tmp/docker.sock:ro jwilder/nginx-proxy# HTTP 1.1 support proxy_http_version 1.1; proxy_buffering off; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $proxy_connection; 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 $proxy_x_forwarded_proto; proxy_set_header X-Forwarded-Ssl $proxy_x_forwarded_ssl; proxy_set_header X-Forwarded-Port $proxy_x_forwarded_port; # Mitigate httpoxy attack (see README for details) proxy_set_header Proxy ""; server { server_name foo.bar.com; listen 443 ssl http2 ; access_log /var/log/nginx/access.log vhost; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:!DSS'; ssl_prefer_server_ciphers on; ssl_session_timeout 5m; ssl_session_cache shared:SSL:50m; ssl_session_tickets off; ssl_certificate /etc/nginx/certs/foo.bar.com.crt; ssl_certificate_key /etc/nginx/certs/foo.bar.com.key; add_header Strict-Transport-Security "max-age=31536000" always; location /nextcloud/ { proxy_pass http://nextcloud.bar.com/; } }