# アップデート

> 新しいイメージを取得して、セルフホスティングの Nodaro をアップデートします。リリースタグの固定、バックアップによるメジャーバージョンへの備え、バックアップの復元によるロールバックも説明します。

Source: https://nodaro.ai/ja/docs/self-hosting/updating

セルフホスティングの Nodaro の**アップデート**とは、新しいアプリのイメージを取得して、アプリを再起動することです。同梱のスタックでは、新しいデータベースのマイグレーションが起動時に自動で適用されるため、ほかに実行するものはありません。**メジャー**バージョンの前には、リリースノートを読み、バックアップを取ってください。ダウングレードする方法がないためです。

## イメージのタグ
`main` ブランチがビルドされるたびに、アプリのイメージ `ghcr.io/nodaroai/nodaro-community` が、`latest` タグと、そのコミットのタグで公開されます。リリースでは、さらに 3 つのバージョンタグが追加されます。

| タグ | 意味 |
| --- | --- |
| `vX.Y.Z`（たとえば `v2.0.0`） | 特定の 1 つのビルドを指し、移動しません。バイト単位で変わらない安定した環境にするには、このタグに固定します。 |
| `vX.Y` | 1 つのマイナーバージョンのパッチに合わせて移動します。 |
| `vX` | 1 つのメジャーバージョン全体にわたって移動します。機能追加と修正は取り込まれますが、互換性のない変更が入ることはありません。 |
| `latest` | `main` に追従します。リリースの有無にかかわらず、メジャーバージョンも含めて、マージされたすべての変更が入ります。 |
| `<sha>` | 1 つのコミットを指し、移動しません。特定の 1 つのビルドを正確に再現する、もう 1 つの方法です。 |

タグは、`.env` の `NODARO_IMAGE` で選びます。たとえば `NODARO_IMAGE=ghcr.io/nodaroai/nodaro-community:v1.23.0` のように設定します。

## 環境をアップデートする
アプリだけをアップデートするには、次のコマンドを実行します。

```bash
docker compose -f docker-compose.community.yml pull nodaro
docker compose -f docker-compose.community.yml up -d nodaro
```

Compose ファイル、`tools/` のスクリプト、同梱のサービスもアップデートするには、次のコマンドを実行します。

```bash
git pull
docker compose -f docker-compose.community.yml pull
docker compose -f docker-compose.community.yml up -d
```

Business エディションなどで、イメージをソースからビルドしている場合は、`pull` を `build` に置き換えてください。`pull` を使うと、公開されている Community エディションのイメージがダウンロードされてしまいます。

マイグレーションは、新しいテーブルや列の追加によって、前方互換性を保つようにしています。破壊的な変更がある場合は、リリースノートで告知します。慎重に運用する必要がある場合は、タグかコミットに固定してください。

## メジャーバージョンの前に
メジャーバージョンでは、`v1` から `v2` のように、最初の数字が変わります。環境変数、Compose の構成、利用者が依存している可能性のある動作を変更できるのは、メジャーバージョンのリリースだけです。

1. [GitHub](https://github.com/nodaroai/app.nodaro.ai/releases) でリリースノートを読みます。
2. `tools/community-backup.sh` でバックアップを取ります。[バックアップと復元](https://nodaro.ai/docs/self-hosting/backups)を参照してください。
3. アップデートしてから、`/setup` を確認します。すべてのカードが緑色になっているはずです。

## ロールバックする
マイグレーションのロールバックはありません。データベースは前方にしか進みません。以前のバージョンに戻すには、次の手順を実行します。

1. アップデートの**前に**取ったバックアップを、`tools/community-restore.sh <archive>` で復元します。
2. 古いイメージに固定します。たとえば `NODARO_IMAGE=ghcr.io/nodaroai/nodaro-community:v1.25.1` のように設定します。正確な `vX.Y.Z` タグは移動しません。
3. `docker compose -f docker-compose.community.yml up -d nodaro` で起動します。

## マネージドの Supabase プロジェクトを使う場合
マイグレーションの自動実行がオフの場合は、新しいイメージで再起動する**前に**、`supabase/migrations/` にある新しいファイルをファイル名の順に適用してください。適用されていないマイグレーションがあっても、通常 API は停止しませんが、そのマイグレーションを必要とする機能は、テーブルが作成されるまで `500` を返します。[データベース](https://nodaro.ai/docs/self-hosting/database#apply-the-migrations-to-a-managed-project)を参照してください。

## 実行中のバージョン
実行中のバージョンは、アプリのサイドバーと `/health` に表示されます。バージョンをクリックすると、実行中のバージョンのリリースノートが表示されます。新しいリリースがある場合は、バージョンの横に赤い点が表示されます。このとき同じダイアログには、最新のリリースノートと、アップグレードに必要な正確なコマンドが、バックアップの手順を先頭にして表示されます。

更新チェックでは、GitHub API に 1 日 1 回、匿名のリクエストを送ります。チェックに失敗すると 5 分後に再試行し、その後は成功するまで、間隔を徐々に空けながら再試行します。

| 変数 | デフォルト | 内容 |
| --- | --- | --- |
| `NODARO_UPDATE_CHECK` | on | `off` にすると、チェックが完全に無効になります。環境からリクエストが送信されることはなくなり、`GET /v1/version` は実行中のバージョンだけを返し、サイドバーにはバージョンがただのテキストとして表示されます。インターネットから隔離された環境向けです。 |
| `NODARO_UPDATE_CHECK_TOKEN` | 空（匿名） | 更新チェックが公開のリリース一覧を読み取るときに使う GitHub トークンです。**スコープは不要**です。 |

GitHub が許可する匿名リクエストは、送信元アドレスごとに 1 時間あたり 60 回です。専用のアドレスを持つ環境では、トークンは必要ありません。アドレスをほかと共有している環境では、この上限を他人に使い切られることがあります。その場合、バージョン表示は組み込みのバージョンに戻り、再試行が成功するまで、リリースノートは空のままになります。ログに `[update-check] … read failed: HTTP 403 (rate limit: 0 of 60 left…)` という行があれば、これが原因です。トークンは `api.github.com` にだけ送信され、ログに記録されることはありません。

Compose ファイルは、`.env` のこの 2 つの変数をコンテナに渡しません。`nodaro` サービスの `environment:` に追加してください。

```yaml
nodaro:
environment:
# ...the variables already listed...
NODARO_UPDATE_CHECK: "off"
```

再起動すると反映されます。

## GitHub Actions からサーバーをアップデートする
リポジトリには、SSH 経由で Nodaro のサーバーをアップデートするワークフローの例 `examples/deploy-host.yml` が含まれています。

1. 自分のリポジトリの `.github/workflows/` にコピーします。
2. リポジトリのシークレット `DEPLOY_HOST`、`DEPLOY_USER`、`DEPLOY_SSH_KEY` を設定します。
3. スクリプト内のインストールディレクトリと Compose のコマンドを、サーバーに合わせて調整します。
4. **Actions** タブから手動で実行し、デプロイするイメージタグを選びます。

このワークフローは、サーバーに接続して `docker compose pull` と `docker compose up -d` を実行し、`/health` が応答するまで最大 90 秒待ってから、古いイメージのレイヤーを削除します。ブランチへのプッシュで、本番環境へのデプロイを開始しないでください。また、デプロイ先の環境ごとに、別のシークレット名を使ってください。

## Frequently asked questions

### セルフホスティングの Nodaro は、どうやってアップデートしますか？

docker compose -f docker-compose.community.yml pull nodaro を実行し、次に docker compose -f docker-compose.community.yml up -d nodaro を実行します。同梱のスタックでは、データベースのマイグレーションは起動時に自動で適用されます。

### どのイメージタグに固定すればよいですか？

バイト単位で変わらない安定した環境にするには、正確な vX.Y.Z タグに固定します。vX.Y は 1 つのマイナーバージョンのパッチを、vX は互換性のない変更を含まない機能追加と修正を取り込みます。latest は、メジャーバージョンも含め、マージされたすべての変更に追従します。

### 以前のバージョンにダウングレードできますか？

直接はできません。データベースのマイグレーションは、前方にしか進まないためです。アップデート前に取ったバックアップを復元してから、古いイメージタグに固定してください。メジャーバージョンの前には、毎回バックアップを取ってください。

### アップデートがあることは、どうすればわかりますか？

新しいリリースがあると、アプリのサイドバーのバージョン表示に赤い点が付きます。クリックすると、リリースノートと、アップグレードに必要な正確なコマンドが表示されます。チェックは、GitHub への 1 日 1 回の匿名リクエストです。

### インターネットから隔離された環境で、更新チェックを無効にできますか？

はい。docker-compose.community.yml の nodaro サービスの environment ブロックに、値を off にした NODARO_UPDATE_CHECK を追加します。これで環境からリクエストが送信されることはなくなり、バージョンはただのテキストとして表示されます。
