基于WSL搭建Nextcloud私有云

in Tutorial with 0 comment

缘起

为什么要搭建私有云

云存储和文件同步,现在应该成为了许多人工作流程的一部分。DropboxGoogle DriveOnedrive 的免费账户都只有最多十几个G的空间,虽然付费可以让你变得更强获得足够的空间,不过前两者需要科学上网,后者的网络也时不时的抽风。

至于国内的坚果云,高级专业版年付也只有96G空间,对于从事写作一类工作的人来说应该足够了,功能也十分完善。不过由于我工作性质的不同,可能一个项目需要同步的文件就有好几个G,对于空间和网络稳定性的要求也就更高一些。

大概从14年工作开始,我就开始使用百度云同步盘来同步管理自己的工作和个人文件。国内网盘大战之后,百度一家独大,非会员被限速,无奈之下也一直充值使用着。再后来,百度取消了百度云同步盘的软件支持,虽然软件还能用,不过同步速度却每况愈下,这才让我开始考虑搭建私有云。

平台选择

如今市面上可供选择的具有同步功能的私有云软件并不多,出名的也就是 SeaFileownCloudNextcloud 这三个了,Nextcloud 基本就是 ownCloud 的后继版本。
nextcloud_on_wsl_01

看过三款软件的Logo设计和软件界面,作为一名设计师,我毫不犹豫就选择了 Nextcloud。不过 Nextcloud 只支持 Linux 环境直接安装,而我家里的服务器则是闲置的运行 Windows 系统的机器,官方推荐使用虚拟机或者 docker 来搭建。

在尝试了 docker 搭建之后,尽管可以正常运作,但本地读取和修改同步文件并不是很方便,让我一度放弃了搭建私有云的念头。直到了解到 Windows Subsystem for Linux (WSL) 之后,经过不断了解尝试,终于实现了自己比较满意的效果。

私有云搭建

WSL 安装

默认情况下,Windows 10 并没有启用 WSL,我们需要前往 控制面板-程序和功能-启用或关闭 Windows 功能,在弹出窗口中勾选 适用于 Linux 的 Windows 子系统。确定后需要重启系统生效。
nextcloud_on_wsl_02

之后,我们就可以直接打开 Microsoft Store,直接搜索 linux 就可以找到支持的 Linux 发行版。我选择了比较熟悉的 Ubuntu,直接点击安装即可。
nextcloud_on_wsl_03

WSL 环境配置

安装完成后,可以直接在开始菜单启动 Ubuntu。第一次启动需要几分钟时间进行系统配置,等待配置完成后,设置好用户名密码就可以进行正常操作了。接下来就是对 WSL 进行软件环境配置。

nextcloud_on_wsl_04

更换软件源

由于 Ubuntu 默认的软件源服务器位于国外,国内访问速度较慢。我们可以通过修改软件源配置文件,将软件源更改为国内镜像站点,加快访问速度。

首先使用 lsb_release -a 命令查看系统版本,我的是Ubuntu 16.04,据此来寻找对应的软件源。找到后再进行配置文件修改,我这里使用的是中科大的镜像站点。

# 备份软件源配置文件
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 编辑配置文件
sudo vim /etc/apt/sources.list

# 删除原始内容,添加中科大镜像源
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-updates main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-backports main restricted universe multiverse
deb https://mirrors.ustc.edu.cn/ubuntu/ xenial-security main restricted universe multiverse

# 更新配置
sudo apt-get update

配置并启用 SSH

WSL 默认通过 bash 进行操作,对于习惯了通过 SSH 远程操作 Linux 的人来说,可能使用 Putty 之类的软件来进行操作更为适应。默认情况下 WSL 并没有启用 SSH服务,而且并没有正确配置密钥,我们需要手动重装并进行进一步配置。

# 设置 root 用户密码
sudo passwd root

# 重装 SSH
sudo apt-get remove openssh-server
sudo apt-get install openssh-server

# 备份 SSH 配置文件
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

# 编辑配置文件
sudo vim /etc/ssh/sshd_config

# 修改相应选项
Port 20022 # 22默认端口被 Windows 占用
UsePrivilegeSeparation no # yes->no
PermitRootLogin yes # 改成 yes
#StrictModes yes # 注释掉
PasswordAuthentication yes # no->yes

# 启动 SSH
sudo service ssh start

配置 LAMP

Nextcloud 和 Wordpress 之类的应用一样,需要网页服务器、数据库和 PHP,我选择了常见的 LAMP 组合,如果使用 LNMP 组合,则需要对 Nginx 调整相应配置。

# 安装 Apache
sudo apt-get -y install apache2

# 安装 MySQL 服务器,安装过程中需要设置 root 用户密码
sudo apt-get -y install mysql-server

# 修改 MySQL 配置文件
sudo vim /etc/mysql/my.cnf

# 修改默认编码为 UTF-8,添加如下内容
[mysqld]
character-set-server = utf8

# 似乎是 WSL 限制,此时若启动 MySQL 服务,将出现 "No directory……" 错误,需要定位 MySQL 所在目录
sudo usermod -d /var/lib/mysql/ mysql

# 安装 PHP
sudo apt-get install php7.0 libapache2-mod-php7.0 php7.0-gd php7.0-json php7.0-mysql php7.0-curl php7.0-mbstring php7.0-intl php7.0-mcrypt php-imagick php7.0-xml php7.0-zip

# 启动 Apache 和 MySQL 服务
sudo service apache2 start
sudo service mysql start

完成上面的步骤后,可以在浏览器访问 localhost 测试 Apache 是否正常工作。

部署 Nextcloud

在配置好 LAMP 基础环境之后,我们就可以开始正式部署 Nextcloud 了。首先可以前往 Nextcloud 官网下载地址找到最新版的下载链接,替换掉下面的链接地址。

# 移动到目标目录
cd /var/www/html

# 下载 Nextcloud 服务端
sudo wget https://download.nextcloud.com/server/releases/nextcloud-13.0.2.zip

# 安装 unzip
sudo apt-get -y install unzip

# 解压 Nexcloud 服务端压缩包
sudo unzip nextcloud-13.0.2.zip

# 更改目录权限,否则安装时会出现“内部服务器错误”
sudo chown -R www-data:www-data /var/www/html/nextcloud

将 Nextcloud 放入网页服务器目录后,我们还需要为其配置站点信息,使其可以被正常访问。使用下面的命令新建可用站点配置文件。

# 为 Nextcloud 配置可用站点信息
sudo vim /etc/apache2/sites-available/nextcloud.conf

在文件中,我们需要添加以下内容:

Alias /nextcloud "/var/www/html/nextcloud/"

<Directory /var/www/html/nextcloud/>
  Options +FollowSymlinks
  AllowOverride All

 <IfModule mod_dav.c>
  Dav off
 </IfModule>

 SetEnv HOME /var/www/html/nextcloud
 SetEnv HTTP_HOME /var/www/html/nextcloud

</Directory>

保存退出 Vim 后,为站点建立符号链接,启用站点。

# 建立符号链接
sudo ln -s /etc/apache2/sites-available/nextcloud.conf /etc/apache2/sites-enabled/nextcloud.conf

# 重启 Apache 服务
sudo service apache2 restart

此时,在浏览器中打开 localhost/nextcloud,如果出现安全警告,需要配置 .htaccess

sudo vim /var/www/html/nextcloud/config/.htaccess

# 加入以下内容
deny from all
IndexIgnore *
Satisfy All

# 重启 Apache 服务
sudo service apache2 restart

至此,我们应该已经可以在本地通过 localhost/nextcloud 这个地址正常访问和使用 Nextcloud。不过我们还可以进一步配置来实现伪静态。

# 开启 Apache 模块,为伪静态做准备
sudo a2enmod rewrite
sudo a2enmod headers

# 修改 config.php,加入伪静态规则
sudo vim /var/www/html/nextcloud/config/config.php

# 加入以下内容
'overwrite.cli.url' => 'https://example.org/nextcloud',
'htaccess.RewriteBase' => '/nextcloud',

# 重启 Apache 服务
sudo service apache2 restart

实现远程访问

通过前面的一系列操作配置,Nextcloud 已经可以在本地运行起来了,不过由于是家庭宽带,没有固定公网 IP,还无法正常通过网络进行远程访问,也就无法实现文件同步功能。

公网 IP 及监听端口

我们可以通过使用 DDNS 动态域名服务来解决没有固定公网 IP 的问题,网上的 DDNS 服务很多,最出名的可能就是花生壳了。我使用的是 no-ip 提供的免费 DDNS,虽然每个月都要手动续签一下,不过还是挺好用的。

另外,家庭宽带一般都被封了80端口,我们就需要修改 Apache 的默认监听端口。

# 修改 Apache 端口配置文件
sudo vim /etc/apache2/ports.conf

# 修改默认的80端口
Listen 32080

# 重启 Apache 服务
sudo service apache2 restart

除了修改端口之外,我们还需要在路由器设置端口映射,并在系统防火墙中为端口设置入站规则,这样才能正常实现远程访问。

端口映射

端口映射的设置根据路由器品牌型号的不同,设置过程稍有区别。首先在 Windows 中打开 CMD,使用 ipconfig -all 命令查看本机的 mac 地址和内部 IP 地址。

nextcloud_on_wsl_05

由于大多数路由器会动态地给连接的设备分配内部 IP 地址,为了防止服务器的内部 IP 时常变动,我们需要在路由器中为设备设置预留 IP 地址。只需要将前面查找到的 mac 地址和 内部 IP 对应添加到预留地址列表中即可。
nextcloud_on_wsl_06

接下来,在端口映射配置界面分别为 WSL 的 SSH 和 Apache 服务添加端口映射条目,我这里使用的是之前设定的 2002232080 端口。
nextcloud_on_wsl_07

入站规则

最后,我们需要在 控制面板-系统和安全-Windows Defender 防火墙-高级设置 中为 SSH 和 Apache 服务添加入站规则。

  1. 在窗口左侧点击 入站规则,右键并选择 新建规则
  2. 在弹出窗口的 规则类型 列表中,选择 端口
  3. 协议和端口 页面,选择 TCP特定本地端口,在后方的输入框中按格式输入前面用到的本地端口 20022, 32080
  4. 操作 页面,勾选 允许连接
  5. 配置文件 页面,全部勾选。
  6. 最后根据喜好设置规则名称。

以上全部设置完成后,我们就可以通过 DDNS 提供的地址搭配端口来实现远程访问和文件同步了。浏览器打开地址类似 http://address.ddns.net:32080/nextcloud

实现 WSL 开机启动

由于 WSL 只是一个子系统,当我们关闭 bash 窗口,整个 Linux 系统包括其中正在运行的各个服务都会被完全关闭,Nextcloud 也就没办法访问了。重新打开 bash 窗口后,Apache 等服务也需要再次手动开启。

理想情况是当 Windows 启动时,在后台自动启动 bash,并且开启需要的各种服务。我们可以通过建立开机启动脚本来实现。

Linux 启动脚本

建立 Linux 脚本,当脚本运行时,启动 SSH、Apache、MySQL 等服务。

# 新建 Linux 启动脚本,文件位置可以根据自己需要调整
sudo vim /usr/boot.sh

# 加入以下内容,其中 passwd 即一开始设置的 Linux 用户对应的密码
#!/bin/sh
echo 'passwd' | sudo -S service ssh start
echo 'passwd' | sudo -S service apache2 start
echo 'passwd' | sudo -S service mysql start
$SHELL

# 设置权限
sudo chmod 777 /usr/boot.sh

Windows 启动脚本

建立 Windows 脚本,在后台挂起 bash,并运行前面建立的 Linux 脚本。可以通过建立计划人物来实现开机运行脚本,不过我这里选择了更简单的把脚本快捷方式放入系统启动文件夹的方法。

# 新建 wsl.vbs,文件位置可以根据自己需要调整,加入以下内容
Set ws = CreateObject("Wscript.Shell") 
ws.run "bash /usr/boot.sh",vbhide

# 将脚本快捷方式放入 Windows 启动文件夹
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

Nextcloud 设置

经过上面的努力,我们已经拥有了一个完全属于自己的私有云。接下来就是 Nextcloud 的应用设置了。

账户和数据库设置

第一次打开 Nextcloud, 我们会进入一个引导界面,在这里创建我们的管理员账号,并配置好数据库, 数据目录 保持默认即可,后续可以更改。配置数据库 选项中,用户部分填入 root,密码即在安装 MySQL 时设置的管理员密码。最后点击 安装完成,稍等一段时间,Nextcloud 就会完成应用的初始化配置。
nextcloud_on_wsl_08

文件目录设置

Nextcloud 默认文件存储目录在网站根目录的 data 文件夹,因为整个 WSL 都是在C盘,也就是说我们以后同步的文件也都存储在C盘,这并不是我们所希望的。尽管 WSL 可以通过 /mnt/d 这样的目录访问D盘等其他盘符,但由于权限问题,并不能把默认存储位置设置在其他硬盘或分区。这里我们可以通过 Nextcloud 的 外部存储 应用来曲线救国。

点击网页右上角的用户头像,在下拉菜单中可以找到 应用 选项。点击进入后,我们可以看到各种用于增强 Nextcloud 功能的应用,就像 Chrome 的各种扩展一样。在 你的应用 页面找到 External storage support 并启用,就开启了外部存储支持。

再转到设置页面,可以在左侧找到 外部存储 设置选项,可以把本地的其他硬盘或者文件夹映射为 Nextcloud 中的一个目录,相当于将你映射的文件夹中的文件都挂载到了云端。在后面进行同步之类的操作时,只要在目录内操作,文件也就直接被保存到相应的硬盘上,不至于C盘被撑爆。

除了本地地址外,它还支持 FTP,SFTP,WebDAV,Amazon S3 等等网络存储地址,甚至还可以把其他 Nextcloud 服务器地址链接进来,方便进行聚合管理。
nextcloud_on_wsl_09

Nextcloud 默认限制了文件最大上传大小为 500M。如果需要更改,可以在设置页面找到 其他设置 - 文件处理,更改成需要的大小保存即可。

一切准备就绪,接下来只要下载相应平台的同步客户端就可以开始体验私有云啦。

Responses