用Docker搭建企业私有云盘NextCloud
前言
本文涉及的操作系统、软件平台和其他环境如下:
- 云盘服务器
- CentOS 7
- WD红盘/阵列盒(可选)
- 所在网络需要有公网IP
- Docker CE
- Docker Compose
- Nginx with SSL
- 阿里云
- DNS
- CA证书
一、安装Docker
1.1 关闭selinux
如果没有专业的运维,建议关闭selinux,以免后续配置引起冲突
修改" /etc/selinux/config “文件,设置SELINUX=disabled ,保存并重启服务器
1.2 删除CentOS自带Docker
CentOS 7自带了旧版本Docker,所以先删除,如果服务器已经安装Docker请谨慎执行!!!
sudo yum -y remove docker docker-common container-selinux1.3 安装Docker CE
Docker分CE和EE两个版本,这里我们用开源免费的CE版即可
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce
# 启动docker
sudo systemctl start docker
# 查看版本确认是否安装成功
docker --version 1.4 安装Docker Compose
Docker Compose是用来管理和配置多个Docker的工具,后面我们会用到它来部署NextCloud
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/bin/docker-compose
sudo chmod +x /usr/bin/docker-compose
# 查看版本确认是否安装成功
docker-compose --version二、安装NextCloud
2.1 使用docker-compose安装NextCloud
这里使用的安装方式来自https://hub.docker.com/r/wonderfall/nextcloud/
有兴趣可以了解所有的配置和相关逻辑,下面仅列出使用方法:
-
将存储盘或者本地磁盘的某个分区挂载到目录” /data “下
-
在” /etc/nextcloud “目录下创建文件” docker-compose.yml "
cd /etc/nextcloud vi docker-compose.ymlversion: '2' services: nextcloud: image: wonderfall/nextcloud links: - nextcloud-db - redis environment: - UID=1000 - GID=1000 - UPLOAD_MAX_SIZE=30G #单个文件上传限制 - APC_SHM_SIZE=128M - OPCACHE_MEM_SIZE=128 - CRON_PERIOD=15m - TZ=Asia/Shanghai #修改时区 - ADMIN_USER=admin - ADMIN_PASSWORD=admin - DOMAIN=xxxx #需要设置的域名 - DB_TYPE=mysql - DB_NAME=nextcloud - DB_USER=nextcloud - DB_PASSWORD=xxxx #数据库nextcloud用户密码 - DB_HOST=nextcloud-db volumes: - /data/docker/nextcloud/data:/data # /data/docker/nextcloud/XX 是挂载卷的位置 - /data/docker/nextcloud/config:/config - /data/docker/nextcloud/apps:/apps2 - /data/docker/nextcloud/themes:/nextcloud/themes expose: - 8888 nextcloud-db: image: mariadb:10 volumes: - /data/docker/nextcloud/db:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=xxxx #数据库root用户密码 - MYSQL_DATABASE=nextcloud - MYSQL_USER=nextcloud - MYSQL_PASSWORD=xxxx #数据库nextcloud用户密码 redis: image: redis:alpine container_name: redis volumes: - /data/docker/nextcloud/redis:/data上面的配置中使用了mysql作为数据库,redis作为缓存,加速同步效率,将容器的持久数据挂载到/data目录,没有使用默认启用的全文检索工具solr,没有将端口映射至宿主机。至于如何通过宿主机访问nextcloud,请参考第三章。
-
执行docker-compose命令部署docker容器
cd /etc/nextcloud docker-compose up -d -
查看是否部署成功
docker ps -a
如果三个容器的STATUS都是UP,证明容器启动成功
-
查看nextcloud容器ip
docker inspect root_nextcloud_1
如上图所示,查询并记录nextcloud容器的ip,供第三章使用
2.2 设置开机启动
-
编辑 /etc/rc.local
vi /etc/rc.localservice docker start cd /etc/nextcloud docker-compose start -
赋予可执行权限
chmod +x /etc/rc.d/rc.local
三、Nginx反向代理
3.1 域名解析
将第二章docker-compose.yml 配置中的域名解析到服务器公网IP

3.2 申请CA证书
有条件可以购买收费CA证书,这里使用了阿里云的免费证书,现在(2017.12)阿里云刻意“隐藏”了免费证书的位置,按以下操作可以找到:
- 保护类型选择“1个域名”
- 选择品牌先选择赛门铁克Symantec
- 这时候才能看到证书类型出现“免费型DV SSL”

购买证书后需要进行验证,通过后才能下载使用

下载证书请选择for Nginx,解压将其中两个文件(key和pem)拷贝至服务器" /etc/cert “目录

3.3 安装Nginx
如果已经安装Nginx可以跳过该步骤,否则可以执行下面的命令安装nginx
# 设置rpm源
sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
# 安装nginx
sudo yum install -y nginx
# 开机自启动nginx
systemctl enable nginx
# 启动nginx
systemctl start nginx3.4 配置Nginx
vi /etc/nginx/nginx.conf修改配置如下:
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
proxy_buffering off; #关闭代理缓存
server {
listen 23456 ssl ; #监听端口为23456,并启用ssl
server_name pan.xxx.com; #域名
ssl_certificate /etc/cert/xxxxx.pem; #pem文件路径
ssl_certificate_key /etc/cert/xxxxx.key; #key文件路径
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://172.18.0.4:8888; #填写nextcloud容器的ip,端口为8888
client_max_body_size 30000m; #允许用户上传文件的大小修改成30G
}
}
}重启nginx
systemctl restart nginx3.5 开放防火墙端口
执行命令:
firewall-cmd --zone=public --add-port=23456/tcp --permanent
firewall-cmd --reload打开23456端口以免访问受限。
3.6 端口转发
最后,我们还需要把路由器的23456端口转发至NextCloud服务器(如192.168.2.254),路由器不同,配置方式也不同,下图是H3路由器配置方式:

到这里,我们就可以通过 https://pan.XXX.com:23456 访问NextCloud了,需要注意我们只配置了Nginx监听SSL,也就是输入URL时,不要忘记是https
需要提醒的是,如果服务器网络是动态IP,还需做DDNS,否则IP更换后,将不能通过域名访问NextCloud
四、DDNS
由于我们想用公司自己的二级域名,又有服务器,还有阿里云的SDK,所以我们没有使用花生壳等第三方解决方案,这里使用DDNS的方式来自https://github.com/rfancn/aliyun-ddns-client
4.1 创建阿里云AccessKey
-
进入阿里云访问控制页面,新建domain用户,并自动生成AccessKey,确认后记录access_key和access_id,注意保密

-
分配域名管理权限给domain用户

4.2 安装
-
安装python的requests包
yum -y install epel-release yum install python-pip pip install requests -
下载源码到 /usr/local
cd /usr/local wget https://github.com/rfancn/aliyun-ddns-client/archive/master.zip -
解压源码
yum install -y unzip unzip master.zip
4.3 配置
-
重命名ddns.conf.example
cd /usr/local/aliyun-ddns-client-master mv ddns.conf.example ddns.conf -
编辑ddns.service
vi ddns.service修改WorkingDirectory
[Unit] Description=Aliyun DDNS Client. Wants=network-online.target After=network.target network-online.target [Service] Type=simple WorkingDirectory=/usr/local/aliyun-ddns-client-master #修改工作目录 ExecStart=/usr/bin/python ddns.py -
复制服务文件
cp ddns.timer /usr/lib/systemd/system cp ddns.service /usr/lib/systemd/system -
修改ddns.conf
vi ddns.conf[DEFAULT] # 填写阿里云domain用户的access_id access_id=XXXX # 填写阿里云domain用户的access_key access_key=XXXXX # Optional: not used now interval=600 # Optional: turn on debug mode or not debug=true [DomainRecord1] # 填写一级域名,如google.com domain=xxxx.com # 填写子域名,如pan,注意不要写成pan.xxxx.com sub_domain=pan # Required: resolve type, now it only supports 'A' type=A -
启动服务并验证配置
cd /usr/local/aliyun-ddns-client-master python ddns.py # 如果显示 2017-12-26 15:28:15 [INFO] Successfully updated DomainRecord[pan.xxxx.com]则环境正常 systemctl daemon-reload systemctl start ddns.timer # 开机自启动 systemctl enable ddns.timer # 查看服务状态 systemctl status ddns.timer -l如果如下图所示,则服务正常:

最后的最后,我们可以在内网或者公网通过 https://pan.xxx.com:23456 访问NextCloud,初始管理员账号密码为admin,登陆后就可以配置和使用了。