记录使用树莓派搭建个人小型服务

为什么入手树莓派

原本有一台E3 1230 v2的z220 sff 32G 小型机作为服务,以前在公司运行。可以不用考虑电、网络等问题。

后来随着离职,小型机就在家中服务,发现功耗、网络等问题接憧而来。故为了解决这些问题想过好多方法

  • 傻瓜式

    直接将小型机24小时运行,噪音方面z220 sff做的还是比较好的可以直接忽略。当以24小时运行的时候发现耗电是一个大问题。

  • 使用时手动开启

    将小型机开启WOL(Wake On LAN), 当不需要的时候将主动关闭。当需要时候的时候,通过wol进行唤醒。这样解决了功耗的问题。

    唤醒方式有很多(在另一台电脑上唤醒、或者在路由器上配置唤醒(OpenWRT)、手机app),这些唤醒方法都需要在同一个网段下。

  • 半自动式

    这时出现了一种需求,当我在异地的时候需要访问某个服务。这时又不在一个网段下此时只能需要打电话告诉家里的小伙伴帮我开一下电脑

    这时出现了开启的问题,所以又针对这个问题想了2个方案。

    • 一个是采用智能插座将电脑设置成通电自动开机,
    • 采用嵌入式小板结合MQTT实现远程发送wol指令(当时采用此方案esp8266+lua+mqtt+web)
  • 24小时运行问题

    这样通过以上几种的方案的折腾发现功耗确实下来了,基本就是用时耗电,不用的时候不耗电。

    但是以上方案存在一个问题, 当某个服务需要24小时的运行的时候, 设备一致处于运行状态了。这样功耗的问题又上来了

    • 为了解决功耗的问题, 将之前的树莓派3B充当部分24小时运行的服务平台。 随着服务的增加3B的内存(1G)是硬伤
    • 后来入手了一个Rock64(运存4G)运行好多服务。确实省电
  • SD Card读写速度

    sd card是硬伤

    • 当在卡片电脑上运行Gitlab时,出现了CPU飙升、运行缓慢的问题了。经排查是性能不满足,主要是sd card的读写速度
    • 后来改良了一版Rock64+USB3.0(硬盘盒)的方案。运行了几个月。

随着不断的折腾、不断的投入,毛爷爷都流失了

这时树莓派发布了8G的运存的4B,果断入手。将全部服务迁移到树莓派4B上。经过压测性能瓶颈还是卡在sd card上。

幸运的是官方发布了USB引导的方案, 需要刷引导到最新的版本(好像是v1.4以后)

经过测试,完全满足自己的需求。现在的问题是各个零件是散落的,不利于管理,稍微松动就会导致机器重启。

在某宝闲逛的时候发现了Argon v1 外壳(120毛爷爷), 入手后,只能插入sd card, argon的v2版本增加了一个底座可以扩展固态 M.2 sata ssd。

去狗东入手一个500G的M.2 sata ssd

此时的树莓派是一个性能完胜的小型机,从功耗、运行速度等都能满足自己的需求。

来自某宝哈

来自某宝哈

  • z220 sff的处理

    现在将涉及的服务都已经迁移到树莓派4B上。小型机已经不使用了。这时将z220 sff安装了黑苹果(e3 1230v2 无核显,需要入手显卡),MacOS 10.13.6这样机器又利用起来了

网络的解决

当小型机在家中运行的时候。 网络的问题就出现了,怎么才能将服务对外。

  • 傻瓜式

    某宝只接购买盒子,进行内网穿透(没有采用,只接放弃)

  • ngork

    通过ngork暴露自己的80 443端口 缺点: 不能使用自己的域名,只做测试,也放弃了

  • frp

    在GitHub找到了frp(后来出现很多重复的轮子),一个golang写的性能还是不错。唯一的缺陷是需要一个固定的ip(我自己有),所以采用了frp进行反向打洞 适合小文件、小流量

  • 动态公网ip

    向运营商申请了一个动态的公网(说好话,别撕逼)这样可以直接访问开启的端口。 适合大文件、大流量, 主要解决NAS的问题。 缺点:动态ip的变化,随着路由器重启或者运营商的切换。ip地址用一段的时候就切换了 解决:采用ddns,本地运行一个服务,每10分钟检查一下出口ip,将最新的ip设置到对应的域名上。至此公网直接使用域名访问即可。

最终的方案是: frp(小流量)+动态公网ip(大流量)

数据备份问题

原来使用proxmox的备份方式是直接备份kvm或者openvz到备份磁盘中。省去很多时间

使用树莓派后, 所有的备份都需要自己写脚本进行备份。

因为树莓派只能扩展一个sata ssd,这样数据的备份就是问题。

  • 冷备

    树莓派有2个USB 3.0 可以插入一个硬盘盒进行数据备份,

  • rsync

    采用增量同步方式,首次会进行全量备份,后续的会根据文件的改动进行增量同步。 存在可以采用外挂硬盘盒

  • 自动备份(设想)

    采用golang或者shell编写备份指令,将备份的文件同步到指定的smb服务下(nas需要唤醒)这样数据的备份是多份的。可以放心使用

  • restic(强大 go语言实现)(使用中)

传送门

插入SD Card 120G的内存卡作为备份目录

使用记录

 1# 1. 初始化备份仓库 目录的名字为 backup 注意 需要输入密码,一定要记住了 要不就完蛋了
 2restic init --repo ./backup
 3
 4# 2. 将docker-compose目录下的所有文件 备份到 仓库路径为当前路径下backup目录下, 后面的backup代表执行的指令为备份
 5restic -r ./backup backup docker-compose
 6
 7# 3. 查看仓库./backup下的快照版本 注意ID的名字 用于恢复
 8restic -r ./backup snapshots
 9
10# 4. 恢复快照版本8c4b2b4a到./mywork_restore目录下
11restic -r ./backup restore 8c4b2b4a --target ./mywork_restore

软件篇

  • 操作系统

    采用manjaro(arch)作为系统。 系统安装所需的必备软件例如Python、golang、docker、docker-compose、hugo、vim、oh my zsh等等

  • 应用软件-中间件

    • frp client: 内网穿透
    • redis cluster: redis集群
    • consul cluster: consul服务发现
    • proxy socks5: 梯子
    • Dockerfile: 通过docker编写自己的业务镜像, 我的hub.docker.com clibing编写了一些多平台的常用镜像
  • 微服务

    隐藏

  • 常用软件

直接展示 docker ps 输入吧 ,懒得写了

 1clibing/alpine-frp:v0.31.2                          "entrypoint.sh"          ..................................
 2clibing/clibing.com                                 "nginx -g 'daemon of…"   ..................................
 3clibing/alpine-nexus:arm64v8-oracle-jdk-3.15.2-01   "bin/nexus run"          ..................................
 4clibing/alpine-openjdk:8-242                        "/sbin/tini -- java …"   ..................................
 5clibing/alpine-fastdfs:v5.11                        "/entrypoint.sh fdhtd"   ..................................
 6clibing/alpine-aliyun-ddns                          "/bin/sh -c 'aliyun-…"   ..................................
 7clibing/alpine-redis:6.0.5                          "/entrypoint.sh redi…"   ..................................
 8clibing/alpine-dragonite:0.4.0                      "/bin/bash docker-en…"   ..................................
 9bitwardenrs/server:1.19.0                           "/usr/bin/dumb-init …"   ..................................
10mysql/mysql-server:8.0.21                           "/entrypoint.sh mysq…"   ..................................
11arm64v8/adminer:4.8.0-standalone                    "entrypoint.sh docke…"   ..................................
12gitea/gitea:1.12.4                                  "/usr/bin/entrypoint…"   ..................................
13consul:1.9.8                                        "docker-entrypoint.s…"   ..................................
14redis:6.2.5                                         "/bin/bash redis.sh"     ..................................
15portainer/portainer:1.24.2-alpine                   "/portainer"             ..................................
16xavierniu/cloudreve:arm64v8                         "./entrypoint.sh"        ..................................
17p3terx/aria2-pro                                    "/init"                  ..................................
18zcube/cadvisor:latest                               "/usr/bin/cadvisor -…"   ..................................
19prom/mysqld-exporter:master                         "/bin/mysqld_exporter"   ..................................
20grafana/grafana:latest                              "/run.sh"                ..................................
21prom/prometheus:latest                              "/bin/prometheus --c…"   ..................................
22prom/node-exporter:latest                           "/bin/node_exporter …"   ..................................

GPIO

1.wiringPi 记录PI2的记录,不是树莓派4.注意

 1  +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+
 2 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
 3 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
 4 |     |     |    3.3v |      |   |  1 || 2  |   |      | 5v      |     |     |
 5 |   2 |   8 |   SDA.1 |   IN | 1 |  3 || 4  |   |      | 5v      |     |     |
 6 |   3 |   9 |   SCL.1 |   IN | 1 |  5 || 6  |   |      | 0v      |     |     |
 7 |   4 |   7 | GPIO. 7 |   IN | 1 |  7 || 8  | 1 | ALT0 | TxD     | 15  | 14  |
 8 |     |     |      0v |      |   |  9 || 10 | 1 | ALT0 | RxD     | 16  | 15  |
 9 |  17 |   0 | GPIO. 0 |   IN | 0 | 11 || 12 | 0 | IN   | GPIO. 1 | 1   | 18  |
10 |  27 |   2 | GPIO. 2 |   IN | 0 | 13 || 14 |   |      | 0v      |     |     |
11 |  22 |   3 | GPIO. 3 |   IN | 0 | 15 || 16 | 0 | IN   | GPIO. 4 | 4   | 23  |
12 |     |     |    3.3v |      |   | 17 || 18 | 0 | IN   | GPIO. 5 | 5   | 24  |
13 |  10 |  12 |    MOSI |   IN | 0 | 19 || 20 |   |      | 0v      |     |     |
14 |   9 |  13 |    MISO |   IN | 0 | 21 || 22 | 0 | IN   | GPIO. 6 | 6   | 25  |
15 |  11 |  14 |    SCLK |   IN | 0 | 23 || 24 | 1 | IN   | CE0     | 10  | 8   |
16 |     |     |      0v |      |   | 25 || 26 | 1 | IN   | CE1     | 11  | 7   |
17 |   0 |  30 |   SDA.0 |   IN | 1 | 27 || 28 | 1 | IN   | SCL.0   | 31  | 1   |
18 |   5 |  21 | GPIO.21 |   IN | 1 | 29 || 30 |   |      | 0v      |     |     |
19 |   6 |  22 | GPIO.22 |   IN | 1 | 31 || 32 | 0 | IN   | GPIO.26 | 26  | 12  |
20 |  13 |  23 | GPIO.23 |   IN | 0 | 33 || 34 |   |      | 0v      |     |     |
21 |  19 |  24 | GPIO.24 |   IN | 0 | 35 || 36 | 0 | IN   | GPIO.27 | 27  | 16  |
22 |  26 |  25 | GPIO.25 |   IN | 0 | 37 || 38 | 0 | IN   | GPIO.28 | 28  | 20  |
23 |     |     |      0v |      |   | 39 || 40 | 0 | IN   | GPIO.29 | 29  | 21  |
24 +-----+-----+---------+------+---+----++----+---+------+---------+-----+-----+
25 | BCM | wPi |   Name  | Mode | V | Physical | V | Mode | Name    | wPi | BCM |
26 +-----+-----+---------+------+---+---Pi 2---+---+------+---------+-----+-----+