posts - 262,  comments - 221,  trackbacks - 0
          【1. 下載Virtual Box】
          ==================================================
          在/etc/apt/sources.list文件的末尾添加一行
            deb http://download.virtualbox.org/virtualbox/debian lucid contrib non-free

          添加Oracle的key文件
            wget -q http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -

          以root用戶身份執行
            sudo apt-get update
            sudo apt-get install virtualbox-4.0  
          ==================================================


          【2. 安裝vagrant和Linux虛擬機】
          ==================================================
            gem install vagrant
            vagrant box add base http://files.vagrantup.com/lucid32.box

          如果出現gem無法安裝的情況(例如鏈接被重置,請使用VPN連接后再安裝gem)
          ==================================================


          【3. 配置Ubuntu】
          ==================================================
            mkdir ubuntu  # 控制虛擬機配置的目錄
            cd ubuntu
            vagrant init     # 初始化vagrant的環境
            vagrant up     # 創建vagrant的運行環境
            vagrant ssh    # 以SSH方式連接登錄

          當使用vagrant ssh方式登錄的時候,會以一個名為vagrant的用戶身份登錄到虛擬機
          (lucid32),這個用戶具備有管理權限(虛擬機預設用戶)。如果使用的虛擬機不是vagrant
          網站提供的,那么默認沒有vagrant用戶,需要在虛擬機端創建一個具備管理權限的用戶

            useradd -d /home/user -m -s /bin/bash -G admin user
            passwd user
            su user

          其中第一個命令的創建一個名為user的用戶,默認的home目錄位于/home/user,默認
          的shell使用/bin/bash,該用戶的組為admin(-G) 。然后為該用戶創建新的密碼并切換到
          該用戶(我們可以使用vagrant作為用戶名),以后所有的操作都在該用戶下進行(不再使用
          vagrant,直接操縱虛擬機)
          ==================================================


          【4. 升級虛擬機的aptitude package】
          ==================================================
          在連接到虛擬機的情況下,執行:

            sudo aptitude update
            sudo aptitude -y install build-essential git-core curl

          確保該repository下的所有最新source會被下載并緩存到本地,并安裝幾個必需的包,
          其中build-essential包含了若干編譯源代碼的必要工具,git-core包含了GIT的核心功能,
          我們將用來提交代碼,curl允許我們訪問某個指定的URL并download該URL的內容
          ==================================================


          【5. 安裝RVM】
          ==================================================
          通過RVM官網提供的腳本來安裝RVM,并默認安裝為系統級別(即sudo打頭的)
           
            sudo bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
           
          如果在這個過程有出現關于“認證”  的錯誤,請為curl添加一個"-k"開關參數

            sudo bash < <(curl -sk https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

          使用Multi-user mode(System mode)安裝的,默認將RVM安裝在/usr/local/rvm下。

          再次安裝部分Ruby的依賴包

            sudo aptitude -y install build-essential bison openssl \
                    libreadline6 libreadline6-dev curl git-core zlib1g \
                    zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 \
                    libsqlite3-dev sqlite3 libxml2-dev libxslt-dev \
                    autoconf libc6-dev libpq-dev libcurl4-openssl-dev          

          The installation process is similar for both installation methods, however, when
          installing a multi-user configuration, do not run the installer directly as root.
          Always use the sudo command         
          ==================================================


          【6. 配置RVM的加載】
          ==================================================
          The rvm function will be automatically configured for every user on the system
          if you install as root. This is accomplished by loading /etc/profile.d/rvm.sh on login.

          Most Linux distributions default to parsing /etc/profile which contains the logic to
          load all files residing in the /etc/profile.d/ directory.

          Once you have added the users you want to be able to use RVM to the rvm group,
          those users MUST log out and back in to gain rvm group membership because
          group memberships are only evaluated by the operating system at initial login time.

          Also, you only use the sudo command during the install process. In Multi-User
          configurations, any operations which require sudo access must use the rvmsudo
          command which preserves the RVM environment and passes this on to sudo.

          There are very few cases where rvmsudo is required once the core install is
          completed, except for when updating RVM itself. There is never a reason to use
          sudo post-install.

          如果是在非vagrant的虛擬機上,我們需要手動為連接的用戶添加一個所屬組:rvm

            sudo usermod -a -G rvm user
            sudo echo 'source "/usr/local/rvm/scripts/rvm"' >> /etc/profile
            exit
           
          注意上面的命令在執行后,當前用戶必須注銷后重新登錄以使更改起效。

          通過如下命令來檢測一切是否正常:

            type rvm | head -1
            rvm is a function

          在完成RVM的配置后,可以看一下還有需要安裝的,運行如下的命令檢查:

            rvm requirements
          ==================================================

           
          【7. 安裝Ruby及其包管理器】
          ==================================================
            rvm install 1.9.2
            rvm use --default 1.9.2
            gem install bundler rake
          ==================================================


          【8. 為發布應用創建一個專用的用戶】
          ==================================================
          為每一個應用的發布創建一個對應的用戶,可以方便我在發布多個應用的時候區分當前
          到底是處在那個應用。

          其次對于目錄,數據庫的所有權都屬于創建者,所以為應用創建特定的用戶有利于我們隔
          離目錄和DB的訪問權限。

            sudo useradd ticketeeapp.com -s /bin/bash -m -d /home/ticketeeapp.com
            sudo chown -R ticketeeapp.com /home/ticketeeapp.com
            sudo passwd ticketeeapp.com
          ==================================================


          【9. 使用SSH連接】
          ==================================================
          SSH連接是基于key authorized的驗證機制,它由634位的隨機字符和數字組成密碼。

          這里我需要為連接到虛擬機的用戶、發布應用的用戶都采用SSH認證方式。

          注意:前面我使用vagrant ssh的時候,不需要密碼就可以連接到虛擬機。就是因為在
          vagrant的虛擬機中,已經有默認的key認證文件了,所以不需要再重新生成key文件,
          否則會導致vagrant ssh無法登錄。

          但是如果不是使用vagrant的虛擬機,則需要手工創建key文件了。key文件分為public
          key和private key兩種。public key存儲在服務器端而private key存儲在服務器/客戶端。
          當使用SSH連接時,服務器會驗證public key和private key是否匹配(兩者的private key
          是否相同)

            # 登錄服務器后,在當前用戶的home目錄下創建.ssh目錄
            mkdir ~/.ssh
            # 在 "本地機器" 將當前public key拷貝到服務器的.ssh目錄下,以登錄用戶名重命名
            # 這個過程需要輸入登錄的密碼
            scp ~/.ssh/id_rsa.pub user@your-server:~/.ssh/[your_name]_key.pub
            # 生成private key
            cat ~/.ssh/[your_name]_key.pub >> ~/.ssh/authorized_keys
            # 修改private key的讀寫權限為僅當前用戶可讀寫
            chmod 600 ~/.ssh/authorized_keys
           
          上面的user@your-server中,user是當前登錄服務器的用戶名,your-server在這里是
          服務器的名稱。如果是使用vagrant,那么這里的user就是vagrant,而your-server則
          是localhost。

          當配置完成后,斷開和服務器的連接,再重新使用SSH方式登錄,這個時候應該不需要
          再次輸入密碼就可以連接。表明SSH配置起作用了。
           
          接下來切換用戶到App發布用戶

            sudo  su ticketeeapp.com
           
          然后重新跑一遍上面的命令。注意在scp命令時把user換成App發布用戶的名稱
          ==================================================


          【10. 取消密碼驗證】
          ==================================================
          切換回原來登錄的用戶賬戶,并打開如下的文件

            sudo nano /etc/ssh/sshd_config
           
          修改其中的配置選擇如下:

            PasswordAuthentication  no  
            PermitRootLogin no

          退出nano編輯器,然后在命令行下執行如下命令,重啟SSH服務:

            service ssh restart
           
          至此完成了所有的基于key authentication的用戶驗證  
          ==================================================


          【11. 安裝數據庫】
          ==================================================
          在Console下執行:

            sudo apt-get install mysql-server
            sudo apt-get install sqlite3 libsqlite3-dev
            gem install sqlite3-ruby

          在安裝的過程中會被要求輸入root用戶的密碼,安裝成功后將會自動加入到開機自啟動
          ==================================================


          【12. 為發布代碼到GitHub的Repository創建密鑰】
          ==================================================
          首先為發布代碼到GitHub創建一個密鑰,這個過程會產生一個公鑰和一個密鑰。密鑰必
          須妥善保存,而公鑰可以作為GitHub上我們發布代碼的key authentication

          首先切換到App應用發布的用戶,在終端下執行命令:

            ssh-keygen -t rsa        #產生密鑰
            cat ~/.ssh/id_rsa.pub  #查看公鑰的內容,拷貝粘帖到GitHub對應管理頁面的輸入框

          注意這些key是可以和Web應用關聯在一起的,所以這個private key是針對單個App的。
          當完成這些操作后,可以運行下面的命令驗證key認證是否成功:

            git clone git@github.com:our_username/ticketee.git ~/ticketee
           
          這個命令會從GitHub的ticketee應用下,拷貝內容到當前用戶目錄下,名稱叫ticketee。  
          如果有這個目錄存在且包含所有應該包含的內容,證明配置成功。此時我們可以刪除這個
          目錄。  
          ==================================================  
           

           【13. 配置Capistrano】
          ==================================================
          首先是把Capistrano 這個gem添加到應用中,再重新執行一次 bundle install

            group :development do
              gem 'capistrano'
            end
           
          然后在應用的根目錄執行命令:capify .

          在應用根目錄下生成兩個文件:capfile 和 config/deploy.rb。其中capfile中調用了config/
          deploy.rb文件,用來讀取所有和部署相關的信息。在config/deploy.rb文件中,有若干項是
          需要配置的

            set :application, "set your application name here"
            set :repository,  "set your repository location here"  # 注意這里是GitHub的repository路徑
            set :scm, :git
            set :port, 2200
            set :user, "set your user name here as the app user" # 由于使用了密鑰不需要密碼
            set :deploy_to, "PATH_TO_USER_HOME_DIR/apps/#{application}"
            set :use_sudo, false # 非Root用戶
            set :keep_releases, 5 # 保留最近5個已發布的版本,清除其他的舊版本
           
            role :web, "[your-server]"  # 如果是使用Capistrano,那么這里是localhost
            role :app, "[your-server]"
            role :db,   "[your-server]", :primary => true # 表示這是一個主數據庫

          接下來在deploy.rb文件的末尾,找到如下幾行,并去掉注釋。用來在每次發布時生成一
          個restart文件,使到Passenger在下次請求到來時自動重啟加載應用。
           
            # 創建任務
            namespace :deploy do
              task :start do ; end
              task :stop do ; end
              task :restart, :roles => :app, :except => { :no_release => true } do
                        run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
              end
            end
          ==================================================


          【14. 創建部署環境并部署】
          ==================================================  
          在完成配置后,可以通過cap -T 來列出所有支持的命令??梢酝ㄟ^如下命令來安裝應用

            cap deploy:setup  # 該命令會產生大量的輸出,構建標準的部署結構,類似于Maven
           
          這個命令會進行如下的輸出:

            $USER_HOME_DIR/apps/$APP_NAME/releases              # 存放發布的版本文件
            $USER_HOME_DIR/apps/$APP_NAME/shared                # 存放版本間共享的文件
            $USER_HOME_DIR/apps/$APP_NAME/shared/system    # 存放系統間共享的文件
            $USER_HOME_DIR/apps/$APP_NAME/shared/log          # 符號鏈接存放多個版本的日志
            $USER_HOME_DIR/apps/$APP_NAME/shared/pids        #  存放當前應用的pid
           
          并修改所有目錄的讀寫權限,在完成部署環境的搭建后,可以執行如下命令真正地部署

            cap deploy
          ==================================================  

           
          【15. 自動運行bundle install】
          ==================================================
          在將源代碼部署到服務器之后,并不會自動地執行bundle install,所以需要讓這一過程
          自動化,在config/deploy.rb文件的頭部添加如下代碼:

          $:.unshift(File.expand_path('./lib', ENV['rvm_path']))
          require 'rvm/capistrano'
          require 'bundler/capistrano'

          第一行代碼將RVM的lib目錄加入到加載路徑中,所以Capistrano知道去哪里找bundle,
          然后分別加入rvm和bundler對capistrano的支持。

          在更新了這個文件后,需要重新執行一次cap deploy,將自動安裝所需的gem
          ==================================================


          【16. 配置生產環境的數據庫】
          ==================================================
          當完成源代碼的部署后,接下來需要同步的就是數據庫的結構。通過下列命令來完成:

            cap deploy:migrations
           
          注意:這個是手動完成的。在此之前必須檢查Gemfile中的DB設置是否匹配,否則會默認
          創建SQLite3數據庫??梢栽贕emfile中(注意:是在Gemfile中,而不是database.yaml)添加

            groupd :production do
              gem 'pg' # 該gem會安裝一個PostgreSQL數據庫的適配器,以連接到PostgreSQL數據庫
            end

          如果這次之前已經部署了代碼,需要用Git重新提交

            git add Gemfile*
            git commit -m "Added pg gem for PostgreSQL on the server"
            git push  
           
          可以在服務器的部署目錄的共享目錄下,創建一個共享的數據庫配置文件,讓多個應用共享。
          首先以vagrant用戶連接登錄到服務器,執行sudo su USER_NAME 切換到App發布用戶,
          執行

            cd /home/PATH_TO_APP/apps/APP_NAME/shared
            mkdir config
            cd config
            nano database.yml # 用vim或者其他編輯器打開編輯該文件
           
          在這個文件中我們指定Production環境下的DB配置

            production:
              adapter: postgresql
              database: DB_NAME
              min_messages: warning

          現在需要讓應用的數據庫配置文件指向這個shared/的文件,修改config/deploy.rb這個文件,
          定義一個新的task,將應用的DB鏈接配置指向這個文件

            task :symlink_database_yml do
              # 刪除原有的數據庫配置文件
              run "rm #{release_path}/config/database.yml"
              # 創建軟鏈接指向新的配置文件
              run "ln -sfn #{shared_path}/config/database.yml  #{release_path}/config/database.yml"
            end
            after "bundle:install", "symlink_database_yml"  # 在bundle install后執行這個task

          在修改了本地的任何代碼,資源,DB后,為了確保本地和服務器的同步,我們簡單地
          運行如下命令:

            cap deploy:migrations
           
          這個命令會將本地代碼的修改同步到服務器端,運行bundle命令,然后運行rake db:migrate
          保證代碼,包依賴,DB結構的同步
          =================================================


          【17. 驗證數據庫配置是否成功】
          =================================================
          在經過一系列的配置后,可以使用如下方法來驗證應用的部署是否成功

          首先以App部署用戶的身份登錄到服務器,進入到App發布的目錄下

            cd /home/ticketeeapp.com/apps/ticketee/current  # App應用的當前運行目錄
            rake db:seed RAILS_ENV=production                      # 導入測試數據到PRD環境
            psql                                                                         # 連接到PostgreSQL數據庫
            psql>SELECT * FROM projects;                                # 執行SQL查詢

          如果我們可以看到關于App應用的信息,那么證明數據庫的部署是正確的。
          =================================================


          【18. 安裝Nginx+Passenger】
          ==================================================
          Nginx和Passenger分別是反向代理服務器和Rails的服務器。其中Passenger提供了一個
          用于和Nginx集成的模塊,可以在安裝該模塊之前先安裝Nginx。

          在Console下執行命令如下:

            # Make sure we have the right ruby selected
            rvm use ree@release
            # Install the passenger gem
            gem install passenger
            # Run the passenger installer
            rvmsudo passenger-install-nginx-module

          在安裝Nginx的passenger模塊的過程中,會出現對話提示,按照提示操作即可完成安裝

          注意:如果安裝的Passenger是3.0以上版本,將不再需要將passenger_ruby的路徑換成
          passenger_ruby了,而是使用:/.rvm/wrappers/ree-1.8.7-2011.03@release/ruby

          接下來讓Nginx在系統啟動時自動啟動Passenger,這是通過一個腳本來做到的:

            sudo bash -c 'curl -L http://bit.ly/nginx-ubuntu-init-file > /etc/init.d/nginx'  
            sudo chmod +x /etc/init.d/nginx
            sudo update-rc.d nginx defaults
            sudo /etc/init.d/nginx start
          ==================================================


          【19. 部署Rails應用】
          ==================================================
          在安裝了Nginx + Passenger之后,部署一個Rails 應用將變得非常容易。只需要在Nginx
          的配置文件:/opt/nginx/conf/nginx.conf中添加這樣一個“server block”

             server {
                listen 80;
                server_name www.yourhost.com;
                root /somewhere/public;   # <--- be sure to point to 'public'!
                passenger_enabled on;
             }

          注意一定要將root指向Rails應用的public目錄。在添加這個配置之后,Passenger將自動
          識別相關的文件,并以此作為配置Gemset的依據
          ==================================================


          【參考資料】
          ==================================================
          Rails 3 in Action》的第14章:Deployment
          RVM installation 官方文檔
          A Guide to a Nginx, Passenger and RVM Server


          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2011-11-21 16:22 Paul Lin 閱讀(1688) 評論(0)  編輯  收藏 所屬分類: RoR
          <2011年11月>
          303112345
          6789101112
          13141516171819
          20212223242526
          27282930123
          45678910

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 晋江市| 南和县| 鹤峰县| 海门市| 双峰县| 和平县| 镇平县| 万年县| 乃东县| 洛宁县| 济南市| 花垣县| 平乐县| 淳安县| 渝中区| 西和县| 尚志市| 太仓市| 都匀市| 张掖市| 无极县| 松溪县| 揭西县| 金乡县| 惠州市| 武穴市| 虹口区| 泉州市| 沙田区| 共和县| 永川市| 沙雅县| 金沙县| 睢宁县| 申扎县| 砀山县| 镇雄县| 维西| 准格尔旗| 织金县| 青川县|