服务器端 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,过程可能会不同。

  1. 添加 Webtatic 源并安装 Git:

    rpm -Uvh http://repo.webtatic.com/yum/centos/5/latest.rpm
    yum install --enablerepo=webtatic git
    
  2. 建立 rvm 用户及组:

    groupadd rvm
    useradd -g rvm rvm
    
  3. 将 root 用户添加到 rvm 组:

    usermod -a -G rvm root
    
  4. 安装 RVM:

    bash < <(curl -Lk https://github.com/wayneeseguin/rvm/raw/1.3.0/contrib/install-system-wide)
    
  5. 将环境变量添加到 root 账户的 .bash_profile 文件:

    echo '[[ -s "/usr/local/rvm/scripts/rvm" ]] && . "/usr/local/rvm/scripts/rvm"' >> ~/.bash_profile
    source ~/.bash_profile
    
  6. 这里需要先登出再重新登入一下。然后安装 zlib 包:

    rvm pkg install zlib
    
  7. 通过 RVM 安装 Ruby 1.9.2:

    rvm install 1.9.2 --with-zlib-dir=/usr/local/rvm/usr/
    
  8. 通过 RVM 设置默认 Ruby 版本为 1.9.2:

    rvm --default use 1.9.2
    
  9. 验证下 Ruby 1.9.2 是否配置成功:

    ruby -v
    
  10. 安装 Bundle:

    gem install bundle
    

在服务器上建立 Octopress 环境

  1. 首先要先将公钥加入到服务器端,具体方法就不赘述了,网上很多。

  2. SSH 登入主机后,建立一个空的 git 仓库:

    mkdir octopress_blog.git && cd octopress_blog.git
    git init --bare
    
  3. 然后我们需要改变远程仓库的工作目录到网站需要部署的位置:

    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
    
  4. 用 vi 在远程仓库的 hooks 目录中创建一个 post-receive 脚本:

    vi hooks/post-receive
    
  5. 粘贴如下,同样别忘了更改 /path/to/staging/directory 和上面一致,这个脚本会在 push 时自动 checkout 到部署目录中,并执行生成静态网站命令:

    #!/bin/sh
    GIT_WORK_TREE=/path/to/staging/directory git checkout -f
    
  6. 输入 wq 保存并退出 vi,改下权限使其可以被执行:

    chmod 755 hooks/post-receive
    
  7. 现在回到本地终端下,添加这个远程仓库,这里默认你已经在本地架起了 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
    
  8. Push 到远程仓库:

    git push live master
    
  9. 现在回到服务器端,cd 进 /path/to/staging/directory,看看是否工作目录是否正常的被 checkout 了,同时也确认下 rvm 的提示,你可以运行下 rake generate 生成下静态,看看是否正常。如果一切正常,将以下两行添加到刚才的 hooks/post-receive 的最后,这样下次再 push 时就可以自动生成静态了:

    cd /path/to/staging/directory
    bundle exec rake generate
    
  10. 最后,要将虚拟主机域名指向 /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 还没太整明白怎么用 =_=|||。

参考