树莓派部署博客
树莓派建站
树莓派建站原因
为何想到用树莓派建站?很简单,云服务器要钱,而且每年花费的金额都不是小数。所以为了解决这个问题,只好用树莓派搭建自己的个人博客,而且还免费。刚好手里有一个闲置了很久的树莓派,正好解决这个服务器的开销。
系统框架
搭建整个系统,需要先对框架进行了解:
系统主要分为四个模块:
- 一台本地PC,用作用户端,进行文字的编辑,并通过Hexo框架的指令生成静态网页代码(一堆文件,以及index.html)。并且可以将生成的代码通过Git上传到服务器;
- 一台树莓派,作为服务器,用于存放本地PC上传的代码。存放的代码需要通过Nginx服务器,将网页通过内网IP进行展示;
- 内网穿透(内网穿透方式有很多种,我选择的是Sakura frp),用于将外网的端口映射到内网的IP上,这样,就可以通过frp供应商提供的IP端口进行内网访问了;
- 一个域名(这个域名可有可无其实),用作外部访问的入口,通过DNS解析到外网的IP端口或者域名即可大功告成。
本地PC
Hexo
关于用Hexo搭建博客的方式,网上有很多方式。本文只是简单的介绍,详细搭建步骤,大家可以自己上网搜索。
安装Node.js
下载nodejs并安装,安装之后,打开系统cmd命令行,依次输入1
2node -v
npm -v
返回正确的版本信息即安装完成(先不要关闭,还要用命令行工具)。
安装Hexo
使用nodejs的npm包管理器安装hexo,在cmd命令行中,输入安装指令。1
2npm install -g hexo-cli
hexo -v
根据返回的版本号,确定是否安装成功。
Hexo生成网页
创建任意文件夹。在文件夹位置打开cmd命令行,输入命令:1
hexo init test-Blog # hexo初始化
再次查看文件夹,就会有Hexo框架的源代码了。
接下来进入文件夹,依次输入以下命令:1
2
3cd test-Blog # 进入文件夹
hexo g # hexo生成静态网页
hexo s # hexo开启本地端口
此时,访问 localhost:4000即可从本地PC上访问Hexo生成的静态网页了。
当然,如果之前已经用hexo建立过博客,把之前的博客文件全部替换过来,然后再修改_config.yml文件的deploy属性即可。
Git
安装Git
本地的网页需要上传至服务器,采用Git方案。需要去Git官网下载:
Git下载地址
正常默认安装即可。
生成ssh公钥
进入到C:\Users\praetor.ssh文件夹,然后右键git bash here(前提是已经安装了git)。再然后在git的命令框输入:1
ssh-keygen -t rsa -f rpi
如果你们之前没有生成过公钥,不用做我上面那一步生成rpi的公钥私钥。你们可以直接win+R后在提示框输入cmd进入命令行窗口,直接输入下面的语句即可,注意:这里的邮箱地址输入你们自己的。1
ssh-keygen -t rsa -C "邮箱地址"
一直回车即可,公钥一般会被保存在 C:\Users\用户名.ssh 下,当服务器搭建起来之后,需要将公钥放在服务器端,方便访问。
本地PC端的设置到此基本完成。
树莓派
树莓派系统安装在此就不多说了。正常安装了树莓派系统的,应该都可以ssh连接。就从ssh连接之后开讲。
配置树莓派
树莓派更换源
- 打开树莓派镜像列表sources.list
1
sudo vim /etc/apt/sources.list
- 将内容替换为清华大学源(如果你们能使用特殊上网方式,这一步也可以不用做)
1
2deb http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi
deb-src http://mirrors.tuna.tsinghua.edu.cn/raspbian/raspbian/ stretch main contrib non-free rpi - 更新源
1
sudo apt-get update
配置远程仓库
树莓派安装Git
1 | sudo apt-get install git |
回复正确的版本号即安装完成。
建立Git远程仓库
我的目标是将树莓派用作个人服务器,搭建在自己家中,和台式机在一个内网中。
所以需要在树莓派端用Git建立一个远程仓库,本地PC通过Git提交本地网页代码至远程仓库。
注意:这种方法适用于各类云服务器,我这里树莓派相当于替代了云服务器。(所以我的本地PC要求在树莓派的局域网内)
建立步骤:
- 创建文件夹
1
2
3sudo mkdir /var/repo/ # 创建一个文件夹
sudo chown -R $USER:$USER /var/repo/ # 分到用户组
sudo chmod -R 755 /var/repo/ # 改变文件夹权限(含义请百度) - 进入文件夹,创建Git仓库,名称为XXXXX。
1
2cd /var/repo/
git init --bare XXXXX.git - 仓库映射(这几步很重要),创建文件夹作为nginx根目录,之后nginx配置root就是配置这个文件夹。
1
sudo mkdir -p /var/www/hexo
- 修改目录权限在仓库XXXXX下创建钩子文件(直接vi即可,vi建议学一下哟,还是很常用的),将网站文件传送到刚才创建的文件夹/var/www/hexo下。(记得改XXXXX):
1
2sudo chown -R $USER:$USER /var/www/hexo
sudo chmod -R 755 /var/www/hexo在文件中,写入以下内容:1
sudo vim /var/repo/XXXXX.git/hooks/post-receive
保存退出,改变文件权限,让文件变为可执行文件。1
2#!/bin/bash
git --work-tree=/var/www/hexo --git-dir=/var/repo/XXXXX.git checkout -f这样远程Git仓库也搞定了。接下来安装&配置nginx。1
sudo chmod +x /var/repo/XXXXX.git/hooks/post-receive
安装nginx
1 | sudo apt-get install nginx |
安装返回正确版本号即可。
配置nginx
打开nginx默认配置项:1
sudo vim /etc/nginx/sites-available/default
将root值修改为我们建立的根目录 /var/www/hexo,我们也能看到,nginx此时只开启了80端口,即http端口,之后我们会再配置https的443端口。
保存退出,重启nginx服务:1
sudo service nginx restart
此时通过内网已经可以访问树莓派的nginx了,在浏览器输入树莓派IP地址回车即可。(此时应该只能看到nginx的界面)
添加公钥
在前面安装完PC端Git之后,我们生成了一段公钥,这时候就要把这个公钥添加在树莓派中,让树莓派不会拒绝我们的代码提交。在.ssh文件夹中用右键 git bash here 打开终端上传公钥即可:1
ssh-copy-id -i 你生成的公钥名称 -p 22 树莓派用户名@树莓派IP
安装完毕,配置PC端hexo的_config.yml文件,填写deploy:1
2
3
4
5
6deploy:
type: git
repository:
rpi: 树莓派用户名@树莓派IP地址:/var/repo/XXXXX
github: https://github.com/用户名/用户名.github.io.git
branch: master # 需要树莓派与git pages的仓库名都为master
都修改完之后,本地 hexo clean && hexo g && hexo d
然后即可一次同时部署树莓派和git pages两个仓库。
但是执行,hexo d报错:1
ERROR Deployer not found: git
解决方案
这是因为没安装hexo-deployer-git插件,在站点目录下输入下面的插件安装就好了:1
npm install hexo-deployer-git --save
然后在使用Hexo d命令就可以推送了。
再次访问树莓派IP地址,网站出现,整体工作完成一半。
内网穿透
为了方便,本人用的是ngrok的内网穿透,方法简单,无需域名。就是有一个缺点,不能自定义域名。
接下来是详细步骤:
先去ngrok网站注册账号,然后登录会显示以下界面,按图上步骤进行选择:
选择后往下拉,会看到该界面,点击第3步的进行下载:
下载完成后,到该文件的下载目录下,在文件路径框处直接输入cmd命令会跳出命令提示符窗口,然后输入以下命令,把下载的文件传送到树莓派:
接下来就是在树莓派输入以下两条命令:
注意:因为我们已经在上面的3个步骤把文件下载并传送到了树莓派,所以我们第一条命令修改一下。首先,我们在树莓派上切换目录到下载文件所在的文件夹,然后换成下面的命令即可,例如我下面的是:最后,直接运行下面的命令即可,运行之后,命令行会给出相应的访问域名,第一张图的命令是随机域名;第二张图是固定域名:
最后,直接访问给出的域名即可,例如我的树莓派内网穿透后的域名是:https://quality-precious-firefly.ngrok-free.app。你们可以访问看看哦,嘻嘻。
扩展
如果在hexo三连时,出现以下错误:
直接在git bash上运行下面的命令即可:1
git config --global http.sslVerify "false"
又或者不设置代理,自行网上查。