如何在Ubuntu 18.04上使用PostgreSQL和Ruby on Rails应用程序

PostgreSQL数据库是Ruby on Rails应用程序的一个强大而灵活的选择。在本教程中,您将在Ubuntu 18.04服务器上设置连接到PostgreSQL数据库的Ruby on Rails开发环境。您将安装和配置PostgreSQL,然后通过创建使用PostgreSQL作为其数据库服务器的Rails应用程序来测试您的设置。

介绍

使用Ruby on Rails Web框架时,默认情况下会将应用程序设置为使用SQLite作为数据库。 SQLite是一个轻量级,可移植且用户友好的关系数据库,在低内存环境中表现尤为出色,并且在许多情况下都能正常运行。 但是,对于需要更可靠的数据完整性和编程可扩展性的高度复杂的应用程序, PostgreSQL数据库将是一个更强大和灵活的选择。 为了将Ruby on Rails设置配置为使用PostgreSQL,您需要执行一些额外的步骤来启动并运行它。

在本教程中,您将在Ubuntu 18.04服务器上设置连接到PostgreSQL数据库的Ruby on Rails开发环境。 您将安装和配置PostgreSQL,然后通过创建使用PostgreSQL作为其数据库服务器的Rails应用程序来测试您的设置。

先决条件

本教程需要以下内容:

第1步 - 安装PostgreSQL

为了配置Ruby on Rails以使用PostgreSQL作为数据库创建Web应用程序,您将首先将数据库安装到您的服务器上。

使用sudo权限,更新您的APT包索引以确保您的存储库是最新的:

sudo apt update

接下来,安装PostgreSQL及其开发库:

sudo apt install postgresql postgresql-contrib libpq-dev

在上一个命令中, postgresql包保存了主PostgreSQL程序,而postgresql-contrib添加了几个扩展其功能的PostgreSQL功能。 libpq-dev是一个PostgreSQL库,允许客户端发送查询并从后端服务器接收响应,这将允许您的应用程序与其数据库进行通信。

一旦安装了PostgreSQL及其依赖项,下一步就是创建一个Rails应用程序稍后将用于创建数据库的角色。

第2步 - 创建新的数据库角色

在PostgreSQL中, 角色的使用方式与Linux中的用户相同,可以组织权限和授权。 此步骤将向您展示如何为Linux用户名创建新的超级用户角色,以允许您在PostgreSQL系统中操作以创建和配置数据库。

要创建PostgreSQL超级用户角色,请使用以下命令,用您的Ubuntu 18.04用户名替换突出显示的单词:

sudo -u postgres createuser -s sammy -P

由于您指定了-P标志,系统将提示您输入新角色的密码。 输入所需的密码,确保将其记录下来,以便在将来的步骤中将其用于配置文件中。

在此命令中,您使用createuser创建名为sammy的角色。 -s为该用户提供了超级用户权限, sudo -u允许您从安装PostgreSQL时自动创建的postgres帐户运行该命令。

注意:由于Ubuntu 18.04上PostgreSQL的身份验证模式以ident开头,因此默认情况下,Ubuntu用户只能在具有相同名称角色的PostgreSQL中运行。 有关更多信息,请查看有关身份验证PostgreSQL官方文档

如果您未使用-P标志并希望在创建角色后为其设置密码,请使用以下命令进入PostgreSQL控制台:

sudo -u postgres psql

您将收到以下输出,以及PostgreSQL控制台的提示:

psql (10.9 (Ubuntu 10.9-0ubuntu0.18.04.1))
Type "help" for help.

postgres=#

postgres=# prompt表示PostgreSQL控制台。 在PostgreSQL提示符下,输入此命令以设置新数据库角色的密码,将突出显示的名称替换为您创建的名称:

\password sammy

PostgreSQL会提示您输入密码。 在提示符下输入所需的密码,然后确认。

现在,输入以下命令退出PostgreSQL控制台:

\q

您现在的提示将重新出现。

在此步骤中,您创建了具有超级用户权限的新PostgreSQL角色。 现在,您已准备好创建一个使用此角色创建数据库的新Rails应用程序。

第3步 - 创建新的Rails应用程序

通过为PostgreSQL配置角色,您现在可以创建一个新的Rails应用程序,该应用程序设置为将PostgreSQL用作数据库。

首先,导航到您的主目录:

cd ~

在此目录中创建一个新的Rails应用程序,将appname替换为您想要调用应用程序的任何内容:

rails new appname -d=postgresql

-d=postgresql选项将PostgreSQL设置为数据库。

运行此命令后,主目录中将出现一个名为appname的新文件夹,其中包含基本Rails应用程序的所有元素。

接下来,进入应用程序的目录:

cd appname

现在您已经创建了一个新的Rails应用程序并且已经移动到项目的根目录中,您可以在Rails应用程序中配置和创建PostgreSQL数据库。

第4步 - 配置和创建数据库

在为应用程序创建developmenttest数据库时,Rails将使用您为Ubuntu用户名创建的PostgreSQL角色。 要确保Rails创建这些数据库,您将更改项目的数据库配置文件。 然后,您将创建数据库。

在Rails应用程序中进行的配置更改之一是添加您在上一步中创建的PostgreSQL角色的密码。 要保持密码等敏感信息的安全,最好将其存储在环境变量中,而不是直接将其写入配置文件中。

要在登录时将密码存储在环境变量中,请运行以下命令,将APPNAME替换为应用程序名称,将PostgreSQL_Role_Password替换为您在上一步中创建的密码:

echo 'export APPNAME_DATABASE_PASSWORD="PostgreSQL_Role_Password"' >> ~/.bashrc

此命令将export命令写入~/.bashrc文件,以便在登录时设置环境变量。

要导出当前会话的变量,请使用source命令:

source ~/.bashrc

现在您已将密码存储在您的环境中,现在可以更改配置文件了。

在首选文本编辑器中打开应用程序的数据库配置文件。 本教程将使用nano

nano config/database.yml

default部分下,找到pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>的行pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>并添加以下突出显示的行,填写您创建的凭据和环境变量。 它应该看起来像这样:

配置/ database.yml的
...
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: sammy
  password: <%= ENV['APPNAME_DATABASE_PASSWORD'] %>

development:
  <<: *default
  database: appname_development
...

这将使Rails应用程序使用正确的角色和密码运行数据库。 CTRL + xY ,然后按ENTER保存并退出。

有关在Rails中配置数据库的更多信息,请参阅Rails文档

现在您已对config/database.yml进行了更改,请使用rails命令创建应用程序的数据库:

rails db:create

一旦Rails创建数据库,您将收到以下输出:

Created database 'appname_development'
Created database 'appname_test'

如输出所示,此命令在PostgreSQL服务器中创建了一个developmenttest数据库。

您现在有一个PostgreSQL数据库连接到您的Rails应用程序。 为确保您的应用程序正常运行,下一步是测试您的配置。

第5步 - 测试您的配置

要测试您的应用程序是否能够使用PostgreSQL数据库,请尝试运行您的Web应用程序,以便它将显示在浏览器中。

使用rails server命令,在Rails应用程序Puma中的内置Web服务器上运行Web应用程序:

rails server --binding=127.0.0.1

--binding将您的应用程序绑定到指定的IP。 默认情况下,此标志将Rails绑定到0.0.0.0 ,但由于这意味着Rails将监听所有接口,因此使用127.0.0.1指定localhost更安全。 默认情况下,应用程序监听端口3000

一旦您的Rails应用程序运行,您的命令提示符将消失,由此输出替换:

=> Booting Puma
=> Rails 5.2.3 application starting in development
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.1 (ruby 2.6.3-p62), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:3000
Use Ctrl-C to stop

要测试您的应用程序是否正在运行,请在服务器上打开一个新的终端窗口,并使用curl命令向127.0.0.1:3000发送请求:

curl http://127.0.0.1:3000

您将收到大量HTML输出,结尾如下:

...
        <strong>Rails version:</strong> 5.2.3<br />
        <strong>Ruby version:</strong> 2.6.3 (x86_64-linux)
      </p>
    </section>
  </div>
</body>
</html>

如果您的Rails应用程序位于远程服务器上,并且您希望通过Web浏览器访问它,则可以轻松地将其绑定到服务器的公共IP地址。 首先,在防火墙中打开端口3000

sudo ufw allow 3000

接下来,查找服务器的公共IP地址。 您可以通过运行以下curl命令来执行此操作:

curl http://icanhazip.com

这将返回您的公共IP地址。 将它与rails server命令一起使用,用服务器的公共IP替换server_public_IP

rails server --binding=server_public_IP

现在,您可以通过以下方式访问端口3000上的服务器公共IP地址,在本地Web浏览器中访问您的Rails应用程序:

http://server_public_IP:3000

在此URL,您将找到Ruby on Rails欢迎页面:

Ruby on Rails欢迎页面

这意味着您的应用程序已正确配置并连接到PostgreSQL数据库。

测试配置后,如果要关闭端口3000 ,请使用以下命令。

sudo ufw delete allow 3000

结论

在本教程中,您创建了一个Ruby on Rails Web应用程序,该应用程序配置为将PostgreSQL用作Ubuntu 18.04服务器上的数据库。 如果您想了解有关Ruby编程语言的更多信息,请查看Ruby系列中的How To Code

有关为应用程序选择数据库的更多信息,请查看有关SQLite,PostgreSQL和MySQL之间差异和用例的教程。 如果您想了解有关如何使用数据库的更多信息,请参阅PostgreSQL中的查询简介文章,或者探索DigitalOcean的托管数据库产品