×

Ruby on Rails 是一个用 Ruby 编写的 Web 框架。本指南介绍如何在 OpenShift Container Platform 上使用 Rails 4。

请通读整个教程,以概述在 OpenShift Container Platform 上运行应用程序所需的所有步骤。如果您遇到问题,请尝试通读整个教程,然后返回到您的问题。查看之前的步骤以确保所有步骤都正确执行也很有用。

前提条件

  • 基本的 Ruby 和 Rails 知识。

  • 本地安装的 Ruby 2.0.0+、Rubygems 和 Bundler 版本。

  • 基本的 Git 知识。

  • 正在运行的 OpenShift Container Platform 4 实例。

  • 确保 OpenShift Container Platform 实例正在运行且可用。还要确保您的 `oc` CLI 客户端已安装并且该命令可从您的命令外壳访问,以便您可以使用它通过您的电子邮件地址和密码登录。

设置数据库

Rails 应用程序几乎总是与数据库一起使用。对于本地开发,请使用 PostgreSQL 数据库。

步骤
  1. 安装数据库

    $ sudo yum install -y postgresql postgresql-server postgresql-devel
  2. 初始化数据库

    $ sudo postgresql-setup initdb

    此命令创建存储数据的 `/var/lib/pgsql/data` 目录。

  3. 启动数据库

    $ sudo systemctl start postgresql.service
  4. 数据库运行后,创建您的 `rails` 用户

    $ sudo -u postgres createuser -s rails

    请注意,创建的用户没有密码。

编写您的应用程序

如果您是从头开始创建 Rails 应用程序,则必须首先安装 Rails gem。然后您可以继续编写您的应用程序。

步骤
  1. 安装 Rails gem

    $ gem install rails
    示例输出
    Successfully installed rails-4.3.0
    1 gem installed
  2. 安装 Rails gem 后,使用 PostgreSQL 作为数据库创建一个新应用程序

    $ rails new rails-app --database=postgresql
  3. 更改到您的新应用程序目录

    $ cd rails-app
  4. 如果您已经拥有一个应用程序,请确保 `pg` (postgresql) gem 存在于您的 `Gemfile` 中。如果不存在,请通过添加 gem 来编辑您的 `Gemfile`

    gem 'pg'
  5. 使用所有依赖项生成新的 `Gemfile.lock`。

    $ bundle install
  6. 除了使用带有 `pg` gem 的 `postgresql` 数据库之外,您还必须确保 `config/database.yml` 使用 `postgresql` 适配器。

    确保您更新了 `config/database.yml` 文件中的 `default` 部分,使其如下所示

    default: &default
      adapter: postgresql
      encoding: unicode
      pool: 5
      host: localhost
      username: rails
      password: <password>
  7. 创建应用程序的开发和测试数据库

    $ rake db:create

    这将在您的 PostgreSQL 服务器中创建 `development` 和 `test` 数据库。

创建欢迎页面

由于 Rails 4 不再在生产环境中提供静态 `public/index.html` 页面,因此您必须创建一个新的根页面。

要拥有自定义欢迎页面,必须执行以下步骤

  • 创建一个包含索引操作的控制器。

  • 为欢迎控制器索引操作创建一个视图页面。

  • 创建一个路由,使用已创建的控制器和视图为应用程序的根页面提供服务。

Rails 提供了一个生成器,可以自动完成所有必要的步骤。

步骤
  1. 运行 Rails 生成器

    $ rails generate controller welcome index

    所有必要的文件夹都已创建。

  2. 修改 `config/routes.rb` 文件中第二行的代码如下:

    root 'welcome#index'
  3. 运行 Rails 服务器以验证页面是否可用。

    $ rails server

    您应该能够在浏览器中访问 https://127.0.0.1:3000 查看页面。如果看不到页面,请检查服务器输出的日志进行调试。

为 OpenShift Container Platform 配置应用程序

为了让您的应用程序与 OpenShift Container Platform 中运行的 PostgreSQL 数据库服务进行通信,您必须编辑 `config/database.yml` 文件中的 `default` 部分,以便使用环境变量(您必须在创建数据库服务后定义这些变量)。

步骤
  • 使用预定义变量修改 `config/database.yml` 文件中的 `default` 部分,如下所示:

    示例 `config/database.yml` 文件
    <% user = ENV.key?("POSTGRESQL_ADMIN_PASSWORD") ? "root" : ENV["POSTGRESQL_USER"] %>
    <% password = ENV.key?("POSTGRESQL_ADMIN_PASSWORD") ? ENV["POSTGRESQL_ADMIN_PASSWORD"] : ENV["POSTGRESQL_PASSWORD"] %>
    <% db_service = ENV.fetch("DATABASE_SERVICE_NAME","").upcase %>
    
    default: &default
      adapter: postgresql
      encoding: unicode
      # For details on connection pooling, see rails configuration guide
      # https://guides.rubyonrails.net.cn/configuring.html#database-pooling
      pool: <%= ENV["POSTGRESQL_MAX_CONNECTIONS"] || 5 %>
      username: <%= user %>
      password: <%= password %>
      host: <%= ENV["#{db_service}_SERVICE_HOST"] %>
      port: <%= ENV["#{db_service}_SERVICE_PORT"] %>
      database: <%= ENV["POSTGRESQL_DATABASE"] %>

将您的应用程序存储在 Git 中

在 OpenShift Container Platform 中构建应用程序通常需要将源代码存储在 Git 仓库中,因此如果您尚未安装 `git`,则必须安装它。

先决条件
  • 安装 git。

步骤
  1. 运行 `ls -1` 命令确保您位于 Rails 应用程序目录中。该命令的输出应如下所示:

    $ ls -1
    示例输出
    app
    bin
    config
    config.ru
    db
    Gemfile
    Gemfile.lock
    lib
    log
    public
    Rakefile
    README.rdoc
    test
    tmp
    vendor
  2. 在您的 Rails 应用程序目录中运行以下命令以初始化并将代码提交到 Git:

    $ git init
    $ git add .
    $ git commit -m "initial commit"

    提交应用程序后,您必须将其推送到远程仓库。在 GitHub 帐户中创建一个新的仓库。

  3. 设置指向您的 `git` 仓库的远程地址。

    $ git remote add origin [email protected]:<namespace/repository-name>.git
  4. 将您的应用程序推送到远程 Git 仓库。

    $ git push

将您的应用程序部署到 OpenShift Container Platform

您可以将您的应用程序部署到 OpenShift Container Platform。

创建 `rails-app` 项目后,您将自动切换到新的项目命名空间。

在 OpenShift Container Platform 中部署应用程序涉及三个步骤:

  • 从 OpenShift Container Platform 的 PostgreSQL 镜像创建数据库服务。

  • 从 OpenShift Container Platform 的 Ruby 2.0 构建器镜像和您的 Ruby on Rails 源代码创建前端服务,并将其与数据库服务连接。

  • 为您的应用程序创建路由。

步骤
  • 要部署您的 Ruby on Rails 应用程序,请为该应用程序创建一个新项目。

    $ oc new-project rails-app --description="My Rails application" --display-name="Rails Application"

创建数据库服务

您的 Rails 应用程序需要一个正在运行的数据库服务。对于此服务,请使用 PostgreSQL 数据库镜像。

要创建数据库服务,请使用 `oc new-app` 命令。您必须向此命令传递一些必要的环境变量,这些变量在数据库容器内使用。这些环境变量是设置数据库的用户名、密码和名称所必需的。您可以将这些环境变量的值更改为您想要的任何值。变量如下:

  • POSTGRESQL_DATABASE

  • POSTGRESQL_USER

  • POSTGRESQL_PASSWORD

设置这些变量可确保:

  • 存在一个具有指定名称的数据库。

  • 存在一个具有指定名称的用户。

  • 用户可以使用指定的密码访问指定的数据库。

步骤
  1. 创建数据库服务:

    $ oc new-app postgresql -e POSTGRESQL_DATABASE=db_name -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password

    要同时设置数据库管理员的密码,请在之前的命令后面附加:

    -e POSTGRESQL_ADMIN_PASSWORD=admin_pw
  2. 观察进度

    $ oc get pods --watch

创建前端服务

要将您的应用程序引入 OpenShift Container Platform,您必须指定应用程序所在的仓库。

步骤
  1. 创建前端服务并指定在创建数据库服务时设置的与数据库相关的环境变量:

    $ oc new-app path/to/source/code --name=rails-app -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password -e POSTGRESQL_DATABASE=db_name -e DATABASE_SERVICE_NAME=postgresql

    使用此命令,OpenShift Container Platform 将获取源代码、设置构建器、构建您的应用程序镜像,并将新创建的镜像与指定的环境变量一起部署。应用程序名为 `rails-app`。

  2. 通过查看 `rails-app` 部署配置的 JSON 文档来验证是否已添加环境变量。

    $ oc get dc rails-app -o json

    您应该看到以下部分:

    示例输出
    env": [
        {
            "name": "POSTGRESQL_USER",
            "value": "username"
        },
        {
            "name": "POSTGRESQL_PASSWORD",
            "value": "password"
        },
        {
            "name": "POSTGRESQL_DATABASE",
            "value": "db_name"
        },
        {
            "name": "DATABASE_SERVICE_NAME",
            "value": "postgresql"
        }
    
    ],
  3. 检查构建过程

    $ oc logs -f build/rails-app-1
  4. 构建完成后,查看 OpenShift Container Platform 中正在运行的 Pod。

    $ oc get pods

    您应该看到以 `myapp--` 开头的一行,这就是您在 OpenShift Container Platform 中运行的应用程序。

  5. 在您的应用程序能够正常运行之前,您必须通过运行数据库迁移脚本来初始化数据库。您可以通过两种方式执行此操作:

    • 从正在运行的前端容器手动操作

      • 使用 `rsh` 命令进入前端容器

        $ oc rsh <frontend_pod_id>
      • 在容器内运行迁移:

        $ RAILS_ENV=production bundle exec rake db:migrate

        如果您在 `development` 或 `test` 环境中运行 Rails 应用程序,则不必指定 `RAILS_ENV` 环境变量。

    • 通过在您的模板中添加预部署生命周期钩子。

为您的应用程序创建路由

您可以公开服务以创建应用程序的路由。

步骤
  • 要通过为服务提供外部可访问的主机名(如 `www.example.com`)来公开服务,请使用 OpenShift Container Platform 路由。在您的情况下,您需要通过键入以下命令来公开前端服务:

    $ oc expose service rails-app --hostname=www.example.com

确保您指定的主机名解析为路由器的 IP 地址。