DefectDojo Pro アップグレードガイド (Pro)
既存の DefectDojo Pro リリースを新しいチャートバージョンにアップグレードする方法について説明します。 推奨される方法は、DefectDojo OCI レジストリからチャートを直接プルすることです。この方法では zip の展開は不要です。インストール時に使用したパッケージ化された zip によるワークフローも アップグレードで利用でき、以下で説明します。
このガイドでは、以下について説明します。
- アップグレード前に
- チャートの取得元: OCI レジストリ
- レジストリへの認証
- OCI レジストリ経由でのアップグレード(推奨)
- 展開済み zip 経由でのアップグレード
- ArgoCD でのアップグレード
- アップグレードの検証
- ロールバック
- トラブルシューティング
アップグレードの対象範囲
DefectDojo Pro のリリースは、チャートバージョン、コンテナイメージのバージョン一式、Pro 設定ファイルから構成されます。これらは一緒にビルド・テストされており、常に一緒に更新する 必要があります。イメージタグだけを単独でアップグレードすることはサポートされておらず、 デプロイが壊れる原因になります。
設定についても同様です。ほぼすべてのリリースで新しい pro_settings.py が同梱されます。
アップグレードの際に古いコピーをそのまま持ち越したり、古いものを手作業でパッチ適用したり
しないでください。アプリケーションは、そのバージョンに対応した pro_settings.py を実行
する必要があります。独自のカスタマイズは local_settings.py に記述してください。この
ファイルはアップグレード時にも保持され、編集してよいのは両者のうちこちらだけです。
チャートを使用すればこの処理は自動的に行われます。チャートは対応する pro_settings.py
を同梱し、local_settings.py と並べてマウントするため、手動でコピーや移行を行う必要は
ありません。
アップグレード前に
すべてのアップグレードは同じ手順で始めるべきです。これらの手順を省略することが、 アップグレード失敗の最も一般的な原因です。
現在のリリースから移行先のバージョンまでの、すべてのバージョンのリリースノートを 読んでください。破壊的変更、新たに必須となったフィールド、移行の前提条件はここに 記載されています。各タグの GitHub リリースページから変更履歴へのリンクがあります。
現在のチャートバージョンを確認してください。 これがアップグレードの起点になります。
helm list -n $NAMESPACE helm get metadata dojopro -n $NAMESPACEデータベースをバックアップしてください。 チャートのアップグレードには、スキーマを 変更する Django マイグレーションが含まれる場合があります。作業を進める前に、 PostgreSQL インスタンスの論理ダンプ(またはストレージレベルのスナップショット)を 取得してください。
values ファイルを用意してください。 アップグレードコマンドには、インストール時に 使用したものと同じプラットフォームプリセット、プロファイルプリセット、顧客用 values ファイルを渡す必要があります。values ファイルが欠落していたり内容がずれていたりすると、 予期しない差分が生じます。
シークレットの参照が引き続き有効であることを確認してください。
--set dojo.existingSecret=...や--set license.existingSecret=...を指定して インストールした場合は、それらの Kubernetes シークレットが引き続きネームスペースに 存在することを確認してください。クラスターに手を加える前に、まずアップグレードをローカルでレンダリングして、 フィールドの欠落、無効な値、テンプレートエラーがないかを確認してください。
helm template dojopro $CHART_REF \ -n $NAMESPACE \ -f $CHART/presets/platforms/<platform>.yaml \ -f $CHART/presets/profiles/<size>.yaml \ -f my-company.yaml \ --set dojo.existingSecret=dojopro-secrets \ --set license.existingSecret=dojopro-license \ > /tmp/dojopro-upgrade-render.yaml$CHART_REFは OCI 参照(下記参照)または展開済みのチャートパスです。
NAMESPACEを一度設定してください。このガイド内のすべてのコマンドは$NAMESPACEを 使用します。NAMESPACE="dojopro"
ネットワークポリシーのデフォルトが変更されました。 NetworkPolicies は現在
networkPolicy.profileによって制御され、デフォルトはstandardです。この設定では、 すべての egress と、このリリース自身の Pod 間の ingress が許可されます(外部からの ingress は引き続き ingress パスに制限されます)。これは、これまでの常に細粒度だった egress 許可リストよりも寛容な設定です。ロックダウンされた挙動を維持したい場合は、networkPolicy.profile: aggressiveを設定し、例外設定(nodeLocalDns、dnsSelectors、externalAPIs)を見直してください。詳細は ネットワークポリシー を参照してください。
オーケストレーター用データベースの要件。 オーケストレーター(
ddorch)は<main-db-name>-ddorchという名前の 2 つ目のデータベースを使用し、存在しない場合は 起動時に作成します。アプリケーションのロールにCREATEDB権限がない場合は、ddorch を 有効にするチャートバージョンにアップグレードする前に、事前にデータベースを作成して おいてください(CREATE DATABASE "defectdojo-ddorch" OWNER defectdojo;)。作成して おかないと、ddorch の Pod はpermission denied to create database (SQLSTATE 42501)で失敗します。詳細は 事前確認: オーケストレーター(ddorch)データベース を参照してください。
Organization/Asset のリラベルのデフォルト。
dojo.V3EnableOrganizationAssetRelabelのデフォルトは現在null(自動)です。 これは新規インストールでは有効、アップグレードでは無効のままになることを意味し、 既存のリリースで UI のリラベル(ProductType/Product を Organization/Asset に 置き換える)が意図せず有効化されることはありません。アップグレード済みのリリースで これを有効にしたい場合は、dojo.V3EnableOrganizationAssetRelabel: trueを明示的に 設定してください。明示的なtrue/falseは常に自動デフォルトより優先されます。
チャートの取得元: OCI レジストリ
チャートは、OCI アーティファクトとして DefectDojo の GCP Artifact Registry に 公開されています。
oci://us-south1-docker.pkg.dev/defectdojo-container-registry/dojo-pro-helm-v2/dojopro各リリースにはチャートバージョンのタグが付けられます(例: 2.57.2)。チャートバージョンは
Chart.yaml 内のアプリバージョンと一致するため、helm upgrade --version に渡すタグは
GitHub リリースに表示されているバージョン番号と同じです。
利用可能なチャートバージョンの一覧を表示するには、次のようにします。
helm show chart \
oci://us-south1-docker.pkg.dev/defectdojo-container-registry/dojo-pro-helm-v2/dojopro \
--version <chart-version>アップグレードに OCI を使う理由。 プリセット(
presets/platforms/*.yaml、presets/profiles/*.yaml)はチャート内にパッケージ化されています。チャートを OCI URL で参照すると、対象チャートに対応した正しいバージョンのプリセットが自動的に 取得されます。再展開の手順は不要で、古いプリセットが使われる心配もありません。
レジストリへの認証
このレジストリは非公開です。Helm がチャートをプルする前に、ログインしておく必要が あります。GCP サービスアカウントキー、または DefectDojo サポートから提供される 短期間有効なアクセストークンを使用してください。
方法 A — サービスアカウントの JSON キーを使う
gcloud auth activate-service-account --key-file=/path/to/key.json
gcloud auth configure-docker us-south1-docker.pkg.dev --quiet
gcloud auth print-access-token \
| helm registry login -u oauth2accesstoken \
--password-stdin us-south1-docker.pkg.dev方法 B — 対話的な gcloud ログインを使う(レジストリへのアクセス権を持つ担当者向け)
gcloud auth login
gcloud auth configure-docker us-south1-docker.pkg.dev --quiet
gcloud auth print-access-token \
| helm registry login -u oauth2accesstoken \
--password-stdin us-south1-docker.pkg.devgcloud auth print-access-token で取得したアクセストークンは 1 時間で失効します。
アップグレード中に 401 Unauthorized が表示された場合は、helm registry login を
再実行してください。
エアギャップ環境・ファイアウォールで隔離された環境の場合: クラスターのノードは
us-south1-docker.pkg.devに到達できるが、作業用マシンからは到達できないという 場合は、以下の展開済み zip によるワークフローを使用してください。OCI による ワークフローは、helm upgradeを実行するホストがレジストリに到達できる場合にのみ 機能します。
OCI レジストリ経由でのアップグレード(推奨)
helm upgrade の参照先として OCI URL を直接指定し、--version でチャートバージョンを
固定します。values ファイル、--set フラグ、--set-file フラグはすべて、元の
インストール時と同じものを使用します。
VERSION="<chart-version>" # e.g. 2.57.2
helm upgrade dojopro \
oci://us-south1-docker.pkg.dev/defectdojo-container-registry/dojo-pro-helm-v2/dojopro \
--version $VERSION \
-n $NAMESPACE \
-f presets/platforms/<platform>.yaml \
-f presets/profiles/standard.yaml \
-f my-company.yaml \
--set dojo.existingSecret=dojopro-secrets \
--set license.existingSecret=dojopro-license \
--set-file ddorch.tls.rootCa=orch_ca.crt \
--set-file ddorch.tls.cert=orch_server.crt \
--set-file ddorch.tls.key=orch_server.key \
--wait --timeout 15m上記のプラットフォームおよびプロファイルのプリセットパスは
presets/platforms/...($CHART/プレフィックスなし)です。Helm が OCI からチャートをプルすると、 プリセットはプルされたチャート内に存在しますが、ここでの-fはそれらファイルの ローカルコピーを指しています。プリセットのローカルコピーを保持していない場合は、 まずhelm pull oci://... --version $VERSION --untarでチャートを展開し、展開した ディレクトリから参照してください。あるいは、展開済み zip によるワークフローを 使用してください。
シークレットとライセンスファイルをインラインで指定するバリエーション:
helm upgrade dojopro \
oci://us-south1-docker.pkg.dev/defectdojo-container-registry/dojo-pro-helm-v2/dojopro \
--version $VERSION \
-n $NAMESPACE \
-f presets/platforms/<platform>.yaml \
-f presets/profiles/standard.yaml \
-f my-company.yaml \
-f my-secrets.yaml \
--set-file license.contents=/path/to/license.lic \
--set-file ddorch.tls.rootCa=orch_ca.crt \
--set-file ddorch.tls.cert=orch_server.crt \
--set-file ddorch.tls.key=orch_server.key \
--wait --timeout 15m
--versionは必ず固定してください。省略すると、コマンド実行時点でレジストリが 解決したタグが使用されてしまい、再現性も監査可能性もありません。再実行、ロール バック、インシデント対応のすべてが同じアーティファクトを参照するように、 バージョンを固定してください。
展開済み zip 経由でのアップグレード
OCI レジストリに到達できない作業用マシンの場合や、チャートをローカルファイルとして
用意しておきたい場合は、GitHub リリースからのパッケージ済み zip がインストール時と
同じ方法でアップグレード時にも機能します。インストール時との違いは、コマンドの動詞
(helm install ではなく helm upgrade)だけです。
GitHub リリースから
dojo-pro-helm-bundled-<version>.zip(および分離署名の.asc)をダウンロードします。インストールガイドに記載されている手順に従い、公開鍵 (
dojo-pro-release-signing.asc)を使って署名を検証します。プリセットが古い展開結果と衝突しないように、チャートをバージョンごとのパスに 展開します。
unzip dojo-pro-helm-bundled-<version>.zip -d /tmp/dojopro-<version> cd /tmp/dojopro-<version> mkdir -p dojopro-<version> tar -xzf dojopro-<version>.tgz -C dojopro-<version>/ CHART="/tmp/dojopro-<version>/dojopro-<version>/dojopro"展開したチャートパスを使ってアップグレードを実行します。values ファイルと フラグは元のインストール時と同じものを使用します。
helm upgrade dojopro $CHART \ -n $NAMESPACE \ -f $CHART/presets/platforms/<platform>.yaml \ -f $CHART/presets/profiles/standard.yaml \ -f my-company.yaml \ --set dojo.existingSecret=dojopro-secrets \ --set license.existingSecret=dojopro-license \ --set-file ddorch.tls.rootCa=orch_ca.crt \ --set-file ddorch.tls.cert=orch_server.crt \ --set-file ddorch.tls.key=orch_server.key \ --wait --timeout 15m
アップグレードのたびに再展開してください。 プリセットファイルはチャート バージョン間で更新されます。古い展開結果を使い回すと、気付かないうちにアップ グレードが古いプリセットのデフォルト値に固定されてしまいます。
ArgoCD でのアップグレード
DefectDojo Pro を ArgoCD で管理している場合、アップグレードは Application 仕様内の
targetRevision を変更するだけで完了します。プラットフォームおよびプロファイルの
プリセットはチャート内でバージョン管理されているため、連動して更新されます。
spec:
source:
repoURL: us-south1-docker.pkg.dev/defectdojo-container-registry/dojo-pro-helm-v2
chart: dojopro
targetRevision: <chart-version> # bump this
helm:
valueFiles:
- presets/platforms/aws-eks.yaml
- presets/profiles/standard.yaml
values: |
# your environment-specific values
parameters:
- name: dojo.existingSecret
value: dojopro-secrets
- name: license.existingSecret
value: dojopro-licensetargetRevision を編集したら Application を同期してください。ArgoCD が OCI
レジストリから新しいチャートをプルし、リコンサイルを行います。
ArgoCD は OCI レジストリ用に独自の認証情報を必要とします。リポジトリシークレットには
type: helmとenableOCI: "true"を設定してください。Secret の正確な形式に ついては、ArgoCD の Helm OCI ドキュメント を参照してください。
アップグレードの検証
helm upgrade が完了したら(あるいは ArgoCD が Synced / Healthy を報告したら)、
新しいリビジョンが稼働していることを確認します。
# Chart revision bumped and status is deployed
helm list -n $NAMESPACE
# All pods Running and Ready — expect django, celery worker/beat,
# connectors, ddorch, ddorch-workers, and (if enabled) mcp-server
kubectl get pods -n $NAMESPACE
# Migrations succeeded — the initializer job should show Completed
kubectl get jobs -n $NAMESPACE
# App version matches the target
kubectl get deployment -n $NAMESPACE \
-o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.template.spec.containers[*].image}{"\n"}{end}'ログインページにアクセスし、UI が表示され、管理者ユーザーが認証できることを
確認してください。プログラムによるチェックを行う場合、アプリケーションが
正常であれば /login/ エンドポイントは 200 を返します。
ロールバック
Helm はリビジョンごとにリリース履歴を保持します。アップグレードによって動作が 悪化した場合は、直前のリビジョンにロールバックしてください。
# Inspect history
helm history dojopro -n $NAMESPACE
# Roll back to the previous revision
helm rollback dojopro <previous-revision> -n $NAMESPACE --wait --timeout 15mデータベースマイグレーションはロールバックされません。 Helm のロールバックは マニフェストの状態(イメージ、設定、シークレット)を復元しますが、
migrate --revertは実行しません。アップグレードで適用されたスキーマの マイグレーションを取り消す必要がある場合は、 アップグレード前にで取得したバックアップから復元するか、 Helm リリースをロールバックする前に DefectDojo サポートと調整のうえ、手動で マイグレーションを取り消してください。
ArgoCD を使用している場合は、git 上で targetRevision の変更を取り消す
(または argocd app rollback を使用する)ことでロールバックし、同期を行います。
トラブルシューティング
チャートのプル時に 401 Unauthorized が発生する。
アクセストークンが失効しています。gcloud auth print-access-token を再取得した
うえで、helm registry login を再実行してください。
Error: UPGRADE FAILED: cannot patch ... field is immutable。
セレクターなど、変更不可なフィールドがずれています。このチャートは安定した
セレクターラベルを固定しているため、通常はこれは以前に Deployment を直接
編集したことが原因です。差分を記録し、問題のあるリソースを削除してから、
Helm がそれを再作成するようアップグレードを再実行してください。
Error: UPGRADE FAILED: conflict occurred while applying object ... conflict with "kubectl-edit" ... .spec.replicas。
Helm 4 はサーバーサイド適用を使用しており、フィールドの所有権を追跡します。この
エラーは、kubectl edit、kubectl scale、または HPA コントローラー
(kube-controller-manager)など、別のマネージャーが Helm によってレンダリングされる
フィールド(最も多いのは .spec.replicas)を変更したことを意味します。次の
コマンドで一度だけ所有権を取り戻してください。
helm upgrade ... --force-conflictsこの修正が適用されたチャートバージョンでは、HPA が有効な Deployment から
replicas が省略されるため、HPA によるスケーリングがアップグレードと競合しなく
なります。kubectl で Deployment を手動でスケールした場合は、チャートが所有権を
保持し続けられるよう、対応する replicas/horizontalpodautoscaler の値を調整する
ことをお勧めします。
Error: UPGRADE FAILED: timed out waiting for the condition。
Pod が --timeout の時間内に Ready 状態にならなかった場合です。遅延している
ワークロードを確認してください。
kubectl describe pod -n $NAMESPACE <pod>
kubectl logs -n $NAMESPACE <pod> --all-containers --tail=200よくある原因: イメージのプル失敗(レジストリ認証)、スキーマのマイグレーションが
まだ実行中(--timeout を増やす)、FQDN の設定ミスによる readiness プローブの
失敗などです。
バージョン間でプリセットが変更され、values ファイルが競合するようになった。
helm template で再レンダリングし(アップグレード前にを
参照)、helm upgrade を実行する前に、上書き設定を新しいプリセットのデフォルト
値と突き合わせて調整してください。
values don't meet the specifications of the schema ... got string, want boolean。
上書き設定内の on/off の値が引用符で囲まれています。Helm は "false" を空でない
文字列として扱い、空でない文字列は truthy と評価されるため、オフにしたつもりの
機能がオンになってしまいます。スキーマは現在、この引用符付きの形式を素通り
させず拒否するようになっています。引用符を外してください。
networkPolicy:
enabled: "false" # wrong: turns network policies ON
enabled: false # rightエラーメッセージには問題のあるパスが示されます。引用符なしの false、no、
off はいずれも実際のブール値として解釈され、受け入れられます。