【树莓派】路由,NAS,密码服务器和一些定时脚本

TL;DR

拿到树莓派估计也有一周多了,折腾了不少东西。在折腾之前,很多人可能只知道树莓派,但是慢慢上手了才发现针对不同的应用都有更专业更有性价比的产品,比如简单的做路由和NAS相关功能的蜗牛、N1,做工业开发的国产版。树莓派就是一个什么都能做一点的东西,可惜在一些方面做不到那么专业。这篇主要讲怎么点亮树莓派4B上的Manjaro,OpenWrt中的NAS自建密码服务器和一些脚本。讲结构居多,具体手把手教程有附链接就不重复了。

Plan

前期计划:

  • 私有云和NAS:连接到我的好几块硬盘,先能够局域网访问,再考虑内网穿透实现公网访问
  • 部署Bitwarden密码服务器:有一篇计划之中的post「什么样的密码管理才是我们需要的」(本来很早就应该写好的),部署开源的密码服务到私有服务器是这个计划的最后一步。目前未考虑开放公网访问
  • 运行一些全天任务,如RSS定时抓取,天气等定时脚本
  • Web开发

后期计划:见Next

Path

装系统

树莓派4B的系统最初可以通过TF卡安装。针对树莓派的Linux系统很多,随便一搜就可以看到推荐和对比。树莓派4B可以直接安装arm 64的系统,我安装的是Manjaro-ARM 20.10,有树莓派版

  1. Manjaro的第一次启动必须要外接屏幕和键盘来设置账户,不能像树莓盘官方系统那样直接用默认账户ssh进去
  2. Manjaro的ssh服务是默认开机启动的,第一次启动之后的每次开机就不再需要外接屏幕和键盘了,除非启动失败
  3. 远程看桌面GUI可以用VNC或者ssh的X-forwarding。折腾了几天VNC也没有成功,tigervnc切换不了默认的DE(默认DE是LXDE。推测这和arm arch有关,arm上很多默认path不一样)。别的VNC也不行,浪费了好几天。于是现在纯ssh使用
  4. 有的软件包并不支持arm 64这种架构,要干特定事情之前最好查一下支持情况。实测mutt这种强行编译也是可以用的
  5. 终端换成了zsh,用了oh my zsh,和我本地的zsh配置文件同步了,软件包和主题都有了。我的.zshrc gist在这里。还装了yayautojump和自动补全等一系列工具
截屏2020-10-26 11.35.09

OpenWrt in Docker

OpenWrt的功能非常多,通常是给路由器用的固件,但是别的Linux也可以刷它来做旁路由,甚至像树莓派这种带网口和WiFi的机器可以做主路由。NAS,梯子,计划任务,aria,Transmission等都有。我是把它安装在Docker中的,也可以直接把它装成树莓派的主系统。

  1. 安装Docker
  2. 安装针对树莓派的Docker镜像。OpenWrt有两个主要的社区buff版本,具体的可以搜一下
  3. 运行镜像,通过本地端口在随便一个浏览器访问192.168.x.x就进入到了管理页面

2020.10.26 在树莓派的Docker上运行的OpenWrt是不支持WiFi桥接的(也就是,树莓派主机必须和路由器通过物理网线连接),等待后续更新,或者一些别的方法出现。

  1. 挂载外部硬盘,启动SAMBA或者ftp,当NAS
  2. 路由器端口映射,公网也可以访问
  3. OpenWrt还有很多别的功能,比如服务监控,很实用

别人的全套教程:

固件:(Docker Hub上面一搜也有很多)

服务通知:

涉及到硬盘挂载时,由于之前不熟悉,踩了很多坑:

  • ntfs格式的硬盘支持需要软件包
  • 由于我两块SSD以前都是Mac专用,都是苹果的HFS+日志格式,这种格式在Linux系统上是只读的;苹果的时间机器对磁盘格式还有要求(必须是HFS+或者APFS,见:在 Mac 上可以与时间机器配合使用的磁盘类型),所以打算用NAS来当时间机器备份,需要先在macOS上关闭磁盘的日志功能,再在Linux中安装hfsprogs来实现读写
  • 开机挂载点,挂载目录的权限都要设置,不然可能重启就挂载到新目录了,或者某些设备出现读写权限的问题
  • 可以先用shell在/mnt下面测试挂载硬盘的权限再在OpenWrt页面中开启网络存储

OpenWrt还可以换主题,安装别的支持软件包等等。

我试过两种「树莓派=网络」的连接方式:

  1. 路由器有线桥接。速度限制在网线或路由器WiFi的最大速度,远远达不到硬盘本身的USB 3.0速度
  2. 直接和我的电脑有线桥接。速度就是硬盘本身的速度减去传输的损耗。但是既然都用网线连接到我的电脑了,为什么不直接把硬盘插在电脑上直接用呢?
image-20201026144113643 image-20201026144153489

配置好了之后,在Mac和Android上都能直接访问SMB硬盘。macOS的Finder提供了原生支持,三星的文件浏览器也支持直接挂载SMB网络存储,甚至可以设置为存储目录。如果计划长期作为NAS使用,建议使用带电源的硬盘SATA接口和使用专门的NAS硬盘,并做好备份和防挂措施。

下一步:100MB/s读写的NAS

Bitwarden in Docker

Bitwarden是开源免费的密码服务,你可以选择使用在线版,并交钱解锁会员功能;或者将它部署在自己的服务器上,免费使用所有功能。它是跨平台的,支持自动填充。

Bitwarden官方的部署指南写的非常详细,同时Bitwarden本身配置也很复杂,需要一点网络基础。我使用的是buff版本的Bitwarden_rs。部署的教程很多,我全程看的是这一篇:

Setting up a Private Password Vault in 5 Minutes with Docker

然后就可以直接通过局域网的网页访问了。

登录页面:

image-20201026135742060

因为本地部署而解锁的付费功能:

image-20201026135806154

教程中提到了创建私人CA证书来实现局域网内https访问(SSL证书是在移动端使用app所必须的),然而我折腾了好几天依然没有成功。现在依然是http访问,同时不能在手机app上访问。以后如果有公共证书了我再继续配置,目前就是在局域网内能实现浏览器访问和电脑Chrome上自动填充。为什么使用它和更多密码管理的事情我会在以后的post中讲到。

那篇教程所使用的镜像除了Bitwarden主服务,还包括配置好的nginx反向代理Bitwarden备份服务,一站解决。

除此之外,还做了几个别的事:

  • 开启admin页面,有各种后台管理。相当于配置文件的GUI

    docker-compose.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    services:
    bitwarden:
    image: bitwardenrs/server:raspberry #swap tag to raspberry to run on a raspberry pi
    expose:
    - "80"
    volumes:
    - ./data/bitwarden:/data
    restart: on-failure
    environment:
    WEBSOCKET_ENABLED: 'true'
    ADMIN_TOKEN: 'XXXXXX'
    # 设置token之后,admin页面就可用了。在<server ip>/admin输入token就可以进入

    image-20201026145748625

  • 关闭用户注册功能。因为只有我一个人用。在配置文件或者admin页面可以关

  • 路由器上配置端口映射,由于家里的网有公网IP,可以实现公网访问;正常情况下为了防止攻击,端口映射都关了

总结:想配置一个私人的https太难了,有经验欢迎交流PS 底下的评论系统好像被LeanClound挂了,暂时没有迁移到别的评论系统的打算(毕竟评论那么少),可以通过邮箱联系到我。

目前Docker上在跑的服务

image-20201026141559830

Scripts

写了两个定时shell脚本,用cron来实现定时或者周期执行。

定期检查公网IP,发生变动则邮件通知

邮件发送用的mutt + qq邮箱的smtp

checkIP.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/zsh
echo "Checking IP"
NEW_IP=$(wget -qO - https://api.ipify.org)
OLD_IP=$(<externalip)
export OLD_IP
export NEW_IP
if [ "$NEW_IP" = "$OLD_IP" ]
then
echo "External IP not changed"
else
echo "External IP changed" > ip_mail.txt
echo "OLD: ${OLD_IP}" >> ip_mail.txt
echo "NEW: ${NEW_IP}" >> ip_mail.txt
mutt XXX@XXX.com -s "External IP changed" < ip_mail.txt
echo $NEW_IP > externalip
echo "Email has been sent.\nNew IP ${NEW_IP} has been recorded in ~/externalip."
fi

截屏2020-10-26 14.32.51

每天发送系统报告

sys_report.sh

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/zsh
vcgencmd measure_temp > sys_report.txt
uptime >> sys_report.txt
iostat -mt >> sys_report.txt
vmstat 3 3 >> sys_report.txt
echo "\nIP: ${NEW_IP}" >> sys_report.txt
echo "Host name: $(hostname -f), addresses: $(hostname -i)\n" >> sys_report.txt
docker ps --format "table {{.ID}}\t{{.Names}}\t{{.Status}}" -a >> sys_report.txt
echo " " >> sys_report.txt
crontab -l >> sys_report.txt

mutt xxx@xxx.com -s "[System Report] Usage" -a sys_report.txt < sys_report.txt

截屏2020-10-26 14.35.10

PS mutt发邮件不支持换字体,所以邮件正文不是等宽字体对不齐。解决方式是发送html编码的邮件。

Next

这篇也就写到这里,接下来的Roadmap里的东西就开新篇写了。

可能的有

  • 买个小显示屏,显示系统状态,公网/内网IP,天气等
  • 作为服务器,先把我这个博客放上来 然后试试app的后台数据库(又是一个被搁置的项目)
  • 作为一个闲时计算平台,跑一些non-intensive的代码,或者没事跑跑网络profile
  • 外接硬件,温度湿度空气质量
  • 独立于NAS的本地串流服务
  • CI服务,私有GitLab
  • 挖矿(调查了一两天,因为单机算力暂时搁置)