搭建个人博客用到了这么些技术~ | 项目复盘

简介: 观前提醒只需几分钟,你就可以 搭建一个 超级酷炫的个人博客! 😋只要一行命令就可以实现博客的自动部署和邮件提醒 😝文章有点长~ 建议收藏慢慢看😄博客简介博客采用 Hexo 搭建,使用了 Butterfly 主题,结合 Gitee 仓库, Aliyun 服务器(运用到 Nginx , docker , node.js 等技术)HEXO简介HEXO是一个 静态网页 博客框架 , HEXO基于 Node.js, 采用 markdown 解析文章具体可以通过该链接了解: HEXO官方文档安装需要先安装 Node.js 和 Git ,为什么要安装这两个呢,博主使用后的


网络异常,图片无法展示
|


网络异常,图片无法展示
|





博客简介


博客采用 Hexo 搭建,使用了 Butterfly 主题,结合 Gitee 仓库, Aliyun 服务器(运用到 Nginx , docker , node.js 等技术)


HEXO


简介


HEXO是一个 静态网页 博客框架 , HEXO基于 Node.js, 采用 markdown 解析文章

具体可以通过该链接了解: HEXO官方文档


安装


需要先安装 Node.jsGit ,为什么要安装这两个呢,博主使用后的体会是:hexo的命令涉及到,比如


一开始初始化的时候就用到了 hexo init 命令,使用完后会看到文件夹下面多出个.git的文件夹, 还有执行部署命令 hexo deploy 部署到git仓库上的时候等等;


至于node,很明显的,当你安装hexo时就涉及到了 npm install -g hexo-cli (全局安装),npm是Node.js的包管理工具(package manager)


常用命令


  1. init (初始化博客)


hexo init 博客文件夹名称


cd 博客文件夹名称


npm install


  1. new (创建文章,页面等)


hexo new 文章名 (直接在source/_post文件夹下面创建相应的md文件)


hexo new page --path about/me "About me"创建一个 source/about/me.md 文件,文章title为"About me"


hexo new draft 文章名该命令会在 source\ _drafts 下创建草稿 ,可以通过hexo public post 草稿名 将该文章发表出来


  1. generate (生成静态文件)


简写:hexo g


hexo g -d 文件生成后立即部署网站hexo g -f 强制重新生成文件


  1. server (本地服务器调试)


简写:hexo s 默认路劲 http://localhost:4000/hexo s -p 重设端口


  1. clean


hexo clean 清除缓存文件 (db.json) 和已生成的静态文件 (public)。


Butterfly


  • 什么是Butterfly呢?


Butterfly是Hexo的一个主题之一,作者是 JerryC。 入门使用:


git clone -b master https://github.com/jerryc127/hexo-theme-butterfly.git themes/Butterfly
复制代码


在博客的根目录中执行上面的代码,然后修改博客根目录下的_config.yml文件(站点配置文件)中的主题为 theme: Butterfly,更改后遇到的错误在Butterfly文档中有提到,具体可以看看clone下来的主题中的 readme文件(十分重要!)


具体配置可以根据这个Butterfly文档 去配置。


插件讲解


评论模块之  Gitalk


  • 什么是 Gitalk 呢?


Gitalk is a modern comment component based on GitHub Issue and Preact


Gitalk是一个基于GitHub Issue和Preact的现代评论组件。


所以在使用Gitalk时,我们可以先到GitHub上注册一个新的仓库,专门用于存放博客的


评论,记住仓库的名字,下面要用到这些 配置:


网络异常,图片无法展示
|


repo就直接写你的仓库名称就好了,不用其他多余的。。(博主当时这里配置错了。。。下意识的以为是仓库的地址 )


其中的 clientID 和 clientSecret 需要我们在GitHub上新建一个 OAuthApp 后才可以得到,具体创建路径如下图(点击头像找到settings):


网络异常,图片无法展示
|


创建完成后即可得到 clientID 和 clientSecret 。


  • 为什么是创建 OAuthApp 而不是 GitHubApp 呢?


  1. 首先看下 gitalk 的说明,点击链接就直接进去到这个 OAuthApp 的创建页面


A GitHub Application is needed for authorization, if you don't have one, Click here to register a new one.


  1. GitHub的官网是这样说的:

网络异常,图片无法展示
|


博主的理解就是... gitalk是个app,你只要授权他使用你GitHub的用户信息就可以了,所


以只用到这个OAuthApp就行了,而GithubApp是个第三方app,对权限等有更细粒度的


控制,不止包括了授权这个操作。


创建 GitHubApp 时会出现如下的细粒度权限控制:

网络异常,图片无法展示
|


搜索模块之  Algolia


我们先来了解下Aloglia

网络异常,图片无法展示
|


Algolia是一个专门提供搜索服务的公司,可以看到有很多关于搜索的产品介绍,上图左


边红框依次是搜索API,即时搜索服务。(Algolia提供10000条记录存储和50000次搜索次


数,免费的)


博主的简单理解就是我们把相关数据上传到Algolia后,使用Algolia的相关api就可以搜


索了


注册登录之后 点击上图右上角的 Dashboard 按钮即可进入后台如下:


网络异常,图片无法展示
|


根据上图步骤即可创建一个 index ,这个是一个索引,用来存放我们博客的相关记录。


博主使用的插件是 hexo-algolia


npm install --save hexo-algolia
复制代码


在博客目录下通过该命令安装,安装完成后需要在我们的站点配置文件(在博客根目录下


的)_config.yml ,添加如下代码,


algolia:
  applicationID: 'applicationID'
  apiKey: 'apiKey'
  indexName: '...'
复制代码


网络异常,图片无法展示
|


如上图所示,点击Api keys可以获取自己的 applicationIDapiKey ,indexName 为你创建的index名称。


按照上图操作完成之后,我们还需要配置一个环境变量


HEXO_ALGOLIA_INDEXING_KEY,引用官网的话:


A separate API Key must be provided as an environment variable named


HEXO_ALGOLIA_INDEXING_KEY. Create it with these limited write access


permissions: Add records, Delete records, List indices, Delete index


博主使用的是Windows电脑,添加一个新的环境变量如下即可,变量值为你的 Admin


API Key(上图右边第三个红框)


网络异常,图片无法展示
|


添加完成后,在你执行hexo g生成静态文件后,再执行hexo algolia即可将你博客


的相关信息上传到 Algolia。


顺便提醒下,主题中的 local_search 和 algolia_search 只能开启一个哦。


Gitee(码云)


简介


码云(gitee.com)是 OSCHINA.NET 推出的代码托管平台,支持 Git 和 SVN,提供免费的私有仓库托管


使用


我们可以在gitee上创建一个私人仓库,然后在我们博客的站点配置文件(_config.xml)


中配置如下的代码:


deploy:
  type: 'git'
  repo: <repository url> #你的博客仓库地址
  branch: master  #分支 默认: gh-pages (GitHub) coding-pages (Coding.net) master (others)
  message:  #提交信息 默认: Site updated: {{ now('YYYY-MM-DD HH:mm:ss') }}
复制代码


同时安装一键部署插件: npm install hexo-deployer-git --save ,这样子当你


执行 hexo deploy 的时候,Hexo 会将博客中 public 目录推送到你的仓库中,并覆盖


其中的文件。


webhook


什么是webhook呢?


码云 WebHook 功能是帮助用户 push 代码后,自动回调一个您设定的 http 地址。


这是一个通用的解决方案,用户可以自己根据不同的需求,来编写自己的脚本程序(比如发邮件,自动部署等).


博主就是用它来实现自动部署和发邮件的


gitee中webhook的使用


网络异常,图片无法展示
|


可以通过右上角的添加按钮来添加push后要去回调的url


网络异常,图片无法展示
|


这里可以选择 签名秘钥WebHook密码 两种模式,选择密码的话,安全性会比较


差,因为它会直接将这个密码以明文的形式写在请求体body中post出去,而当你选择秘


钥的时候,它会使用签名算法,对请求内容进行签名,这个过程中不暴露你的签名秘


钥,安全性比较高。


具体可以看看这个帮助文档:WebHook密钥验证和验证算法


为什么不用GitHub呢?


这里主要是因为服务器的选择,博主使用的是 阿里云服务器


  1. 阿里云访问GitHub的速度很慢


  1. 使用仓库是为了方便部署和使用webhook功能


Aliyun(阿里云)


网上除了 阿里云,还有腾讯云,百度云,华为云等等


大家可以自行选择~😝


阿里云centos7下docker+nginx的安装和使用


具体可以看docker官方文档


Uninstall old versions 删除旧版本


sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
复制代码


Install the yum-utils package (which provides the yum-config-

manager utility) and set up the stable repository.


sudo yum install -y yum-utils \
           device-mapper-persistent-data \
           lvm2
 sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
复制代码


设置成阿里的存储库。


如果安装出现如下错误


File "/bin/yum-config-manager", line 135
    except yum.Errors.RepoError, e:
  SyntaxError: invalid syntax
复制代码


可能是你升级了Python,博主的Python 已经是3.7.0 版本了,需要做如下修改:


**切换到root用户 在目录usr/bin下执行 vim yum-config-manager **


修改/usr/bin/python -tt 为 /usr/bin/python2 -tt


INSTALL DOCKER ENGINE


sudo yum install docker-ce docker-ce-cli containerd.io
复制代码


安装最新版本的 Docker Engine 和 containerd


启动docker


sudo systemctl start docker
复制代码


使用镜像加速器


首先登入阿里云的容器镜像服务 获取镜像加速器,根据图中的操作文档修改配置文件


/etc/docker/daemon.json 即可。


网络异常,图片无法展示
|


拉取nginx镜像,搭建http服务器


docker pull nginx
docker run --name nginx-test -d -p 80:80 -v 博客文件夹路径:/usr/share/nginx/html nginx 
复制代码


访问你的阿里云地址,如果已经买了域名,通过备案了可以直接访问你的域名,就可以看到你的博客了。 (⊙o⊙)… 当然还要先配置好服务器的安全组规则,把你的端口暴露出来,这样才可以访问。


具体路径如下(PC):打开阿里云的控制台 =》 已开通的云产品中的云服务器ECS =》服务器实例 =》实例列表中的管理 =》本实例安全组 =》配置规则  =》 添加安全组规则 即可配置。


or


在阿里云App上操作。


网络异常,图片无法展示
|



Node.js


简介


Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript


engine.Node.jsNode.js中文网


特点


  1. 事件驱动


  • 这个是Node.js设计的核心思想


  • 事件驱动就是 当某个事件发生时,才去执行这个回调函数,而注册的回调函数都是异步执行的,这样充分利用了计算机的资源。


  1. 异步,非阻塞IO


  1. 单线程


  • 我们写的代码都在一个主线程里面,其他的都在线程池里,这样保证了线程的安全。


  1. 实时性


使用


  1. 安装 下载地址 nodejs.org/zh-cn/downl…博主的版本是node-v12.14.0-linux-x64,执行下面的代码解压文件,


xz -d node-v12.14.0-linux-x64.tar.xz
tar -xf node-v12.14.0-linux-x64.tar
复制代码


  1. 接着执行以下代码 创建软连接(根据自己Node.js文档的路径)


ln -s ~/node-v12.14.0-linux-x64/bin/node /usr/bin/node
ln -s ~/node-v12.14.0-linux-x64/bin/npm /usr/bin/npm
ln -s ~/node-v12.14.0-linux-x64/bin/npm /usr/bin/npx
复制代码


  1. 在其他目录下输入node -v可以看到版本信息即安装成功。


  1. npm npm是Node.js的包管理工具,随着node.js一起安装的。 使用淘宝镜像安装模块会更快(同步频率目前为10分钟一次以保证尽量与官方服务同步。)npm install -g cnpm --registry=https://registry.npm.taobao.org


Node.js有很多框架可以使用,如Express,Koa,Socket Stream等等。


自动化部署的实现


资料准备


可以看看上面中关于 gitee webhook 这一块,还有下面两个文档


WebHook 推送数据格式说明


WebHook 密钥验证和验证算法


加密算法不可逆 : MD5、SHA1、SHA256、SHA512可逆 :对称加密和非对称加密


git 更新脚本


在阿里云服务器上建个脚本 pull.sh


内容如下


# cd到博客目录
#git fetch 指令是下载远程仓库最新内容,不做合并 
#git reset 指令把HEAD指向master最新版本
cd ~/hexo_blog  
git fetch --all
git reset --hard origin/master
复制代码


格式化时间脚本


dateFormat.js


function dateFormat(fmt, date) {
    let ret;
    const opt = {
        "Y+": date.getFullYear().toString(),        // 年
        "m+": (date.getMonth() + 1).toString(),     // 月
        "d+": date.getDate().toString(),            // 日
        "H+": date.getHours().toString(),           // 时
        "M+": date.getMinutes().toString(),         // 分
        "S+": date.getSeconds().toString()          // 秒
        // 有其他格式化字符需求可以继续添加,必须转化成字符串
    };
    for (let k in opt) {
        ret = new RegExp("(" + k + ")").exec(fmt);
        if (ret) {
            fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
        };
    };
    return fmt;
}
module.exports=dateFormat;
复制代码


自动化部署脚本


webhook.js


/**
author: Java4ye
description:  node.js实现自动化部署,同时使用qq邮箱通知博客更新情况
*/
var http=require("http");
var dateFormat=require("./dateFormat");
var execSync = require('child_process').execSync; //同步
var nodemailer = require('nodemailer');
// npm install nodemailer --save  
var transporter = nodemailer.createTransport({
    //https://github.com/andris9/nodemailer-wellknown#supported-services 支持列表
    service: 'qq',
    port: 465, // SMTP 端口
    secureConnection: true, // 使用 SSL
    auth: {
        user: 'qq@qq.com',
        pass: 'smtp密码'  //不是qq密码,是你设置的smtp密码
    }
});
var status='failed';
var message='';
http.createServer(function(req,resp){
    var headers=req.headers; //获取请求头中的信息
    var agent=headers['user-agent'];  //拿到UA
    if(agent=='git-oschina-hook'){ //判断是不是来自gitee
        var timestamp=headers['x-gitee-timestamp'];  
        var token=headers['x-gitee-token'];  
        /**
        *  加密算法的实现  HmacSHA256算法(不可逆的)
        */
        const crypto = require('crypto');
        const secret="webhook上的秘钥"; 
        var hmac=crypto.createHmac("sha256",secret);
        var content=hmac.update(timestamp+"\n"+secret);
        var cryptoContent=content.digest("base64");
        //console.log("sha256(Hmac方式)加密后结果:%s",cryptoContent);
        var s ='';
        if(token==cryptoContent){
            s=execSync('./pull.sh').toString(); //执行更新仓库的脚本
            console.log(s.toString());
            status='successfully';
        }
        message="call webhook  at "+dateFormat("YYYY-mm-dd HH:MM", new Date()) ;
        console.log(message);
        var mailOptions = {
            from: '@qq.com', // 发件地址
            to: '@qq.com', // 收件列表
            subject: 'Update blog '+status, // 标题
            //text和html两者只支持一种
            //  text: 'Hello world ?', // 标题
            html: '<b>'+message+'</b> <br> <b>'+s+'</b>' // html 内容
        };
        transporter.sendMail(mailOptions, function(error, info){
            if(error){
                return console.log(error);
            }
            console.log('Message sent: ' + info.response);
        });
    }
    resp.writeHead(200,{"Content-Type":"text/plain"});
    resp.end("ok\n"); 
}).listen(8080);
console.log("Server run at 8080 at %s",dateFormat("YYYY-mm-dd HH:MM", new Date()) );
复制代码


启动命令


将三个脚本放在同个文件夹下,执行以下命令即可。


nohup node webhook.js &  //后台运行 log 在当前文件夹下面的nohup.out


最后,当你执行 hexo g  -d 命令部署时,就可以收到邮件信息啦,注意


记得去执行 hexo algolia  ,这样你就可以更新网站的文章检索信息啦



目录
相关文章
|
域名解析 数据安全/隐私保护
自己动手搭建一个网站
最近在研究着随便搞一个网站玩玩,既然有想法了,马上行动。 各种查资料的过程就忽略掉了,下面直入主题。
|
计算机视觉
R沟通|Rmarkdown构建简历并部署到个人网站
上一期已经对使用 latex 模板构建 cv 做了较为详细的说明:R沟通|使用latex模板构建个人履历。但是存在一个问题:Latex 最后输出的是 pdf 版本,如果你想把他部署到自己的个人网站上,可能就比较费劲了(害,是我不会)。所以请教了李康国学弟之后,我又尝试了下使用 Rmarkdown 构建 cv 并将其部署到 gitee中,这样所有人都可以通过网址访问我的 cv 了。
328 0
R沟通|Rmarkdown构建简历并部署到个人网站
|
资源调度 前端开发 编译器
Stenciljs 学习之搭建项目
Stencil 是一个生成 Web Components(更确切地说,是自定义元素)的编译器。Stencil 将最流行的框架的最佳概念结合到一个简单的构建时工具中。 学习一个框架肯定是重创建项目开始啦!现在就让我们一起学习一下怎么创建项目吧。
117 0
|
JavaScript 开发工具 数据安全/隐私保护
手把手教你打造炫酷个人博客:从零开始到成功上线
手把手教你打造炫酷个人博客:从零开始到成功上线
137 0
|
JavaScript Shell 开发工具
使用vuepress从零开始搭建我的技术文档|已部署到线上
几天前为了深入学习JS我手写了一个JS工具库,并且发布到了npm上 我把具体步骤,从零搭建再到发布上线的全部细节都写在这这一片文章上了:手写了一个JS工具库并发布到npm 既然已经写了JS工具库,那必须要有文档呀,要不然谁知道怎么使用!!! 所以今天这篇文章就介绍一下怎么使用vuepress2.x搭建一个文档,内容不深,小白也能看懂,因为我只是小小的写了一下 ^_^嘿嘿 文档效果可以点击此处查看☞:LearnJTs文档
668 1
使用vuepress从零开始搭建我的技术文档|已部署到线上
|
前端开发 JavaScript ice
flexiwan项目踩坑实践
flexiManage是以色列一家初创公司flexiWAN开源的基于SD-WAN平台的应用层的框架,包括flexiManage服务端框架以及硬件侧的flexiAgent框架,然而其并没有开源前端框架,为了验证其SD-WAN方案的可行性,需要快速搭建一个前端应用
282 0
|
缓存 JavaScript 前端开发
手把手教你从0开始搭建个人博客,东半球最详细的保姆级博客搭建部署教程 | 程序员人手必备个人博客网站
手把手教你从0开始搭建个人博客,东半球最详细的保姆级博客搭建部署教程 | 程序员人手必备个人博客网站
手把手教你从0开始搭建个人博客,东半球最详细的保姆级博客搭建部署教程 | 程序员人手必备个人博客网站
|
编解码 缓存 前端开发
【经验分享】Web前端开发测试常见问题总结
案例总结web前端开发常见问题!欢迎留言、打卡!
510 0
【经验分享】Web前端开发测试常见问题总结
|
JavaScript 应用服务中间件 Linux
从零开始部署到上线:手把手教你搭建属于自己的个人博客网站!
从零开始部署到上线:手把手教你搭建属于自己的个人博客网站!
641 0
从零开始部署到上线:手把手教你搭建属于自己的个人博客网站!
|
开发工具 git Windows
R沟通|使用 Blogdown 构建个人博客
你是不是特别想创建一个自己的私人博客?以及为什么要使用 blogdown 搭建博客?难度是不是很大,和其他搭建博客而言有什么优点? 在小编使用过一段时间后,个人认为 blogdown 搭建博客的优势在于,将 Rmarkdown 与 hugo 相结合,再加上 github 和一个可以部署的网站。你可以轻松的将一篇篇 Rmarkdown 的文章自动上传上去。而 Rmarkdown 的优势在于,你的代码结果都可以轻松呈现。而不是“复制粘贴”结果!
200 0
R沟通|使用 Blogdown 构建个人博客