DockerとGoで構築したバックエンドをRenderに本番デプロイする

## 1. はじめに
バックエンドとフロントエンドを分離して開発するケースは一般的です。このガイドでは、Dockerを使ってGoで構築したバックエンドをRenderを使って本番環境にデプロイする方法を詳しく解説します。

なお、こちらは以下の記事の続きになります。

https://qiita.com/jijimama/items/525d70b01f7e2ea5facb


## 2. なぜRenderを選んだのか？
Renderは以下を同時に満たしているため、選定しました：

- バックエンドに適したDocker対応の簡易性。
- PostgreSQLのセットアップが簡単で無料枠がある。
- 自動デプロイ機能が充実し、運用コストが低い。

## 3. 必要な準備
### ソースコード構成
プロジェクトのディレクトリ構造は以下のようになっていることを前提とします：

```
├── backend
│   ├── Dockerfile
│   ├── main.go
│   ├── ...
└── frontend
    ├── ...
```

### 事前条件
- Docker がインストールされている。
- GitHub にリポジトリが作成済み。
- Render のアカウントを作成済み。
- PostgreSQL を使用する場合、```docker-compose.yml``` で定義されていること。

もし、Render のアカウントを作成済みでない場合は簡単にできますので作成しましょう。

![スクリーンショット 2024-12-25 8.18.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724481/5de91657-1473-cc4e-1bff-cac7869efabe.png)
こちらの「Get Started」をクリックし、

![スクリーンショット 2024-12-25 8.18.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724481/be86b37c-3ddc-72ee-747e-5fb4ef1272a6.png)

「GitHub」を選択して進んでいくと、連携しアカウント作成することができます。

## 4. Renderのアカウント作成とプロジェクト作成
![スクリーンショット 2024-12-25 8.20.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724481/fe4a129a-828c-964c-9e91-a066155d6f28.png)

- Render にログインまたはサインアップ（Render公式サイト）。
- ダッシュボードの「New +」ボタンをクリック。
- 「Web Services」を選択。

![スクリーンショット 2024-12-25 8.21.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724481/e802d62c-3d38-b270-4588-51289468d8e1.png)

「Git Provider」から該当のリポジトリを選択します。

![スクリーンショット 2024-12-25 8.23.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724481/e17f69b6-6956-e432-1651-dc7ba27aa193.png)

そして、必要な項目を入力していきます。

Branch：main
Root Directory：backend

としています。

### データベースの作成
![スクリーンショット 2024-12-25 14.35.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724481/1c9a8b1a-d432-8feb-c513-7a746273d5a4.png)

#### 1. 新しいデータベースの作成:

Render ダッシュボードで、New > PostgreSQL を選択します。

#### 2. データベースの設定:

データベースの名前やサイズを設定します（無料プランを選択可能）。
データベース接続情報（ホスト名、ユーザー名、パスワード、データベース名）が提供されます。

#### 3. 接続情報を環境変数として設定:

バックエンドアプリで使うために、Render の Environment Variables セクションに以下を設定します：

|Key|	Value|
|--|--|
|DATABASE_URL|DBのInternal Database URL|
|GIN_MODE|	release|

## 5. 本番デプロイ用にコード修正
先ほど設定した```DATABASE_URL```を使用します。
Render で設定した環境変数も ```os.Getenv("DATABASE_URL")``` で取得できます。Render はデプロイ時に設定された環境変数を自動的にアプリケーションに渡します。

```go
// 環境変数から取得
dsn := os.Getenv("DATABASE_URL")
if dsn == "" {
    // 環境変数が設定されていない場合、個別の環境変数から取得
    dbHost := os.Getenv("DB_HOST")
    dbPort := os.Getenv("DB_PORT")
    dbUser := os.Getenv("DB_USER")
    dbName := os.Getenv("DB_NAME")
    dbPassword := os.Getenv("DB_PASSWORD")

    // 接続文字列を作成
    dsn = "host=" + dbHost + " port=" + dbPort + " user=" + dbUser + " dbname=" + dbName + " password=" + dbPassword + " sslmode=disable"
}
// PostgreSQLに接続
client, err := ent.Open("postgres", dsn)
```

もし、```DB_HOST```などもすべて設定した場合は```DATABASE_URL```を設定する必要はありません。


```GIN_MODE``` 環境変数を使用して Gin のモードを設定します。
ローカル環境のみ```.env```ファイルを読み込むようにしています。

```go:main.go
// GIN_MODE 環境変数を設定
ginMode := os.Getenv("GIN_MODE")
if ginMode == "" {
    ginMode = "debug" // デフォルトは "debug"
	// .envファイルを読み込む
	err := godotenv.Load()
	if err != nil {
		log.Printf("Error loading .env file: %v", err)
	}
}
gin.SetMode(ginMode)
```

## 6. デプロイ

mainブランチにpushされると自動的にデプロイされます。

![スクリーンショット 2024-12-25 21.28.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3724481/b1296ac2-6def-e709-2194-c96660383c74.png)

のようになれば成功です。

## 7. 動作確認

デプロイ後、Render の Web サービス URL にアクセスして動作を確認します
``https://your-backend-service.onrender.com``

## 8. データベースの確認

テーブルが作成されたかを確認したい場合、ローカルで見る方法もあります。
#### 1. PostgreSQL クライアントをインストール

Macの場合 
```
brew install postgresql
```

#### 2. psql コマンドを使用 
Render の「External Database URL」を使い、次のコマンドを実行します。
```
psql <External Database URL>
```

#### 3. 接続後の操作
データベースに接続できたら、次のコマンドでデータを確認できます：
```
-- テーブル一覧を表示
\dt

-- データベースから抜ける
\q
```

## 9. まとめ
この記事では、Dockerを使ってGoで構築したバックエンドをRenderにデプロイする方法を解説しました。Render は無料プランで小規模プロジェクトを簡単にホスティングできるため、特に個人や小規模チームの開発に最適です。ぜひこの手順を参考にデプロイを試してみてください！