DoccanoをGoogle Cloud Runにデプロイする方法

## DoccanoをGoogle Cloud Runにデプロイする手順

このガイドでは、DoccanoをGoogle Cloud Runにデプロイするプロセスをステップバイステップで説明します。このプロセスには、Google Cloud BuildとGoogle Cloud Source Repositoriesの設定も含まれます。

### 前提条件

- Google Cloud Platformのアカウントがあること。
- `gcloud`コマンドラインツールがインストールされ、設定されていること。

### 1. Cloud Source Repositories リポジトリの作成

1. **Google Cloud Console** にアクセスして、プロジェクトを選択します。
2. ナビゲーションメニューから **Source Repositories** を選択し、**リポジトリを表示** をクリックします。
3. **リポジトリを追加** ボタンをクリックして、新しいリポジトリを作成します。
4. リポジトリに名前を付け（例：`my-project-repo`）、必要な設定を行い、**作成** をクリックします。

### 2. ローカル Git リポジトリの設定

ローカルで作業しているプロジェクトがまだ Git リポジトリとして初期化されていない場合は、以下のコマンドを使用して初期化します。

```bash
git init
git add .
git commit -m "Initial commit"
```

### 3. Google Cloud Source Repositories とのリンク

作成したリポジトリをローカル Git リポジトリにリンクするには、次のコマンドを使用します。これにより、Google Cloud Source Repositories の URL がリモートリポジトリとして追加されます。

```bash
git remote add google https://source.developers.google.com/p/[PROJECT_ID]/r/[REPOSITORY_NAME]
```

ここで、`[PROJECT_ID]` は Google Cloud プロジェクトの ID、`[REPOSITORY_NAME]` は作成したリポジトリの名前に置き換えてください。

### 4. コードのプッシュ

ローカルの変更を Cloud Source Repositories にプッシュするには、次のコマンドを使用します。

```bash
git push google master
```

このコマンドは、ローカルの `master` ブランチの変更をリモートの `master` ブランチにプッシュします。必要に応じて、異なるブランチ名を指定することができます。

これで、Google Cloud Source Repositories へのプッシュが完了し、Cloud Build などの他のサービスでこれらのソースコードを使用することができるようになります。
git push goolge masterを実行すると新しい認証URLが表示されることがあります。
その場合はURLを開いてログインして認証スクリプトを全てターミナルで実行します。



# Cloud Build の設定

Cloud Build の設定と `cloudbuild.yaml` ファイルの作成について詳細に説明します。まず、Cloud Build に必要なサービスアカウントを設定し、その後で `cloudbuild.yaml` ファイルを作成する手順を踏みます。

### 1. サービスアカウントの作成と設定

Cloud Build が他の Google Cloud サービスと連携するためには、適切な権限を持つサービスアカウントが必要です。以下の手順でサービスアカウントを作成し、必要なロールを割り当てます。

#### サービスアカウントの作成:

1. **Google Cloud Console** にログインします。
2. ナビゲーションメニューから **IAM と管理** > **サービスアカウント** を選択します。
3. ページ上部の **+ サービスアカウントを作成** をクリックします。
4. サービスアカウントの名前を入力し、必要に応じて説明を追加します。
5. **作成** をクリックして、次の画面でサービスアカウントの詳細を設定します。

#### 必要なロールの割り当て:

1. Cloud Build の実行には通常、以下のロールが必要です:
   - **Cloud Build エディタ**（`roles/cloudbuild.builds.editor`）: これにより、Cloud Build がビルドを実行し、関連するリソースにアクセスすることが可能になります。
   - **ストレージ オブジェクト管理者**（`roles/storage.objectAdmin`）: ビルドプロセス中にアーティファクトやソースコードを Cloud Storage に読み書きする権限を提供します。

2. サービスアカウント作成後、IAM でサービスアカウントを選択し、**役割を追加** をクリックして上記のロールを追加します。
3. 変更を保存します。

### 2. `cloudbuild.yaml` ファイルの作成

`cloudbuild.yaml` ファイルは、Cloud Build が実行するビルドの手順を定義します。以下は基本的な `cloudbuild.yaml` の例です。

```yaml
steps:
  - name: 'gcr.io/cloud-builders/gcloud'
    args: ['version']

  - name: 'gcr.io/cloud-builders/docker'
    args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-image', '.']

images:
  - 'gcr.io/$PROJECT_ID/my-image'
```

この例では、次のことが行われます:
- `gcloud` コマンドを使用してバージョン情報を出力します。
- Docker を使用してイメージをビルドし、Google Container Registry にプッシュします。

#### `cloudbuild.yaml` ファイルをプロジェクトに追加:

1. 上記の内容を `cloudbuild.yaml` ファイルに保存し、プロジェクトのルートディレクトリに配置します。
2. Cloud Source Repositories や GitHub など、Cloud Build がアクセスできるリポジトリにプッシュします。

これで、Cloud Build が `cloudbuild.yaml` ファイルに基づいてビルドを実行できるようになります。

### ステップ 3: Artifact RegistryでのDockerレポジトリの設定

1. Navigation menu > Artifact Registryを選択します。
2. "レポジトリを作成"をクリックし、タイプに"Docker"を選択します。
3. レポジトリの名前と地域を指定します（例：doccano、asia-northeast1）。

### ステップ 4: ローカル環境でのDoccanoの設定

```bash
git clone https://github.com/doccano/doccano.git
cd doccano
# Dockerfileとtool/run.shの調整を行い、適切な設定を加える
```

### ステップ 5: Dockerfileの調整

Cloud Runでは環境変数`PORT`で動的にポートを指定します。`tool/run.sh`に以下を追加して、環境変数からポート番号を取得します。

```bash
gunicorn \
  --bind="0.0.0.0:$PORT" \
  --workers="${WORKERS:-1}" \
  --timeout=300 \
  --capture-output \
  --log-level info \
  config.wsgi &
```

またDockerfileで以下設定が記載されていることを確認して下さい。
```Dockerfile
RUN chmod +x /doccano/tools/run.sh
CMD ["/doccano/tools/run.sh"]
```
### ステップ 6: Cloud Source Repositoriesへのプッシュ

```bash
git add .
git commit -m "Prepare Doccano for Google Cloud"
git push google master
```

### ステップ 7: Cloud BuildでのビルドとArtifact Registryへのプッシュ
Cloud Build を使用して `cloudbuild.yaml` ファイルをビルドする手順を説明します。これには、Google Cloud Console または Cloud SDK コマンドライン ツール `gcloud` を使用します。

理解しました。`Dockerfile`がプロジェクトのルートディレクトリである`doccano`フォルダの`docker`サブディレクトリ内にある場合、`cloudbuild.yaml`ファイルを適切に設定して、Cloud Buildがその`Dockerfile`を認識できるようにする必要があります。

### `cloudbuild.yaml` ファイルの設定方法

1. **`cloudbuild.yaml`の設定**：
   `Dockerfile`へのパスを`cloudbuild.yaml`内で正確に指定する必要があります。次の例は、`Dockerfile`が`docker`フォルダ内にある場合の設定を示しています：
   ```yaml
   steps:
   - name: 'gcr.io/cloud-builders/docker'
     args: ['build', '-t', 'gcr.io/$PROJECT_ID/my-image', '-f', 'docker/Dockerfile', '.']
   images:
   - 'gcr.io/$PROJECT_ID/my-image'
   ```
   
   この設定では、`-f`オプションを使用して`Dockerfile`の正確な場所を指定しています。

1. **Cloud SDK（gcloud コマンドライン ツール）がインストール** されていることを確認します。インストールされていない場合は、Google Cloud の公式ドキュメントからダウンロードしてインストールしてください。
2. **プロジェクトの設定** を確認します：
   ```bash
   gcloud config set project [YOUR_PROJECT_ID]
   ```
   `[YOUR_PROJECT_ID]` には、使用する Google Cloud プロジェクトの ID を指定します。
3. **ビルドの実行**：
   ```bash
   gcloud builds submit --config cloudbuild.yaml .
   ```
   このコマンドは、カレントディレクトリの `cloudbuild.yaml` を使用してビルドプロセスを開始します。`.` はカレントディレクトリを指し、ここにソースコードが含まれていることを意味します。

これらのステップにより、Cloud Build を使って `cloudbuild.yaml` をビルドし、設定されたタスク（例えば、コンテナのビルド、テストの実行、デプロイメント等）を自動的に実行できるようになります。
### ステップ 8: Google Cloud Runへのデプロイ

環境変数として認証情報を渡しながらDoccanoをデプロイします。

```bash
gcloud run deploy doccano-service \
  --image asia-northeast1-docker.pkg.dev/[PROJECT-ID]/doccano/doccano \
  --add-cloudsql-instances [YOUR_CLOUD_SQL_INSTANCE_CONNECTION_NAME] \
  --update-env-vars DATABASE_URL=postgres://[USER]:[PASSWORD]@[HOST]:[PORT]/[DATABASE],SECRET_KEY=[YOUR_SECRET_KEY],GOOGLE_TRACKING_ID=[YOUR_TRACKING_ID] \
  --platform managed \
  --region asia-northeast1 \
  --allow-unauthenticated
```

このステップにより、DoccanoがCloud Runにデプロイされ、アプリケーションにアクセスするためのURLが提供されます。