Truenas+Nextcloud 配置
硬件
这里的配置满足了 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 转接头转换
硬盘
- 希捷酷狼 4T * 2
- 闲置笔记本拆机盘 1T
两块 4T 硬盘组 RAID1。1T 硬盘做下载盘,存放不重要的数据。
另外还有喷漆、贴纸和脚垫等
机箱改造
喷漆
购买某宝自喷漆,拆解机箱,喷漆晾干即可。
注意:
- 拆开后,最好给螺丝和对应部位拍个照,因为装回来可能是几天后,螺丝种类又多,容易混
- 少量多次
- 最好放在灰尘比较少的地方晾干
- 白色漆打底,最后喷一层光油
- 漆干的没那么快,可能会粘着垫纸,别着急翻面
- 一定一定戴口罩
- 脱漆剂对塑料有腐蚀性,别问我怎么知道的
硬盘背板加电容
买来发现背板只有电阻和 led 给硬盘灯用,而有非常多的电容没有焊接,规格是 0805。
正好手头有 0805 电容,就焊了一些上去。靠近 sata 接口的 2 个焊接 0.1uF(c4、c04),其余 6 个焊接 22uF 的电容,其余同理。
因为已经生产很久了,焊点表明氧化严重,需要助焊剂去除氧化层,否则很容易虚焊。
Truenas 系统
Truenas 系统安装的教程极多,可以自己搜索。
安装完成后需要根据自己的网络环境配置 ip。
在浏览器访问 truenas IP 即可访问管理后台,账号 root,密码为安装时设置的值。
QQ 邮箱配置
建议在 系统-电子邮件
中设置自己的邮箱,我使用的是 qq 邮箱
到 qq 邮箱中申请授权码(QQ邮箱-设置-账户
),作为这里的密码,其他依照上图填写。
在 truenas 后端,帐户-用户
,编辑 root 用户邮箱,可以与上面的 qq 邮箱一样(邮箱允许自己给自己发邮件)
发送测试邮件,不出意外,邮箱会收到一封邮件。
配置 SSH 密钥登录
首先需要有一对密钥,没有的话可以依据服务器上的 Git - 生成 SSH 公钥文章生成。
在 帐户-用户
中配置用户 SSH 公钥。
确认服务
中 ssh 有没有开启
使用诸如 putty 或者 linux 的 ssh 客户端都可以登录主机。我比较喜欢使用 termius
备份配置文件
在系统-常规
中可以保存和恢复配置。我的系统安装在 U 盘中,如果 U 盘损坏,则可以换一个重新安装上系统,并恢复配置,非常方便
创建储存池
储存池相当于一个虚拟盘,可以有多个物理硬盘通过不同的组合(raid1、raidz)在软件上作为一个盘。
具体可以看看 B 站这个视频
Nextcloud
安装 Nextcloud
注意因为众所周知的原因,安装插件没有梯子有可能会失败,我在路由器中配置了梯子得以解决。
在插件
中找到并点击安装
建议选择高级插件安装。个人喜好不用 dhcp 也不用 nat,直接手动配置 ip,相当于桥接模式,虚拟机的虚拟网卡直接连接到路由器,这样虚拟机和 truenas 系统有着等同的网络地位,都在路由器路由表中占用一个 ip
其他选项默认,点击保存即可
配置 ssh
为了之后方便 SSL 证书的更新,我在 truenas 系统里生成了证书,并把公钥放在了 nextcloud jail 中。
运行ssh-keygen -o
命令即可
选择监狱-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 目录的内容
-
复制目录
cd /usr/local/www/nextcloud cp -r data backup
-
在
插件-nextcloud
中关闭 nextcloud -
在
监狱-nextcloud-挂载点
中添加挂载点 -
选择对应,你想要映射的目录即可,我这边是 main pool 中的 ncdata 数据集
-
重新开启 nextcloud jail
-
进入 nextcloud 维护模式(此时访问 nextcloud 会显示错误,因为数据文件夹没有文件)
sudo -u www php /usr/local/www/nextcloud/occ maintenance:mode --on # 提示没有sudo就安装一下 pkg install sudo
-
重新复制文件到数据目录
cp -r backup/. data
注意这里需要加/. 因为 data 目录已经存在
-
关闭维护模式
sudo -u www php /usr/local/www/nextcloud/occ maintenance:mode --off
-
检查权限
ls -l
确定 data 目录所有者和群组均为
www
chown -R www:www data
递归赋予权限
-
访问 nextcloud 检查是否成功
访问 nextcloud
在插件-nextcloud-安装说明
中写了默认生成的各种密码,包括登录 nextcloud 所需的密码
登录之后,在设置-概览
中可以检查还需优化的选项。
配置 crontab 执行
crontab -u www -e
# 添加如下内容
*/5 * * * * php -f /usr/local/www/nextcloud/cron.php
# 每5分钟执行一次命令
在 nextcloud web 端,访问设置-基本设置
,在后台任务中选择 cron
配置并使用 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
生成证书
# 注册
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 等服务。
前提是需要一个处于公网的服务器。
访问 NAS
- 连接上局域网时
- 终端设备向路由器发起 dns 请求,被拦截并返回局域网 ip
- 之后的流量都仅通过路由器转发,非常快速
- 公网环境,比如使用流量的手机
- 终端发起 dns 请求,被域名服务商提供的主机解析,为 frp 的公网 ip
- 访问流量通过服务器转发给 NAS
- NAS 将结果返回给服务器
- 服务器将结果发送给终端设备
frp 转发的流量,访问速度较慢(具体速度取决于服务器带宽,家庭网络带宽)。实测阿里云杭州学生轻量级服务器,带宽没记错的话是 1M,nextcloud 同步速度 700KB/s 波动。
具体的配置可以看这篇博客
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 的方式挂载在用户中。
这样 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 客户端,即可
配置 RPC 地址和密钥即可连接