介紹
在使用Ruby on Rails網頁框架時,您的應用程序將默認使用SQLite作為數據庫。SQLite是一個輕量級、便攜且用戶友好的關係型數據庫,在低內存環境中表現尤其出色,因此在許多情況下都能很好地運行。但是,對於需要更可靠的數據完整性和程序擴展性的高度復雜的應用程序,使用PostgreSQL數據庫將是一個更健壯和靈活的選擇。您需要進行額外的步驟來配置您的Ruby on Rails設置以使用PostgreSQL。
在本教程中,您將設置一個連接到Ubuntu 20.04服務器上的PostgreSQL數據庫的Ruby on Rails開發環境。您將安裝並配置PostgreSQL,然後通過創建一個使用PostgreSQL作為其數據庫服務器的Rails應用程序來測試您的設置。
先決條件
本教程需要以下條件:
-
通過遵循Ubuntu 20.04的Ubuntu 20.04初始服務器設置指南設置的Ubuntu 20.04服務器,包括一個具有sudo權限的非root用戶和一個防火墻。
-
在您的 Ubuntu 20.04 伺服器上安裝了一個 Ruby on Rails 開發環境。要設置這個,請參照 在 Ubuntu 20.04 上使用 rbenv 安裝 Ruby on Rails。本教程將使用 Ruby 的版本 3.1.2 和 Rails 的版本 7.0.4;有關最新版本的信息,請查看 Ruby 和 Rails 的官方網站。
步驟 1 – 安裝 PostgreSQL
要將 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 20.04用户名:
- sudo -u postgres createuser -s sammy -P
由于您指定了-P
标志,您将被提示输入新角色的密码。输入所需的密码,并确保记录下来,以便在稍后的步骤中将其用于配置文件。
您可以使用createuser
命令來創建一個名為sammy
(或您首選的用戶名)的角色。使用-s
標誌將賦予該用戶超級用戶權限,sudo -u
允許您從在安裝PostgreSQL時自動創建的postgres
帳戶運行命令。
注意:由於Ubuntu上的PostgreSQL的身份驗證模式初始為ident
,因此默認情況下Ubuntu用戶只能使用相同名稱的角色在PostgreSQL中運行。有關更多信息,請查看PostgreSQL身份驗證的官方文檔。
如果您沒有使用-P
標誌,並且希望在創建後為該角色設置密碼,請使用以下命令進入PostgreSQL控制台:
- sudo -u postgres psql
您將收到以下輸出,以及PostgreSQL控制台的提示:
Outputpsql (12.12 (Ubuntu 12.12-0ubuntu0.20.04.1))
Type "help" for help.
postgres=#
PostgreSQL控制台由postgres=#
提示表示。在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步 – 配置和创建您的数据库
當為應用程式建立開發
和測試
數據庫時,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 } %>
,並添加以下突出顯示的行,填寫您的憑據和您創建的環境變量。它應該看起來像這樣:
...
default: &default
adapter: postgresql
encoding: unicode
#有關連接池的詳細信息,請參閱Rails配置指南
# 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
+ x
,Y
,然後ENTER
保存並退出。
有關在Rails中配置數據庫的更多信息,請參見Rails文檔。
現在您已經對config/database.yml
進行了更改,請使用rails
命令創建應用程序的數據庫:
- rails db:create
一旦Rails創建了數據庫,您將收到以下輸出:
OutputCreated database 'appname_development'
Created database 'appname_test'
正如輸出所示,此命令在您的PostgreSQL服務器中創建了development
和test
數據庫。
現在您有一個與Rails應用程序連接的PostgreSQL數據庫。為確保您的應用程序正常工作,您現在將測試您的配置。
第5步-測試您的配置
為了測試您的應用程序能夠使用PostgreSQL數據庫,您將運行Web應用程序,以便它將在瀏覽器中顯示。
使用rails server
命令,在Rails應用程序中運行內置的Web服務器,Puma:
- rails server --binding=127.0.0.1
--binding
將應用程式綁定到指定的 IP。預設情況下,此標誌將Rails綁定到0.0.0.0
,這表示Rails將聽取所有接口,因此使用127.0.0.1
指定localhost
更安全。應用程式默認情況下在端口3000
上聽取。
一旦您的Rails應用程序運行,您的命令提示符將消失,被此輸出取代:
Output=> Booting Puma
=> Rails 7.0.4 application starting in development
=> Run `bin/rails server --help` for more startup options
Puma starting in single mode...
* Puma Version 5.6.5 (ruby 3.1.2-p20) ("Birdie's Version")
* 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結尾的輸出,類似於:
Output...
<strong>Rails version:</strong> 7.0.4<br />
<strong>Ruby version:</strong> 3.1.2 (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
現在,您將能夠通過服務器的公共IP地址在本地Web瀏覽器中訪問您的Rails應用程序,端口為3000
,訪問:
http://server_public_IP:3000
在此URL上,您將找到一個Ruby on Rails頁面:
如果您可以訪問主頁,則表示您的應用程序已正確配置並連接到PostgreSQL數據庫。
在測試配置後,如果您想要關閉端口3000
,請使用以下命令。
- sudo ufw delete allow 3000
結論
在這個教程中,您創建了一個Ruby on Rails Web應用程序,它配置為在Ubuntu 20.04服務器上使用PostgreSQL作為數據庫。如果您想了解更多關於Ruby編程語言的信息,請查看我們關於如何在Ruby中編碼的系列文章。
有關為應用程序選擇數據庫的更多信息,請查看我們關於SQLite、PostgreSQL和MySQL之間的區別和用例的教程。如果您想要了解更多有關如何使用數據庫的信息,請查看PostgreSQL查詢入門文章,或探索DigitalOcean的托管數據庫產品。