之前的博客用 Hexo 生成,已经稳定跑了快一年。但是从搭建开始我就很烦 Nodejs,这东西在 Windows 下总有各种稀奇古怪的 bug,在 Linux 下倒是可以正常用,然而那意味着我得在 Windows 下写好博客再拖到虚拟机里去(因为专业需要工作平台只能放在 Windows 下),这无疑背离了静态博客生成器几行命令完成从生成到部署的优点。
之前还用过一阵 Gitblog,其实还是挺好用的,就是几个带的主题都不怎么好看,每次写完文章还得自己把 md 文件传到它的目录下,后来忘了什么原因弃用了 Gitblog 又转投 Hexo 了。
前几天看到有人用 Grav 搭建了博客,虽然主题也没多好看,但它的特性还挺符合我需求的。不需要数据库,可以带后台,插件主题也还算丰富,于是折腾了好几天终于转到了 Grav,简单记录一下遇到的坑吧。
下载
Grav 官网
可以选择只下载核心部分,也可以选择下载带 Admin Panel 的。
其实这里我推荐搭博客的直接去他的 skeletons 里下载他做好打包的版本 Blog Site,这里的 skeleton 就类似他用 Grav 做好一个长得像博客的站,然后用 Grav 的 backup 功能打包一个压缩包供其他人使用。
可以看到在 Skeletons 里有很多的包可以下载,Grav 作为一个 CMS 远远不止可以搭博客,他的 modular 功能可以让你用几个文本文件轻松搭出产品展示页面、文档系统、图片展示、简历展示,只要下载对应的 skeleton 改改内容就好了,还是挺方便的。
安装
这一步就很简单了。
unzip xxx.zip -d /var/www/blog/
解压完成后有个小坑,很容易遇到权限设置不对的问题,可以写个小脚本弄一下。
#!/bin/sh
chown joeblow:staff .
chown -R joeblow:staff *
find . -type f | xargs chmod 664
find ./bin -type f | xargs chmod 775
find . -type d | xargs chmod 775
find . -type d | xargs chmod +s
umask 0002
弄好后应该可以在浏览器里正常访问了。下一步就是安装 Admin Panel,因为下载的这个 Blog Site 自己并没有带。
bin/gpm install admin
bin/gpm
这个 PHP 文件是 Grav 的插件主题管理器,bin/grav
是 Grav 的文件管理器(大概是这个功能吧,可以备份、清空缓存等)。
如果这时候报权限错误可以再执行以下刚才的脚本,Grav 的又一个坑就是权限常常不对(有一个 cache 的文件是 644 的,造成用户自己的账户不可写),不过装好了 Admin Panel 以后就可以全部在后台操作了。
后台
地址是 http://xxx.abc/admin
,第一次会让你注册,登录后点左上角自己头像进入账户设置,推荐弄好后去插件里找到 Login 把用户注册关掉。
后台功能不复杂,随便看看就能懂了,Grav 的文件结构是靠目录实现的,在根目录下的就会出现在首页的导航栏上(也会受主题不同的影响),每个页面分为很多类型,Blog 类型是用来展示博客的,每一个博客是一个 Item,Default 类型是一个单页类型,别的我也没用到。
新建文章的时候就是 Add Page,写名字和 URL,选目录和类型(Item),然后写好保存就可以了,Options 和 Advanced 里可以设置一些日期、是否发布、分类、标签之类的东西,也可以直接本地写好再传上去,按他的 front-matter 来就行。
插件和主题都可以在后台安装,有一个 Add 按钮,有时候出 bug 了可以去 shell 里清空一下缓存。
bin/grav clearcache
评论
安装 JSComments 插件,配置自己的 shortname,不过不支持多说,反正多说最近也经常挂,我已经换 disqus 了。
还有一个坑就是插件安装好后还不能用,得自己改下模板。
修改 /var/www/grav/user/themes/antimatter/templates/partials/blog_item.html.twig
文件。
<div class="e-content">
{{ page.content }}
{{ jscomments('disqus', { shortname: 'your-short-name' }) }} // 加上这一行
</div>
{% if config.plugins.comments.enabled %}
{% include 'partials/comments.html.twig' %}
{% endif %}