Hexo 云服务备份与使用 Jupyter
本文由 Fluid 用户授权转载,版权归原作者所有。
本文作者:pxxyyz
原文地址:https://pxxyyz.com/posts/32990/、https://pxxyyz.com/posts/60533/
前言
记录hexo博客遇到的问题:
- 免密git
- 自动备份
- 云服务器开启
Jupyter Notebook
- 在博客的菜单访问
Jupyter
(使用Nginx
重定向实现url访问端口) - 公式渲染引擎
云服务器备份
参考「Hexo博客部署到腾讯云服务器」[1]后遇到了两个问题:
每次在本地部署博客时都要重复输入密码
1
2
3
4deploy:
type: git
repo: root@***(服务器ip,内网外网都行):/home/git/blog.git #仓库地址
branch: master #分支备份时hexo自带的backup无效
1
2
3
4backup:
type: git
repo: root@***(服务器ip,内网外网都行):/home/git/backup.git #仓库地址
branch: master #分支
免密git
在这一部分参照了「使用Git+Hooks实现Hexo站点自动部署到CentOS服务器上」[2]的配置SSH免密登陆步骤。
1 |
|
因为部署时用的root上传,因此这里的your_user_name
设置git
和root
两个。添加成功后ssh -v git@HostIP
和ssh -v root@HostIP
显示Welcome to XXX !
自动备份
这里我按照「deploy的流程在服务器设置了自动化备份」[1],主要思路是在服务器设置一个独立的文件夹backup
,再用类似deploy的钩子blog.git
,构造一个备份的钩子deploy.git
将博客的备份文件上传。
获取
root
权限1
$ su root
建立
git
仓库1
2$ cd /home/backup
$ git init --bare backup.git修改
backup.git
权限1
$ chown git:git -R backup.git
在
/home/hexo/backup.git
下,有一个自动生成的hooks
文件夹,我们创建一个新的git
钩子post-receive
,用于自动部署。1
$ vim backup.git/hooks/post-receive
按
i
键进入文件的编辑模式,在该文件中添加两行代码(将下边的代码粘贴进去),指定 Git 的工作树(源代码)和 Git 目录1
2
3
4
5#!/bin/bash
git --work-tree=/home/backup --git-dir=/home/git/backup.git remote add origin
git --work-tree=/home/backup --git-dir=/home/git/backup.git checkout -f
# git --work-tree=/home/backup --git-dir=/home/git/backup.git checkout -b master # 创建切换分支
git --work-tree=/home/backup --git-dir=/home/git/backup.git push origin master # 提交代码至分支按
Esc
键退出编辑模式,输入:wq
保存退出。(先输入:
,然后输入wq
回车)修改文件权限,使得其可执行。
1
$ chmod +x /home/git/backup.git/hooks/post-receive
博客根目录
_config
下增加(因为服务器没有分支,默认是master
,使用backup
钩子)1
2
3
4deploy:
type: git
repo: root@***(服务器ip,内网外网都行):/home/git/backup.git #仓库地址
branch: master #分支备份
hexo backup
(使用Hexo-Git-Backup
插件)1
2
3$ hexo clean
$ hexo g
$ hexo b
这个地方走了不少弯路,因为backup阶段每次都提示错误:
1 |
|
我通过搜索fatal-does-not-appear-to-be-a-git-repository
找到解决思路,用Git命令
自动备份。详细参见「HEXO博客实现自动备份」[3]。
安装
shelljs
模块1
$ npm install --save shelljs
编写自动备份脚本:主题目录下
scripts
文件夹下新建一个js
文件,文件名随意取,例如update.js
。
1 |
|
注意:
- 在
Hexo根目录
或在主题目录下的scripts
文件夹js
在启动时就会自动载入,因此建议放在主题目录下,避免不必要的问题,例如Blog/themes/fluid/scripts/update.js
。 - 此
backup.js
是在hexo backup
运行后backupAfter
自动触发的,因此可以在其他仓库备份(如github
和coding
)后实现服务器的自动备份。 git
远程仓库在服务器,所以push在服务器端的home/git/backup.git
里post-receive
钩子中。- 由于设定了
git
免密设置,因此使用backup.git
操作不需要重复的输入密码。
在_config.yml
下设置备份配置。注意:backup
下不要有服务器的repo
,因为在scripts
下backup.js
已实现git push
。
1 |
|
再来一波四连😄
1 |
|
得到
1 |
|
服务器的文件夹/home/backup
下可看到Hexo backup
的备份文件,服务器端备份的文件与github
或coding
备份文件一致。同时,文件夹/home/hexo
是hexo deploy
的部署文件,通过Nginx
提供 Web 服务
。这就实现了服务器部署和备份的自动化操作。
Tips:如果遇到程序没有报错但文件夹上传失败时,可以手动删除Hexo
根目录下的.deploy_git
文件夹,再重新部署和备份。
访问Jupyter
下面以域名pxxyyz.com
为例,首先需要在服务器开启Jupyter
[4]
安装Jupyter
- 安装
Anaconda
1 |
|
- 生成
Jupyter Notebook
配置文件
1 |
|
- 打开
ipython
并设置登入密码
1 |
|
- 修改服务器配置文件
1 |
|
- 按
i
键进入文件的编辑模式,在该文件中添加代码,按Esc
键退出编辑模式,输入:wq
保存退出。(先输入:
,然后输入wq
回车)
1 |
|
- 启动
Jupyter
1 |
|
- 打开端口步骤: 本实例安全组->配置规则->入方向->手动添加
授权策略 | 优先级 | 协议类型 | 端口范围 | 授权对象 |
---|---|---|---|---|
允许 | 100 | 自定义 TCP | 目的:8888/8888 | 源:0.0.0.0/0 |
- 浏览器访问
Jupyter notebook
(移动端或桌面端),并输入刚才配置的密码即可使用
1 |
|
注意:
- 第二种方式需要域名解析到服务器公网IP,域名等价于公网IP
https://HostIP:8888
访问出错,https://域名:8888
同理
- anaconda换源,分别测试一下下载速度和稳定性,自行选择最优的
1 |
|
- 可以在
Jupyter notebook
的工作目录中上传或下载.ipynb
文件,当然别的文件也可以。
Nginx 重定向
希望在我的博客中添加一个菜单按钮直接访问我的Jupyter notebook
。然而菜单链接是通过url_for
自动生成的,如添加link: ':8888'
,生成的是pxxyyz.com/:8888/
,而不是pxxyyz.com:8888
。当然,可以设置链接为link: 'pxxyyz.com:8888'
,直接且简单,但这不能学到一些有趣的东西!
下面通过特点子页面来访问域名的指定端口,即通过pxxyyz.com/jupyter
访问pxxyyz.com:8888
- 在此之前上传了
SSL证书
并配置HTTPS
[5] - 修改服务器配置文件
1 |
|
- 按
i
键进入文件的编辑模式,在该文件找到server
,修改代码,按Esc
键退出编辑模式,输入:wq
保存退出。(先输入:
,然后输入wq
回车)
1 |
|
- 重启
nginx
并检查配置
1 |
|
- 当然,一开始不是这么做的,错误的方法也贴出来,避免入坑
1 |
|
分析
用
proxy_pass
得到的重定向是https://pxxyyz.com/jupyter
对应的服务器访问的是
https://HostIP:8888
正确的
Jupyter notebook
访问地址却是http://HostIP:8888
因此问题出在http的域名强制转成https
解决方法:遇到指定链接用
return 302
返回http从而得到正确的结果[6]结果:
https://pxxyyz.com/jupyter
、http://pxxyyz.com/jupyter
、http://pxxyyz.com:8888
和http://HostIP:8888
均能打开Jupyter notebook
- 但IP的SSL证书不免费!
https+port
的组合访问会出错。
补充
数学公式
在此补充一下之前公式不显示的问题。虽然Fluid主题支持LaTeX 数学公式,但是需要手动操作,而且我按照教程开启本功能mathjax
没有成功,即公式在网页里并没有被渲染和转换。通过网上查找,发现解决这类问题的思路主要是换渲染引擎[7],例如pandoc
、mathjax
、katex
。我目前使用mathjax
,操作如下:
卸载默认引擎,并安装这个新的渲染引擎
1
2$ npm uninstall hexo-renderer-marked --save
$ npm install hexo-renderer-kramed --save修改
/node_modules/hexo-renderer-kramed/lib/renderer.js
1
2
3
4
5
6
7// Change inline math rule
function formatText(text) {
// Fit kramed's rule: $$ + \1 + $$
// 直接返回text
// return text.replace(/`\$(.*?)\$`/g, '$$$$$1$$$$');
return text;
}修改hexo的渲染源码
/node_modules/kramed/lib/rules/inline.js
1
2
3
4
5
6// 去掉`\\`的额外转义,第11行,将其修改为
// escape: /^\\([\\`*{}\[\]()# +\-.!_>])/,
escape: /^\\([`*{}\[\]()# +\-.!_>])/,
// 将em标签对应的符号中,去掉`_`,第20行,将其修改为
// em: /^\b_((?:__|[\s\S])+?)_\b|^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,
em: /^\*((?:\*\*|[\s\S])+?)\*(?!\*)/,停止使用
hexo-math
,安装hexo-renderer-mathjax
1
2
3$ npm uninstall hexo-math --save
// 不知道是不是必要的
$ npm install hexo-renderer-mathjax --save更新
Mathjax
的CDN
链接,打开/node_modules/hexo-renderer-mathjax/mathjax.html
,把script
更改为:1
2
3// <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.1/MathJax.js?config=TeX-MML-AM_CHTML"></script>
// 网上推荐的上面这个,但我使用失败了,推荐下面这个,亲测可行
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>按照Fluid的快速开始,需要修改主题配置,打开
/source/_data/fluid_config.yml
文件1
2
3
4
5post:
math:
enable: true
specific: false
engine: mathjax在根目录下修改
_config.yml
,添加1
mathjax: true
在
Front-matter
中打开MathJax
1
2
3---
mathjax: true
---显示数学公式
1
2# 不空行会出bug
$$\Sigma({n} ; {p})=\left\{\left(\zeta_{1}, \ldots, \zeta_{r}\right) \in \mathbb{C}^{n_{1}} \times \cdots \times \mathbb{C}^{n_{r}}: \sum_{k=1}^{r}\left\|{\zeta}_{k}\right\|^{2 p_{k}} < 1\right\}$$
\[\Sigma({n} ; {p})=\left\{\left(\zeta_{1}, \ldots, \zeta_{r}\right) \in \mathbb{C}^{n_{1}} \times \cdots \times \mathbb{C}^{n_{r}}: \sum_{k=1}^{r}\left\|{\zeta}_{k}\right\|^{2 p_{k}} < 1\right\}\]
因为hexo-renderer-kramed
和hexo-renderer-marked
均不支持emoji
功能,使用:smile: :blush: :smiley: :smirk:在Typora可以正常显示表情,在网页上显示的是:smile: :blush: :smiley: :smirk:
,因此,可以直接复制emoji
表情😄😊😃😏。
经过强哥提醒,需要额外使用插件hexo-filter-github-emojis
来支持hexo
的 emoji
。
1
$ npm install hexo-filter-github-emojis --save
在根目录下_config.yml
添加配置
1
2
3
4
5
6githubEmojis:
enable: true
className: github-emoji
inject: true
styles:
customEmojis:
正文markdown
用如下格式使用 emoji
1
2# 不空行会出bug
{% raw %}{% github_emoji emoji %}{% endraw %}
正如上面所说,Hexo 默认情况下 :emoji:
不能正确显示表情,如:tada:
,而该插件通过 {%github_emoji tada%}(github_emoji tada)
即可显示这个 emoji ,其他调用格式可以看 hexo-filter-github-emojis
的官方文档。
一键三连
前面提到的在根目录下使用Git Bash Here
输入下面指令有些繁琐。
1
$ hexo clean && hexo g && hexo d && hexo b
现在用.bat
文件简化,可以分别保存。其中第四行的地址为根目录。
1 |
|
1 |
|
1 |
|
一键预览的窗口支持实时修改实时显示,即文档修改保存后,刷新可得修改后的预览页面。如果做到ssh免密登入,部署与备份也能一键完成。