在 Linux 上的 Azure 应用服务中生成 Ruby 和 Postgres 应用

Azure 应用服务提供高度可缩放、自修复的 Web 托管服务。 本教程演示如何创建 Ruby 应用并将其连接到 PostgreSQL 数据库。 完成后,Linux 上的应用服务上运行 Ruby on Rails 应用。

标题为 Tasks 的 Ruby on Rails 应用示例的屏幕截图。

本教程中,您将学习如何:

  • 在 Azure 中创建 PostgreSQL 数据库
  • 将 Ruby on Rails 应用连接到 PostgreSQL
  • 将应用部署到 Azure
  • 更新数据模型并重新部署应用
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

如果没有 Azure 订阅,可在开始前创建一个试用帐户

先决条件

若要完成本教程,

可以使用本地 Azure CLI。

准备本地 Postgres 数据库

在此步骤中,将在本地 Postgres 服务器中创建数据库供本教程使用。

连接到本地 Postgres 服务器

  1. 打开终端窗口并运行 psql 以连接到本地 Postgres 服务器。

    sudo -u postgres psql
    

    如果连接成功,则 Postgres 数据库正在运行。 否则,请确保按照 下载 - PostgreSQL 核心分发中的步骤启动本地 Postgres 数据库。

  2. 键入 \q 退出 Postgres 客户端。

  3. 使用已登录 Linux 用户名创建一个 Postgres 用户,该用户可以通过运行以下命令来创建数据库。

    sudo -u postgres createuser -d <signed-in-user>
    

在本地创建 Ruby on Rails 应用

在此步骤中,你将获得 Ruby on Rails 示例应用程序,配置其数据库连接,并在本地运行它。

克隆示例

  1. 在终端窗口中, cd 指向工作目录。

  2. 克隆示例存储库并更改为存储库根目录。

    git clone https://github.com/Azure-Samples/rubyrails-tasks.git
    cd rubyrails-tasks
    
  3. 确保默认分支为 main

    git branch -m main
    

    小窍门

    应用服务不需要更改分支名称。 但是,由于许多存储库正在将其默认分支 main更改为,本教程还演示如何从 main中部署存储库。 有关详细信息,请参阅 更改部署分支

  4. 安装所需程序包。

    bundle install --path vendor/bundle
    

在本地运行示例

  1. 运行 Rails 迁移 以创建应用程序所需的表。 若要查看迁移中创建的表,请查看 Git 存储库中的 db/migrate 目录。

    rake db:create
    rake db:migrate
    
  2. 运行该应用程序。

    rails server
    
  3. 在浏览器中导航到 http://localhost:3000 。 在页面中添加一些任务。

    Ruby on Rails 成功连接到 Postgres

  4. 若要停止 Rails 服务器,请在终端中键入 Ctrl + C

在 Azure 中创建 Postgres

在此步骤中,将在 Azure Database for PostgreSQL 中创建 Postgres 数据库。 稍后,将 Ruby on Rails 应用程序配置为连接到此数据库。

创建资源组

资源组是在其中部署和管理 Azure 资源(例如 Web 应用、数据库和存储帐户)的逻辑容器。 例如,可以选择在使用完之后通过一个简单的步骤删除整个资源组。

在 Azure CLI 中,使用 az group create 命令创建资源组。 以下示例在“中国东部 2”位置创建名为 myResourceGroup 的资源组。 若要查看 基本 层中 Linux 上的应用服务支持的所有位置,请 az appservice list-locations --sku B1 --linux-workers-enabled 运行以下命令。

az group create --name myResourceGroup --location "China North"

通常在附近的区域中创建资源组和资源。

此命令完成后,JSON 输出会显示资源组属性。

在 Azure 中创建 Postgres 数据库

  1. db-up使用以下命令安装扩展:

    az extension add --name db-up
    
  2. 使用 az postgres up 命令在 Azure 中创建 Postgres 数据库,如以下示例所示。 将 <postgresql-name> 替换为一个 唯一 名称(服务器终结点为 https://<postgresql-name.postgres.database.azure.cn>)。 对于 <管理员用户名><管理员密码>,请指定凭据以为此 Postgres 服务器创建管理员用户。

    az postgres up --resource-group myResourceGroup --location chinanorth --server-name <postgresql-name> --database-name sampledb --admin-user <admin-username> --admin-password <admin-password> --ssl-enforcement Enabled
    

    此命令可能需要一段时间,因为它执行以下作:

    • 如果不存在,则创建名为myResourceGroup资源组。 每个 Azure 资源都需要位于其中一个中。 --resource-group 是可选的。
    • 使用管理用户创建 Postgres 服务器。
    • 创建数据库 sampledb
    • 允许从本地 IP 地址进行访问。
    • 允许从 Azure 服务进行访问。
    • 创建有权访问 sampledb 数据库的数据库用户。

    您可以通过其他 az postgres 命令和 psql 单独完成所有步骤,但 az postgres up 可以一步完成所有这些操作。

    命令完成后,找到以 Ran Database Query: 开头的输出行。 他们显示为你创建的数据库用户,用户名和密码rootSampledb1。 稍后,您会使用它们将您的应用程序连接到数据库。

    小窍门

    --location <location-name>,可以设置为任意一个 Azure 区域。 可以使用 az account list-locations 命令获取您的订阅可用的区域。 对于生产应用,请将数据库和应用置于同一位置。

将应用连接到 Azure Postgres

在此步骤中,将 Ruby on Rails 应用程序连接到在 Azure Database for PostgreSQL 中创建的 Postgres 数据库。

配置数据库连接

在存储库中,打开 配置/database.yml。 在文件的底部,将生产变量替换为以下代码。

production:
  <<: *default
  host: <%= ENV['DB_HOST'] %>
  database: <%= ENV['DB_DATABASE'] %>
  username: <%= ENV['DB_USERNAME'] %>
  password: <%= ENV['DB_PASSWORD'] %>

保存更改。

在本地测试应用程序

  1. 返回本地终端,设置以下环境变量:

    export DB_HOST=<postgres-server-name>.postgres.database.azure.cn
    export DB_DATABASE=sampledb 
    export DB_USERNAME=root@<postgres-server-name>
    export DB_PASSWORD=Sampledb1
    
  2. 在 Azure Database for PostgreSQL 的 Postgres 数据库中,使用您刚刚配置的生产值运行 Rails 数据库迁移,以创建表。

    rake db:migrate RAILS_ENV=production
    
  3. 在生产环境中运行时,Rails 应用程序需要预编译的资产。 使用以下命令生成所需的资产:

    rake assets:precompile
    
  4. Rails 生产环境还使用机密来管理安全性。 生成密钥。

    rails secret
    
  5. 将密钥保存到 Rails 生产环境使用的相应变量。 为方便起见,请为这两个变量使用相同的键。

    export RAILS_MASTER_KEY=<output-of-rails-secret>
    export SECRET_KEY_BASE=<output-of-rails-secret>
    
  6. 使 Rails 生产环境能够为 JavaScript 和 CSS 文件提供服务。

    export RAILS_SERVE_STATIC_FILES=true
    
  7. 在生产环境中运行示例应用程序。

    rails server -e production
    
  8. 请导航至 http://localhost:3000 如果页面加载时未出错,Ruby on Rails 应用程序正在连接到 Azure 中的 Postgres 数据库。

  9. 在页面中添加一些任务。

    Ruby on Rails 已成功连接到 Azure Database for PostgreSQL

  10. 若要停止 Rails 服务器,请在终端中键入 Ctrl + C

提交更改

  1. 运行以下 Git 命令以提交更改:

    git add .
    git commit -m "database.yml updates"
    

你的应用已准备好部署。

部署到 Azure 云

在此步骤中,将 Postgres 连接的 Rails 应用程序部署到 Azure 应用服务。

配置部署用户

可以使用“deployment user”将 FTP 和本地 Git 部署到 Azure Web 应用。 配置部署用户之后,可对所有 Azure 部署使用此用户。 帐户级部署用户名和密码不同于 Azure 订阅凭据。

若要配置部署用户,请在 Azure CLI 中运行 az webapp deployment user set 命令。 将 <username> 和 <password> 替换为部署用户的用户名和密码。

  • 用户名在 Azure 中必须唯一,并且为了本地Git推送,不能包含“@”符号。
  • 密码必须至少为 8 个字符,且具有字母、数字和符号这三种元素中的两种。
az webapp deployment user set --user-name <username> --password <password>

JSON 输出会将该密码显示为 null。 如果收到 'Conflict'. Details: 409 错误,请更改用户名。 如果收到 'Bad Request'. Details: 400 错误,请使用更强的密码。

请记录你要用于部署 Web 应用的用户名和密码。

创建应用服务计划

在 Azure CLI 中,使用 az appservice plan create 命令创建应用服务计划。

以下示例在免费定价层中创建名为 myAppServicePlan 的应用服务计划:

az appservice plan create --name myAppServicePlan --resource-group myResourceGroup --sku FREE --is-linux

创建应用服务计划后,Azure CLI 会显示类似于以下示例的信息:

{ 
  "freeOfferExpirationTime": null,
  "geoRegion": "China North",
  "hostingEnvironmentProfile": null,
  "id": "/subscriptions/0000-0000/resourceGroups/myResourceGroup/providers/Microsoft.Web/serverfarms/myAppServicePlan",
  "kind": "linux",
  "location": "China North",
  "maximumNumberOfWorkers": 1,
  "name": "myAppServicePlan",
  < JSON data removed for brevity. >
  "targetWorkerSizeId": 0,
  "type": "Microsoft.Web/serverfarms",
  "workerTierName": null
} 

创建 Web 应用

应用服务计划中创建一个 myAppServicePlan

在 Azure CLI 中,可以使用 az webapp create 该命令。 在以下示例中,将 <app-name> 替换为全局唯一的应用名称(有效字符是 a-z0-9-)。 运行时设置为 RUBY|2.6.2。 若要查看所有受支持的运行时,请运行 az webapp list-runtimes --linux

az webapp create --resource-group myResourceGroup --plan myAppServicePlan --name <app-name> --runtime 'RUBY:2.6' --deployment-local-git

创建 Web 应用后,Azure CLI 会显示类似于以下示例的输出:

Local git is configured with url of 'https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git'
{
  "availabilityState": "Normal",
  "clientAffinityEnabled": true,
  "clientCertEnabled": false,
  "cloningInfo": null,
  "containerSize": 0,
  "dailyMemoryTimeQuota": 0,
  "defaultHostName": "<app-name>.chinacloudsites.cn",
  "deploymentLocalGitUrl": "https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git",
  "enabled": true,
  < JSON data removed for brevity. >
}

现在你已经创建了一个新的空 Web 应用并启用了 Git 部署。

注释

Git 远程的 URL 将显示在 deploymentLocalGitUrl 属性中,其格式为 https://<username>@<app-name>.scm.chinacloudsites.cn/<app-name>.git。 保存此 URL,后续将会用到。

配置数据库设置

在应用服务中,使用 Azure CLI 中的命令将环境变量设置为应用设置az webapp config appsettings set

以下 Azure CLI 命令配置应用设置DB_HOSTDB_DATABASEDB_USERNAMEDB_PASSWORD。 替换占位符 <appname><postgres-server-name>

az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DB_HOST="<postgres-server-name>.postgres.database.azure.cn" DB_DATABASE="sampledb" DB_USERNAME="root@<postgres-server-name>" DB_PASSWORD="Sampledb1"

配置 Rails 环境变量

  1. 在本地终端中,为 Azure 中的 Rails 生产环境 生成新机密

    rails secret
    
  2. 在以下 Azure CLI 命令中,将两 <个输出的 rails-secret> 占位符替换为在本地终端中生成的新密钥。

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings RAILS_MASTER_KEY="<output-of-rails-secret>" SECRET_KEY_BASE="<output-of-rails-secret>" RAILS_SERVE_STATIC_FILES="true" ASSETS_PRECOMPILE="true"
    

    ASSETS_PRECOMPILE="true" 告知默认 Ruby 容器在每个 Git 部署中预编译资产。 有关详细信息,请参阅 预编译资产服务静态资产

从 Git 推送到 Azure

  1. 由于要部署 main 分支,需要将应用服务应用 main 的默认部署分支设置为(请参阅 更改部署分支)。 在本地 Shell 中,使用DEPLOYMENT_BRANCH命令设置az webapp config appsettings set应用设置。

    az webapp config appsettings set --name <app-name> --resource-group myResourceGroup --settings DEPLOYMENT_BRANCH='main'
    
  2. 在本地终端中,将 Azure 远程添加到本地 Git 存储库。

    git remote add azure <paste-copied-url-here>
    
  3. 推送到 Azure 远程部署 Ruby on Rails 应用程序。 系统会提示输入前面提供的密码,作为创建部署用户的一部分。

    git push azure main
    

    在部署期间,Azure 应用服务会将其进度与 Git 通信。

     Counting objects: 3, done.
     Delta compression using up to 8 threads.
     Compressing objects: 100% (3/3), done.
     Writing objects: 100% (3/3), 291 bytes | 0 bytes/s, done.
     Total 3 (delta 2), reused 0 (delta 0)
     remote: Updating branch 'main'.
     remote: Updating submodules.
     remote: Preparing deployment for commit id 'a5e076db9c'.
     remote: Running custom deployment command...
     remote: Running deployment command...
     ...
     < Output has been truncated for readability >
     

转到 Azure 应用

浏览到 http://<app-name>.chinacloudsites.cn 列表并添加几个任务。

Azure 应用示例标题为“任务”的屏幕截图,其中显示了添加到列表中的任务。

恭喜,你正在 Azure 应用服务中运行数据驱动的 Ruby on Rails 应用。

在本地更新模型并重新部署

在此步骤中,对数据模型和 Web 应用进行简单的更改 task ,然后将更新发布到 Azure。

对于任务方案,可以修改应用程序,以便可以将任务标记为已完成。

添加列

  1. 在终端中,导航到 Git 存储库的根目录。

  2. 生成一个新的迁移,将布尔列Done添加到Tasks表中。

    rails generate migration AddDoneToTasks Done:boolean
    

    此命令在 db/migrate 目录中生成新的迁移文件。

  3. 在终端中,运行 Rails 数据库迁移,在本地数据库中进行更改。

    rake db:migrate
    

更新应用程序逻辑

  1. 打开 app/controllers/tasks_controller.rb 文件。 在文件末尾找到以下行:

    params.require(:task).permit(:Description)
    
  2. 修改此行以包含新 Done 参数。

    params.require(:task).permit(:Description, :Done)
    

更新视图

  1. 打开 应用/视图/任务/_form.html.erb 文件,即“编辑”窗体。

  2. 找到该行 <%=f.error_span(:Description) %> 并直接在其下方插入以下代码:

    <%= f.label :Done, :class => 'control-label col-lg-2' %>
    <div class="col-lg-10">
      <%= f.check_box :Done, :class => 'form-control' %>
    </div>
    
  3. 打开 app/views/tasks/show.html.erb 文件,这是一个单记录视图页面。

    找到该行 <dd><%= @task.Description %></dd> 并直接在其下方插入以下代码:

      <dt><strong><%= model_class.human_attribute_name(:Done) %>:</strong></dt>
      <dd><%= check_box "task", "Done", {:checked => @task.Done, :disabled => true}%></dd>
    

    打开 应用/视图/任务/index.html.erb 文件,这是所有记录的索引页。

    找到该行 <th><%= model_class.human_attribute_name(:Description) %></th> 并直接在其下方插入以下代码:

    <th><%= model_class.human_attribute_name(:Done) %></th>
    
  4. 在同一文件中,找到该行 <td><%= task.Description %></td> 并直接在其下方插入以下代码:

    <td><%= check_box "task", "Done", {:checked => task.Done, :disabled => true} %></td>
    

在本地测试更改

  1. 在本地终端中,运行 Rails 服务器。

    rails server
    
  2. 若要查看任务状态更改,请 http://localhost:3000 导航到并添加或编辑项。

    向任务添加了复选框

  3. 若要停止 Rails 服务器,请在终端中键入 Ctrl + C

将更改发布到 Azure

  1. 在终端中,为生产环境运行 Rails 数据库迁移,以便在 Azure 数据库中进行更改。

    rake db:migrate RAILS_ENV=production
    
  2. 提交 Git 中的所有更改,然后将代码更改推送到 Azure。

    git add .
    git commit -m "added complete checkbox"
    git push azure main
    
  3. git push完成后,导航到 Azure 应用并测试新功能。

    发布到 Azure 的模型和数据库更改

    如果添加了任何任务,这些任务将保留在数据库中。 对数据架构的更新使现有数据保持不变。

流式传输诊断日志

若要访问应用服务中的应用程序代码内生成的控制台日志,请在 Azure CLI 中运行以下命令以打开诊断日志记录:

az webapp log config --resource-group <resource-group-name> --name <app-name> --docker-container-logging filesystem --level Verbose

--level 的可能值为:ErrorWarningInfoVerbose。 每个后续级别包括上一个级别。 例如:Error 仅包含错误消息,Verbose 则包含所有消息。

启用诊断日志记录功能以后,请运行以下命令来查看日志流:

az webapp log tail --resource-group <resource-group-name> --name <app-name>

如果没有立即看到控制台日志,请在 30 秒后重新查看。

注释

也可通过浏览器在 https://<app-name>.scm.chinacloudsites.cn/api/logs/docker 中检查日志文件。

若要随时停止日志流式处理,请键入 Ctrl+C

管理 Azure 应用

  1. 转到 Azure 门户 以管理创建的应用。

  2. 在左侧菜单中,单击 “应用服务”,然后单击 Azure 应用的名称。

    门户导航至 Azure 应用

    可以看到应用的“概述”页。 在这里,可以执行基本管理任务,例如停止、启动、重启、浏览和删除。

    左侧菜单提供用于配置应用的页面。

    Azure 门户中的应用服务页

清理资源

在前面的步骤中,你在资源组中创建了 Azure 资源。 如果认为将来不需要这些资源,请在本地 Azure CLI 中运行以下命令删除资源组:

az group delete --name myResourceGroup

运行此命令可能需要一分钟时间。

后续步骤

在本教程中,你将学习到如何:

  • 在 Azure 中创建 Postgres 数据库
  • 将 Ruby on Rails 应用连接到 Postgres
  • 将应用部署到 Azure
  • 更新数据模型并重新部署应用
  • 从 Azure 流式传输诊断日志
  • 在 Azure 门户中管理应用

转到下一教程,了解如何使用自定义域和证书保护应用。

或者,查看其他资源: