## 前言
本文主要描述如何快速搭建一个私有云盘,[Nextcloud](https://nextcloud.com/) 是 GitHub 上的一个开源项目,本文参考 [GitHub文档](https://github.com/nextcloud/docker) 使用 Docker 来部署 Nextcloud。
在安装 Nextcloud 时选用 MySQL 和 Redis 作为数据库,不使用默认的数据库。
## Docker 配置
配置国内仓库地址提高下载镜像的速度,修改配置文件 `/etc/docker/daemon.json`,没有就新建该文件,添加如下配置(我这里配置了多个地址):
```json
{
"registry-mirrors": [
"https://3laho3y3.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"https://mirror.ccs.tencentyun.com"
]
}
```
保存之后重启 docker
```
$ systemctl restart docker
```
## 安装 MySQL
拉取镜像(最新版)
```
$ docker pull mysql
```
创建持久化数据目录,表示 mysql 运行数据放在这个目录下: `/home/mysql/data`
```
$ cd home
$ mkdir mysql
$ mkdir data
```
启动容器并指定持久化目录、指定root密码、端口映射
```
$ docker run -d -p 3306:3306 \
--privileged=true --name mysql \
-v /home/mysql/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=123456 \
mysql
```
解释以上命令及参数的含义:
> docker run : 创建一个容器并运行
> -d : 后台运行容器,并返回容器ID
> -p : 端口映射,格式为:主机(宿主)端口:容器端口
> --privileged : 设置为 true 时,容器内root拥有宿主机的root权限
> --name : 为容器指定一个名称
> -v : 目录映射,格式为:主机(宿主)目录:容器目录,通过该参数可以将数据持久化到指定的宿主机目录下,容器重启时数据不会丢失
> -e : 设置环境变量,这里设置数据库root账号的密码为123456
数据库测试连接通过即可
## 安装 Redis
同样拉取镜像,创建持久化数据目录:`/home/redis/data`
如果需要 redis 配置文件可以通过以下命令获取:
```
$ wget -P /home/redis http://download.redis.io/redis-stable/redis.conf
```
启动容器指定配置文件启动、持久化目录、密码(可以不设置)
```
$ docker run -d -p 6379:6379 \
--privileged=true --name redis \
-v /home/redis/redis.conf:/etc/redis/redis.conf \
-v /home/redis/data:/data \
redis redis-server /etc/redis/redis.conf --appendonly yes --requirepass 'redis6379'
```
## 安装 Nextcloud
```
$ docker run -d -p 8088:80 \
--name nextcloud \
--restart=always \
-v /home/nextcloud/html:/var/www/html \
-v /home/nextcloud/apps:/var/www/html/custom_apps \
-v /home/nextcloud/config:/var/www/html/config \
-v /home/nextcloud/data:/var/www/html/data \
-v /home/nextcloud/theme:/var/www/html/themes \
--link mysql:mysql \
--link redis:redis \
nextcloud
```
解释以上命令及参数的含义:
> --link 连接到已安装的容器,使用该参数后可以直接将 mysql 和 redis 作为主机名
## 初始化配置
通过 docker 启动后,在浏览器输入 `http://ip:8088/` 进入初始设置界面,依次设置以下内容:
1、创建管理员账号,设置管理员账号和密码即可。
2、数据目录,不需要改动。
3、配置数据库,选择 MySQL/MariaDB,分别输入:
- 用户名:mysql 的用户名,即 root
- 密码:root 账号的密码
- 数据库名:nextcloud
- 主机:这里需填写 mysql,因为在 docker 启动命令中指定了 --link mysql:mysql
4、点击安装完成(稍等一会儿即可进入登录界面)
## 优化
在 `config.php` 配置文件中加入如下配置(对应安装时映射路径,文件在 `/home/nextcloud/config` 下)
```
'memcache.local' => '\OC\Memcache\Redis',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
'host' => 'redis',
'port' => 6379,
'password' => 'redis6379'
),
```
----
通过以上步骤即可完成 Nextcloud 安装,通过管理员账号登录后可以进行自定义配置和插件的安装,下面记录如何配置 https 和 nginx 反向代理。
## 配置 HTTPS
1、nginx 配置
在 nginx 目录新建一个自定义配置文件目录 `myconf` ,完整路径为 `/home/nginx/nginx-1.16.1/conf/myconf` 。
在该目录下新建一个配置文件 `nextcloud.conf`,内容如下:
```nginx
server {
listen 80;
server_name 自己的域名例mycloud.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl;
server_name 自己的域名例mycloud.com;
// 证书相关
ssl_certificate /home/nginx/ssl/4834759_mycloud.com.pem;
ssl_certificate_key /home/nginx/ssl/4834759_mycloud.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Robots-Tag none;
add_header X-Download-Options noopen;
add_header X-Permitted-Cross-Domain-Policies none;
add_header Strict-Transport-Security "max-age=15768000";
location = /.well-known/carddav {
return 301 $scheme://$host/remote.php/dav;
}
location = /.well-known/caldav {
return 301 $scheme://$host/remote.php/dav;
}
client_max_body_size 512M;
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 3;
gzip_min_length 1024;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
location / {
proxy_buffering off;
proxy_set_header Host $http_host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
// 本机 nextcloud 服务的端口为 8088
proxy_pass http://localhost:8088;
}
}
```
文件中域名、证书、nginx 代理的 ip 和端口都需要配置为实际的值。
在 `nginx.conf` 将 `nextcloud.conf` 文件引入
```nginx
http {
include mime.types;
// nextcloud 配置文件的相对路径
include myconf/nextcloud.conf;
default_type application/octet-stream;
...
```
2、Nextcloud 配置
在 `config.php` 配置文件添加自己的域名和协议为 https
```php
'trusted_domains' =>
array (
0 => 'localhost',
1 => '个人的域名',
),
'overwriteprotocol' => 'https',
```
通过以上配置后,就可通过域名访问 Nextcloud。

Docker 部署 Nextcloud,快速搭建私有云盘