Ricky Hao

使用Docker快速搭建NextCloud

0x00 概述

由于先前的个人云盘需求,所以想要搭建一个NextCloud。再加上租的房子有公网IP,因此决定使用ArchLinux虚拟机来跑一个NextCloud的Docker容器实现个人云盘的需求。(关于为何不使用Docker for Windows,原因是我需要使用VMware而不是Hyper-V

0x01 准备

  • Linux环境
  • Docker
  • Docker-Compose(可以使用pip进行安装)

0x02 Docker Compose文件的编写

在这里,我选择使用Docker Compose进行容器的编排。至少需要启用两个容器:Mysql与Nextcloud(内置Apache2版本)。

version: "3.7"

volumes:
    mysql:
        driver: local-persist
        driver_opts:
            mountpoint: /home/ricky/nextcloud/mysql
    mysql_config:
        driver: local-persist
        driver_opts:
            mountpoint: /home/ricky/nextcloud/mysql_config
    data:
        driver: local-persist
        driver_opts:
            mountpoint: /mnt/I/nextcloud/data
    config:
        driver: local-persist
        driver_opts:
            mountpoint: /mnt/I/nextcloud/config
    apps:
        driver: local-persist
        driver_opts:
            mountpoint: /mnt/I/nextcloud/custom_apps
    apache:
        driver: local-persist
        driver_opts:
            mountpoint: /mnt/I/nextcloud/apache
services:
    db:
        image: mariadb
        user: "1000:50"
        restart: always
        volumes:
          - type: volume
            source: mysql
            target: /var/lib/mysql
          - type: volume
            source: mysql_config
            target: /etc/mysql/conf.d
        environment:
          - MYSQL_ROOT_PASSWORD=password
          - MYSQL_DATABASE=nextcloud

    app:
        image: nextcloud:15.0.2
        user: root
        links:
          - db
        volumes:
          - type: volume
            source: apache
            target: /etc/apache2/sites-enabled
          - type: volume
            source: data
            target: /var/www/html/data
          - type: volume
            source: config
            target: /var/www/html/config
          - type: volume
            source: apps
            target: /var/www/html/custom_apps
          - "/mnt/I/nextcloud/apache2-ssl.sh:/usr/local/bin/apache2-ssl.sh"
        ports:
          - target: 443
            published: 8443
            protocol: tcp
            mode: host
        command:
          - apache2-ssl.sh

        restart: always

这是我的docker-compose.yml文件。下面将描述各个模块的功能:
* version:指定Docker Compose版本
* volumes:使用的Docker volume,其中这里的local-persist需要自己去GitHub上下载插件进行安装(用于指定挂载路径)。
* services:服务定义
* db:服务名称
* image:使用镜像
* user:使用用户,这里注意对于Mariadb需要指定用户,不然会出现权限错误
* restart:始终重启
* volumes:数据卷挂载
* environment:环境变量
* ports:对外开放的端口,可以进行端口转发
* command:覆盖镜像中原本的CMD命令

0x03 开启Apache的SSL模块

这里我们会遇到一个问题,在NextCloud官方镜像中,ApacheSSL模块是默认禁用的。因此我们需要写一个apache2-ssl.sh来启用它(这里的文件名字需要以apache2-开头)。

#! /bin/bash
a2enmod ssl
service apache2 restart
exec "apache2-foreground"

非常简单,最重要的是最后要重新运行原本的exec "apache2-foreground"命令来启动Apache
关于ApacheSSL设置,我们还需要设置其网站配置文件。

LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
ServerName pc.rickyhao.com

<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerAdmin root@rickyhao.com
        DocumentRoot /var/www/html
        Header always set Strict-Transport-Security "max-age=15552000; includeSubdomains;"

        ErrorLog ${APACHE_LOG_DIR}/error.log
        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLEngine on

        SSLCertificateFile    /etc/apache2/sites-enabled/ssl/server.pem
        SSLCertificateKeyFile /etc/apache2/sites-enabled/ssl/server.key

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>
    </VirtualHost>
</IfModule>
  • header:为之后安全Strict-Transport-Security头做准备

0x04 自启动

在这里,我使用的是systemctl进行自启动服务的管理。

[Unit]
Description=Nextcloud docker compose
After=docker.service

[Service]
ExecStart=docker-compose -f /home/ricky/nextcloud/docker-compose.yml up
ExecStop=docker-compose -f /home/ricky/nextcloud/docker-compose.yml stop

[Install]
WantedBy=multi-user.target

最后使用sudo systemctl daemon-reload重载服务文件,sudo systemctl enable nextcloud启用自启动即可。

0x05 后记

其实我原先一开始是使用nextcloud-fpm版本的镜像,配上nginx来食用的。但是会出现奇怪的性能上的问题,最后还是选择了自带的Apache
最后的最后,想了想自己的Office 365订阅及只用了几百M的1TOneDrive云盘,还是选择了使用OneDrive来储存照片等个人文件(巨硬大法好!)

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据