部署 Ruby on Rails - Heroku 有没有好的替代方案? [关闭]

Posted

技术标签:

【中文标题】部署 Ruby on Rails - Heroku 有没有好的替代方案? [关闭]【英文标题】:Deploying Ruby on Rails - Is there a good alternative for Heroku? [closed] 【发布时间】:2013-07-17 15:48:47 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这是我在这个主题上找到的一篇非常好的帖子

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

我一一浏览了那里的选项,以我的拙见,OpenShift 是中小型网站的最佳选择,至少在开始开发和创建 POC\Prototype 时是这样

为什么更好?

它为您提供 Heroku 将为您提供的功能 它为您提供本地(持久)存储 - 因此您无需在 Amazon 上为 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 下

    在https://www.openshift.com 上创建 Openshift 帐户 使用命令行工具,我发现它们的信息量更大 转到https://www.openshift.com/get-started 按照步骤 1..3 安装和设置命令行工具 cd 到您的 Rails 应用程序文件夹 /home/dev/MyApp 创建一个新的应用程序域 - 运行:rhc domain-create <domain name>

    通过运行在 OpenShift 中创建您的应用程序

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

    -a 设置 OpenShift 下的应用程序名称 - 它可以与您的 Rails 应用程序名称完全不同

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

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

    设置你的数据库

    通过调用为您的 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']%>
    

    确保一切都在本地运行

    运行:“捆绑安装” 运行:'rails s' - 看看一切正常

    Git - 将 OpenShift 存储库添加为您的远程存储库之一并推送它

    确保您的所有工作都已更新、提交并与您的 GitHub 同步 - 这可以在以后省去很多麻烦 运行:rhc app-show &lt;application name&gt; - 这将显示有关您的应用程序的所有信息 - 复制 Git URL 运行:git remote add openshift &lt;OpenShift repo URL&gt;

    通过合并获取任何 OpenShift 添加的内容

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

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

    推送到 OpenShift:git push openshift

就是这样,现在您的应用程序应该部署在 OpenShift 上

如何打开我部署的网站?

使用rhc app-show &lt;application name&gt; 命令您可以看到您的网站网址

通常是http://&lt;application name&gt;-&lt;domain name&gt;.rhcloud.com

改成自己的域名很容易

运行rhc alias add &lt;app name&gt; &lt;your domain&gt; 然后在您的 DNS 管理中 - 编辑 CNAME 'www' 定义以指向 http://&lt;application name&gt;-&lt;domain name&gt;.rhcloud.com

如何连接到我的 OpenShift 机器?

同样,使用rhc app-show &lt;application name&gt;可以看到SSH地址 只需运行ssh &lt;SSH address&gt; 即可连接

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

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

您可以在此处阅读更多信息https://www.openshift.com/developers/deploying-and-building-applications

现在,我只谈部署动作钩子

    在您的应用程序文件夹下,转到 .openshift/action_hooks 并在其下创建一个名为 deploy 的文件 使该文件可执行 - 运行:chmod +x deploy

    把一些代码放进去

    例如:

    #!/bin/bash

    echo "开始部署"

    推送 $OPENSHIFT_REPO_DIR > /dev/null

    echo "将目录更改为 $OPENSHIFT_REPO_DIRpublic"

    cd $OPENSHIFT_REPO_DIR

    cd 公开

    echo "创建指向 $OPENSHIFT_DATA_DIR 上传命名上传的软链接"

    ln -s $OPENSHIFT_DATA_DIR上传上传

    echo "正在运行 bundle exec rake db:migrate RAILS_ENV=production"

    bundle exec rake db:migrate RAILS_ENV="production"

    echo "正在运行 bundle exec rake db:seed RAILS_ENV=production"

    bundle exec rake db:seed RAILS_ENV="production"

    popd > /dev/null

    软链接后面会解释——路由需要找到Carrierwave上传的文件 将文件添加到您的 git - git add deploy(当然是在文件夹中) 提交您的更改并推送到 openshift 远程

如何集成 Carrierwave,以便上传文件并保存在 OpenShift 上?

有两点

    文件将保存在哪里? - 这很简单 路由是否知道如何获取我上传的文件?

设置保存路径:

设置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

定义存储目录

“上传/#model.class.to_s.underscore/#mounted_as/#model.id”

结束

$OPENSHIFT_DATA_DIR 文件夹的使用将确保我们能够写入文件并且它会保留在那里

确保路由会找到文件:

我花了一段时间才想出这个技巧(不是太多,只是几个小时)

Rails 路由只知道如何关联应用程序文件夹下的文件夹 - 所以,在 OpenShift 机器上,它会在 $OPENSHIFT_REPO_DIR\ public 文件夹,这是我放在 deploy 文件中的软链接变得方便的地方 - 它只是欺骗系统并使其从不在应用程序文件夹下的文件夹中获取这些文件


我知道有很多关于这些问题以及如何部署和所有内容的帖子,但我只是想整理一下。

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

最好的来源之一是 OpenShift 文档

我希望这些东西可以帮助人们并节省您的时间和金钱

享受

【讨论】:

以上是关于部署 Ruby on Rails - Heroku 有没有好的替代方案? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

在 Ruby on Rails 中使用 Heroku

Magnific Popup Lightbox 在 Ruby on Rails 开发中有效,但在部署到 Heroku 时无效

Ruby on Rails - Heroku上的Carrierwave错误

Ruby on Rails 中的 Sendgrid / 电子邮件发送问题(托管在 Heroku 上)

Ruby on rails在主机上传[关闭]

推送到Heroku时Ruby on Rails错误