--- title: Hexo博客升级小记 english_title: hexo-blog-update-log top: 0 date: 2018-12-09 categories: tags: - hexo - dropbox - vps - incron - supervisor fancybox: comments: true permalink: description: --- ## 序 手里多了些服务器,想整理一下手里各个网站的部署,发现以前写的文章有些问题,需要重新写,于是就有了这篇文章。 这里采用Dropbox进行同步,最好是使用境外的服务器,如果使用境内的服务器需要配置代理。 这个方案主要有以下几个优点: - 自己拥有数据 - 可以实现多终端编辑,Dropbox无缝同步 - 在服务器端使用了Hexo-admin插件,可以在网页端编辑文章并实时预览 - 服务器是一个自动部署中心,一旦监测到修改,会自动提交到Github - 使用GitPages进行托管,拥有动态+静态博客的优点 ## 安装前准备 1.首先登陆vps需要执行如下命令更新各种依赖 2.为防止机器没有安装epel,先安装epel(必须安装) - 升级 CentOS 内核 `yum -y update` - 安装 Git `yum install git-core` 导入key ``` rpm --import http://download-i2.fedoraproject.org/pub/epel/RPM-GPG-KEY-EPEL-6 ``` 安装epel,分别是32位和64位 ``` 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 ``` yum install yum-priorities -y ``` 安装好后用命令看下,如果成功的话输出内容里有epel字样 ``` yum repolist ``` 3.安装Node.js ``` sudo yum install nodejs sudo yum install npm --enablerepo=epel ``` ## 安装Dropbox 网上给出的教程试了好几次都有问题,自己搜到了正确的姿势 参考说明:[nstall Dropbox In An Entirely Text-Based Linux Environment](http://www.dropboxwiki.com/tips-and-tricks/install-dropbox-in-an-entirely-text-based-linux-environment) 注意:这里最好使用非Root的用户运行 安装代码如下: ``` 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的账号。 ``` ~/.dropbox-dist/dropboxd ``` 首次打开需要你验证账户。选择有右键复制上面一段,浏览器打开,登录你的Dropbox账号,授权这台机器参与你的网盘同步,关联成功会出现如下画面,Ctrl+C一下 ![](https://images.liangs.me/bitcron/Notes/_image/2017-07-19-16-21-05.jpg) ![](https://images.liangs.me/bitcron/Notes/_image/2017-07-19-16-24-40.jpg) 注意:进入连接后,一定要等刷新完毕后再点,并且不能结束终端,等到关联成功的消息。 ### Dropbox使用 切换到dropbox.py脚本所在位置 查看dropbox 工作状态`./dropbox.py status` 开始同步 `./dropbox.py start` 停止同步 `./dropbox.py stop` 帮助 `./dropbox.py exclude help` #### 选择性同步文件夹 例如你不需要同步`Dropbox/books/`目录,进入Dropbox目录`cd ~/Dropbox`,运行exclude来排除books目录: ``` ./dropboxy.py exclude add books #当前目录最好在Dropbox ``` 更多不需要同步的目录: ``` ./dropboxy.py exclude add book photos Public Documents #排除Dropbox目录下books, photos, Public, Documents等目录 ``` 这里讲/public等生成的静态文件文件夹去掉就行了 ## 安装hexo 1.在刚才上面的结束之后 ls一下看看 ``` [root@vultr ~]# ls Dropbox dropbox.tar.gz ``` 2.切进去Dropbox目录 ``` cd Dropbox ``` 3.接下来创建博客的目录 ``` mkdir hexo cd hexo ``` 4.开始正式安装hexo ``` #网上教程里的很多命令在256或者128内存下全部是坑,因为内存关系安装不了 npm install hexo-cli -g #初始化hexo hexo init hexo generate #可缩写为:hexo g hexo server #可缩写为:hexo s ``` 这时端口4000被打开了,我们能过浏览器打开地址`http://<服务器ip>:4000/`访问测试一下看能不能看到首页,如果看不到或者结果不是OK,请排查错误。 添加防火墙例外 ``` -A INPUT -p tcp -m state --state NEW -m tcp --dport 4000 -j ACCEPT ``` 或直接关闭防火墙 ``` #临时生效,重启后复原 开启: service iptables start 关闭: service iptables stop #永久性生效,重启后不会复原 开启: chkconfig iptables on 关闭: chkconfig iptables off ``` 这个时候可以去你的Dropbox网盘里看看有没有hexo目录,并且目录结构如下 ![](https://images.liangs.me/bitcron/Notes/_image/2017-07-19-16-29-41.jpg) - 下载Dropbox官方提供的一个用于管理的 Python 脚本 ``` wget https://linux.dropbox.com/packages/dropbox.py ``` 所有命令可以点击[这里](https://www.dropbox.com/help/desktop-web/linux-commands)查看 然后增加这个脚本的权限 ``` chmod +x ./dropbox.py ``` 加入到自启动 ``` ./dropbox.py autostart y ``` 然而实际测试发现这个在重启后 root 用户登录后没有自动启动,需要手动登录到为Dropbox创建的用户下进行启动,启动代码为` ./dropbox.py start` 可以用 `ps -e`命令来查看当前进程看看有没有成功启动 ![](https://images.liangs.me/bitcron/Notes/_image/2017-07-19-16-34-25.jpg) ## 内容同步发布 1.安装和配置incron检测文件变化。incrond 可以监控指定目录的文件指定变化(删除修改打开移动等等),并且运行指定命令。使用corn可以设置定时任务,另外incron不支持子文件夹的监测,需要将子文件夹也写入配置文件中。 ``` yum install incron ``` 启动并加入自启 ``` service incrond start chkconfig incrond on ``` 修改默认编辑器为 Vi (貌似默认编辑器本来是一个 GUI,我们远程状态下没有 GUI) ``` echo 'editor = vi' >> /etc/incron.conf ``` 这个时候使用以下命令来进行编辑 ``` incrontab -e ``` 打开后添加: ``` /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 ``` 会使用到的一些命令 ``` service incrond stop service incrond start service incrond status ``` 最后写 runhexo 这个脚本 - 首先我们可以用以下指令新建空文本 `touch runhexo.sh` 注意要在 root 目录下创建。目录要对应你在 incrontab 的里写的目录。 - 然后打开文件进行编辑 `vim /root/runhexo.sh` - 代码如下: ```bash #!/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插件为博客添加后台编辑 ![](https://images.liangs.me/bitcron/Notes/_image/2017-07-19-17-20-09.jpg) hexo-hey项目地址:https://github.com/nihgwu/hexo-hey 安装: ``` npm install hexo-hey --save ``` 配置`_config.yml`文件 添加如下几行 ``` # Admin admin: name: hexo password: hey secret: hey hexo expire: 60*1 # cors: http://localhost:3000 ``` 运行 ``` hexo serve ``` 这个时候你的博客网站的管理后台就可以远程的在你 VPS 的 IP地址的4000端口访问到。比如 `:4000/admin`。 ## 配置Github/Coding多账号管理SSH Key 1. 单个网站通过Https链接,避免22端口关闭错误。 测试https端口连通性 ``` ssh -T -p 443 git@ssh.github.com ``` 添加ssh配置文件 ``` vim ~/.ssh/config ``` 写入内容 ``` Host github.com Hostname ssh.github.com Port 443 ``` 2. 多网站多账号SSH Key配置 - 生成Github和Coidng的SSH Key ``` 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是否生成 ``` ls ~/.ssh ``` - 添加private key ``` ssh-add ~/.ssh/id_rsa_github ssh-add ~/.ssh/id_rsa_coding ``` 如果执行ssh-add时提示"Could not open a connection to your authentication agent",可以先执行命令: ``` ssh-agent bash ``` 然后再运行ssh-add命令。 可以通过 ssh-add -l 来确私钥列表 ``` ssh-add -l ``` 可以通过 ssh-add -D 来清空私钥列表 ``` ssh-add -D ``` - 修改配置文件 ```bash #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” ![](https://images.liangs.me/bitcron/Notes/_image/2017-07-19-17-56-16.jpg) 选择`SSH and GPG keys`,点击`New SSH key`,在出现的界面中填写SSH key的名称,填一个你自己喜欢的名称即可,然后将上面拷贝的`~/.ssh/id_isa_github.pub`文件内容粘帖到 key 一栏,再点击`Add SSH key`按钮就可以了。 ![](https://images.liangs.me/bitcron/Notes/_image/2017-07-19-17-56-29.jpg) 添加过程github会提示你输入一次你的github密码 ,确认后即添加完毕。 - 测试 ```bash #测试github ssh -T git@github.com #测试Coding ssh -T git@git.coding.net # 测试gitlab ssh -T git@gitlab.example.com ``` Hexo中`_config.yml`配置 ``` 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`这个文件末尾加上 ``` [include] files = /etc/supervisor/*.conf ``` 新建`hexo-server.conf`文件 写脚本 ```bash [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的一些命令 ```bash #启动、管理配置中设置的进程。 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同步之前需要先做些准备工作: ``` 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命令 ``` 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都需要输入用户名 ![](https://images.liangs.me/bitcron/Notes/_image/b84f46c31486c0689dcb46fe856a3408_hexo-01.png) 问题原因及解决方案: 最主要的原因可能是你没有采用git@github.com ![](https://images.liangs.me/bitcron/Notes/_image/ff716f897db6f52aae3fe00d8a7e6ca5_hexo-04.png) 而是用https//github.com ![](https://images.liangs.me/bitcron/Notes/_image/5a6545da6f259e0f0ee8a92550861cda_hexo-03.png) 修改后重新提交部署: ![](https://images.liangs.me/bitcron/Notes/_image/9ac59c621f8f09f44cf517c55e0bec7d_hexo-02.png) ## 注意 - 为了避免上传一次就重新将pulic .git文件夹就同步一次,所以在本地Dropbox上要选择性同步。 - 想利用分布式解析国内解析到coding 国外解析到github,结果国内访问github比coding还快。 - 迁移的时候只要保存好`_config.yml` `package.json`配置文件,`source`,`themes`文件夹,迁移的时候再重新安装环境将备份的文件覆盖后装上npm包就行。