/** * WPML compatibility functions * * @global array $duplicated_posts Array to store the posts being duplicated. * * @package Yoast\WP\Duplicate_Post * @since 3.2 */ add_action( 'admin_init', 'duplicate_post_wpml_init' ); /** * Add handlers for WPML compatibility. */ function duplicate_post_wpml_init() { if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'shutdown', 'duplicate_wpml_string_packages', 11 ); } } global $duplicated_posts; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: Renaming a global variable is a BC break. $duplicated_posts = []; /** * Copy post translations. * * @global SitePress $sitepress Instance of the Main WPML class. * @global array $duplicated_posts Array of duplicated posts. * * @param int $post_id ID of the copy. * @param WP_Post $post Original post object. * @param string $status Status of the new post. */ function duplicate_post_wpml_copy_translations( $post_id, $post, $status = '' ) { global $sitepress; global $duplicated_posts; remove_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10 ); remove_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10 ); $current_language = $sitepress->get_current_language(); $trid = $sitepress->get_element_trid( $post->ID ); if ( ! empty( $trid ) ) { $translations = $sitepress->get_element_translations( $trid ); $new_trid = $sitepress->get_element_trid( $post_id ); foreach ( $translations as $code => $details ) { if ( $code !== $current_language ) { if ( $details->element_id ) { $translation = get_post( $details->element_id ); if ( ! $translation ) { continue; } $new_post_id = duplicate_post_create_duplicate( $translation, $status ); if ( ! is_wp_error( $new_post_id ) ) { $sitepress->set_element_language_details( $new_post_id, 'post_' . $translation->post_type, $new_trid, $code, $current_language ); } } } } // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: see above. $duplicated_posts[ $post->ID ] = $post_id; } } /** * Duplicate string packages. * * @global array() $duplicated_posts Array of duplicated posts. */ function duplicate_wpml_string_packages() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: renaming the function would be a BC-break. global $duplicated_posts; foreach ( $duplicated_posts as $original_post_id => $duplicate_post_id ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $original_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $original_post_id ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $new_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $duplicate_post_id ); if ( is_array( $original_string_packages ) ) { foreach ( $original_string_packages as $original_string_package ) { $translated_original_strings = $original_string_package->get_translated_strings( [] ); foreach ( $new_string_packages as $new_string_package ) { $cache = new WPML_WP_Cache( 'WPML_Package' ); $cache->flush_group_cache(); $new_strings = $new_string_package->get_package_strings(); foreach ( $new_strings as $new_string ) { if ( isset( $translated_original_strings[ $new_string->name ] ) ) { foreach ( $translated_original_strings[ $new_string->name ] as $language => $translated_string ) { do_action( // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. 'wpml_add_string_translation', $new_string->id, $language, $translated_string['value'], $translated_string['status'] ); } } } } } } } } dev-portal – Raqqa

dev-portal

Offshore Task List (PR = Task Ticket) / オフショア作業チケット一覧

Scope / スコープ
EN: AWS production deployment for the Portal API (search-only mode). CI/CD is build-only skeleton; no auto-deploy in this phase.
JP: Portal API の AWS 本番デプロイ(検索専用モード)。CI/CD はビルドのみのスケルトンで、自動デプロイは本フェーズ対象外。


PR-01 — Finalize prod Overlay (No Cron) / 本番オーバーレイ確定(Cron なし)

Goal / 目的
EN: Production runs search-only; Cron resources excluded or suspended.
JP: 本番は検索専用で稼働。Cron リソースは出力から除外または停止。

Files / 変更ファイル
EN: Modify k8s/overlays/prod/kustomization.yaml and ensure only API/Chroma/Ingress render.
JP: k8s/overlays/prod/kustomization.yaml を修正し、API/Chroma/Ingress のみがレンダリングされる状態に。

Definition of Done (DoD) / 受け入れ基準
EN: kubectl kustomize k8s/overlays/prod | grep -i cron shows nothing; kubectl apply -k works.
JP: kubectl kustomize k8s/overlays/prod | grep -i cron の結果が空で、kubectl apply -k が成功する。


PR-02 — Production Secrets Wiring (DB / Auth) / 本番シークレット配線(DB/認証)

Goal / 目的
EN: Provide DB and Auth secrets (examples + references).
JP: DB と認証のシークレット(サンプルと参照設定)を提供。

Files / 変更ファイル
EN: Add secret-api-db.example.yaml, secret-api-auth.example.yaml, update patch-api-env-from-secret.yaml.
JP: secret-api-db.example.yamlsecret-api-auth.example.yaml を追加し、patch-api-env-from-secret.yaml を更新。

Definition of Done (DoD) / 受け入れ基準
EN: With real secrets, /health/ready = 200.
JP: 実シークレット適用時に /health/ready = 200 を返す。


PR-03 — RDS Connectivity via ExternalName / ExternalName による RDS 接続

Goal / 目的
EN: postgres Service points to RDS endpoint.
JP: postgres Service が RDS エンドポイントを参照。

Files / 変更ファイル
EN: Add external-postgres.yaml (Service: ExternalName).
JP: external-postgres.yaml を追加(Service: ExternalName)。

Definition of Done (DoD) / 受け入れ基準
EN: API connects to postgres:5432.
JP: API から postgres:5432 へ接続できる。


PR-04 — Portal API Prod Env (JWKS / Read-Only Stance) / 本番環境設定(JWKS/Read-Only 方針)

Goal / 目的
EN: APP_ENV=prod, AUTH_MODE=jwks, with graceful shutdown.
JP: APP_ENV=prodAUTH_MODE=jwks を設定し、Graceful Shutdown を有効化。

Files / 変更ファイル
EN: Update patch-api-env-from-secret.yaml, patch-api-prestop.yaml.
JP: patch-api-env-from-secret.yamlpatch-api-prestop.yaml を更新。

Definition of Done (DoD) / 受け入れ基準
EN: Invalid token → 401/403; /health/ready = 200.
JP: 不正トークンで 401/403/health/ready = 200


PR-05 — ALB Ingress (TLS + Hostname) / ALB Ingress(TLS+ホスト名)

Goal / 目的
EN: Public HTTPS access via AWS Load Balancer Controller + ACM.
JP: AWS Load Balancer Controller と ACM により、HTTPS で公開アクセス。

Files / 変更ファイル
EN: Add ingress-portal-api.yaml.
JP: ingress-portal-api.yaml を追加。

Definition of Done (DoD) / 受け入れ基準
EN: HTTPS host returns 200 for /health/ready.
JP: HTTPS ホストの /health/ready200 を返す。


PR-06 — NetworkPolicies (Least Privilege) / NetworkPolicy(最小権限)

Goal / 目的
EN: Restrict ingress to API from ALB; restrict egress to Chroma + Postgres only.
JP: API への Ingress を ALB のみに制限し、Egress は Chroma と Postgres のみに制限。

Files / 変更ファイル
EN: Add netpol-allow-api.yaml, netpol-api-egress.yaml.
JP: netpol-allow-api.yamlnetpol-api-egress.yaml を追加。

Definition of Done (DoD) / 受け入れ基準
EN: Non-whitelisted egress blocked; required paths allowed.
JP: 許可リスト外の Egress は遮断、必要経路は通過。


PR-07 — Chroma (Search-Only, Stable Resources) / Chroma(検索専用・安定稼働)

Goal / 目的
EN: Ensure Chroma resources (PVC/probes) are stable.
JP: Chroma のリソース(PVC/Probes)を安定化。

Files / 変更ファイル
EN: Add/modify patch-chroma-resources.yaml.
JP: patch-chroma-resources.yaml を追加/修正。

Definition of Done (DoD) / 受け入れ基準
EN: /api/v1/heartbeat healthy.
JP: /api/v1/heartbeat が正常。


PR-08 — Ingress Smoke Script / Ingress スモークスクリプト

Goal / 目的
EN: One-command smoke checks with Bearer token.
JP: Bearer トークン付きで 1 コマンドのスモークチェックを実行可能に。

Files / 変更ファイル
EN: Add scripts/smoke_prod.sh; doc in docs/RUNBOOK-PROD.md.
JP: scripts/smoke_prod.sh を追加し、docs/RUNBOOK-PROD.md に手順を記載。

Definition of Done (DoD) / 受け入れ基準
EN: Script shows expected 200/401/403.
JP: スクリプト出力が想定どおり 200/401/403 を示す。


PR-09 — RUNBOOK-PROD (Ops) / 運用ランブック(本番)

Goal / 目的
EN: Document deploy, rollback, secret rotation, kill switches.
JP: デプロイ、ロールバック、シークレットローテーション、キルスイッチの手順を文書化。

Files / 変更ファイル
EN: Add docs/RUNBOOK-PROD.md.
JP: docs/RUNBOOK-PROD.md を追加。

Definition of Done (DoD) / 受け入れ基準
EN: Another engineer can operate prod following the doc alone.
JP: 別のエンジニアがこの文書だけで本番運用できる。


PR-10 — CI Skeleton (Build Only) / CI スケルトン(ビルドのみ)

Goal / 目的
EN: Build images on tag push; no deploy.
JP: タグ push をトリガにイメージをビルド(デプロイなし)。

Files / 変更ファイル
EN: Add .github/workflows/build.yml.
JP: .github/workflows/build.yml を追加。

Definition of Done (DoD) / 受け入れ基準
EN: Tag push publishes image to GHCR.
JP: タグ push で GHCR にイメージが公開される。


PR-11 — PROD_PARAMS (Environment Matrix) / 本番パラメータ表

Goal / 目的
EN: Capture all prod parameters in one place.
JP: 本番の全パラメータを 1 箇所に集約。

Files / 変更ファイル
EN: Add docs/PROD_PARAMS.md (Region, VPC, Subnets, RDS endpoint, ACM ARN, Host, JWKS URI, Audience/Scope, PVC sizes).
JP: docs/PROD_PARAMS.md を追加(Region, VPC, Subnets, RDS endpoint, ACM ARN, Host, JWKS URI, Audience/Scope, PVC sizes など)。

Definition of Done (DoD) / 受け入れ基準
EN: Parameter sheet complete.
JP: パラメータ表が網羅的に埋まっている。


PR-12 — (Optional) SecurityContext Hardening / (任意)SecurityContext 強化

Goal / 目的
EN: runAsNonRoot, readOnlyRootFilesystem, etc.
JP: runAsNonRootreadOnlyRootFilesystem などの適用。

Files / 変更ファイル
EN: Add patch-api-security.yaml.
JP: patch-api-security.yaml を追加。

Definition of Done (DoD) / 受け入れ基準
EN: No basic pod security warnings.
JP: Pod セキュリティの基本的な警告が出ない。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です