用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请谨慎执行!!!

1
sudo yum -y remove docker docker-common container-selinux

1.3 安装Docker CE

Docker分CE和EE两个版本,这里我们用开源免费的CE版即可

1
2
3
4
5
6
7
8
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

1
2
3
4
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 “

    1
    2
    cd /etc/nextcloud
    vi docker-compose.yml
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    version: '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容器

    1
    2
    cd /etc/nextcloud
    docker-compose up -d
  • 查看是否部署成功

    1
    docker ps -a

    1

    如果三个容器的STATUS都是UP,证明容器启动成功

  • 查看nextcloud容器ip

    1
    docker inspect root_nextcloud_1

    2

    如上图所示,查询并记录nextcloud容器的ip,供第三章使用

2.2 设置开机启动

  • 编辑 /etc/rc.local

    1
    vi /etc/rc.local
    1
    2
    3
    service docker start
    cd /etc/nextcloud
    docker-compose start
  • 赋予可执行权限

    1
    chmod +x /etc/rc.d/rc.local

三、Nginx反向代理

3.1 域名解析

将第二章docker-compose.yml 配置中的域名解析到服务器公网IP

3

3.2 申请CA证书

有条件可以购买收费CA证书,这里使用了阿里云的免费证书,现在(2017.12)阿里云刻意“隐藏”了免费证书的位置,按以下操作可以找到:

  • 保护类型选择“1个域名”
  • 选择品牌先选择赛门铁克Symantec
  • 这时候才能看到证书类型出现“免费型DV SSL”

4

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

5

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

6

3.3 安装Nginx

如果已经安装Nginx可以跳过该步骤,否则可以执行下面的命令安装nginx

1
2
3
4
5
6
7
8
# 设置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 nginx

3.4 配置Nginx

1
vi /etc/nginx/nginx.conf

修改配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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

1
systemctl restart nginx

3.5 开放防火墙端口

执行命令:

1
2
firewall-cmd --zone=public --add-port=23456/tcp --permanent
firewall-cmd --reload

打开23456端口以免访问受限。

3.6 端口转发

最后,我们还需要把路由器的23456端口转发至NextCloud服务器(如192.168.2.254),路由器不同,配置方式也不同,下图是H3路由器配置方式:

10

到这里,我们就可以通过 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,注意保密

    7

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

    8

4.2 安装

  • 安装python的requests包

    1
    2
    3
    yum -y install epel-release
    yum install python-pip
    pip install requests
  • 下载源码到 /usr/local

    1
    2
    cd /usr/local
    wget https://github.com/rfancn/aliyun-ddns-client/archive/master.zip
  • 解压源码

    1
    2
    yum install -y unzip
    unzip master.zip

4.3 配置

  • 重命名ddns.conf.example

    1
    2
    cd /usr/local/aliyun-ddns-client-master
    mv ddns.conf.example ddns.conf
  • 编辑ddns.service

    1
    vi ddns.service

    修改WorkingDirectory

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [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

  • 复制服务文件

    1
    2
    cp ddns.timer /usr/lib/systemd/system
    cp ddns.service /usr/lib/systemd/system
  • 修改ddns.conf

    1
    vi ddns.conf
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [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

  • 启动服务并验证配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    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

    如果如下图所示,则服务正常:

    9

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

用Docker搭建企业私有云盘NextCloud

https://wurang.net/nextcloud_with_docker/

作者

Wu Rang

发布于

2017-12-26

更新于

2021-12-06

许可协议

评论