$ sudo yum install -y postgresql postgresql-server postgresql-devel
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 数据库。
安装数据库
$ sudo yum install -y postgresql postgresql-server postgresql-devel
初始化数据库
$ sudo postgresql-setup initdb
此命令创建存储数据的 `/var/lib/pgsql/data` 目录。
启动数据库
$ sudo systemctl start postgresql.service
数据库运行后,创建您的 `rails` 用户
$ sudo -u postgres createuser -s rails
请注意,创建的用户没有密码。
如果您是从头开始创建 Rails 应用程序,则必须首先安装 Rails gem。然后您可以继续编写您的应用程序。
安装 Rails gem
$ gem install rails
Successfully installed rails-4.3.0
1 gem installed
安装 Rails gem 后,使用 PostgreSQL 作为数据库创建一个新应用程序
$ rails new rails-app --database=postgresql
更改到您的新应用程序目录
$ cd rails-app
如果您已经拥有一个应用程序,请确保 `pg` (postgresql) gem 存在于您的 `Gemfile` 中。如果不存在,请通过添加 gem 来编辑您的 `Gemfile`
gem 'pg'
使用所有依赖项生成新的 `Gemfile.lock`。
$ bundle install
除了使用带有 `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>
创建应用程序的开发和测试数据库
$ rake db:create
这将在您的 PostgreSQL 服务器中创建 `development` 和 `test` 数据库。
由于 Rails 4 不再在生产环境中提供静态 `public/index.html` 页面,因此您必须创建一个新的根页面。
要拥有自定义欢迎页面,必须执行以下步骤
创建一个包含索引操作的控制器。
为欢迎控制器索引操作创建一个视图页面。
创建一个路由,使用已创建的控制器和视图为应用程序的根页面提供服务。
Rails 提供了一个生成器,可以自动完成所有必要的步骤。
运行 Rails 生成器
$ rails generate controller welcome index
所有必要的文件夹都已创建。
修改 `config/routes.rb` 文件中第二行的代码如下:
root 'welcome#index'
运行 Rails 服务器以验证页面是否可用。
$ rails server
您应该能够在浏览器中访问 https://127.0.0.1:3000 查看页面。如果看不到页面,请检查服务器输出的日志进行调试。
为了让您的应用程序与 OpenShift Container Platform 中运行的 PostgreSQL 数据库服务进行通信,您必须编辑 `config/database.yml` 文件中的 `default` 部分,以便使用环境变量(您必须在创建数据库服务后定义这些变量)。
使用预定义变量修改 `config/database.yml` 文件中的 `default` 部分,如下所示:
<% 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"] %>
在 OpenShift Container Platform 中构建应用程序通常需要将源代码存储在 Git 仓库中,因此如果您尚未安装 `git`,则必须安装它。
安装 git。
运行 `ls -1` 命令确保您位于 Rails 应用程序目录中。该命令的输出应如下所示:
$ ls -1
app
bin
config
config.ru
db
Gemfile
Gemfile.lock
lib
log
public
Rakefile
README.rdoc
test
tmp
vendor
在您的 Rails 应用程序目录中运行以下命令以初始化并将代码提交到 Git:
$ git init
$ git add .
$ git commit -m "initial commit"
提交应用程序后,您必须将其推送到远程仓库。在 GitHub 帐户中创建一个新的仓库。
设置指向您的 `git` 仓库的远程地址。
$ git remote add origin [email protected]:<namespace/repository-name>.git
将您的应用程序推送到远程 Git 仓库。
$ git push
您可以将您的应用程序部署到 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
设置这些变量可确保:
存在一个具有指定名称的数据库。
存在一个具有指定名称的用户。
用户可以使用指定的密码访问指定的数据库。
创建数据库服务:
$ oc new-app postgresql -e POSTGRESQL_DATABASE=db_name -e POSTGRESQL_USER=username -e POSTGRESQL_PASSWORD=password
要同时设置数据库管理员的密码,请在之前的命令后面附加:
-e POSTGRESQL_ADMIN_PASSWORD=admin_pw
观察进度
$ oc get pods --watch
要将您的应用程序引入 OpenShift Container Platform,您必须指定应用程序所在的仓库。
创建前端服务并指定在创建数据库服务时设置的与数据库相关的环境变量:
$ 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`。
通过查看 `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"
}
],
检查构建过程
$ oc logs -f build/rails-app-1
构建完成后,查看 OpenShift Container Platform 中正在运行的 Pod。
$ oc get pods
您应该看到以 `myapp-
在您的应用程序能够正常运行之前,您必须通过运行数据库迁移脚本来初始化数据库。您可以通过两种方式执行此操作:
从正在运行的前端容器手动操作
使用 `rsh` 命令进入前端容器
$ oc rsh <frontend_pod_id>
在容器内运行迁移:
$ RAILS_ENV=production bundle exec rake db:migrate
如果您在 `development` 或 `test` 环境中运行 Rails 应用程序,则不必指定 `RAILS_ENV` 环境变量。
通过在您的模板中添加预部署生命周期钩子。