Docker快速部署ownCloud并配置HTTPS

前言


ownCloud一直是市场上最受欢迎的个人云存储解决方案之一,有着使用广泛、客户端兼容性好、自由开源等优点。但ownCloud的部署涉及LAMP环境,部署过程较为繁琐。这篇文章介绍如何用docker-compose快速部署ownCloud,并配置Nginx转发+HTTPS提高服务器安全性。

配置docker-compose

以下部分内容来自ownCloud官方安装文档

首先,下载官方docker-compose文件,并创环境变量文件用以指定ownCloud版本、账户密码和HTTP端口。

1
2
3
4
5
6
7
8
9
10
$ mkdir owncloud-docker-server
$ cd owncloud-docker-server
$ wget https://raw.githubusercontent.com/owncloud/docs/master/modules/admin_manual/examples/installation/docker/docker-compose.yml
$ cat << EOF > .env
OWNCLOUD_VERSION=10.3
OWNCLOUD_DOMAIN=localhost
ADMIN_USERNAME=admin
ADMIN_PASSWORD=admin
HTTP_PORT=8080
EOF

从下载下来的docker-compose.yml文件里可以看出,ownCloud共有三个docker服务:ownclouddbredis,这三个docker服务都将创建独立的docker数据卷,将各自的数据文件持久化到数据卷里。

1
2
3
4
5
6
7
8
9
10
11
12
version: '2.1'

volumes:
files:
driver: local
...
services:
owncloud:
...
volumes:
- files:/mnt/data
...

我个人更习惯将ownCloud的数据保存目录指定为某个具体文件夹,方便我进行管理。所以我对docker-compose.yml做如下改动:

1
2
3
4
5
6
7
8
9
10
11
12
13
version: '2.1'

volumes:
# files:
# driver: local
...
services:
owncloud:
...
volumes:
# - files:/mnt/data
- /path/to/my/data/owncloud:/mnt/data
...

用docker-compose启动ownCloud

启动ownCloud的命令很简单,只需让docker-compose按照配置好的docker-compose.yml启动容器。第一次运行需要拉取镜像,只需耐心等待即可。

1
$ docker-compose up -d

命令执行完成后可以通过docker-compose命令查看拉取的镜像和服务运行状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ docker-compose images
Container Repository Tag Image Id Size
-------------------------------------------------------------------------
owncloud_db_1 webhippie/mariadb latest 3f6237885724 626 MB
owncloud_owncloud_1 owncloud/server 10.3 b7c82576c651 785 MB
owncloud_redis_1 webhippie/redis latest 42ab00c664c2 56.4 MB

$ docker-compose ps
Name Command State Ports
--------------------------------------------------------------------------------------------
owncloud_db_1 /usr/bin/entrypoint /bin/s ... Up (healthy) 3306/tcp
owncloud_owncloud_1 /usr/bin/entrypoint /usr/b ... Up (healthy) 0.0.0.0:8080->8080/tcp
owncloud_redis_1 /usr/bin/entrypoint /bin/s ... Up (healthy) 6379/tcp

此时也可以用curl来验证服务是否启动:

1
2
3
4
5
$ curl 127.0.0.1:8080 -I
HTTP/1.1 302 Found
Date: Mon, 16 Dec 2019 03:14:55 GMT
Server: Apache
...

配置Nginx转发+HTTPS

Nginx+HTTPS的配置不算麻烦,只要在Nginx的配置文件(比如/etc/nginx/sites-available/default)中添加一个server项即可。在这里的配置中,我让Nginx在8000端口上启动HTTPS服务,并将所有请求以HTTP方式转发至8080端口上的ownCloud。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 8000 ssl;
server_name owncloud;

ssl_certificate /etc/nginx/ssl/owncloud.crt;
ssl_certificate_key /etc/nginx/ssl/owncloud.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;

client_max_body_size 0;

location / {
proxy_set_header Host $host:8000;
proxy_redirect http:// https://;
proxy_pass http://127.0.0.1:8080/;
}
}

配置时有一些需要注意的地方。

  • client_max_body_size项,其默认的值为1m,也就是说Nginx最大只能接受1M大小的HTTP请求,这对于ownCloud的文件上传功能来说是不可接受的。在这里我将其设为0,让Nginx不限制HTTP请求的大小。理论上来说这个参数应该限定在文件上传的url以提高安全性,但这里就图个方便。
  • location中的proxy_set_header项,将请求转发头的Host设置为Nginx的Host($host:8000)而不是ownCloud的Host($host:8080),避免ownCloud在响应重定向时返回8080端口地址。
  • location中的proxy_redirect项,将所有重定向响应中的HTTP地址转换为HTTPS地址。

当然,在配置了以上转发规则后,ownCloud的响应还是存在一些问题:网页上的注销链接地址没有加上HTTPS前缀,导致点击后出现400错误,需要手动将地址前缀改成https://才能顺利注销。这个就属于ownCloud本身的BUG了。

结语

个人云存储的优势在公共云存储商家不断倒闭之后逐渐显现出来了。如果有使用个人云存储服务的需求,ownCloud无疑是一个值得尝试的选择。不管是局域网内部使用、公网IP宽带+DDNS、内网穿透,还是VPS(包括低价大带宽的NAT VPS),HAVE FUN and ENJOY。


Docker快速部署ownCloud并配置HTTPS
https://www.yooo.ltd/2019/12/16/Docker快速部署ownCloud并配置HTTPS/
作者
OrangeWolf
发布于
2019年12月16日
许可协议