万神劫

万物天地为剑,神鬼妖邪为剑
劫波万渡,宇宙苍穹尽为剑
是为万神劫!

3条评论 2012-09-23

Linode 部署 Klog 【Ubuntu 篇】

前言

之前写过一篇 Linode 部署 Klog 的文章,不过是基于 CentOS 的,最近开始换用 Ubuntu 了,发现好用了很多,因此又有了本篇文章。
另外这次换到 Ubuntu 之后,还加入了 Capistrano 自动部署和 Backup 自动备份功能,文章中也有记录。
本文基于 Linode 512 套餐 + Ubuntu 12.04 32位版

用户

建议新建一个用户来执行部署操作,而不是直接用 root 用户,这里就不详述了,命令如下

useradd -d /home/deployer -m -s /bin/bash deployer 
gpasswd deployer 
gpasswd -a deployer sudo

然后以新的用户重新登录

安装 rvm

curl -L https://get.rvm.io | sudo bash -s stable
sudo gpasswd -a deployer rvm

这里需要重新登录一下才能执行 rvm

安装 Ruby

先执行 rvm requirements 查看一下需要系统里面还缺哪些包
然后根据提示安装好这些包,下面是示例

sudo apt-get update
sudo apt-get install build-essential openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion pkg-config
rvmsudo rvm install ruby
rvm use 1.9.3 --default  

安装 Passenger

gem install passenger

安装 Nginx

与姊妹篇相同,需要手工安装 Nginx ,因为要额外编译一个 module,参见隐藏 Nginx + Passenger 的server header
将以下两个文件上传至服务器并解压

  • agentzh-headers-more-nginx-module-v0.16-0-gde77fd2.zip
  • nginx-1.0.15.tar.gz

然后执行以下命令,跟随安装向导提示操作

sudo apt-get install libcurl4-openssl-dev  # 可能需要安装
rvmsudo passenger-install-nginx-module  

然后根据向导一步步安装,步骤如下

  1. 输入 2 ,即选择 No: I want to customize my Nginx installation.
  2. 输入 Nginx 源码所在目录 /home/nginx-1.0.15
  3. 输入 Nginx 安装位置 /usr/local/nginx
  4. 输入额外的安装参数 --add-module=/home/agentzh-headers-more-nginx-module-de77fd2

如果想方便地启动、停止 Nginx ,可以考虑下载一个脚本

cd /etc/init.d
sudo wget https://raw.github.com/chloerei/nginx-init-ubuntu-passenger/master/nginx 
sudo vi nginx   # 如果 nginx 的路径不是/opt/nginx,那么修改一下这个文件
sudo update-rc.d nginx defaults
sudo chmod +x nginx 
sudo service nginx start

因为我喜欢装到 /usr/local/nginx 下,所以这里 fork 了一份修改好的代码防止每次都要修改
https://raw.github.com/edokeh/nginx-init-ubuntu-passenger/master/nginx

安装 Mysql

sudo apt-get install mysql-server
sudo apt-get install libmysqld-dev
sudo mysql_secure_installation # 配置 root 密码
sudo service mysql restart

注意第二个包其实就是 mysql-devel ,这里安装它是为了将来安装 mysql2 gem

如果希望外部也能访问这个数据库的话,需要做一些修改

  • 修改 /etc/mysql/my.cnf ,将 bind 地址改为 0.0.0.0
  • 修改 mysql 库的 user 表

安装 ImageMagick

sudo apt-get install imagemagick

安装 Node.js 与相关的包

此节为 2013-06-03 新增
由于用到了 Sea.js,我写了个 gem 来辅助进行 compile,而这个 gem 依赖于一些 Node.js 的包
先装好 Node.js

sudo apt-get update
sudo apt-get install python-software-properties python g++ make
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

然后是两个包

sudo npm install spm -g
sudo npm install spm-chaos-build -g

这里有个诡异的事情,请检查一下 ~/.spm 目录的权限,至少我的 Linode 上这个目录属于 root 而非普通用户
这会导致 spm chaos-build 命令执行不正常,请修改权限,至少加上 o+w

部署代码

终于到重点了,这里会用 Capistrano 来部署代码

准备 Capistrano 目录

首先来做一些准备工作

gem install rvm-capistrano
gem install whenever
cd ~
mkdir klog
cd klog
wget https://raw.github.com/edokeh/klog/master/Capfile
wget https://raw.github.com/edokeh/klog/master/config/deploy.rb -P config
wget https://raw.github.com/edokeh/klog/master/config/database.yml -P config

这里先新建了一个目录作为 cap 部署目录,然后从 git 上下载了我提供的部署脚本

修改脚本和配置

根据实际情况编辑一下 config/deploy.rb ,主要是修改以下几项

  • server 部署的服务器地址
  • user 服务器用户名
  • password 服务器密码
  • deploy_to 代码部署目录,就是上面一步新建的 klog 目录

还需要修改一下 config/database.yml ,只需要修改 production 部分即可
另外,注意到脚本中有这么一行 require "whenever/capistrano" ,这是使用 whenever 自动备份,后面再讲

执行部署

cap deploy:setup
cap deploy:cold

不出意外,代码应该会成功地部署到 klog/current 目录下,而且会做好一些关键目录的 link

  • current/log -> shared/log
  • public/uploads -> shared/uploads

这样下次再次部署时,cap 会自动删除 current 目录,而日志与上传的文件都不会丢失
另外实际上 current 目录也是 link 到 release 目录下的

配置 nginx 并启动

项目根目录下有 nginx.conf ,基本上你只需要简单修改一下即可使用,主要修改项包括

  • passenger_root
  • passenger_ruby
  • $server_host 访问域名
  • $server_root 代码部署目录,注意这里需要制定到 public 目录下,而且用 cap 的话,应用目录是 current 子目录,比如 /home/deployer/klog/current/public

修改完后执行

sudo cp current/nginx.conf /usr/local/nginx/conf
sudo service nginx restart

升级代码

今后如果我升级了 klog 代码,你可以通过 cap 来自动升级部署

cd ~/klog
cap deploy:migrations

代码会自动更新,自动执行 db:migrate & bundle install & asset:precompile,并且服务器也会自动重启

自动备份

这里要抱歉一下,如果你希望自动备份数据库和上传的文件到 dropbox,并且希望在发布完了之后就能配置好的话,可能需要你在读完这段之后重新执行一遍 cap 部署
如果对 backup 和 whenever 不了解的同学建议先阅读 用 Backup 和 Whenever 进行备份

目前的 cap 脚本中其实有关于 whenever 的部分,主要功能是在部署时,将 whenever 定义的任务写到 crontab 里面,其中就包括我们的备份任务,当然我们做一些配置即可,先在 config 目录下新建一个 backup_config.rb

cd klog
wget https://raw.github.com/edokeh/klog/master/config/backup_config.rb -P config

backup_config.rb 需要修改的主要有

  • MySQL 数据库配置
  • uploads 目录位置
  • dropbox 的 api_key 和 api_secret ,不了解的可以参考上面我给出的文章,简而言之就是在 dropbox 新建一个 app,然后它会提供两个值,如果你还没有注册 dropbox,可以点这里

然后记得要先手工跑一遍 backup 命令,因为 dropbox 的权限需要预激活

cd current
bundle exec backup perform -t klog -c config/backup_config.rb

然后脚本会提示你访问一个 url ,访问后点击 Allow 即可,然后回到终端按回车继续
最后,如果偷懒的话,重新执行一遍 cap deploy 即可

comments powered by Disqus