0

我正在尝试在我的服务器上进行多阶段部署,但无法运行暂存和生产配置。

服务器:Ubuntu 11.10 (GNU/Linux 3.0.0-19-server x86_64)

这是我到目前为止所做的:

  1. 我在本地机器上创建了一个名为 form_tester 的新项目。我在本地使用带有 sqlite3 的简单数据库。我希望在登台和生产上都使用 mysql2。

  2. 在服务器上为登台和生产设置目录。

    /home/username/form_tester/staging
    /home/username/form_tester/production
    
  3. 在服务器上制作了两个数据库,用于暂存和生产。我还将它们配置为由具有正确权限的用户访问,因为我能够在其中生成表。

    ftstaging
    ftproduction
    
  4. 为暂存和生产配置了 config/database.yml 文件。

    staging: 
      adapter: mysql2 
      encoding: utf8 
      reconnect: false
      database: ftstaging
      pool: 5 
      username: dbuser 
      password: pass 
      host: server.com
    
    production: 
      adapter: mysql2 
      encoding: utf8 
      reconnect: false
      database: ftproduction
      pool: 5 
      username: dbusr 
      password: pass 
      host: server.com
    
  5. 为暂存和生产配置了 Gemfile。

    来源“https://rubygems.org”

    gem 'rails', '3.2.8'
    gem 'jquery-rails'
    gem 'capistrano'
    
    group :development do
      gem 'sqlite3'
    end
    
    group :staging do
      gem 'activerecord-mysql2-adapter'
      gem 'mysql2'
    end
    
    group :production do
      gem 'activerecord-mysql2-adapter'
      gem 'mysql2'
    end
    
    # Gems used only for assets and not required
    # in production environments by default.
    group :assets do
      gem 'sass-rails',   '~> 3.2.3'
      gem 'coffee-rails', '~> 3.2.1'
      gem 'uglifier', '>= 1.0.3'
    end
    
  6. Ran Capify 以获取部署文件。从 deploy.rb 文件中删除所有内容。单独留下Capfile。

  7. 创建部署目录并制作两个文件。

    config/deploy/production.rb
    config/deploy/staging.rb
    
  8. 为配置添加了以下详细信息:

对于 config/deploy/production.rb:

    server "server.com", :app, :web, :db, :primary => true
    set :deploy_to, "/home/username/form_tester/production"
    set :rails_env, "production"

对于 config/deploy/staging.rb:

    server "server.com", :app, :web, :db, :primary => true
    set :deploy_to, "/home/username/form_tester/staging"
    set :rails_env, "staging"

对于 config/deploy.rb:

    set :stages, ['production', 'staging']
    set :default_stage, 'staging'
    require 'capistrano/ext/multistage'

    # Set application name
    set :application, 'form_tester'
    set :domain, 'server.com'
    set :user, 'username'

    # Use Git source control
    set :scm, :git
    set :repository, "ssh://#{user}@#{domain}/home/#{user}/git/#{application}.git"
    set :branch, 'master'
    set :deploy_via, :remote_cache
    set :scm_verbose, true

    default_run_options[:pty] = true
    set :use_sudo, false

    namespace :deploy do
      task :start do ; end
      task :stop do ; end

      desc "Restart application"
      task :restart, :roles => :app, :except => { :no_release => true } do
        run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
      end
    end

9.使用 git --bare init 在服务器上初始化 git repo 并确保我可以正确访问当前用户名的目录。

10.在开发机器上初始化git repo并将文件推送到
ssh://username@server.com/home/username/git/form_tester.git的服务器repo。

11.开始从本地机器部署到服务器上登台。我运行以下所有命令没有错误。

在 /home/username/form_tester/staging 下构建目录树

    $ cap deploy:setup
    $ cap deploy:check
    $ cap deploy:update

    *ssh'ed into my server*

    $ rake schema:db:load
    $ rake db:seed
    $ rails console
    > app.get('/')
    I get a '200' returned
    > exit

仍然 ssh 进入我的服务器

12.我创建了一个从 /var/www/staging 到我的应用程序公共目录的符号链接

    /home/username/form_tester/staging/current/public.

    $ sudo ln -s /home/username/form_tester/staging/current/public /var/www/staging

13.修改 /etc/apache2/sites-available/default 文件为登台应用程序添加子URI。

    $ sudo vi /etc/apache2/sites-available/default

    …
            RailsBaseURI /staging
            <Directory /var/www/staging>
                    Options -MultiViews
            </Directory>
    …

14.此时(本地)我运行 cap deploy:restart 并且似乎重新启动服务器,因为没有错误。(登录到服务器)我也尝试了 sudo service apache2 restart,这也很好地重新启动了服务器。

15.此时我拉起 url server.com/staging 但看不到我的应用程序。

其他文件:

配置/应用程序.rb:

    require File.expand_path('../boot', __FILE__)

    require 'rails/all'

    if defined?(Bundler)
      Bundler.require(*Rails.groups(:assets => %w(development test)))
    end

    module FormTester
      class Application < Rails::Application
        config.encoding = "utf-8"
        config.filter_parameters += [:password]
        config.active_support.escape_html_entities_in_json = true   
        config.active_record.whitelist_attributes = true
        config.assets.enabled = true
        config.assets.version = '1.0'
      end
    end

config/environments/staging.rb 和 production.rb

    FormTester::Application.configure do
      config.cache_classes = true
      config.consider_all_requests_local       = false
      config.action_controller.perform_caching = true
      config.serve_static_assets = false
      config.assets.compress = true
      config.assets.compile = false
      config.assets.digest = true
      config.i18n.fallbacks = true
      config.active_support.deprecation = :notify
    end

/var/log/apache2/error.log

除了 phusion 乘客,这里似乎没有任何与 ruby​​ 相关的东西出现,但这不是错误。

    [Thu Nov 01 01:16:11 2012] [notice] caught SIGTERM, shutting down
    PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/gd.so' - /usr/lib/php5/20090626/gd.so: cannot open shared object file: No such file or directory in Unknown on line 0
    PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php5/20090626/mcrypt.so' - /usr/lib/php5/20090626/mcrypt.so: cannot open shared object file: No such file or directory in Unknown on line 0
    [Thu Nov 01 01:16:12 2012] [notice] Apache/2.2.20 (Ubuntu) DAV/2 SVN/1.6.12 PHP/5.3.6-13ubuntu3.7 with Suhosin-Patch Phusion_Passenger/3.0.17 configured -- resuming normal operations
    [Thu Nov 01 01:16:20 2012] [error] [client 68.6.38.254] File does not exist: /var/www/favicon.ico
    [Thu Nov 01 01:16:22 2012] [error] [client 68.6.38.254] File does not exist: /var/www/favicon.ico
    [Thu Nov 01 01:23:07 2012] [error] [client 68.6.38.254] File does not exist: /var/www/favicon.ico

观察:

  1. 运行 rake schema:db:load 似乎可以为我的数据库正确构建表,但实际上是为 development.sqlite3 文件构建它们。

  2. 如果我打开 rails 控制台并运行 Rails.env,我会得到“staging”作为环境。

  3. 这很可能与#1 相关,rake db:seed 似乎没有填充我在服务器上的 mysql 中名为“ftstaging”的数据库,即使它执行。

  4. cap deploy 似乎与 cap deploy:update 没有什么不同。

  5. 最终结果是 server.com/staging 上的一个页面显示“我们很抱歉,但出了点问题”。

  6. 我的似乎没有显示任何内容

  7. 运行 rake about 表明我仍处于开发模式。

    About your application's environment
    Ruby version              1.9.3 (x86_64-linux)
    RubyGems version          1.8.24
    Rack version              1.4
    Rails version             3.2.8
    JavaScript Runtime        Node.js (V8)
    Active Record version     3.2.8
    Action Pack version       3.2.8
    Active Resource version   3.2.8
    Action Mailer version     3.2.8
    Active Support version    3.2.8
    Middleware                ActionDispatch::Static, Rack::Lock, #<ActiveSupport::Cache::Strategy::LocalCache::Middleware:0x00000002796948>, Rack::Runtime, Rack::MethodOverride, ActionDispatch::RequestId, Rails::Rack::Logger, ActionDispatch::ShowExceptions, ActionDispatch::DebugExceptions, ActionDispatch::RemoteIp, ActionDispatch::Reloader, ActionDispatch::Callbacks, ActiveRecord::ConnectionAdapters::ConnectionManagement, ActiveRecord::QueryCache, ActionDispatch::Cookies, ActionDispatch::Session::CookieStore, ActionDispatch::Flash, ActionDispatch::ParamsParser, ActionDispatch::Head, Rack::ConditionalGet, Rack::ETag, ActionDispatch::BestStandardsSupport
    Application root          /home/username/form_tester/staging/releases/20121101080752
    Environment               development
    Database adapter          sqlite3
    Database schema version   20121030011807
    

我尝试了以下教程,但运气不佳:

问题:

我确定有人了解进出部署过程,我错过了什么?我应该检查什么?从我在这里展示的内容来看,我可以做些什么不同的事情?

在这一点上,非常感谢任何帮助。我已经与这个问题斗争了两天,不知道我做错了什么,也不知道还有什么可以尝试的。我大约 3 周前才开始使用 Rails,我最沮丧的原因是无法找到对部署过程的清晰描述。我希望澄清这个问题,作为回报,帮助其他人轻松地从想法到多阶段部署。

另一方面,为什么有人会“否决”这篇文章?我在问一个合法的问题,并提供信息来支持它。如果这不是一个好问题,请告诉我为什么。谢谢


11/1/12 - 更新:

我想出了如何让我的应用程序进入“暂存”环境,但它仍然无法在 server.com/staging 加载。

我在 config/application.rb 文件中添加了“Rails.env = ActiveSupport::StringInquirer.new('staging')”,但我不知道为什么这会强制环境。这是正确的方法吗?

然后我部署,ssh'ed 到我的服务器作为用户名,并运行 rake db:migrate 和 rake db:seed。我现在看到我的数据库已填充。

还有什么可能发生的?我的环境/staging.rb 文件有问题吗?


/etc/apache2/httpd.conf

ServerName server.com

LoadModule passenger_module /usr/local/rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.17/ext/apache2/mod_passenger.so
PassengerRoot /usr/local/rvm/gems/ruby-1.9.3-p194/gems/passenger-3.0.17
PassengerRuby /usr/local/rvm/wrappers/ruby-1.9.3-p194/ruby
4

1 回答 1

0

我终于发现了主要问题:资产管道

第一个问题:我没有取消注释 Capfile 中的以下行

load 'deploy/assets'

第二个问题:我从未编译过资产(在开发机器或服务器端。哎呀!)

$ bundle exec rake assets:precompile

参考

任何可能知道的人的后续问题: 我注意到当我编译资产时,它说 RAILS_ENV=production 而不是 staging。在制作 staging.rb 文件时,我基本上复制了 production.rb 文件。我不确定这是否与生产有关。

这是预期的吗?

/usr/local/rvm/rubies/ruby-1.9.3-p194/bin/ruby /usr/local/rvm/gems/ruby-1.9.3-p194@global/bin/rake assets:precompile:all RAILS_ENV=production RAILS_GROUPS=assets
于 2012-11-03T02:47:50.757 回答