すべての記事
Getting Started
CICDoo とは はじめに: オンボーディングウィザード ダッシュボードとインフラマップConcepts
本番、ステージング、開発の各ステージ ドメイン、サブドメイン、SSL Odoo のバージョンとエディション(Community と Enterprise) ワークスペースとチームでの共同作業Servers
サーバーの追加 サーバーのドメインと DNS ロードバランサーを使う サーバーの操作: デプロイ、ログ、チャートProjects & Git
プロジェクトの作成 GitHub の接続 GitLab の接続 ブランチとインスタンス プロジェクトのタグ付けと絞り込み アプリノードによる高可用性Instances & Console
インスタンスの作成 インスタンスの再起動、停止、削除 ステージ間でのブランチのマージ Web IDE とリモートアクセス インスタンス設定の説明 デプロイとジョブキューAgent Tasks
エージェントタスクとは エージェントタスクの設定 タスクの実行と結果の確認 エージェント時間と追加購入Monitoring & Backups
インスタンスのモニタリング バックアップと復元 アラート通知(メールと SMS)Workspaces & Permissions
ワークスペースメンバーの招待 メンバーの権限とリソースへのアクセス メンバーがリソースを表示または使用できないAccount & Security
二要素認証(2FA) プロフィールと連携の設定 パスワードとアカウントの復旧Billing & Plans
プランと料金 アップグレードとサブスクリプションの管理 プロジェクトのサブスクリプションが未払いの場合 チャネルパートナープログラムSupport & Tickets
サポートチケットの作成 CICDoo チームのサポートを受けるTroubleshooting
トラブルシューティング: サーバーを接続できない トラブルシューティング: デプロイが失敗した トラブルシューティング: リポジトリ移動後に git push が 403 で失敗する トラブルシューティング: インスタンスが停止している、または遅い トラブルシューティング: ドメインまたは SSL の問題プロジェクトと Git
アプリノードによる高可用性
データベースを実行するプライマリプロジェクトと、それを提供するアプリノードで、1 つの本番 Odoo データベースを複数のサーバーで動かす方法を説明します。
仕組み
高可用性を使うと、1 つの Odoo データベースの本番環境を複数のサーバーで同時に動かせます。あるサーバーが応答しなくなると、訪問者はほかのサーバーに振り向けられます。
クラスターは、同じコードを実行するプロジェクトで構成されます:
- プライマリ: 本番インスタンスが Odoo とデータベースを実行するプロジェクトです。そのデータベースはアプリノードにだけ公開され、それ以外には公開されません。
- アプリノード: それぞれ別の本番サーバー上にあるほかのプロジェクトで、本番インスタンスは Odoo だけを実行し、プライマリのデータベースを使います。
訪問者はプライマリのアドレスを使います。CICDoo はそのアドレスをプライマリと応答しているすべてのアプリノードに向け、数分ごとに各ノードを確認します。応答しなくなったノードは、回復するまでアドレスから外されます。
データベース自体は引き続き 1 台のサーバー、つまりプライマリのサーバーで動きます。アプリノードは Odoo 側を冗長化するものです。プライマリのサーバーが停止すると、サイトも一緒に停止します。
始める前に
- 同じコード: クラスター内のすべてのプロジェクトは、同じリポジトリ、デフォルトブランチ、Odoo のバージョン、エディションを使う必要があります。Time Machine がオンの場合は、固定されたコミットも一致している必要があります。
- 別々のサーバー: 各アプリノードには、プライマリやほかのノードとは異なる、専用の本番サーバーが必要です。
- Cloudflare プロキシ: ノード間でトラフィックを分散する機能は、現在 Cloudflare プロキシが有効なサーバーで動作します。アプリノードが返すすべてのページがプライマリのデータベースと通信するため、同じリージョンのサーバーを使ってください。
- 共有ファイルストア: クラスター内のすべてのサーバーは、Odoo のファイルストア用に同じ共有ストレージをマウントする必要があります。これがないと、あるノード経由でアップロードした添付ファイルがほかのノードにはなく、別のノードにたどり着いた訪問者はログアウトされます。設定に手助けが必要な場合はサポートにお問い合わせください。
- データベース接続: 各アプリノードは、プライマリのデータベースに独自の接続を開きます。ノードを追加するにつれて、プライマリの本番インスタンスのコンソールにある 設定 タブの PostgreSQL 設定 で max_connections を引き上げてください。
高可用性の設定は、プロジェクト設定 の 詳細設定 タブにある 高可用性 カードにあります。プロジェクトの設定を変更する権限が必要です。
プライマリを設定する
データベースを実行するプロジェクトを開き、プロジェクト設定 > 詳細設定 に移動して、高可用性 で 役割 を プライマリ(アプリ + データベース) に設定します。適用 をクリックして確定します。
本番インスタンスが再起動します。再起動後、そのデータベースはクラスターのアプリノードからの接続を受け付けます。サーバー同士がプライベートネットワークを共有していない限り、サーバー間の接続は暗号化されます。
本番インスタンスは、同梱の専用データベースを使う必要があります。本番インスタンスが外部データベースを指しているプロジェクトは、プライマリになれません。
アプリノードを追加する
通常どおりノード用のプロジェクトを作成します。同じリポジトリとデフォルトブランチ、同じバージョンとエディション、そして専用の本番サーバーを使います。そのプロジェクトにあるステージングと開発のインスタンスはすべて削除してください。アプリノードは本番だけを実行し、ステージングと開発のブランチはプライマリのプロジェクトに置きます。
次に、ノードの プロジェクト設定 > 詳細設定 を開き、役割 を アプリノード(プライマリのデータベースを使用) に設定し、データベースの提供元 でプライマリを選んで、適用 をクリックして確定します。選択肢に表示されるのは、同じワークスペースにあり同じコードを実行しているプライマリだけです。
ノードはすぐには起動しません。まずプライマリのサーバーがノードを許可する必要があり、これは次回の確認時に行われ、通常は 5 分以内です。それまでカードには "プライマリがこのノードを許可するのを待っています。" と表示され、許可されるとすぐにノードが自動で起動します。ノードが応答し始めて数分後に、訪問者を受け付け始めます。
プライマリでは、高可用性 カードにアプリノードの一覧と、データベースサーバーが現在のアクセスリストを適用済みかどうかが表示されます。
アプリノードで変わること
- 本番インスタンスには専用のデータベースがありません。データベースの設定は CICDoo が管理し、インスタンスの Odoo 設定では変更できません。
- スケジュールされたジョブ(Odoo の cron)はプライマリでのみ実行されます。
- バックアップはプライマリで取得されます。クラスターのデータベースのバックアップと復元は、プライマリのプロジェクトから行ってください。
- アプリノードのブランチにプッシュしても、それだけでは何も起きません。クラスターはプライマリから更新されます。
更新をデプロイする
いつもどおりプライマリのブランチにプッシュします。すると CICDoo がクラスター全体を順番に更新します:
- 各アプリノードを停止します。
- ほかのサーバーがデータベースを使っていない状態で、モジュールのアップグレードも含めてプライマリを更新します。
- 新しいコードで各アプリノードを再び起動します。
各ステップは、それが実行されるインスタンスの キュー タブで確認できます。プライマリの更新が失敗すると、アプリノードは再起動されず、そのキューのエントリに理由が表示されます。問題を修正して、もう一度デプロイしてください。
モジュールのアップグレードにはデータベースを占有する必要があるため、単一のインスタンスの場合と同じく、プライマリの更新中はサイトを利用できません。
クラスターから外れる
アプリノードを外すには、その 役割 を スタンドアロン(独自のデータベース) に戻し、適用 をクリックします。ノード自身のデータベースにはクラスターのデータがないため、本番インスタンスは停止します。再び起動する前に、バックアップを復元してください。
アプリノードが残っている間は、プライマリを変更できません。先にノードを外してください。
トラブルシューティング
- ノードが許可を待ち続ける: プライマリの本番インスタンスが実行中で、そのサーバーがオンラインであることを確認してください。プライマリになった後に一度再起動しないと、どのノードも許可されません。
- ノードは起動するが Odoo が立ち上がらない: ノードのログを開いてください。プライマリのデータベースが初期化されていないというメッセージがあれば、プライマリが最初の起動をまだ終えていません。
- アップロードやログインがノード間で訪問者についてこない: サーバーがファイルストアを共有していません。上の "始める前に" を参照してください。
インスタンスとブランチの対応については ブランチとインスタンス を、別の機能であるサーバー単位のロードバランサー設定については ロードバランサーを使う を参照してください。
まだ解決しませんか?アプリからチケットを作成するか、エンジニアに相談してください。