部署Ruby on Rails - Heroku有一个很好的替代方案吗?

时间:2013-07-18 15:30:49

标签: ruby-on-rails deployment heroku openshift

如果您愿意,我正在开始一个新的小型企业,POC,我想在某个地方免费部署我的Rails应用程序。 我发现有Heroku,还有其他选择吗?

1 个答案:

答案 0 :(得分:66)

是的,有

这是我在这个主题上发现的非常好的帖子

http://blog.sudobits.com/2013/02/15/heroku-alternatives-for-deploying-rails-applications

我一个接一个地查看了选项,据我所知,OpenShift是中小型网站的最佳选择,至少在开发和创建POC \ Prototype的初期

为什么会更好?

  • 它为你提供了Heroku将给你的东西
  • 它为您提供本地(持久)存储 - 因此您不需要在亚马逊上支付S3或等价 - 我想在某些时候您想要这样做(使用S3),但至少开始时你不需要把钱放在上面
  • 网站似乎运行得更快
  • 我发现在控制机器上发生的事情方面更灵活

有任何缺点吗?

  • 我在Openshift上可以找到的唯一缺点是,似乎部署在Heroku上花费的时间要多得多,并且在你第一次访问网站时会有相当大的延迟(但是在第一次工作更快之后 - 不相关如果您认为这是问题,请进行浏览器缓存)

可能是本文档https://www.openshift.com/blogs/converting-an-existing-rails-app-to-run-on-openshift下的Gemfile部分可以解决此问题...我稍后会尝试

在Openshift上部署已有的应用程序需要执行哪些步骤?

在很多地方,我找到了有关如何创建和部署新应用程序的解释,但有点难以理解如何将我已有的应用程序放在OpenShift上

这就是我想解释的原因

假设 - 您的应用程序已经被git控制 - 它的路径是/ home / dev / MyApp - 你现在在/ home / dev

  1. https://www.openshift.com
  2. 上创建Openshift帐户
  3. 使用命令行工具,我发现它们提供了更多信息
  4. 转到https://www.openshift.com/get-started
  5. 按照步骤1..3安装和设置命令行工具
  6. cd到你的rails应用程序文件夹/ home / dev / MyApp
  7. 创建新的应用程序域 - 运行:rhc domain-create <domain name>
  8. 运行

    在OpenShift中创建应用程序

    rhc app-create -a MyApp -t ruby-1.9 --no-git

    -a在OpenShift下设置应用程序名称 - 它可能与rails应用程序名称完全不同

    -t设置应用程序类型 - 我认为目前ruby 1.9是他们支持的最高版本

    - no-git告诉不要创建git - 因为我们已经有了一个

  9. 设置数据库

    • 通过调用

      为OpenShift应用程序安装相应的数据库盒

      rhc cartridge add <DB cartridge type> -a <Application Name>

      例如:

      rhc cartridge add mysql-5.1 -a MyApp

      它还支持MongoDB和PostgreSQL

      (见https://www.openshift.com/developers/technologies

    • 更改您的database.yml以与OpenShift数据库相关 - 现在,这很容易,因为OpenShift将其大量配置作为环境变量,您可以在任何需要的地方使用它 - 例如:

    production:
      adapter: mysql
      encoding: utf8
      database: <%=ENV['OPENSHIFT_APP_NAME']%>
      pool: 5
      host: <%=ENV['OPENSHIFT_MYSQL_DB_HOST']%>
      port: <%=ENV['OPENSHIFT_MYSQL_DB_PORT']%>
      username: <%=ENV['OPENSHIFT_MYSQL_DB_USERNAME']%>
      password: <%=ENV['OPENSHIFT_MYSQL_DB_PASSWORD']%>
      socket: <%=ENV['OPENSHIFT_MYSQL_DB_SOCKET']%>
    
  10. 确保一切正常运作

    • 运行:&#39;捆绑安装&#39;
    • 运行:&#39; rails s&#39; - 看到一切正常
  11. Git - 将OpenShift存储库添加为远程存储库之一并将其推送

    • 确保您的所有工作都与GitHub一起更新,提交和同步 - 这可以节省很多麻烦
    • 运行:rhc app-show <application name> - 这将显示有关您的应用程序的所有信息 - 复制Git URL
    • 运行:git remote add openshift <OpenShift repo URL>
    • 通过合并

      获取OpenShift添加的内容

      运行:git merge openshift/master -s recursive -X ours

    • 提交更改:git commit -am 'adding OpenShift files

    • 推送到OpenShift:git push openshift
  12. 就是这样,现在你的应用程序应该部署在OpenShift

    如何打开已部署的网站?

    使用rhc app-show <application name>命令,您可以看到您的网站网址

    通常为http://<application name>-<domain name>.rhcloud.com

    将其更改为您自己的域很容易

    • 只需运行rhc alias add <app name> <your domain>
    • 然后在您的DNS管理中 - 编辑CNAME&#39; www&#39;定义指向 http://<application name>-<domain name>.rhcloud.com

    如何连接到我的OpenShift机器?

    再次,使用rhc app-show <application name>您可以看到SSH地址 只需运行ssh <SSH address>即可连接

    如何在部署时自动运行迁移和种子?

    OpenShift的一个好处是能够添加在部署的不同阶段触发的自定义操作(动作挂钩)

    您可以在此处详细了解https://www.openshift.com/developers/deploying-and-building-applications

    目前,我只会谈谈deploy action-hook

    1. 在您的应用程序文件夹下,转到.openshift / action_hooks并在其下创建一个名为deploy的文件
    2. 使此文件可执行 - 运行:chmod +x deploy
    3. 将一些代码加入其中

      例如:

        

      #!/斌/庆典

           

      echo&#34;开始部署&#34;

           

      pushd $ {OPENSHIFT_REPO_DIR}&gt;的/ dev / null的

           

      回显&#34;将目录更改为$ {OPENSHIFT_REPO_DIR} public&#34;

           

      cd $ {OPENSHIFT_REPO_DIR}

           

      cd public

           

      回显&#34;创建指向上传的$ {OPENSHIFT_DATA_DIR}上传软链接&#34;

           

      ln -s $ {OPENSHIFT_DATA_DIR}上传内容

           

      echo&#34;运行bundle exec rake db:migrate RAILS_ENV = production&#34;

           

      bundle exec rake db:migrate RAILS_ENV =&#34; production&#34;

           

      echo&#34;运行bundle exec rake db:seed RAILS_ENV = production&#34;

           

      捆绑exec rake db:种子RAILS_ENV =&#34;生产&#34;

           

      popd&gt;的/ dev / null的

      • 软链接将在后面解释 - 路由需要找到Carrierwave上传的文件
    4. 将文件添加到您的git - git add deploy(当然来自文件夹内)
    5. 提交您的更改并推送到openshift远程
    6. 如何整合Carrierwave以便我可以上传文件并保存在OpenShift上?

      有两点

      1. 文件将保存在哪里? - 这很容易
      2. 路由会知道如何获取我上传的文件吗?
      3. 设置保存路径:

        将initializers \ carrierwave.rb文件设置为

        CarrierWave.configure do |config|
          if Rails.env.production?
            config.storage = :file
            config.enable_processing = true
            config.root = ENV['OPENSHIFT_DATA_DIR']
            config.cache_dir = config.root + 'uploads'
          end    
        end
        

        默认情况下保留上传者的意思,即storage :file

          

        def store_dir

             

        &#34;上载/#{model.class.to_s.underscore} /#{mounted_as} / {#} model.id&#34;

             

        使用$ OPENSHIFT_DATA_DIR文件夹将确保我们能够编写文件并保留文件

        确保路由找到文件:

        我花了一段时间来提出这个伎俩(不是太多,只是几个小时)

        Rails路由知道如何仅关联应用程序文件夹下的文件夹 - soo,在OpenShift机器上,它将查找$ {OPENSHIFT_REPO_DIR下的上传文件文件夹(在我们的例子中名为uploads) } \ public文件夹,这是我在部署文件中放置的软链接变得方便的地方 - 它只是欺骗系统并让它去从一个不在其下的文件夹中获取这些文件申请文件夹


        我知道有很多关于这些问题和如何部署以及所有内容的帖子,但我只想在其中加入一些订单。

        当然,在我写的内容中可能存在错误和不准确之处,因为我没有记录每一步,但仅仅记录了我记得的内容,如果我在某些细节上错了,请随时纠正我。

        最好的来源之一是OpenShift文档

        我希望这些东西可以帮助别人,节省你的时间和金钱

        享受