使用Docker快速搭建NextCloud

  • A+
所属分类:安全博客

0x00 概述

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

0x01 准备

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

安装local-persist

curl -fsSL https://raw.githubusercontent.com/CWSpear/local-persist/master/scripts/install.sh | sudo bash

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 [email protected]
        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来储存照片等个人文件(巨硬大法好!)

FROM :rickyhao.com | rickyhao.com

相关推荐: 硬盘突然提示需要格式化才能使用? 你是要格式化呢?还是...呢?(上篇)

 本文由实习生彭诗雨原创,转载请注明。引言最近遇到一个关于文件系统方面的练习题比较有意思。小编做完题目之后,感觉可以好好总结一下思路,在此拿出来和大家交流一下步骤和心得。日常生活中大家也可能遇到到这样的场景:一直使用的硬盘,磁盘中明明是存在了很多数据…

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: