title: hexo部署到服务器
date: 2020-02-23 09:09:25
comments: true
toc: true
top: false
categories:
- [笔记,hexo]
tags: [hexo,github,webhook]
不使用github pages,改为自己的服务器。将代码托管到gtihub,使用webhook实现github与服务器同步推送代码,并且安装hexo-admin来实现后台管理与服务器到github上的推送。
购买服务器
服务器商千千万,自行挑选一个靠谱的。
注意:国内各服务商有学生优惠套餐,但是只能购买大陆服务器,且大陆服务器需要备案才能使用,备案很麻烦,要花十几到二十天左右。但是便宜稳定。
进入服务商的购买页面,选择配置。
若是一键选择套餐购买,需要选择地区、选择服务器的配置、选择服务器镜像系统、服务器带宽(越大则服务器能承受的压力越大)、购买时长。
若是自定义配置,需要选择购买的计时方式、配置的详细选择,更多的系统选择以及自定义镜像、存储空间。
总结就是越强越贵,时间越长越贵。个人博客不需要非常好的配置,推荐系统选择linux
注意:大陆服务器需要至少购买3个月时长才可以进行备案。
假如是国外服务器,则购买后可以直接进行部署了。如果是头铁选了国内,则需要先进行备案(大概20天左右。备案流程放到最后。)
我使用的宝塔控制面板,简单方便无脑。安装宝塔后,可以在控制面板进行操作来操作自己的服务器。
注:若服务器操作过程出现无法挽回的问题,可以在服务器控制台重装系统。
连接服务器
首先下载putty、xhell等连接工具,我使用的是finalshell,用哪个都可以,原理都一样,用服务器商自带的登陆功能也可以。打开后界面如图。
点击文件夹,新建一个连接,选择SSH连接
名称自定义,主机为上一步的ip地址。填写完后点击确定。
(国外服务器可勾选智能加速,国内则不勾选)此时我使用的是美国服务器,所以勾选了海外加速。
可以看到新建了一个服务器连接,ssr为刚刚自定义的名称,后面有ip地址和端口号,和服务器主机名。
双击该连接,进入服务器,连接成功出现如图所示界面。
如果出现该窗口
点接受并保存。
部署到服务器
解析域名
注:若github page有绑定域名的话,先把绑定解除,并且将解析暂停,否则会冲突。
到域名管理处,点击解析
按照如图所示添加两条记录,一个主机记录选@
(直接输入域名即可进入网站),一个选www
(前面加上www可进入网站),也可以自定义一个前缀,但在后面站点配置时要加进去。
记录类型选A,指向一个IP地址,然后在记录值处填自己服务器的公网IP。
主机记录说明:
安装宝塔面板
根据官方教程进行安装。
若安装完成不能使用,则需要放行端口:
腾讯云:https://www.bt.cn/bbs/thread-1229-1-1.html
进入服务器,根据自身系统输入安装命令,命令失效则看官方教程,有备用命令
Centos安装命令:
yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
Ubuntu/Deepin安装命令:
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && sudo bash install.sh
Debian安装命令:
wget -O install.sh http://download.bt.cn/install/install-ubuntu_6.0.sh && bash install.sh
Fedora安装命令:
wget -O install.sh http://download.bt.cn/install/install_6.0.sh && bash install.sh
以cenOS为例:
输入命令进行安装
输入y,安装宝塔,然后稍等片刻
如图安装完成,会显示控制面板的url以及用户名和密码
安装完成后,就可以关闭finalShell了,打开浏览器,输入该地址,并输入刚刚显示的用户名和密码,进入面板
这里建议进入后修改登陆面板的帐号与密码,不使用默认生成的。并且将面板的网址保存起来,方便以后直接输入网址进入面板。
进入面板后,会出现如下提示,进行安装软件。可以根据需求进行安装,也可以直接点一键安装,推荐LNMP,且选择极速安装,编译安装太慢。
创建站点
宝塔面板安装完成后,在导航栏点击网站,选择添加站点。
设置如下,在域名处填写自己的域名,可填写多个 (填写进的域名在解析完成后可以访问到该网站)
生成站点后,点击网站名或者后面的设置,可以进入站点设置来添加一些新的域名以及二级域名等等。
其中abc为自定义的二级域名,想不想设置随意。设置了就需要在解析时填写对应的主机记录。
点击添加后如下,这样用户可以通过以下域名访问到该服务器部署的网站,如果不想让github.io的地址也访问到该服务器,可以删除。
添加的域名需要解析到服务器才可以正常使用。
添加完成后关闭设置即可。
最后到域名管理处。进行解析。添加记录如下
- 记录值:www和@各添加一次,
- 记录类型:选A
- 线路类型:默认
- 记录值:你的服务器IP地址
结果如下(若有自定义二级域名等等,需要再添加上。)
等待几分钟生效,即可通过域名访问该服务器。
使用webhook实现同步页面
虽然服务器是配置好了,但是宝塔并不支持代码托管,也就是说使用hexo d
命令推送的代码并不能推到宝塔上来实现更新网站。于是使用webhook来实现与github代码同步。
原理:
安装宝塔WebHook
在宝塔面板导航栏点击软件商店。搜索 webhook
点击安装。
配置webhook
安装完成后,点击设置,(可以勾选首页显示。)
点击添加,名称随意,执行脚本先随便填写一点内容,点击提交后再编辑脚本。
(若出现编辑不能保存的情况,则在宝塔面板的右上角点修复)
添加完成后点击编辑,删除原来随意填写的内容,添加如下代码并修改gitHttp。
注:
- 原代码有一个$1变量,在后面的密钥部分的URL地址最后通过param=X,将X作为 该变量传入脚本,但因为我无论怎么改都会出现参数错误,因此将该变量删掉了。然后改一下代码,将$1的参数替换为固定的值,只要站点目录存在就没问题。
- 大概是因为自己设置了保存博客源代码的分支为默认分支的原因,用原代码里面的有一句
git pull
总是拉不过来文件,在服务器上手动拉取发现拉取的是博客源代码的分支。故在原代码中将git pull
改成git pull origin master
来指定拉取静态页面的分支。
#!/bin/bash
echo ""
#输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "Start"
#git项目路径
gitPath="/www/wwwroot/【站点根目录】"
#git 网址
gitHttp="【仓库git地址】"
echo "Web站点路径:$gitPath"
#判断项目路径是否存在
if [ -d "$gitPath" ]; then
cd $gitPath
#判断是否存在git目录
if [ ! -d ".git" ]; then
echo "在该目录下克隆 git"
sudo -Hu www git clone $gitHttp gittemp --depth=1
sudo mv gittemp/.git .
sudo rm -rf gittemp
fi
#拉取最新的项目文件
echo "拉取最新文件"
sudo -Hu www git reset --hard origin/master
sudo -Hu www git pull origin master
#设置目录权限
echo "设置目录权限"
sudo chown -R www:www $gitPath
echo "End"
exit
else
echo "该项目路径不存在"
echo "End"
exit
fi
更新: 在指令语句前加入sudo,授予管理员权限,避免执行失败
gitHttp路径为github代码仓库的地址,需要到代码库中查看(带.git尾缀的地址,即hexo部署时配置 _config.yml
时填写的地址。),点击复制键进行复制
粘贴后格式应该如下
gitHttp="https://github.com/XXXXXX.git"
随后点击右下角的保存即可。
github配置hook
编辑完成后,点击查看密钥
复制好密钥以及下方URL的&
前面的内容(全复制也可以)
进入github的网站代码库的设置,导航栏选webhook,然后点击Add webhook
填写内容
填写好后点击Add webhook。
然后回到面板,点击测试,然后在日志中查看结果。
同时回到github的webhook界面,编辑刚刚的钩子
在最下面可以看到成功的信息。
这样以后在本地进行的deploy,服务器最自动钩取github仓库的master分支,实现将博客部署到服务器上。然后使用域名就可以进行访问(不要加https://)。
添加SSL证书,开启https协议
注:若出现访问拒绝的话,注意是否加了https协议。
没有配置SSL证书的话,用https访问会被拒绝。SSL证书有收费的也有免费的。
宝塔自带免费证书,但要求实名认证。
接下来以个人服务商腾讯云的免费证书为例,
按步骤填写即可注册证书。添加后下载证书,然后解压。
若关闭了界面,可以在SSL证书处下载证书
打开下载好的文件夹,打开Apache
打开.crt
和.key
结尾的文件。
然后在宝塔面板进入站点的设置,图中点击网站名或者设置都可以
如图,在SSL界面其他证书里,将.key
结尾的密钥放入左边,.crt
结尾的证书放入右边,保存,然后强制HTTPS,即可开启https协议。
源代码同步到服务器(舍弃)
更新(必看):
本来是想的利用hexo-admin实现在服务器上开启后台管理,然后就能实现理想中的功能:
-
本地操作完博客后,源代码+静态页面+文章都可以同步到服务器上
-
服务器操作完博客后,源代码+静态页面+文章也都同步到本地
这样的话,我可以在本地尝试修改主题与配置,满意后进行推送同步到服务器。在没有hexo与git环境时(如临时用其他电脑或者用手机),然后又不能安装或者不想安装的话,可以通过hexo-admin后台来写文章并deploy,等到了自己的电脑上直接克隆就可以完成同步了。
但在配置时发现了一个问题,hexo-admin提供的deploy功能貌似仅支持以hexo开头的命令,如hexo d
、hexo new "文章名"
,我试图加入git命令然后就报错了。
这就导致我能成功将本地的源代码、静态页面推送到服务器,但是用hexo-admin新建然后写的文章是没办法自动保存到github上来克隆到本地的。再考虑到安装插件的问题,一些功能需要安装一些插件(如音乐播放器、live2D、加入视频等等)。插件是不会被推送的,若想推送插件的话,每次推送都要等待很长时间。
综上,故暂时舍弃源代码同步到服务器,让服务器仅保存静态页面就行了。所以下面的内容可以不用看了。
PS:关于能否使用git命令的问题已经提交到github上的Issues,如果有解决办法的话希望能留言告诉我。
在服务器上部署hexo
关于CentOS的安装git、Node.js我遇到一些问题,参考了下面两篇文章完美解决,故这里就不说安装方法了,直接看这两篇就行了。
CentOS安装Git参考链接:
https://www.cnblogs.com/imyalost/p/8715688.html
注:Hexo需要10版本以上才能支持,默认安装的话版本开头为6,需要安装最新版本才可以,我就用默认安装Node.js的方法结果最后hexo安装失败。
CentOS安装最新版Node.js参考链接:
https://www.jianshu.com/p/4a9449506924
安装hexo指令:
npm install hexo-cli -g
警告不用理会。
克隆保存在github上的博客代码
通过cd命令切换到想保存博客根目录的文件夹下,例如我打算把博客的根目录放在 /www下,则输入cd /www
,
然后克隆在github上的博客源代码,例如我的命令为
git clone https://github.com/lluuiq/lluuiq.github.io.git
,后面是仓库地址,改为自己的。
git clone 【仓库地址】
这样在输入该指令的文件夹下会出现【yourusername】.github.io的文件夹,里面放着博客的源代码。
若想改个名字的话,在包含根目录的文件夹下(我的是/www)输入下面指令
mv 【yourusername】.github.io 【newname】
我将文件夹名称改为wa2000,下面的wa2000文件夹都是博客根目录。
在服务器上的hexo根目录已经建成,接下来就是同步github上的源代码仓库,使得当github仓库的文件更新时,服务器上的博客源代码也会同步更新。
服务器上的hexo同步github
宝塔与webhook安装
步骤同 部署到服务器
设置webhook
与上方内容相同,但需要更改的是分支名选择存放博客目录的分支
个人的配置(参照修改)
git项目路径:gitPath="/www/wa2000"
git网址:gitHttp="https://github.com/lluuiq/lluuiq.github.io.git"
分支名:source
#!/bin/bash
echo ""
#输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "Start"
#git项目路径
gitPath="【你的博客根目录地址】"
#git 网址
gitHttp="【你的仓库地址】"
echo "Web站点路径:$gitPath"
#判断项目路径是否存在
if [ -d "$gitPath" ]; then
cd $gitPath
#判断是否存在git目录
if [ ! -d ".git" ]; then
echo "在该目录下克隆 git"
git clone $gitHttp gittemp
mv gittemp/.git .
rm -rf gittemp
fi
#拉取最新的项目文件
git reset --hard origin/【你的分支名】
git pull
#设置目录权限
chown -R www:www $gitPath
echo "End"
exit
else
echo "该项目路径不存在"
echo "End"
exit
fi
添加webhook后,参考上方内容与仓库进行链接即可。
创建站点
如图点击添加站点。
添加域名可以加前缀,但加了前缀也要加入对应的解析。根目录后面一定要是public文件夹,生成的静态页面会保存在该文件夹中,只有将该文件夹设为根目录网站才会正常显示,最后点击提交即可创建。
然后回到服务器,安装必要包
npm install hexo --save
npm install --save hexo-deployer-git
输入github的用户名与密码
git config --global user.email "【github邮箱】"
git config --global user.name "【github用户名】"
配置SSH
配置SSH免去每次推送都要帐号密码,任意地方输入下方指令,【注释】部分可用自己邮箱,github,也可以不加-C
ssh-keygen -t rsa -C "【注释】"
中间都按回车就行了,然后到ssh存放的地方
cd ~/.ssh
vim id_rsa.pub
打开id_rsa.pub后,复制里面的公钥(用finalshell的话直接在下方的文件目录里双击打开也可以)
然后到如图地方添加公钥
然后到仓库的地方,复制ssh地址
(若本来就是ssh地址则跳过)打开根目录的配置文件_config.yml,将deploy下的repository改为ssh地址。
在博客的根目录下生成静态页面并尝试推送到github
hexo clean
hexo g
hexo d
注:若出现下方情况则使用下方命令删除.user.ini
chattr -i 【.user.ini路径】
rm -rf 【.user.ini路径】
若出现下方情况则修改ssh配置
vim /etc/ssh/sshd_config
找到 RSAAuthentication与PubkeyAuthentication,将注释去掉,并确定AuthorizedKeysFile后面为.ssh/authorized_keys
且可用。
然后重启ssh服务。
/sbin/service sshd restart
再次执行hexo d
可能会出现下方警告
该警告是让你将github的IP加入host,可以无视,也可以加进去去掉警告。
vim /etc/hosts
然后在里面加入【警告中的IP地址】 github.com
,保存并退出即可。
清除、生成、推送都成功后,重启宝塔面板
/etc/init.d/bt restart
重启后,在本地使用推送将博客源代码推到github时,服务器上会自动拉取进行同步。
接下来就是在服务器上开启远程后台管理了。
开启后台管理(舍弃)
使用hexo-admin插件开启后台管理功能,可以通过网页进入后台管理文章,也可以通过内置的脚本实现部署与推送。
放行4000端口
到宝塔面板的安全里放行4000端口,说明随意填。
以腾讯云为例,到服务器的管理处放行4000端口。
注意:hexo s
命令不支持https,在输入网站时不要加https
测试推送
git操作官方文档,或者百度git指令查询详细用法。
在根目录处执行下方执行指令
git add .
git commit -m "【更新说明,随便填】"
git push origin 【博客源代码分支名】
出现上方提示说明可以进行推送。
如果保存源代码的分支不是默认的,要在git push
后面空一格加上origin 【博客源代码分支名】
若提示
则输入
git remote add origin 【github仓库的ssh地址】
编写脚本
在根目录创建一个文件夹存放脚本(直接放根目录也行,但后面记得更改配置的路径),名称随意,我用admin作为文件夹名,deploy作为脚本名。然后进入创建的文件夹,新建并编辑一个脚本文件
我的代码为mkdir admin
与vim deploy.sh
mkdir 【新建的文件夹】
cd 【创建的文件夹】
vim 【脚本名】.sh
在脚本文件中输入下方指令,“save blog”里面是更新说明,自定义填写。
#!/usr/bin/env sh
hexo g
hexo d
然后按ESC,接着输入:wq
保存并退出。
这样当用后台管理时,会先生成静态页面,再进行部署,部署完成后会将源代码推送到github。
可自行修改需要的命令,例如加入hexo clean
,也可以加一些其他自己需要的命令。
为刚刚脚本授予权限
chmod +x 【脚本名】.sh
然后执行该脚本看看效果,如果一切顺利,则可以进行下一步。效果大概如图:
脚本配置好后,开启开机自动启动hexo s
命令来启动后台,因为hexo-admin
在创建的存放脚本的文件夹中新建自启脚本(同样名称自定义)
cd 【存放脚本的文件夹】
vim 【自启脚本文件名】.sh
然后输入命令,cd后面的路径要换成自己的博客根目录路径,例如我的为cd /www/wa2000
#!/bin/bash
cd 【博客根目录路径】
hexo s
写完后同样按ESC,输入:wq
保存并退出
添加权限
chmod +x 【自启脚本名】.sh
然后返回服务器的根目录,打开etc/rc.d/rc.local
cd ~
vim /etc/rc.d/rc.local
在下面添加脚本路径,如我的脚本存放目录为/www/blog/admin/server.sh
,添加效果如下
然后保存并退出。
执行下方命令授权
chmod +x /etc/rc.d/rc.local
然后重启服务器
reboot
稍等片刻进入http://【域名】:4000
,若能进入,说明配置成功。
安装hexo-admin并配置
参考文档:Easy Hexo hexo-admin官网
服务器上进入博客根目录,然后输入命令安装hexo-admin
npm install --save hexo-admin
安装完成后即可通过http://【域名】:4000/admin
进入后台。接下来进行一些配置。
进入后台的设置界面,点击红框内的链接。
如图,填入登陆后台用的用户名与密码,secret能为密码进行加密,随意填自己喜欢的短语就行。
将生成的代码拷贝到博客根目录下的配置文件_config.yml
中,并添加deployCommand
deployCommand的内容单引号内为一条指令
./admin/deploy.sh
指运行保存在admin文件夹内的deploy.sh,将路径改为自己的脚本运行指令即可。
保存,然后重启服务器。
关于网站备案的琐事
到购买服务器/域名的服务商那里有详细的备案流程说明,这里仅记录个人备案遇到的坑。以腾讯云举例。
-
国家规定服务器需要购买至少3个月才能备案
学生套餐优惠只能购买三次,一次最短购买一个月时长,最长为一年时长,本来抱着试试的心态只买了一个月,结果发现居然要至少3个月才能备案,于是只能再去用学生套餐来延长时长,本来三次机会,结果花了两次机会只买了一年一个月,如果确定想用大陆服务器并且想长时间使用的话,建议一次购买最长时长,10元/月算非常便宜了。
-
审核时间长
首先需要先为域名进行实名认证,实名认证后备案需要申请幕布进行拍照(给你邮过去,免邮),等幕布到了以后按要求拍照并上传,填写关于网站的资料以及服务器的资料,最后提交。
大概腾讯那边审核一两天,然后腾讯帮你提交到审核局审核个10天左右(最晚一个月,个人经历时间为10天左右),审核通过后会给你工信部备案号,但还要到全国互联网安全管理服务平台再提交一次备案,不过这个审核较快,一天就通过了。通过后会给你联网备案号。
以百度为例
上面的为工信部备案号,下面的为联网备案号。
-
关于在全国互联网安全管理服务平台备案
注意:里面有一个为网站填写信息的,有个选择网站是否为交互类型,如果不是论坛、有注册功能的那种一定要选择否,选是的话需要到当地公安局一趟进行当面审核。这是为了保证网站安全所以需要到公安局进行审核,并且填写大概7-8页厚的表格。