前言
前段时间参加掘金的coze活动得了一个树莓派,这玩意对我来说没啥用,我就把他改造成了服务器,毕竟是4C4G配置,肯定要比我买的2C2G腾讯云服务器好一点。
身为一个前端,服务器知识少的可怜,经过一周的时间学习尝试,还是把树莓派一步步改造成了个人服务器。
大家如果有闲置电脑也可以按照我的方案改造成服务器,性能肯定比云服务器强。
树莓派
树莓派(Raspberry Pi)是一款由英国树莓派基金会(Raspberry Pi Foundation)开发的微型单板计算机。它的设计初衷是促进计算机科学教育,尤其是在发展中国家和学校中。树莓派凭借其低廉的价格、小巧的体积和丰富的功能,广泛应用于教育、开发和各种创客项目中。
树莓派有多个型号,主要包括:
-
树莓派1:这是最早的型号,发布于2012年。采用了ARMv6架构的处理器,性能相对较低,但已经可以运行Linux操作系统并支持基本的编程和开发工作。
-
树莓派2:发布于2015年,采用了四核ARM Cortex-A7处理器,性能大幅提升,适合更复杂的项目和应用。
-
树莓派3:发布于2016年,配备了四核ARM Cortex-A53处理器,首次引入了内置的Wi-Fi和蓝牙功能,进一步提升了便利性。
-
树莓派4:发布于2019年,提供了1GB、2GB、4GB和8GB RAM的不同版本,配备了更强大的四核ARM Cortex-A72处理器,支持双显示输出、USB 3.0接口等功能,极大地扩展了其应用范围。
-
树莓派400:是一款将键盘与计算机集成在一起的设备,发布于2020年,主要面向教育市场。
树莓派的主要特点包括:
- 低成本
- 小巧便携
- 强大的社区支持
- 丰富的I/O接口(如GPIO、USB、HDMI、音频、CSI等)
- 支持多种操作系统(如Raspbian、Ubuntu、Windows 10 IoT Core等)
树莓派可以用于多种项目,如家庭自动化、媒体中心、机器人、网络服务器、编程学习平台等。它的开源特性和模块化设计使其成为创客和开发者的热门选择。
我这次得到的是树莓派4B,性能还是不错的。
购买tf卡
拿到树莓派,发现它不自带磁盘,所以需要自己买。为了体积小巧,它支持tf卡,就是以前手机里的内存卡,小的那种。
然后我自己从某多多上花了36元买了一个64G tf卡,又买了一个卡套。一切准备就绪,下面开始给树莓派安装系统。
安装树莓派系统
先到www.raspberrypi.com/software/ 网站下载烧录系统到tf卡的软件,因为我的电脑是mac,所以下载的是mac版本,也有windows版本。
把tf卡插到电脑上,打开刚安装好的软件,选择要安装的操作系统,选择存储卡。
这里我选择的是RaspBerry Pi OS Lite版本,因为是要做服务器,不需要桌面,如果你想要桌面可以选择RaspBerry Pi OS版本。
选择完成后,点击NEXT按钮。
点击编辑设置
设置主机名和系统用户名和密码,同时需要配置WiFi。主机名和系统用户名、密码这三个设置完成后,一定要记住,后面会用到。
切到Services标签,开启SSH服务。
最后点击确定,开始烧录,这个时间可能会有点长。
烧录成功
推出内存卡,然后把卡插入树莓派,启动树莓派,过一会树莓派启动成功后,使用终端获取树莓派内网ip地址
在终端中ping前面设置的主机名,就能获取内网ip了,这里注意一下,树莓派必须和电脑在同一个局域网。
使用ssh连接树莓派,@前面是用户名,后面是内网ip,输入完成后,回车会让你输入密码,输入完刚才设置的密码后回车就能连上了。
ssh xiaofu@192.168.1.11
到这里树莓派系统终于安装成功了
安装docker
下面我们来安装docker,只要安装了docker,安装其他东西就比较简单了。
在网上找了很多教程安装docker,都不行,直到找到这篇文章,终于安装成功了。
blog.hsj01wzonline.top/posts/myblo…
跟着上面教程一步一步输入命令就行了
#清华大学镜像站
export DOWNLOAD_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce"
#中科大镜像站
export DOWNLOAD_URL="http://mirrors.ustc.edu.cn/docker-ce"
sudo apt install curl
这一步有点慢,要等一会
sudo curl -fsSL https://get.hsj01wzonline.top:9186/sh/docker.sh | bash
设置开机启动
sudo systemctl enable docker
检验是否安装成功
镜像同步
大家应该都知道前段时间国内无法访问dockerhub拉镜像了,我从网上找到一个方案,使用github的actions把dockerhub上的镜像同步到自己的阿里云镜像仓库中。
登录阿里云,然后搜索容器镜像服务或ACR,如果没有开通服务,需要先开通服务
点击个人实例,虽然限额使用,但是是免费的
创建命名空间,可以设置为公开,这样其他地方拉镜像的时候,就不用登录了。
在个人凭证这里设置密码,账号是阿里云的登录账号
然后到github上创建一个项目 github.com/dbfu/images…
如果你们也想用,可以直接fork我的项目。
添加两个密钥:
ALIYUN_REGISTRY_USER:阿里云用户名
ALIYUN_REGISTRY_PASSWORD:刚才设置的密码
安装portainer 在线docker管理工具
上面把镜像同步搞定了,现在我们来安装一个在线管理docker的工具,这个工具可以直接使用docker启动。
首先到dockerhub上搜索这个portainer镜像,搜索后把名字复制下来
然后到github上修改刚才仓库里的代码
这里注意一下,树莓派系统架构是arm构架,这种方式同步过去的镜像是amd架构,在树莓派里无法运行,所以我们要指定镜像架构,这个地方卡了我很长时间。
点击arm构架镜像进去,复制MANIFEST DIGEST
修改镜像名称,把刚才复制的内容黏贴到这里,前面加@符号
然后点击提交代码
等待github运行action同步镜像,过一会刷新阿里云镜像仓库,可以看到已经同步过来了
点击这里复制镜像仓库地址
到树莓派中拉取镜像,:后面的版本号和前面代码中设置的版本号要一样
镜像拉取成功,可以使用docker images 查看镜像
执行命令创建卷
docker volume create portainer_data
启动镜像
docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data 7cda22f6b2b7
后面的 7cda22f6b2b7 是镜像id,替换成自己的
启动后,使用docker ps
查看是否成功
在浏览器中访问 https://树莓派ip:9443 ,这里要注意一下是https,不支持http访问。
第一次进入需要设置账号密码
设置完密码后,进入首页,可以看到本地环境
进入本地环境,可以看到本地的镜像和启动的容器
安装minio当作图床
现在能白嫖的图床越来越少了,所以自己搭建一个吧。搭建个人图床我这里使用minio,minio使用起来比较简单,直接使用docker启动。
到dockerhub上搜索minio找到arm64架构的镜像
使用github同步
同步完成后,可以使用portainer拉取镜像,需要先配置aliyun源
也可以直接使用portainer启动镜像,但是minio官方已经给了命令,如果用portainer还要自己配置,所以我直接使用命令启动minio,启动前先创建卷
docker volume create minio_data
然后从官方复制命令,启动镜像
docker run --name minio -d --restart=always -e "MINIO_ROOT_USER=你的账号" -e "MINIO_ROOT_PASSWORD=你的密码" --publish 9000:9000 --publish 9001:9001 --volume minio_data:/bitnami/minio/data 你的镜像id
启动成功后,可以使用 http://你的树莓派ip:9001 访问服务
输入刚才设置的账号密码登录进来,创建一个桶
输入桶的名称
点击桶进去详情,修改权限,可以直接访问资源
到这里上传一个文件测试一下
输入 http://树莓派ip地址/桶的名称/图片名称 就可以访问了
公网访问图床服务
上面我们已经搭建了一个图床服务,但是只能局域网访问,用处不大。
这里给大家分享两个可以把内网服务暴露到公网的方案。
开通公网ip
因为我们网是上海联通的,可以直接打电话给客服,让他帮忙给公网ip给开一下,第二天基本就能开成功。如果你们那里不支持开通公网,可以看一下第二种方案。
公网ip开成功后,需要进光猫管理员后台修改配置,我家没有路由器只有光猫,输入http://192.168.1.1/CU.html 进入管理员后台,这里需要超级管理员密码,安装宽带的人知道,可以问一下他。
我从网上查了一下,可以设置虚拟主机,把内网端口映射出来,但是我按照教程配置不生效,我换了一个方案,使用DMZ方案,这个可以把整个机器所有端口都映射出去,很方便,但是有风险。
修改完,过一会就会生效。
在百度输入ip,查看自己公网ip
我们使用公网ip访问一下minio服务试试,http://公网ip:9001 ,正常来说是访问不了的,局域网内不能从公网访再问内网,我查了一下好像是NAT回流问题,我用手机开流量后开热点给电脑使用,是可以正常访问的。
使用ip访问服务不优雅,正好我在腾讯云有个域名,可以把二级域名解析到这个ip上。
这样就可以通过域名加端口号访问了,美中不足的地方,DMZ没办法把80端口映射出去,访问服务的时候必须带上端口号。
公网ip偶尔会变,这时候域名解析就会失效,怎么解决这个问题呢,可以使用ddns-go服务来解决,每当公网ip变化,会自动调用腾讯云的域名解析接口把ip改掉。ddns-go可以使用docker部署,部署起来也简单。
步骤和前面安装minio镜像差不多,我这边就不详细说了。
推荐使用这个镜像
启动镜像
docker run -d --name ddns-go --restart=always --net=host -v /opt/ddns-go:/root 616d11cc1b54
启动成功后,访问 http://树莓派ip:9876
因为我的域名是腾讯云,所以这里我选择腾讯云,点击下面创建腾讯云api密钥,去腾讯云那边创建密钥填入下面输入框中。
最后这里我配置了一个叮叮机器人通知,如果公网ip变了,会通知。
使用cloudflare端口转发
前面不能开公网ip的同学,可以试试这个方案,完全免费。这个方案和frp转发有点像,不过使用frp需要有个服务器,但是使用cloudflare,可以白嫖,缺点就是有点慢。
这个方案我是参考这篇文章mp.weixin.qq.com/s/6En5WH255…
先到www.cloudflare-cn.com/ 注册一个账号,登录进来
点击左侧 Zero Trust
这里正常操作是复制docker运行命令到服务器上运行,但是还是那个问题,无法从dockerhub上拉取镜像,所以还是采用前面方案把镜像同步到阿里云。
镜像运行成功后,这个状态会变成Connected
我又从腾讯云买了一个域名
点击下面保存,过一会使用file.xiaofu.xyz 访问,用这种方案的好处就是可以不用带端口号,并且不用担心上面回流问题,还不用备案,缺点是有点慢。
有的人应该访问不了,需要把新买的域名DNS服务器设置到cloudflare上
bonnie.ns.cloudflare.com
ram.ns.cloudflare.com
这个修改完成后,需要一段时间才能生效,慢慢等吧。
上面文章中有两个加速方案我没测试,感兴趣的可以测试一下。
博客
已经写了不少文章了,一直想弄一个自己的博客,因为自己的服务配置比较差,一直没弄。现在有服务器了,搭建一个博客玩玩。
博客我使用halo开源建站工具,颜值高功能强大,部署简单。
这里我使用docker部署,还是和以前一样,到dockerhub把镜像同步到阿里云镜像仓库。
运行镜像
docker run -it -d --name halo -p 8090:8090 -v ~/.halo2:/root/.halo2 镜像id
运行成功后,使用 http://树莓派ip地址:8090 访问
输入完信息后,点击初始化,登录后进去首页
然后再次访问 http://树莓派ip地址:8090, 可以看到自己的博客首页
如果想让别人使用域名访问你的博客,可以在cloudflare再添加一个端口转发。
这时候就能通过 blog.xiaofu.xyz/ 访问我的博客了
接下来就是把掘金文章搬运到我自己的博客中了,程序员能用脚本解决的问题,肯定不会自己动手,所以我写了一个脚本,把掘金的文章下载到本地,然后上传到自己的博客中。
脚本写完后,试了一下,发现掘金的图片做了防盗链,文章里的图片不能显示,于是优化了一下脚本,把文章里的图片地址抠出来,使用代码下载图片上传到自己的图床,然后再把文章里的图片链接换成自己图床的链接。
到掘金平台找一个接口,把cookie复制出来,然后设置自己的minio服务器的配置,然后慢慢等待下载文章。
下载完成后,到博客的管理后台安装导入插件
安装成功后,把我们下载下来的文章导入到博客中
导入成功后,再到文章菜单里全选发布就行了
再次访问博客, blog.xiaofu.xyz/
美中不足的地方,图片有掘金水印。
脚本代码我已经发到github了,下面会有脚本代码解析
使用Obsidian工具写文章
最近发现了一个比较好用的本地写文章的工具,就是Obsidian,以后可以在本地写文章,然后发布到掘金或自己的博客。
Obsidian默认上传图片,会把图片存放到本地,我找了一个插件可以把图片上传到图床里,不过需要现在安装PicGo。
PicGo默认不支持minio当图床,但是可以安装Minio插件
然后配置minio服务
然后到Obsidian安装插件 Image Auto Upload
上传url:http://127.0.0.1:36677/upload
删除url:http://127.0.0.1:36677/delete
复制一个图片测试一下,没问题可以正常使用。
下载掘金文章脚本解析
这个脚本用到了几个问题库
- inquirer用户交互
- ora loading库
- minio 上传图片到minio服务器
- node-fetch 解决低版本node不支持fetch的问题
代码解析
定义让用户输入的参数
校验参数
通过接口获取当前用户所有掘金文章,这里是通过cookie确定本人的,所以前面要输入掘金的cookie。
遍历所有文章,下载文章,这里可以使用Primise.all并行下载,但是掘金可能做了限流,接口调用太快,会报错,我就给做成一个一个下载了。
看一下下载文章的方法,先通过一个掘金接口,获取到文章的原始markdown内容
然后写一个正则表达式给文章里的图片链接抠出来,并且把图片链接替换成我们自己的图床链接
初始化minio客户端
然后下载图片并上传到minio服务器,和上面一样的问题,也可以做成并行的,但是怕报错,也是做成一个一个的下载
下载图片的方法
最后把文章内容写入到本地md目录下