# Heroku 是什么

Heroku 是一个一站式程序托管平台，你可以通过[heroku.com](https://www.heroku.com)获取更多信息

## 注册

你需要一个 heroku 帐户，如果你还没有，请通过此链接注册：[https://signup.heroku.com/](https://signup.heroku.com/)

## 安装命令行应用

请确保你已安装 heroku 命令行工具

### HomeBrew

```bash
brew tap heroku/brew && brew install heroku
```

### 其他安装方式

在此处查看其他安装选项: [https://devcenter.heroku.com/articles/heroku-cli#download-and-install](https://devcenter.heroku.com/articles/heroku-cli#download-and-install).

### 登录

安装命令行工具后，使用以下命令登录:

```bash
heroku login
```

查看当前登录的 heroku 电子邮件账户:

```bash
heroku auth:whoami
```

### 创建一个应用

通过访问 heroku.com 来访问你的帐户，然后从右上角的下拉菜单中创建一个新应用程序。Heroku 会问一些问题，例如区域和应用程序名称，只需按照提示操作即可。

### Git

Heroku 使用 Git 来部署你的应用程序，因此你需要将你的项目放入 Git 存储库（如果还没有的话）。

#### 初始化 Git

如果你需要将 Git 添加到你的项目中，在终端中输入以下命令:

```bash
git init
```

#### Master

你应该选择一个分支，并坚持将其用于部署到 Heroku，比如 **main** 或 **master** 分支。确保在推送之前将所有更改都加入此分支。

通过以下命令检查你当前的分支：

```bash
git branch
```

星号表示当前分支。

```bash
* main
  commander
  other-branches
```

> **提示**：如果你没有看到任何输出并且你刚刚执行了 `git init`。 你需要先提交（commit）你的代码，然后你会看到 `git branch` 命令的输出。


如果你当前 _不在_ 正确的分支上，请输入以下命令来切换（针对 **main** 分支来说）：

```bash
git checkout main
```

#### 提交更改

如果此命令有输出，那么你有未提交的改动。

```bash
git status --porcelain
```

通过以下命令来提交

```bash
git add .
git commit -m "a description of the changes I made"
```

#### 与 Heroku 进行连接

将你的应用与 heroku 连接（替换为你的应用名称）。

```bash
$ heroku git:remote -a your-apps-name-here
```

### 设置运行包（Buildpack）

设置运行包来告知 heroku 如何处理 Vapor。

```bash
heroku buildpacks:set vapor/vapor
```

### Swift 版本文件

我们添加的运行包会查找 **.swift-version** 文件以了解要使用的 swift 版本。 （将 5.8.1 替换为你的项目需要的任何版本。）

```bash
echo "5.8.1" > .swift-version
```

这将创建 **.swift-version** ，内容为 `5.8.1`。


### Procfile

Heroku 使用 **Procfile** 来知道如何运行你的应用程序，在我们的示例中它需要这样配置：

```
web: App serve --env production --hostname 0.0.0.0 --port $PORT
```

我们可以使用以下终端命令来创建它

```bash
echo "web: App serve --env production" \
  "--hostname 0.0.0.0 --port \$PORT" > Procfile
```

### 提交更改

我们刚刚只是更改了这些文件，但它们没有被提交。 如果我们推送（push），heroku 将无法看到这些更改。

使用以下命令提交它们。

```bash
git add .
git commit -m "adding heroku build files"
```

### 部署到 Heroku

你已准备好开始部署，从终端运行以下命令。 构建过程可能会需要一些时间，不必担心。

```none
git push heroku main
```

### 扩展

成功构建后，你需要添加至少一台服务器，Eco 计划的价格从每月$5起（参见[定价](https://www.heroku.com/pricing#containers)），请确保在 Heroku 上配置了付款方式。然后，针对单个 web worker 执行下面命令：

```bash
heroku ps:scale web=1
```

### 继续部署

当你想更新时只需将最新的更改推入 main 分支并推送到 heroku，它就会重新部署。

## Postgres

### 添加 PostgreSQL 数据库

在 dashboard.heroku.com 上访问你的应用程序，然后转到 **Add-ons** 部分。

从这里输入`postgres`，你会看到`Heroku Postgres`的选项。 选择它。

选择每月$5的 Essential 0 计划（参见[定价](https://www.heroku.com/pricing#data-services)），并进行预配。剩下的交给 Heroku 处理。

完成后，你会看到数据库出现在 **Resources** 选项卡下。

### 配置数据库

我们现在必须告诉我们的应用程序如何访问数据库。 在 app 目录中运行。

```bash
heroku config
```

这会输出类似以下内容的内容：

```none
=== today-i-learned-vapor Config Vars
DATABASE_URL: postgres://cybntsgadydqzm:2d9dc7f6d964f4750da1518ad71hag2ba729cd4527d4a18c70e024b11cfa8f4b@ec2-54-221-192-231.compute-1.amazonaws.com:5432/dfr89mvoo550b4
```

**DATABASE_URL** 这里将代表 postgres 数据库。 请**从不** 硬编码静态 url，heroku 会变更这个 url，并破坏你的应用程序。

以下是一个示例数据库配置

```swift
if let databaseURL = Environment.get("DATABASE_URL") {
    var tlsConfig: TLSConfiguration = .makeClientConfiguration()
    tlsConfig.certificateVerification = .none
    let nioSSLContext = try NIOSSLContext(configuration: tlsConfig)

    var postgresConfig = try SQLPostgresConfiguration(url: databaseURL)
    postgresConfig.coreConfiguration.tls = .require(nioSSLContext)

    app.databases.use(.postgres(configuration: postgresConfig), as: .psql)
} else {
    // ...
}
```

如果你使用 Heroku Postgres 的标准计划，则需要开始未验证的 TLS。

不要忘记提交这些更改

```none
git add .
git commit -m "configured heroku database"
```

### 重置你的数据库

你可以使用 `run` 命令在 heroku 上恢复或运行其他命令。
要重置你的数据库请运行：

```bash
heroku run App -- revert --all --yes --env production
```

如要迁移请运行以下命令：

```bash
heroku run App -- migrate --env production
```
