# Ruby on Rails

### 安装 Ruby

Edgegap 为您提供了一个非常直观的平台，可以在需要的任何地方部署无服务器 Web 应用。对于本教程，我们将介绍部署 Ruby on Rails 的步骤。在检查其他内容之前，请确保已安装 Ruby。

如果您在 Linux/UNIX 机器上运行，可以使用机器上预装的包管理器通过终端安装 Ruby。您可以参考 [Ruby 的官方文档](https://www.ruby-lang.org/en/documentation/installation/) 以查找与您的 Linux/UNIX 发行版对应的精确命令。

在 Windows 机器上，您需要 [下载 RubyInstaller](https://rubyinstaller.org) 来获取 Ruby。

安装结束后，您可以使用以下命令检查 Ruby 是否正确安装：

```
ruby -v
```

现在安装了 Ruby，显然您还需要安装 Rails。这相当简单，可以使用以下单个命令完成：

```
gem install rails
```

您可以用类似验证 Ruby 安装的方法轻松确认 Rails 是否已正确安装。

```
rails -v
```

### 要求

要跟随本教程，除 Ruby 和 Ruby on Rails 外，您还需要具备以下内容：

* [Docker Desktop](https://www.docker.com/get-started/)
* [一个 Edgegap 帐户](https://app.edgegap.com/auth/login)
* 访问 [Edgegap 的私有容器仓库](https://docs.edgegap.com/zh/learn/advanced-features/edgegap-container-registry) 或其它像 [Docker 的容器注册表](https://hub.docker.com/)

### 开始使用 Ruby on Rails

要开始使用 Ruby on Rails，您需要为新项目创建一个文件夹，并在该文件夹中运行以下命令：

```
rails new edgegap-ruby-rails-demo
```

安装过程完成后，您需要修改位于 config 文件夹中的 routes.rb 文件。您的 routes 文件应包含以下内容：

```ruby
Rails.application.routes.draw do
  root 'hello_world#index'
end
```

您可能会注意到在项目的 views 文件夹中没有 'hello\_world' 页面。您可以通过生成相应的控制器来轻松创建它。首先，确保您位于运行 `rails new` 命令时 Rails 为您生成的文件夹中。

如果您使用的是 Linux 发行版，请使用以下命令创建 HelloWorld 控制器：

```
rails generate controller HelloWorld index --skip-routes
```

skip-routes 选项可确保此命令不会为该控制器生成新的路由，这正是我们想要的，因为我们已经手动创建了一个路由。

对于 Windows，您需要在命令中添加一些关键字，如下所示：

```
ruby bin/rails generate controller HelloWorld index –skip-routes
```

命令成功执行后，您将在 views 文件夹中看到 HelloWorld 页面。在部署之前，您可能需要修正 HTML 语法以获得正确的部分。该文件应如下所示：

<figure><img src="https://3334189208-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fgit-blob-203bfc13bd043df0ca5bbc9cd9e267e456e53a9e%2Fruby-index-page.png?alt=media" alt=""><figcaption></figcaption></figure>

完成项目的唯一一步是本地部署您的 Ruby on Rails 应用。再次提醒，不同操作系统下的命令如下：

Linux：

```sh
rails server
```

Windows：

```sh
ruby bin/rails server
```

### 为应用创建容器镜像

为大多数应用创建容器镜像相对简单。您必须创建一个 Dockerfile，然后在 Docker 上运行该文件以创建镜像。Visual Studio Code 是创建 Dockerfile 的好平台，因为默认情况下它不会为我们创建的每个新文件添加扩展名。这正是我们需要的。只需创建一个新文件并将其命名为 Dockerfile。您会看到旁边出现小小的 Docker 图标。现在，您可以将此脚本复制并粘贴到其中以获取主要依赖项。此 Dockerfile 创建的镜像大约为 700 MB。当然，您可以对其进行优化，但这样大小的容器将在 Edgegap 上运行得非常顺畅：

```dockerfile
FROM ruby:3-alpine
WORKDIR /app
COPY . .
RUN apk add --no-cache build-base tzdata nodejs yarn sqlite-dev postgresql-dev mysql-dev
RUN gem install bundler
RUN bundle install
ENV RAILS_ENV=production
RUN bundle exec rails assets:precompile
EXPOSE 3000
CMD ["rails", "server", "-b", "0.0.0.0"]
```

保存 Dockerfile 后，就可以创建镜像了。您可以通过运行以下命令轻松完成：

{% hint style="warning" %}
对于 ARM CPU（Mac M1、M2 等）用户，向 `--platform linux/amd64`  选项添加到您的构建命令中。
{% endhint %}

```sh
docker build -t registry.edgegap.com/<YOUR_REPO>/ruby-rails-demo:<YOUR_VERSION_NUMBER> .
```

最好遵循语义化版本控制放置版本号，但如果您不打算在第一次部署后在 Edgegap 上更新构建，则可以完全省略版本号。不过在此之前，您需要将新创建的 Docker 镜像推送到您选择的镜像仓库。请记住，我们通过 Edgegap Registry 提供私有仓库，为您提供一些使用默认 Docker 仓库可能没有的安全优势。要将镜像推送到我们的仓库，您必须先使用此命令使用您的凭据登录：

```sh
docker login registry.edgegap.com
```

现在，剩下的就是像这样推送您的镜像：

```sh
docker push registry.edgegap.com/<YOUR_REPO>/ruby-rails-demo:<YOUR_VERSION_NUMBER>
```

太好了！现在，您距离在 Edgegap 平台上部署您的 Nuxt 应用只差一步。

### 在 Edgegap 上部署您的应用

在 Edgegap 上部署应用有两种方式。无论哪种方式，您都需要有一个帐户，您可以通过此处的链接免费创建。首先，我们介绍如何通过网站部署容器化的应用。

#### 通过 Edgegap 仪表板部署应用

您需要前往 [Edgegap 平台网站](https://console.edgegap.com/) 并输入您的凭据。登录后，您将被自动重定向到仪表板。如果您刚创建帐户，您会看到立即启动第一个应用的选项。如果没有，只需转到屏幕左侧菜单中的“应用与游戏”选项卡。您会在右上角看到创建新应用的选项：

<figure><img src="https://3334189208-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fgit-blob-fc4b2486acb434863c2a6fd0e3772e02bfd2e214%2Fcreate-app-nuxt-js.png?alt=media" alt=""><figcaption></figcaption></figure>

点击后，应出现以下表单：

<figure><img src="https://3334189208-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fgit-blob-488e9bf3f56918ab3e01c15c9364a8fe321a40b5%2Fapp-form-nuxt-js.png?alt=media" alt=""><figcaption></figcaption></figure>

您应填写所有必填字段，完成后，您需要将默认设置中的一些内容进行修改：

* 端口号：该应用需要打开 3000 端口，因此请在创建表单的“端口”部分添加该端口。取消选中验证端口的选项。

填写完表单并提供适当信息后，只需提交，您就可以准备部署。只需选择区域和要模拟的玩家数量即可。

填写完表单并提供适当信息后，只需提交，您就可以准备部署。只需选择区域和要模拟的玩家数量即可。

<figure><img src="https://3334189208-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fgit-blob-810022e4ed498eed59c957e369b76261513c0daa%2Fruby-deployment-edgegap.png?alt=media" alt=""><figcaption></figcaption></figure>

确认选择后，您的应用将很快上线。部署完成后您将看到如下内容。您可以通过点击此图中圈出的图标自行访问它。

<figure><img src="https://3334189208-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fgit-blob-b407d8a535e2c875804fc36d55999d68b2c82121%2Fruby-deployment-edgegap-2.png?alt=media" alt=""><figcaption></figcaption></figure>

这将打开一个新标签，其中包含您 Nuxt 应用的默认登录页面。

#### 通过 Edgegap 的 API 部署应用

虽然我们的 web 仪表板是部署应用最用户友好的方式，但您也可以通过一个非常简单的 API 请求来完成。为此，您可以使用 Postman。重要的是您需要访问仪表板来 [创建 API 令牌](https://docs.edgegap.com/zh/docs/sample-projects/broken-reference) 通过个人资料中的选项。

一旦您拥有 API 令牌，剩下要做的就是构建一个部署请求，包含您的应用名称、版本、IP 地址、您希望部署的区域，以及作为授权参数的一部分的令牌。您可以在我们的文档中查看完整请求示例。

发送请求后，您应在命令行或 Postman 上看到如下响应：

<figure><img src="https://3334189208-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fgit-blob-902356a5acce346433cb04f870f205cc4f161e2d%2Fruby-deployment-api.png?alt=media" alt=""><figcaption></figcaption></figure>

通过 CLI 部署应用就完成了这些步骤。要确认您的应用已部署，您可以再次前往仪表板并通过点击“活动部署”选项卡查看正在运行的部署。
