Featured image of post Truenas+Nextcloud 配置

Truenas+Nextcloud 配置

简单自组NAS

Truenas+Nextcloud 配置

IMG20210720223239

IMG20210720223243

硬件

这里的配置满足了 truenas 建议的最低要求(主要是内存 8G 及以上)。因为 truenas core 基于 freebsd,使用 zfs 文件系统,需要大量的内存做磁盘缓存,几乎是有多少用多少。

配件表

名称 价格
主板:映泰 J4105 549
电源:益衡 7025B 200W 240
内存:威刚 万紫千红 8G 2666MHZ 226
机箱:蜗牛星际 C 款 118
风扇:乔思伯 12020 19
U 盘:32G 28
m.2 转 sata 79
总计: 1259

机箱是 4 盘位机箱,主板只有两个 sata 口,使用 M.2 转 sata*2 转接头转换

Screenshot_2021-08-04-11-50-13-91_0961b065c

硬盘

  • 希捷酷狼 4T * 2
  • 闲置笔记本拆机盘 1T

两块 4T 硬盘组 RAID1。1T 硬盘做下载盘,存放不重要的数据。

另外还有喷漆、贴纸和脚垫等

机箱改造

喷漆

购买某宝自喷漆,拆解机箱,喷漆晾干即可。

注意:

  • 拆开后,最好给螺丝和对应部位拍个照,因为装回来可能是几天后,螺丝种类又多,容易混
  • 少量多次
  • 最好放在灰尘比较少的地方晾干
  • 白色漆打底,最后喷一层光油
  • 漆干的没那么快,可能会粘着垫纸,别着急翻面
  • 一定一定戴口罩
  • 脱漆剂对塑料有腐蚀性,别问我怎么知道的

硬盘背板加电容

IMG20210701130627

买来发现背板只有电阻和 led 给硬盘灯用,而有非常多的电容没有焊接,规格是 0805。

正好手头有 0805 电容,就焊了一些上去。靠近 sata 接口的 2 个焊接 0.1uF(c4、c04),其余 6 个焊接 22uF 的电容,其余同理。

因为已经生产很久了,焊点表明氧化严重,需要助焊剂去除氧化层,否则很容易虚焊。

Truenas 系统

Truenas 系统安装的教程极多,可以自己搜索。

安装完成后需要根据自己的网络环境配置 ip。

在浏览器访问 truenas IP 即可访问管理后台,账号 root,密码为安装时设置的值。

QQ 邮箱配置

建议在 系统-电子邮件 中设置自己的邮箱,我使用的是 qq 邮箱

屏幕截图 2021-08-04 125223

到 qq 邮箱中申请授权码(QQ邮箱-设置-账户),作为这里的密码,其他依照上图填写。

在 truenas 后端,帐户-用户,编辑 root 用户邮箱,可以与上面的 qq 邮箱一样(邮箱允许自己给自己发邮件)

发送测试邮件,不出意外,邮箱会收到一封邮件。

配置 SSH 密钥登录

首先需要有一对密钥,没有的话可以依据服务器上的 Git - 生成 SSH 公钥文章生成。

帐户-用户 中配置用户 SSH 公钥。

确认服务中 ssh 有没有开启

image-20210804130416334

使用诸如 putty 或者 linux 的 ssh 客户端都可以登录主机。我比较喜欢使用 termius

备份配置文件

系统-常规中可以保存和恢复配置。我的系统安装在 U 盘中,如果 U 盘损坏,则可以换一个重新安装上系统,并恢复配置,非常方便

image-20210804131542933

创建储存池

储存池相当于一个虚拟盘,可以有多个物理硬盘通过不同的组合(raid1、raidz)在软件上作为一个盘。

具体可以看看 B 站这个视频

image-20210804131829032

Nextcloud

安装 Nextcloud

注意因为众所周知的原因,安装插件没有梯子有可能会失败,我在路由器中配置了梯子得以解决。

插件中找到并点击安装

建议选择高级插件安装。个人喜好不用 dhcp 也不用 nat,直接手动配置 ip,相当于桥接模式,虚拟机的虚拟网卡直接连接到路由器,这样虚拟机和 truenas 系统有着等同的网络地位,都在路由器路由表中占用一个 ip

image-20210806123237114

其他选项默认,点击保存即可

配置 ssh

为了之后方便 SSL 证书的更新,我在 truenas 系统里生成了证书,并把公钥放在了 nextcloud jail 中。

运行ssh-keygen -o命令即可

image-20210807101118274

选择监狱-nextcloud-命令行即可使用命令行。

# 配置ssh开机自启
vi /etc/rc.conf
# 在文件最后添加
sshd_enable="YES"

# 配置ssh参数
vi /etc/ssh/sshd_config
# 取消注释下面两行,并改为如下内容
Port 22
PermitRootLogin yes

# 开启ssh
service sshd start

# 添加公钥
cd
mkdir .ssh
vi .ssh/authorized_keys
# 粘贴公钥内容

尝试 ssh 连接

为 jail 开启中文支持

vi /etc/profile,写入如下内容

export LANG=zh_CN.UTF-8
export LC_ALL="en_US.ISO8859-1"
export LANG="en_US.ISO8859-1"
export LC_CTYPE="en_US.ISO8859-1"
export LANG=zh_CN.eucCN

vi /etc/csh.cshrc,写入如下内容

setenv LANG "zh_CN.UTF-8"

配置 nextcloud

配置访问 url

nextcloud 主目录位于/usr/local/www/nextcloud

编辑配置文件vi /usr/local/www/nextcloud/config/config.php

array (
    0 => 'localhost',
    1 => '192.168.2.3',
    2 => 'cloud.vinf.top',
 ),#修改并添加适当的访问地址
 # 设置默认手机号位置
 'default_phone_region' => 'CN',

更改 nextcloud data 目录

一般情况下都需要自定义 data 目录,比如存放 jail 的池容量太小或重要数据需要集中存放

这里用挂载的方法直接覆盖了原本 data 目录的内容

  1. 复制目录

    cd /usr/local/www/nextcloud
    cp -r data backup
    
  2. 插件-nextcloud中关闭 nextcloud

  3. 监狱-nextcloud-挂载点中添加挂载点

    image-20210807104157580
  4. 选择对应,你想要映射的目录即可,我这边是 main pool 中的 ncdata 数据集

    image-20210807104311335
  5. 重新开启 nextcloud jail

  6. 进入 nextcloud 维护模式(此时访问 nextcloud 会显示错误,因为数据文件夹没有文件)

    sudo -u www php /usr/local/www/nextcloud/occ maintenance:mode --on
    # 提示没有sudo就安装一下 pkg install sudo
    
  7. 重新复制文件到数据目录

    cp -r backup/. data
    

    注意这里需要加/. 因为 data 目录已经存在

  8. 关闭维护模式

    sudo -u www php /usr/local/www/nextcloud/occ maintenance:mode --off
    
  9. 检查权限

    ls -l
    

    确定 data 目录所有者和群组均为www

    chown -R www:www data
    

    递归赋予权限

  10. 访问 nextcloud 检查是否成功

访问 nextcloud

插件-nextcloud-安装说明中写了默认生成的各种密码,包括登录 nextcloud 所需的密码

登录之后,在设置-概览中可以检查还需优化的选项。

配置 crontab 执行

crontab -u www -e
# 添加如下内容
*/5  *  *  *  * php -f /usr/local/www/nextcloud/cron.php
# 每5分钟执行一次命令

在 nextcloud web 端,访问设置-基本设置,在后台任务中选择 cron

image-20210807105735446

配置并使用 redis

这是个优化选项,可以不做

# 安装redis
pkg install redis

# 配置开机自启
vi /etc/rc.conf
# 添加如下行到文件末尾
redis_enable="YES"

# 开启redis
service redis start

# 配置nextcloud
vi /usr/local/www/nextcloud/config/config.php
# 添加如下内容
'redis' =>
  array (
    'host' => '127.0.0.1',
    'port' => 6379,
  ),
  'memcache.local' => '\\OC\\Memcache\\Redis',
  'memcache.distributed' => '\\OC\\Memcache\\Redis',
  'memcache.locking' => '\\OC\\Memcache\\Redis',

SSL

对于需要外网访问的情况,SSL 非常重要。

truenas 主机上用到了三张 SSL 证书,统一由 truenas 的 acme.sh 管理

安装 acme.sh

# 安装acme.sh
curl  https://get.acme.sh | sh

# 安装deploy-freenas
git clone https://github.com/danb35/deploy-freenas
vi /root/deploy-freenas/deploy_config
# 写入如下内容 api_key需要从truenas管理界面中生成
[deploy]
api_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
image-20210807114324756

生成证书

# 注册
acme.sh  --register-account  -m xxxxxxx@qq.com --server zerossl

# 设置api key
# 不同的域名服务商提供不同的api key,需要看看acme.sh是否支持(主流的都支持)
# 一般登录到管理后台都可以找到
export Ali_Key="XXXXXXXXXXXXXXXX"
export Ali_Secret="XXXXXXXXXXXXXXXXXXXXXX"

# 申请证书
# 给truenas管理后端的证书
/root/.acme.sh/acme.sh --issue -d nas.vinf.top --dns dns_ali --reloadcmd "/root/deploy-freenas/deploy_freenas.py"
# nextcloud使用的证书
/root/.acme.sh/acme.sh --issue -d cloud.vinf.top --dns dns_ali

# 安装证书并设置reload cmd
# 这里的reload cmd使用ssh的方式执行,使用密钥登录
# 证书文件通过共享同一个数据集的方式共享,在每一个需要用到证书的jail做一个挂载点即可
acme.sh --install-cert -d cloud.vinf.top --key-file /mnt/main/ssl/cloud.vinf.top/cloud.vinf.top.key --fullchain-file /mnt/main/ssl/cloud.vinf.top/fullchain.cer --reloadcmd "ssh root@192.168.2.3 'service nginx forcereload' "

acme.sh 在安装时会自动生成一个 cron 任务,每天检查是否有过期的证书。若有则自动申请,并在申请成功后自动执行 reload cmd,实现证书的自动续期

证书申请后,可以在路由器上配置一个 dns 劫持,比如将 nas.vinf.top 直接 dns 映射到 192.168.2.2,这样就可以用域名访问网页,并且可以测试 https 配置是否完整。

frp 公网访问

概览

内网穿透可以在没有公网 ip 的情况下实现公网访问 nextcloud 等服务。

前提是需要一个处于公网的服务器。

image-20210808102517259

访问 NAS

  • 连接上局域网时
    • 终端设备向路由器发起 dns 请求,被拦截并返回局域网 ip
    • 之后的流量都仅通过路由器转发,非常快速
  • 公网环境,比如使用流量的手机
    • 终端发起 dns 请求,被域名服务商提供的主机解析,为 frp 的公网 ip
    • 访问流量通过服务器转发给 NAS
    • NAS 将结果返回给服务器
    • 服务器将结果发送给终端设备

frp 转发的流量,访问速度较慢(具体速度取决于服务器带宽,家庭网络带宽)。实测阿里云杭州学生轻量级服务器,带宽没记错的话是 1M,nextcloud 同步速度 700KB/s 波动。

frp github 地址

具体的配置可以看这篇博客

frp server 配置

在服务器上下载对应的 frp 编译版本,根据不同的系统,配置 frps 为服务

[common]
bind_addr = 0.0.0.0
bind_port = 7000
# 设置自己的token
token = 12345678

vhost_http_port = 80
vhost_https_port = 443

注意:

  • 需要开启使用的对应的端口,比如 80,443
  • 域名需要解析到服务器的公网 ip
  • 客户端和服务器的各项参数需要对应,比特 token 和 port 等

frp client 配置

下载 frp,依据系统架构的不同,这里下载 amd64

新建目录 mkdir /usr/local/opt/

复制下载的文件到目录

解压 tar -zxvf frp.tar.gz

编辑 frpc.ini

[common]
# 改为自己的服务器公网ip
server_addr = 123.123.123.123
server_port = 7000
#改为自己的token
token = 12345678

# ssh可以如下配置
[nas@ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 2222

# http配置
[nas]
type = http
local_port = 80
custom_domains = nas.vinf.top
host_header_rewrite = nas.vinf.top

# https配置
[s@nas]
type = https
local_port = 443
custom_domains = nas.vinf.top
host_header_rewrite = nas.vinf.top

vi /usr/local/etc/rc.d/frpc,写入,其中文件路径需要自己稍作更改

#!/bin/sh

# PROVIDE: frpc
# REQUIRE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr

name="frpc"
rcvar=frpc_enable

load_rc_config $name

: ${frpc_enable="NO"}
: ${frpc_user="nobody"}
: ${frpc_flags=""}

daemon_pidfile="var/run/frpc_daemon.pid"
pidfile="/var/run/frpc.pid"
command="/usr/local/opt/frp_0.37.0_freebsd_amd64/frpc -c /usr/local/opt/frp_0.37.0_freebsd_amd64/frpc.ini"
start_cmd="/usr/sbin/daemon -r -R 5 -u $frpc_user -P $daemon_pidfile -p $pidfile -t $name $command $frpc_flags"

start_postcmd="${name}_poststart"
stop_cmd="${name}_stop"

frpc_poststart()
{
    echo "${name}_daemon running pid `cat ${daemon_pidfile}`."
    echo "${name} running pid `cat ${pidfile}`."
}

frpc_stop()
{
    if [ -f "$daemon_pidfile" ]; then
        pid=`cat $daemon_pidfile`
        echo "Stopping pid ${pid}."
        kill $pid
    else
        echo "${name} not running?"
    fi
}


run_rc_command "$1"

增加可执行权限chmod +x /usr/local/etc/rc.d/frpc,并设置自启动sysrc frpc_enable=YES

使用 aria2 下载

安装

# 安装aria2
pkg install aria2
# 配置自启,启动用户
sysrc aria2_user=www
sysrc aria2_group=www
sysrc aria2_enable=YES

这里最好使用 www 用户,和 nextcloud 使用相同的用户(尽管两者不是同一个系统,但用户 GID 相同,有相同的权限)。这使得 nextcloud 可以访问 aria2 下载的文件。

我创建了一个共享的数据集,并挂载到 nextcloud 和 aria2 的 jail 中,nextcloud 以 external store 的方式挂载在用户中。

image-20210809101704043

image-20210809101751711

image-20210809101855672

这样 aria2 下载完成的文件,可以直接在 nextcloud 中管理,非常方便。

配置

vi /usr/local/etc/aria2.conf,写入如下内容

continue
daemon=true
dir=/download # 更换为自己的下载目录
file-allocation=falloc
log-level=warn
disable-ipv6=true
log-level=warn
max-connection-per-server=15
max-concurrent-downloads=20
max-overall-download-limit=0
min-split-size=5M
rpc-listen-all=true
enable-rpc=true
rpc-secret=123456789 #换为自己的密钥
ca-certificate=/mnt/ssl/fullchain.cer #换为自己的证书路径

service aria2 start,开启 aria2

在 chrome 中安装 aria2 插件,或下载 aria2 客户端,即可

image-20210809102247796

配置 RPC 地址和密钥即可连接