0x00 概述
由于先前的个人云盘需求,所以想要搭建一个NextCloud。再加上租的房子有公网IP,因此决定使用ArchLinux
虚拟机来跑一个NextCloud
的Docker容器实现个人云盘的需求。(关于为何不使用Docker for Windows,原因是我需要使用VMware而不是Hyper-V)
0x01 准备
- Linux环境
- Docker
- Docker-Compose(可以使用
pip
进行安装)
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官方镜像中,Apache的SSL模块是默认禁用的。因此我们需要写一个apache2-ssl.sh
来启用它(这里的文件名字需要以apache2-
开头)。
#! /bin/bash
a2enmod ssl
service apache2 restart
exec "apache2-foreground"
非常简单,最重要的是最后要重新运行原本的exec "apache2-foreground"
命令来启动Apache。
关于Apache的SSL设置,我们还需要设置其网站配置文件。
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来储存照片等个人文件(巨硬大法好!)
文章评论