服务器端 Octopress 搭建及移动方案
玩了几天的 Octopress,又学到了不少 git 方面的知识,越发感叹 Octopress/Jekyll 和版本控制的各种美好。而看过了 @masukomi 的文章之后又学到了新东西,这里介绍一下。
不同于 Octopress 官方文档中的在本地生成静态网站再通过 rsync 同步到服务器,本文介绍的方法是在服务器上搭建环境,然后直接将 Octopress push 到自建的服务器端 Git 仓库,由服务器来生成静态页面。
这样搞的好处
除了多出一个服务器备份 repo 外,最重要的是让服务器本身具备了生成功能而不仅仅是储存页面,使整个系统得以脱离本地环境而实现功能,通过添加一些脚本(比如 JekyllMail),就让移动发布成为可能。
这样搞的问题
- 对服务器要求较高,要支持 ssh 登录,
有 root 权限,能搭建起 git 和 ruby 环境。 - 因为要让服务器来生成静态页面,而目前 Octopress 还不能仅针对更改部分进行生成,对于有些对 CPU 限制较多的服务器,同时文章很多,生成时间过长的话,就有可能超限而生成到一半就 kill 了。
- 需要熟悉 Linux 下的一些基础操作,当然还有 git(不过既然是玩 Octopress 的,折腾能力应该是有的哈)。
搭建步骤
注意提前备份,折腾坏了丢数据 Lucifr 一概不负责任!
Git,RVM,Ruby,Bundle
首先需要搭建起能够生成 Octopress 的环境,这需要你能够通过 SSH 登入 root 账户。
注意:Lucifr 所使用的是基于 Centos 5.5 的 LNMP 架构,如果使用的是不同版本 Linux,过程可能会不同。
-
添加 Webtatic 源并安装 Git:
rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm yum install --enablerepo=webtatic git
-
建立 rvm 用户及组:
groupadd rvm useradd -g rvm rvm
-
将 root 用户添加到 rvm 组:
usermod -a -G rvm root
-
安装 RVM:
bash < <(curl -Lk https://github.com/wayneeseguin/rvm/raw/1.3.0/contrib/install-system-wide)
-
将环境变量添加到 root 账户的 .bash_profile 文件:
echo '[[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm"' >> ~/.bash_profile source ~/.bash_profile
-
这里需要先登出再重新登入一下。然后安装 zlib 包:
rvm pkg install zlib
-
通过 RVM 安装 Ruby 1.9.2:
rvm install 1.9.2 --with-zlib-dir=/usr/local/rvm/usr/
-
通过 RVM 设置默认 Ruby 版本为 1.9.2:
rvm --default use 1.9.2
-
验证下 Ruby 1.9.2 是否配置成功:
ruby -v
-
安装 Bundle:
gem install bundle
在服务器上建立 Octopress 环境
-
首先要先将公钥加入到服务器端,具体方法就不赘述了,网上很多。
-
SSH 登入主机后,建立一个空的 git 仓库:
mkdir octopress_blog.git && cd octopress_blog.git git init --bare
-
然后我们需要改变远程仓库的工作目录到网站需要部署的位置:
git config core.bare false git config core.worktree /path/to/staging/directory # 上一行中你需要将 /path/to/staging/directory 换成网站的部署目录,比如:/home/wwwroot/blog git config receive.denycurrentbranch ignore
-
用 vi 在远程仓库的 hooks 目录中创建一个
post-receive
脚本:vi hooks/post-receive
-
粘贴如下,同样别忘了更改
/path/to/staging/directory
和上面一致,这个脚本会在 push 时自动 checkout 到部署目录中,并执行生成静态网站命令:#!/bin/sh GIT_WORK_TREE=/path/to/staging/directory git checkout -f
-
输入
wq
保存并退出 vi,改下权限使其可以被执行:chmod 755 hooks/post-receive
-
现在回到本地终端下,添加这个远程仓库,这里默认你已经在本地架起了 Octopress:
cd my_octopress_blog # 将 my_octopress_blog 改成你的 octopress 所在目录 git remote add live me@example.com:/path/to/octopress_blog.git # 上一行中的 me 和 example.com 分别是服务器端的用户名和主机地址,/path/to/octopress_blog.git 是刚刚建立起的远程仓库的目录,如 /root/git/octopress_blog.git
-
Push 到远程仓库:
git push live master
-
现在回到服务器端,cd 进 /path/to/staging/directory,看看是否工作目录是否正常的被 checkout 了,同时也确认下 rvm 的提示,你可以运行下
rake generate
生成下静态,看看是否正常。如果一切正常,将以下两行添加到刚才的hooks/post-receive
的最后,这样下次再 push 时就可以自动生成静态了:cd /path/to/staging/directory bundle exec rake generate
-
最后,要将虚拟主机域名指向 /path/to/staging/directory 的子目录 public(当然也可以提前弄好)
如果和 Lucifr 一样是用 LNMP,可以运行 /root/vhost.sh 按照提示添加新的虚拟主机,绑定目录设置为 /path/to/staging/directory/public 即可。或是直接修改已有虚拟主机的 nginx 的 conf 文件(在 /usr/local/nginx/conf/vhost 中),将 server 中的 root 改到 /path/to/staging/directory/public 也可。
关于 public 目录
在服务器端,通过修改 _config.yml 可以将 public 目录放到任何目录中。
当然要注意这样一来本地的 _config.yml 就不要再 push 上去了。
全搞定了,然后呢?
在家时这么搞
和之前的 generate 再 deploy 不同,现在本地这两个命令都不用了,写了新文章或是做了其它修改之后直接:
git add .
git commit -m "site update"
git push live master
出门时这么搞
出门在外,用他人的电脑时,只要随身 U 盘里带个 SSH 的客户端,登录自己的主机,到 /path/to/staging/directory/ 中 rake new_post
,把写好的文章贴进去,rake generate
即可,免去了搭建环境的麻烦,很云端的赶脚啊有木有!
回到家之后,先到 octopress_blog.git 中 commit 了,然后再在本地 merge 一下 live 就行了。
强烈推荐下 SourceTree,懒得敲命令者的福音。
另外,@masukomi 写的 JekyllMail) 可以实现通过邮件来发新文章,目前正在完善当中,看了看 README,未来的前景非常之美好,不过这个 Lucifr 还没太整明白怎么用 =_=|||。