Hexo博客升级小记

手里多了些服务器,想整理一下手里各个网站的部署,发现以前写的文章有些问题,需要重新写,于是就有了这篇文章。
这里采用Dropbox进行同步,最好是使用境外的服务器,如果使用境内的服务器需要配置代理。
这个方案主要有以下几个优点:

  • 自己拥有数据
  • 可以实现多终端编辑,Dropbox无缝同步
  • 在服务器端使用了Hexo-admin插件,可以在网页端编辑文章并实时预览
  • 服务器是一个自动部署中心,一旦监测到修改,会自动提交到Github
  • 使用GitPages进行托管,拥有动态+静态博客的优点

    安装前准备

    1.首先登陆vps需要执行如下命令更新各种依赖
    2.为防止机器没有安装epel,先安装epel(必须安装)
  • 升级 CentOS 内核 yum -y update
  • 安装 Git yum install git-core
    导入key
    1
    rpm --import http://download-i2.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6

安装epel,分别是32位和64位

1
2
rpm -Uvh http://download-i2.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
rpm -Uvh http://download-i2.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

然后安装yum-priorities

1
yum install yum-priorities -y

安装好后用命令看下,如果成功的话输出内容里有epel字样

1
yum repolist

3.安装Node.js

1
2
sudo yum install nodejs	
sudo yum install npm --enablerepo=epel

安装Dropbox

网上给出的教程试了好几次都有问题,自己搜到了正确的姿势
参考说明:nstall Dropbox In An Entirely Text-Based Linux Environment
注意:这里最好使用非Root的用户运行
安装代码如下:

1
2
3
4
5
6
cd
32位
wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86"
64位
wget https://clientupdates.dropboxstatic.com/dbx-releng/client/dropbox-lnx.x86_64-30.4.22.tar.gz
tar -xvzf dropbox-lnx.x86_64-30.4.22.tar.gz

然后执行,登录Dropbox的账号。

1
~/.dropbox-dist/dropboxd

首次打开需要你验证账户。选择有右键复制上面一段,浏览器打开,登录你的Dropbox账号,授权这台机器参与你的网盘同步,关联成功会出现如下画面,Ctrl+C一下

注意:进入连接后,一定要等刷新完毕后再点,并且不能结束终端,等到关联成功的消息。

Dropbox使用

切换到dropbox.py脚本所在位置
查看dropbox 工作状态./dropbox.py status
开始同步 ./dropbox.py start
停止同步 ./dropbox.py stop
帮助 ./dropbox.py exclude help

选择性同步文件夹

例如你不需要同步Dropbox/books/目录,进入Dropbox目录cd ~/Dropbox,运行exclude来排除books目录:

1
./dropboxy.py exclude add books #当前目录最好在Dropbox

更多不需要同步的目录:

1
./dropboxy.py exclude add book photos Public Documents #排除Dropbox目录下books, photos, Public, Documents等目录

这里讲/public等生成的静态文件文件夹去掉就行了

安装hexo

1.在刚才上面的结束之后 ls一下看看

1
2
[root@vultr ~]# ls
Dropbox dropbox.tar.gz

2.切进去Dropbox目录

1
cd Dropbox

3.接下来创建博客的目录

1
2
mkdir hexo
cd hexo

4.开始正式安装hexo

1
2
3
4
5
6
#网上教程里的很多命令在256或者128内存下全部是坑,因为内存关系安装不了
npm install hexo-cli -g
#初始化hexo
hexo init
hexo generate #可缩写为:hexo g
hexo server #可缩写为:hexo s

这时端口4000被打开了,我们能过浏览器打开地址http://<服务器ip>:4000/访问测试一下看能不能看到首页,如果看不到或者结果不是OK,请排查错误。

添加防火墙例外

1
-A INPUT -p tcp -m state --state NEW -m tcp --dport 4000 -j ACCEPT

或直接关闭防火墙

1
2
3
4
5
6
7
#临时生效,重启后复原
开启: service iptables start
关闭: service iptables stop

#永久性生效,重启后不会复原
开启: chkconfig iptables on
关闭: chkconfig iptables off

这个时候可以去你的Dropbox网盘里看看有没有hexo目录,并且目录结构如下

  • 下载Dropbox官方提供的一个用于管理的 Python 脚本
    1
    wget https://linux.dropbox.com/packages/dropbox.py

所有命令可以点击这里查看
然后增加这个脚本的权限

1
chmod +x ./dropbox.py

加入到自启动

1
./dropbox.py autostart y

然而实际测试发现这个在重启后 root 用户登录后没有自动启动,需要手动登录到为Dropbox创建的用户下进行启动,启动代码为./dropbox.py start 可以用 ps -e命令来查看当前进程看看有没有成功启动

内容同步发布

1.安装和配置incron检测文件变化。incrond 可以监控指定目录的文件指定变化(删除修改打开移动等等),并且运行指定命令。使用corn可以设置定时任务,另外incron不支持子文件夹的监测,需要将子文件夹也写入配置文件中。

1
yum install incron

启动并加入自启

1
2
service incrond start
chkconfig incrond on

修改默认编辑器为 Vi (貌似默认编辑器本来是一个 GUI,我们远程状态下没有 GUI)

1
echo 'editor = vi' >> /etc/incron.conf

这个时候使用以下命令来进行编辑

1
incrontab -e

打开后添加:

1
2
3
4
5
6
/home/ubuntu/Dropbox/hexo/source/_posts/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /home/ubuntu/Dropbox/hexo/hexo.sh
/home/ubuntu/Dropbox/hexo/source/_posts/笔记/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /home/ubuntu/Dropbox/hexo/hexo.sh
/home/ubuntu/Dropbox/hexo/source/_posts/结绳纪/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /home/ubuntu/Dropbox/hexo/hexo.sh
/home/ubuntu/Dropbox/hexo/source/_posts/拾摘/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /home/ubuntu/Dropbox/hexo/hexo.sh
/home/ubuntu/Dropbox/hexo/source/_posts/萱苏小筑/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /home/ubuntu/Dropbox/hexo/hexo.sh
/home/ubuntu/Dropbox/hexo/themes/ IN_MODIFY,IN_CREATE,IN_DELETE,IN_MOVE /home/ubuntu/Dropbox/hexo/hexo.sh

会使用到的一些命令

1
2
3
service incrond stop
service incrond start
service incrond status

最后写 runhexo 这个脚本

  • 首先我们可以用以下指令新建空文本 touch runhexo.sh 注意要在 root 目录下创建。目录要对应你在 incrontab 的里写的目录。
  • 然后打开文件进行编辑 vim /root/runhexo.sh
  • 代码如下:
    1
    2
    3
    4
    5
    6
    #!/usr/bin/env bash
    exec 200<$0
    flock -n 200 || exit 1
    sleep 10
    cd /root/Dropbox/hexo && hexo clean && hexo g && hexo d
    cd /root/Dropbox/hexo/source/ && git add -A && git commit -m "auto commit" && git push

上面push到github还需要配置SSH等步骤,见后面的描述。
以上代码会在特定时间内只允许一个脚本实例运行。运行后会清理 Hexo 原有的静态文件, 生成新的静态文件以供读取,并且会自动传到相应的Github上的repo备份。
好了到这里就应该可以了。然后可以 debug 测试一下,并且可以关机给服务器搞个 snapshot 快照进行备份,以防以后出错 (重启后记得手动运行一下 Dropbox)。

使用hexo-hey插件为博客添加后台编辑


hexo-hey项目地址:https://github.com/nihgwu/hexo-hey
安装:

1
npm install hexo-hey --save

配置_config.yml文件
添加如下几行

1
2
3
4
5
6
7
# Admin
admin:
name: hexo
password: hey
secret: hey hexo
expire: 60*1
# cors: http://localhost:3000

运行

1
hexo serve

这个时候你的博客网站的管理后台就可以远程的在你 VPS 的 IP地址的4000端口访问到。比如 <vps的ip>:4000/admin

配置Github/Coding多账号管理SSH Key

  1. 单个网站通过Https链接,避免22端口关闭错误。
    测试https端口连通性
    1
    ssh -T -p 443 git@ssh.github.com

添加ssh配置文件

1
vim ~/.ssh/config

写入内容

1
2
3
Host github.com
Hostname ssh.github.com
Port 443

  1. 多网站多账号SSH Key配置
  • 生成Github和Coidng的SSH Key
    1
    2
    ssh-keygen -t rsa -f ~/.ssh/id_rsa_github -C “wmwwmv@gmail.com”
    ssh-keygen -t rsa -f ~/.ssh/id_rsa_coding -C "wmwwmv@163.com”

检查key是否生成

1
ls ~/.ssh

  • 添加private key
    1
    2
    ssh-add ~/.ssh/id_rsa_github
    ssh-add ~/.ssh/id_rsa_coding

如果执行ssh-add时提示”Could not open a connection to your authentication agent”,可以先执行命令:

1
ssh-agent bash

然后再运行ssh-add命令。
可以通过 ssh-add -l 来确私钥列表

1
ssh-add -l

可以通过 ssh-add -D 来清空私钥列表

1
ssh-add -D

  • 修改配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #Github
    Host github.com
    HostName ssh.github.com
    Port 443
    User wmwwmv@gmail.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_github
    #coding
    Host git.coding.net
    Hostname git-ssh.coding.net
    User wmwwmv@163.com
    Port 443
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_coding
  • 上传public key 到 GitHub/Coidng
    GitHub设置过程如下:
    登录github,点击右上方的图标,点击“Settings”


选择SSH and GPG keys,点击New SSH key,在出现的界面中填写SSH key的名称,填一个你自己喜欢的名称即可,然后将上面拷贝的~/.ssh/id_isa_github.pub文件内容粘帖到 key 一栏,再点击Add SSH key按钮就可以了。

添加过程github会提示你输入一次你的github密码 ,确认后即添加完毕。

  • 测试
    1
    2
    3
    4
    5
    6
    #测试github
    ssh -T git@github.com
    #测试Coding
    ssh -T git@git.coding.net
    # 测试gitlab
    ssh -T git@gitlab.example.com

Hexo中_config.yml配置

1
2
3
4
5
6
deploy:
type: git
repo:
github: git@github.com:wmwwmv/wmwwmv.github.io.git
coding: git@git.coding.net:shichao/xiaozhu.git
branch: master

利用supervisor让hexo-server服务常驻后台

supervisord.conf这个文件末尾加上

1
2
[include]
files = /etc/supervisor/*.conf

新建hexo-server.conf文件
写脚本

1
2
3
4
5
6
7
8
[program:hexo-server]
command = hexo s
directory = /root/Dropbox/hexo
user=root
autostart = true
autorestart = true
stdout_logfile = /var/log/supervisor/hexo.log
stderr_logfile = /var/log/supervisor/hexo_err.log

supervisor的一些命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#启动、管理配置中设置的进程。
supervisord
#停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值,这个示例就是chatdemon。
supervisorctl stop programxxx
#启动某个进程
supervisorctl start programxxx
#重启某个进程
supervisorctl restart programxxx
#重启所有属于名为groupworker这个分组的进程(start,restart同理)
supervisorctl stop groupworker
#停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl stop all
#载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
supervisorctl reload
#根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
supervisorctl update

  • Git同步之前需要先做些准备工作:

    1
    cd /root/Dropbox/hexo/source/ && git add 404 readme.md about _drafts _posts about tags resources && git commit -m "auto commit" && git remote add origin git@github.com:wmwwmv/BlogBackup.git && git push -u origin master
  • 使用MarkdownEditor的fileshook命令

    1
    cd /d E:\Dropbox\hexo && hexo clean && hexo g && hexo d && cd source/ && git add -A && git commit -m "auto commit" && git push

然后将第三方云设置成七牛的图床就更加完美了,不仅能拖入普遍自动生成链接,还可以自动发布。

遇到的问题

hexo deploy时重复输入用户名密码的问题

每次部署执行hexo deploy都需要输入用户名

问题原因及解决方案:
最主要的原因可能是你没有采用git@github.com

而是用https//github.com

修改后重新提交部署:

注意

  • 为了避免上传一次就重新将pulic .git文件夹就同步一次,所以在本地Dropbox上要选择性同步。
  • 想利用分布式解析国内解析到coding 国外解析到github,结果国内访问github比coding还快。
  • 迁移的时候只要保存好_config.yml package.json配置文件,sourcethemes文件夹,迁移的时候再重新安装环境将备份的文件覆盖后装上npm包就行。
文章目录
  1. 1.
  2. 2. 安装前准备
  3. 3. 安装Dropbox
    1. 3.1. Dropbox使用
      1. 3.1.1. 选择性同步文件夹
  4. 4. 安装hexo
  5. 5. 内容同步发布
  6. 6. 使用hexo-hey插件为博客添加后台编辑
  7. 7. 配置Github/Coding多账号管理SSH Key
  8. 8. 利用supervisor让hexo-server服务常驻后台
  9. 9. 遇到的问题
    1. 9.1. hexo deploy时重复输入用户名密码的问题
  10. 10. 注意