前言
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服务:owncloud
、db
、redis
,这三个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:
... services: owncloud: ... volumes:
- /path/to/my/data/owncloud:/mnt/data ...
|
用docker-compose启动ownCloud
启动ownCloud的命令很简单,只需让docker-compose按照配置好的docker-compose.yml
启动容器。第一次运行需要拉取镜像,只需耐心等待即可。
命令执行完成后可以通过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。