- 发布于
Docker 搭建私有云 Nextcloud
- 作者
- 姓名
前言
本文是 Docker 系列的第二篇,对之前发布的 Nextcloud 搭建教程进行了修改和完善并重新发布。
本文要实现的目标是快速搭建一个配置好 SSL 证书的 Nextcloud 服务器,不占用主机443端口,非常适合建站的朋友在主站之外使用诸如cloud.domain.com
的子域名为自己搭建云存储服务,用于小范围的快速文件分享或者个人文件存储。
网络上有很多 Nextcloud 搭建方法,本文完全采用 Nextcloud 官方提供的 docker-compose 方式,搭建完成后使用 nginx 配置端口转发及 SSL 证书。
搭建完成体验地址:点击访问 用户名 guest 密码 Guest12345
搭建方法
Docker Hub上有很多 Nextcloud 的镜像,经过试用,最终选择了官方镜像。
Nextcloud 的官方 Github 页面有着详细的使用说明,并提供了多样化的选择,可以查看这个页面并根据自己的需求选择使用。
官方 Github 页面上提供的 docker-compose 文件很完善,基本无须任何修改,我们就可以在我们的服务器上搭建起 Nextcloud 服务。本文中使用的是insecure/mariadb-cron-redis/fpm/
目录下的docker-compose文件,地址在这里。
选择 insecure, 是因为自动配置SSL容易出错,并且如果不把容器 443 端口直接映射到主机443 端口,仍然需要其他 Web 服务器进行端口转发,而进行转发的 Web 服务器同样需要配置 SSL。
具体步骤如下:
将官方提供的 docker-compose 文件下载到服务器
由于 git 无法通过 git clone
下载单个文件夹,我们通过 wget 结合文件原始地址逐一下载,具体方式是——在本地新建对应的文件夹,进入文件夹后,wget+ 对应文件夹中文件链接,具体步骤如下:
mkdir -p ~/docker/docker-compose/nextcloud
cd ~/docker/docker-compose/nextcloud
mkdir web
cd web
wget https://raw.githubusercontent.com/nextcloud/docker/master/.examples/docker-compose/insecure/mariadb-cron-redis/fpm/web/Dockerfile
wget https://raw.githubusercontent.com/nextcloud/docker/master/.examples/docker-compose/insecure/mariadb-cron-redis/fpm/web/nginx.conf
cd ..
wget https://raw.githubusercontent.com/nextcloud/docker/master/.examples/docker-compose/insecure/mariadb-cron-redis/fpm/db.env
wget https://raw.githubusercontent.com/nextcloud/docker/master/.examples/docker-compose/insecure/mariadb-cron-redis/fpm/docker-compose.yml
其中具体文件的下载地址,可以通过在 Github 该文件页面,点击 Raw 之后获得
使用 docker-compose BUILD 镜像并运行
完成上面的操作后,我们就已经将整个官方提供的 docker-compose 示例复制到了我们的服务器上,我们只需将配置文件中的内容补全,之后 BUILD 后运行即可,要修改的地方共有两处:
因为下面的操作我们需要使用 docker-compose,如果提示未安装,请先进行安装:
sudo apt-get update
sudo apt-get install docker-compose
之后BUILD镜像并运行:
docker-compose build --pull
docker-compose up -d
这里需要注意,可能会提示 version 错误,根据使用的 Docker 版本不同,可能需要将 docker-compose.yml 第一行的
version: '3'
改为version: '2'
,关于 version 的使用可以参考官方文档。
所有容器正常运行,此时访问http://服务器IP:8080
就可以进入Nextcloud界面,此时创建一个用户就可以进入Nextcloud文件管理界面。
通过 Portainer 中的 Logs 可以看到容器运行正常,数据库连接正常,我们已经可以正常上传下载分享文件,但关键的工作还未完成,主要包括:
- 申请 SSL 证书
- 修改 nginx 配置文件实现端口转发及 HTTPS 访问
申请 SSL 证书
HTTPS 取代 HTTP 是大势所趋,随着 Let's Encrypt 等免费 SSL 证书的出现,越来越多的网站开始为自己加上一把小锁,安全之外还多一份美观,既然免费,我们怎么有理由拒绝,本部分将使用 Cerbot 来申请 Let's Encrypt 提供的免费通配符证书。
获取 Certbot 客户端
使用 wget 获取 Cerbot客户端:
wget https://dl.eff.org/certbot-auto
增加可执行权限:
chmod a+x certbot-auto
申请证书
之后执行以下命令即可开始申请免费SSL证书:
./certbot-auto certonly -d "*.betas.me" --manual --preferred-challenges dns-01 --server https://acme-v02.api.letsencrypt.org/directory
注意将betas.me
替换成你的域名。
根据提示填写即可,最后一步需要到你的域名管理页面添加一个TXT类的解析,Host名名是_acme-challege,值为下面一行所提供的:
去你的域名管理页面添加即可,添加后请稍等片刻待DNS生效即可,经测试一般几分钟就可以,之后点击回车确认即可,如果正确添加了 TXT 解析值,就会提示 SSL 证书申请成功。
可以看到 SSL 证书保存在 /etc/letsencrypt/live下,但要注意的是live下保存的实际上是软连接,原文件位置是在/etc/letsencrypt/archive文件夹下,如果我们直接绑定/etc/letsencrypt/live到容器,容器将会因无法找到链接文件而报错,所以我直接将/etc/letsencrypt目录绑定到容器。
替代选择:通过网页手动申请 SSL 证书
如果你运行 Certbot 出错或者其他原因无法申请成功,可以前往 Freessl 进行申请,可以选择 TrustAsia 提供的一年免费的单域名证书或者 Let's Encrypt 提供的三个月通配符证书。
证书申请完成后,因所有证书文件均为纯文本内容,可通过在服务器新建对应文件后,复制文件内容的形式将证书复制至服务器,也可以通过 FTP 方式复制至服务器。
配置 SSL
在部署 Nextcloud 服务时,已经包含了一个 nginx 容器,完全可以通过将该 nginx 的配置文件绑定主机文件并进行修改来实现HTTPS访问,但这种情况下,一般需要将容器内的443端口直接映射到主机443端口,否则访问时必须以https://域名:端口号
的形式,还是需要主机内其他Web服务器进行端口转发。
所以,我推荐不通过 Nextcloud 中的 nginx 配置 HTTPS,而是直接通过在主机内再运行一个 nginx(当然你也可以选择其他Web服务器),并直接在该 nginx 内进行 HTTPS 配置以及端口转发。
配置 Nextcloud 容器外 nginx 端口转发
大部分读者在架设 Nextcloud 之前 已经部署过其他服务,一般也已经安装了 nginx 等 Web 服务器,443端口已经处于被占用状态,所以通过上一部分的做法时不得不通过增加端口号来访问,最后还是需要在容器外增加端口转发,所以我建议直接使用本部分的方法。
Nextcloud 容器外既可以是非 Docker 环境的 nginx 也可以是 Docker 环境中的另一个 nginx ,这里我们同样采用容器,我们要实现的目标是将 http://服务器IP:8080 转发到https://cloud.betas.me。
如果你已经搭建过 nginx 服务,请直接参考修改 nginx 配置文件即可。
如果你还未搭建 nginx 服务,可以通过 Docker 创建一个新的 nginx 容器,请注意以下目录绑定根据实际情况修改:
请参考本博客的这篇文章
docker run -d --name nginx \
-v /root/docker/nginx:/etc/nginx \
-v /root/wwwroot:/usr/share/nginx/html \
-v /etc/letsencrypt:/etc/letsencrypt \
-p 80:80 \
-p 443:443 \
nginx
之后我们在 /root/docker/nginx/conf.d 目录下新建一个cloud.域名.conf 文件,内容如下:
server {
listen 443 ssl http2;
server_name cloud.betas.me;
ssl_certificate /etc/letsencrypt/live/betas.me/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/betas.me/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/betas.me/chain.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4:!DH:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 30m;
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://服务器IP:8080;
}
}
之后重启 nginx 容器,即可实现通过https://cloud.betas.me 访问 Nextcloud服务:
其他配置
在完成 Nextcloud 服务搭建后,我们发现存在几个问题:
- 无法上传较大文件
- 在 Nextcloud 管理后台中的管理-概览中出现警告:
下面我们解决这两个问题:
修改 nginx 配置以上传大文件
上传文件大小限制,主要由 nginx 配置文件中的client_max_body_size
的值决定,其默认值为 1M,我们根据需求调整其大小:
直接修改 nginx 配置文件目录下的 nginx.conf 文件,增加如上图所示红色内容:
server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8000m;
各项的值可以根据需求修改。
之后重启 docker 镜像即可:
docker restart nginx
解决后台警告
我们需要修改之前添加的cloud.域名.conf
文件,增加两条规则:
location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
将以上内容添加至 cloud.域名.conf
文件下的 server 部分即可。
添加完成后重启 nginx 容器:
docker restart nginx
再去后台查看,警告已经消失。