WP-12(실험 설계서 6장) vm/ai-env: apply.sh(시크릿 4종을 Secret Manager에서 파일로, 미등록이면
성능 저하 모드로 기동), compose(agent 8080·hitl 8081·rag-db pgvector 0.8.7-pg16), ai.env(Discord
서버 Selfheal Lab 1557424985793101824, approvals 1557425140302872698, escalation 1557425282363691048,
OPENAI_MODEL gpt-6.1-sol 후보), 프롬프트 3종, 러너북 11종(조치별·토폴로지·3층 절차).
WP-15(실험 설계서 4.1·4.3): apps/alloy.yaml(Alloy Helm 1.13.0 DaemonSet, 클러스터링으로 KSM·Argo CD·
cadvisor 스크랩 분산, demo 등 파드 로그 → Loki), apps/kube-state-metrics.yaml(Helm 8.6.0).
legacy-api compose에 Alloy 사이드카(up{job="legacy-api"}, 컨테이너 로그). DB VM은
vm/postgres-common/alloy.sh로 apt 설치 + prometheus.exporter.postgres(pg_replication_lag_seconds)
+ custom query pg_is_wal_replay_paused + PostgreSQL 로그.
vm/harness/apply.sh: 준비 대기 루프의 curl에 || true(러너 재기동 순간 curl 56으로 중단되던 문제,
2026-10-08 harness-sync 실측).
56 lines
2.8 KiB
Bash
Executable File
56 lines
2.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# db-replica (10.20.0.21): hot standby of db-primary via streaming replication (Terraform design 6.10;
|
|
# PostgreSQL docs 26.2.4/26.2.5). First run: pg_basebackup -R (creates standby.signal + primary_conninfo, slot replica1).
|
|
# Re-runs leave an existing standby alone. Password from Secret Manager via the VM SA.
|
|
set -euo pipefail
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
PGV=16
|
|
PRIMARY_IP=10.20.0.20
|
|
DATA=/var/lib/postgresql/${PGV}/main
|
|
CONF=/etc/postgresql/${PGV}/main
|
|
|
|
apt-get update -qq
|
|
apt-get install -y -qq postgresql-${PGV} jq >/dev/null
|
|
install -d -m 755 -o postgres -g postgres "$CONF/conf.d"
|
|
cat > "$CONF/conf.d/10-selfheal.conf" <<CONF
|
|
# managed by selfheal-lab-gitops vm/postgres-replica/apply.sh
|
|
listen_addresses = '*'
|
|
ssl = on
|
|
password_encryption = 'scram-sha-256'
|
|
hot_standby = on
|
|
log_line_prefix = '%m [%p] %u@%d '
|
|
CONF
|
|
cat > "$CONF/pg_hba.conf" <<HBA
|
|
# managed by selfheal-lab-gitops vm/postgres-replica/apply.sh
|
|
local all postgres peer
|
|
local all all peer
|
|
hostssl app app 10.10.0.0/16 scram-sha-256
|
|
hostssl app app 10.20.0.0/20 scram-sha-256
|
|
hostssl all harness 10.20.0.0/20 scram-sha-256
|
|
HBA
|
|
chown postgres:postgres "$CONF/conf.d/10-selfheal.conf" "$CONF/pg_hba.conf"; chmod 640 "$CONF/pg_hba.conf"
|
|
|
|
if [ -f "$DATA/standby.signal" ]; then
|
|
echo "already a standby; restarting to pick up config"
|
|
systemctl restart postgresql
|
|
else
|
|
PROJECT="$(curl -sf -H 'Metadata-Flavor: Google' http://metadata.google.internal/computeMetadata/v1/project/project-id)"
|
|
TOKEN="$(curl -sf -H 'Metadata-Flavor: Google' 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/token' | jq -r .access_token)"
|
|
PGPASSWORD="$(curl -sf -H "Authorization: Bearer ${TOKEN}" "https://secretmanager.googleapis.com/v1/projects/${PROJECT}/secrets/selfheal-db-password/versions/latest:access" | jq -r .payload.data | base64 -d)"
|
|
unset TOKEN; export PGPASSWORD
|
|
[ -n "$PGPASSWORD" ] || { echo "empty DB password" >&2; exit 1; }
|
|
systemctl stop postgresql
|
|
rm -rf "$DATA"
|
|
install -d -m 700 -o postgres -g postgres "$DATA"
|
|
sudo -u postgres PGPASSWORD="$PGPASSWORD" PGSSLMODE=require pg_basebackup -h "$PRIMARY_IP" -U replicator -D "$DATA" -R -X stream -C -S replica1 -P
|
|
unset PGPASSWORD
|
|
systemctl start postgresql
|
|
fi
|
|
sleep 3
|
|
echo "--- replica status"
|
|
sudo -u postgres psql -Atc "select pg_is_in_recovery()"
|
|
sudo -u postgres psql -Atc "select status, sender_host, slot_name from pg_stat_wal_receiver" 2>/dev/null || true
|
|
|
|
# --- Alloy (WP-15): postgres exporter + logs to the observability VM (reads the harness password itself) ---
|
|
bash "$(dirname "$0")/../postgres-common/alloy.sh"
|