release 1.13.6: env-only machine paths and SSH hosts

Load ~/.config/taler-monitoring/env (taler-monitoring-env profiles)
before suite defaults. Drop hardcoded operator homes and host aliases
from scripts; apply/staging/www/secrets/wallet via env.
This commit is contained in:
Hernâni Marques 2026-07-19 03:33:12 +02:00
parent d7a0ceb90b
commit 0c94fb3d2e
No known key found for this signature in database
GPG key ID: CB5738652768F7E9
32 changed files with 175 additions and 157 deletions

View file

@ -138,7 +138,7 @@ Each check prints **global** and **grouped** ids:
# inside: low-priv SSH francpaysan-stage-user (User stagepaysan) → podman # inside: low-priv SSH francpaysan-stage-user (User stagepaysan) → podman
# containers stage-lfp-{bank,exchange-ansible,merchant} · ports 9032/9031/9030 # containers stage-lfp-{bank,exchange-ansible,merchant} · ports 9032/9031/9030
# stats: outside-in public …/intro/stats.json (age via generated_at_unix) # stats: outside-in public …/intro/stats.json (age via generated_at_unix)
# Admin credit for e2e: E2E_BANK_ADMIN_PASS=… or francpaysan-host secrets # Admin credit for e2e: E2E_BANK_ADMIN_PASS=… or stage host secrets
# (bank-admin-password.txt under /mnt/data/stagepaysan/bank/secrets/) # (bank-admin-password.txt under /mnt/data/stagepaysan/bank/secrets/)
# Override: INSIDE_SSH=… INSIDE_PROFILE=stage-lfp # Override: INSIDE_SSH=… INSIDE_PROFILE=stage-lfp
@ -374,7 +374,7 @@ snapshotted via SSH whenever the stack is under load:
```bash ```bash
# LAN down? force WAN DNAT host # LAN down? force WAN DNAT host
KOOPA_SSH=koopa-external ./taler-monitoring.sh inside KOOPA_SSH=koopa-external ./taler-monitoring.sh inside
# or rely on automatic fallback (default KOOPA_SSH_FALLBACKS=koopa-external) # or rely on automatic fallback (KOOPA_SSH_FALLBACKS from env)
METRICS_LOAD=0 ./taler-monitoring.sh e2e # skip host probes METRICS_LOAD=0 ./taler-monitoring.sh e2e # skip host probes
LADDER_LOAD=0 ./taler-monitoring.sh ladder LADDER_LOAD=0 ./taler-monitoring.sh ladder
@ -383,7 +383,7 @@ LADDER_LOAD=0 ./taler-monitoring.sh ladder
| Env | Default | Meaning | | Env | Default | Meaning |
|-----|---------|---------| |-----|---------|---------|
| `KOOPA_SSH` | `koopa` | primary SSH host | | `KOOPA_SSH` | `koopa` | primary SSH host |
| `KOOPA_SSH_FALLBACKS` | `koopa-external` | tried if primary fails | | `KOOPA_SSH_FALLBACKS` | *(from env)* | tried if primary fails |
| `METRICS_LOAD` | `1` | `0` = skip all host/container load probes | | `METRICS_LOAD` | `1` | `0` = skip all host/container load probes |
| `LADDER_LOAD` | `1` | `0` = skip load in ladder only | | `LADDER_LOAD` | `1` | `0` = skip load in ladder only |
| `LADDER_PAY` | `1` | `0` = skip payment ladder after withdraws | | `LADDER_PAY` | `1` | `0` = skip payment ladder after withdraws |
@ -393,7 +393,7 @@ LADDER_LOAD=0 ./taler-monitoring.sh ladder
## Needs ## Needs
- SSH `koopa` or `koopa-external` (inside / load / sanity server bits) - SSH via `KOOPA_SSH` / `KOOPA_SSH_FALLBACKS` (env) (inside / load / sanity server bits)
- secrets under `koopa-admin-secrets/...` for e2e - secrets under `koopa-admin-secrets/...` for e2e
- `taler-wallet-cli` for e2e - `taler-wallet-cli` for e2e
@ -418,7 +418,7 @@ Soft mode only with `MONPAGES_REQUIRE_PUBLIC=0` (escape hatch).
./taler-monitoring.sh -d lefrancpaysan.ch monpages ./taler-monitoring.sh -d lefrancpaysan.ch monpages
``` ```
If pages are missing publicly: `sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh` on koopa If pages are missing publicly: `sudo $APPLY_MONITORING_LIVE` on koopa
(FP: Infomaniak vhost for `/monitoring*`). (FP: Infomaniak vhost for `/monitoring*`).
## Devtesting · fake-franken CHF (v1.13+) ## Devtesting · fake-franken CHF (v1.13+)

View file

@ -126,7 +126,7 @@ When filing an issue, quote the full id + label, e.g.
| **aptdeploy.trixie-upgrade-** | upgrade-track `…-trixie-upgrade` (install once, then mytops-style upgrade) | | **aptdeploy.trixie-upgrade-** | upgrade-track `…-trixie-upgrade` (install once, then mytops-style upgrade) |
| **aptdeploy.trixie-testing-upgrade-** | upgrade-track `…-trixie-testing-upgrade` | | **aptdeploy.trixie-testing-upgrade-** | upgrade-track `…-trixie-testing-upgrade` |
Standalone: `host-agent/run-aptdeploy.sh` (on koopa local; else `ssh koopa-external`). Standalone: `host-agent/run-aptdeploy.sh` (on koopa local; else ssh `$DEPLOY_SSH` / `$APT_DEPLOY_SSH`).
### surface (remote-only public inventory) ### surface (remote-only public inventory)

View file

@ -1 +1 @@
1.13.5 1.13.6

View file

@ -17,6 +17,7 @@ Git tags: `vMAJOR.FEATURE.FIX` (e.g. `v1.8.0`). File `VERSION` omits the `v` pre
| Tag | Date (UTC) | Notes | | Tag | Date (UTC) | Notes |
|-----|------------|--------| |-----|------------|--------|
| **v1.13.6** | 2026-07-19 | **Bugfix:** machine paths and SSH hosts only via env (`~/.config/taler-monitoring/env` / `taler-monitoring-env`); suite loads env before defaults; no `/home/hernani` or bogus host hardcodes. |
| **v1.13.5** | 2026-07-19 | **Bugfix:** progress bar — env-aware phase estimates (CHECK_BANK/LANDING, mon hosts); re-fit total after each phase (done+remaining); drop fake +12 for host-agent monpages post-check (fixes stage 42/139→46/46 snap). | | **v1.13.5** | 2026-07-19 | **Bugfix:** progress bar — env-aware phase estimates (CHECK_BANK/LANDING, mon hosts); re-fit total after each phase (done+remaining); drop fake +12 for host-agent monpages post-check (fixes stage 42/139→46/46 snap). |
| **v1.13.4** | 2026-07-19 | **Bugfix:** monpages race-proof — atomic HTML write; rsync `--delay-updates` + settle; fetch retries; larger head windows; pre-publish soft content (`MONPAGES_PRE_PUBLISH`); bootstrap markers. | | **v1.13.4** | 2026-07-19 | **Bugfix:** monpages race-proof — atomic HTML write; rsync `--delay-updates` + settle; fetch retries; larger head windows; pre-publish soft content (`MONPAGES_PRE_PUBLISH`); bootstrap markers. |
| **v1.13.3** | 2026-07-19 | **Bugfix:** sticky **generated** time in **Europe/Zurich** (CEST/CET · MESZ/MEZ), not UTC `…Z`; ISO keeps offset for age JS. | | **v1.13.3** | 2026-07-19 | **Bugfix:** sticky **generated** time in **Europe/Zurich** (CEST/CET · MESZ/MEZ), not UTC `…Z`; ISO keeps offset for age JS. |

View file

@ -91,7 +91,7 @@ if [[ -z "${EXP_PW_FILE:-}" ]]; then
fi fi
# stage: try stagepaysan secret via ssh if missing # stage: try stagepaysan secret via ssh if missing
if [[ ! -f "${EXP_PW_FILE:-}" && "$STACK" = "stage" ]]; then if [[ ! -f "${EXP_PW_FILE:-}" && "$STACK" = "stage" ]]; then
for host in francpaysan-stage-user francpaysan-host; do for host in ${INSIDE_SSH:+"$INSIDE_SSH"} ${FRANCPAYSAN_SSH:+"$FRANCPAYSAN_SSH"}; do
tmp=$(mktemp) tmp=$(mktemp)
if ssh -o BatchMode=yes -o ConnectTimeout=10 "$host" \ if ssh -o BatchMode=yes -o ConnectTimeout=10 "$host" \
'tr -d "\n\r" </mnt/data/stagepaysan/bank/secrets/bank-explorer-password.txt' \ 'tr -d "\n\r" </mnt/data/stagepaysan/bank/secrets/bank-explorer-password.txt' \

View file

@ -34,7 +34,7 @@ if [ "${DEVTESTING_SKIP:-0}" = "1" ]; then
exit 0 exit 0
fi fi
: "${DEVTESTING_SSH:=taler-rusty-devtesting}" : "${DEVTESTING_SSH:=}"
: "${DEVTESTING_AMOUNT:=CHF:1.00}" : "${DEVTESTING_AMOUNT:=CHF:1.00}"
: "${DEVTESTING_EXCHANGE_IBAN:=CH6808573105529100001}" : "${DEVTESTING_EXCHANGE_IBAN:=CH6808573105529100001}"
: "${SSH_CONNECT_TIMEOUT:=8}" : "${SSH_CONNECT_TIMEOUT:=8}"

View file

@ -426,7 +426,7 @@ else
warn "alt_unit_names" "using built-in SI fallback" warn "alt_unit_names" "using built-in SI fallback"
fi fi
# Host + bank/exchange/merchant RAM/CPU/load (SSH koopa or koopa-external) # Host + bank/exchange/merchant RAM/CPU/load (SSH via KOOPA_SSH from env)
set_group load set_group load
section "e2e · load snapshot (before withdraw/pay)" section "e2e · load snapshot (before withdraw/pay)"
metrics_report_load "${METRICS_DIR}/load-before.json" "e2e-start" || true metrics_report_load "${METRICS_DIR}/load-before.json" "e2e-start" || true
@ -437,51 +437,50 @@ if [ "$E2E_REMOTE" = "1" ]; then
ADMIN_PASS="${E2E_BANK_ADMIN_PASS:-${BANK_ADMIN_PASS:-}}" ADMIN_PASS="${E2E_BANK_ADMIN_PASS:-${BANK_ADMIN_PASS:-}}"
MPW="${E2E_MERCHANT_TOKEN:-${MERCHANT_TOKEN:-}}" MPW="${E2E_MERCHANT_TOKEN:-${MERCHANT_TOKEN:-}}"
# Stage FrancPaysan: allow admin credit without committing passwords. # Stage FrancPaysan: allow admin credit without committing passwords.
# Order: already-set env → local secrets tree → SSH francpaysan-host (ops laptop). # Order: env → FRANCPAYSAN_SECRETS → SSH FRANCPAYSAN_SSH/INSIDE_SSH + remote secret paths.
if [ -z "$ADMIN_PASS" ] && [ "${CUR:-${EXPECT_CURRENCY:-}}" = "TESTPAYSAN" ]; then if [ -z "$ADMIN_PASS" ] && [ "${CUR:-${EXPECT_CURRENCY:-}}" = "TESTPAYSAN" ]; then
_fp_try="" _fp_try=""
for _fp_try in \ if [ -n "${FRANCPAYSAN_SECRETS:-}" ]; then
"${FRANCPAYSAN_SECRETS:-}/stage/bank-admin-password.txt" \ _fp_try="${FRANCPAYSAN_SECRETS}/stage/bank-admin-password.txt"
"${HOME}/francpaysan-secrets/stage/bank-admin-password.txt" \ if [ -f "$_fp_try" ]; then
"${HOME}/src/francpaysan-secrets/stage/bank-admin-password.txt" \
"${HOME}/taler/src/francpaysan-secrets/stage/bank-admin-password.txt"
do
if [ -n "$_fp_try" ] && [ -f "$_fp_try" ]; then
ADMIN_PASS=$(tr -d '\n\r' <"$_fp_try") ADMIN_PASS=$(tr -d '\n\r' <"$_fp_try")
info "bank admin secret" "from $_fp_try" info "bank admin secret" "from $_fp_try"
break
fi fi
done fi
if [ -z "$ADMIN_PASS" ] && command -v ssh >/dev/null 2>&1; then if [ -z "$ADMIN_PASS" ] && command -v ssh >/dev/null 2>&1; then
for _fp_host in "${FRANCPAYSAN_SSH:-francpaysan-host}" francpaysan-host; do _remote_bank_sec="${FRANCPAYSAN_REMOTE_BANK_ADMIN_SECRET:-}"
[ -z "$_remote_bank_sec" ] && [ -n "${FRANCPAYSAN_REMOTE_SECRETS_ROOT:-}" ] && \
_remote_bank_sec="${FRANCPAYSAN_REMOTE_SECRETS_ROOT}/bank/secrets/bank-admin-password.txt"
for _fp_host in ${FRANCPAYSAN_SSH:+"$FRANCPAYSAN_SSH"} ${INSIDE_SSH:+"$INSIDE_SSH"}; do
[ -n "$_fp_host" ] && [ -n "$_remote_bank_sec" ] || continue
ADMIN_PASS=$(ssh -o BatchMode=yes -o ConnectTimeout=8 "$_fp_host" \ ADMIN_PASS=$(ssh -o BatchMode=yes -o ConnectTimeout=8 "$_fp_host" \
'sudo cat /mnt/data/stagepaysan/bank/secrets/bank-admin-password.txt 2>/dev/null' \ "sudo cat ${_remote_bank_sec} 2>/dev/null" \
2>/dev/null | tr -d '\n\r' || true) 2>/dev/null | tr -d '\n\r' || true)
if [ -n "$ADMIN_PASS" ]; then if [ -n "$ADMIN_PASS" ]; then
info "bank admin secret" "from ${_fp_host}:/mnt/data/stagepaysan/bank/secrets/" info "bank admin secret" "from ${_fp_host} (remote path via env)"
break break
fi fi
done done
fi fi
unset _fp_try _fp_host unset _fp_try _fp_host _remote_bank_sec
fi fi
# Stage merchant: public templates need no token; optional default-instance token # Stage merchant: public templates need no token; optional default-instance token
if [ -z "$MPW" ] && [ "${CUR:-${EXPECT_CURRENCY:-}}" = "TESTPAYSAN" ]; then if [ -z "$MPW" ] && [ "${CUR:-${EXPECT_CURRENCY:-}}" = "TESTPAYSAN" ]; then
for _fp_try in \ if [ -n "${FRANCPAYSAN_SECRETS:-}" ] && [ -f "${FRANCPAYSAN_SECRETS}/stage/default-instance-token.txt" ]; then
"${FRANCPAYSAN_SECRETS:-}/stage/default-instance-token.txt" \ MPW=$(tr -d '\n\r' <"${FRANCPAYSAN_SECRETS}/stage/default-instance-token.txt")
"${HOME}/francpaysan-secrets/stage/default-instance-token.txt"
do
if [ -n "$_fp_try" ] && [ -f "$_fp_try" ]; then
MPW=$(tr -d '\n\r' <"$_fp_try")
break
fi fi
done
if [ -z "$MPW" ] && command -v ssh >/dev/null 2>&1; then if [ -z "$MPW" ] && command -v ssh >/dev/null 2>&1; then
MPW=$(ssh -o BatchMode=yes -o ConnectTimeout=8 "${FRANCPAYSAN_SSH:-francpaysan-host}" \ _remote_mer_sec="${FRANCPAYSAN_REMOTE_MERCHANT_TOKEN:-}"
'sudo cat /mnt/data/stagepaysan/merchant/secrets/default-instance-token.txt 2>/dev/null' \ [ -z "$_remote_mer_sec" ] && [ -n "${FRANCPAYSAN_REMOTE_SECRETS_ROOT:-}" ] && \
_remote_mer_sec="${FRANCPAYSAN_REMOTE_SECRETS_ROOT}/merchant/secrets/default-instance-token.txt"
_fp_host="${FRANCPAYSAN_SSH:-${INSIDE_SSH:-}}"
if [ -n "$_fp_host" ] && [ -n "$_remote_mer_sec" ]; then
MPW=$(ssh -o BatchMode=yes -o ConnectTimeout=8 "$_fp_host" \
"sudo cat ${_remote_mer_sec} 2>/dev/null" \
2>/dev/null | tr -d '\n\r' || true) 2>/dev/null | tr -d '\n\r' || true)
fi fi
unset _fp_try unset _fp_host _remote_mer_sec
fi
fi fi
else else
ADMIN_PASS="${E2E_BANK_ADMIN_PASS:-$(read_secret "taler-bank/bank-admin-password.txt" || true)}" ADMIN_PASS="${E2E_BANK_ADMIN_PASS:-$(read_secret "taler-bank/bank-admin-password.txt" || true)}"

View file

@ -195,25 +195,20 @@ resolve_explorer_pw() {
|| [[ "${TALER_DOMAIN:-}" == stage.*lefrancpaysan* ]] \ || [[ "${TALER_DOMAIN:-}" == stage.*lefrancpaysan* ]] \
|| [[ "${TALER_DOMAIN:-}" == *stage.lefrancpaysan* ]]; then || [[ "${TALER_DOMAIN:-}" == *stage.lefrancpaysan* ]]; then
for f in \ for f in \
"${FRANCPAYSAN_SECRETS:-}/stage/bank-explorer-password.txt" \ ${FRANCPAYSAN_SECRETS:+"${FRANCPAYSAN_SECRETS}/stage/bank-explorer-password.txt"} \
"${HOME}/francpaysan-secrets/stage/bank-explorer-password.txt" \
"${HOME}/src/francpaysan-secrets/stage/bank-explorer-password.txt" \
"${HOME}/taler/src/francpaysan-secrets/stage/bank-explorer-password.txt" \
"${HOME}/.config/taler-landing/stage-bank-explorer-password.txt" "${HOME}/.config/taler-landing/stage-bank-explorer-password.txt"
do do
[ -n "$f" ] && [ -f "$f" ] || continue [ -n "$f" ] && [ -f "$f" ] || continue
tr -d '\n\r' <"$f" tr -d '\n\r' <"$f"
return 0 return 0
done done
for host in \ _remote_exp="${FRANCPAYSAN_REMOTE_BANK_EXPLORER_SECRET:-}"
"${INSIDE_SSH:-}" \ [ -z "$_remote_exp" ] && [ -n "${FRANCPAYSAN_REMOTE_SECRETS_ROOT:-}" ] && \
francpaysan-stage-user \ _remote_exp="${FRANCPAYSAN_REMOTE_SECRETS_ROOT}/bank/secrets/bank-explorer-password.txt"
francpaysan-host for host in ${INSIDE_SSH:+"$INSIDE_SSH"} ${FRANCPAYSAN_SSH:+"$FRANCPAYSAN_SSH"}; do
do [ -n "$host" ] && [ -n "$_remote_exp" ] || continue
[ -n "$host" ] || continue
pw=$(ssh -o BatchMode=yes -o ConnectTimeout=12 "$host" \ pw=$(ssh -o BatchMode=yes -o ConnectTimeout=12 "$host" \
'tr -d "\n\r" </mnt/data/stagepaysan/bank/secrets/bank-explorer-password.txt 2>/dev/null \ "tr -d '\\n\\r' <${_remote_exp} 2>/dev/null || sudo tr -d '\\n\\r' <${_remote_exp} 2>/dev/null" \
|| sudo tr -d "\n\r" </mnt/data/stagepaysan/bank/secrets/bank-explorer-password.txt 2>/dev/null' \
2>/dev/null || true) 2>/dev/null || true)
if [ -n "$pw" ]; then if [ -n "$pw" ]; then
printf '%s' "$pw" printf '%s' "$pw"
@ -230,7 +225,6 @@ resolve_explorer_pw() {
fi fi
for f in \ for f in \
"${SECRETS_ROOT:+${SECRETS_ROOT}/taler-bank/bank-explorer-password.txt}" \ "${SECRETS_ROOT:+${SECRETS_ROOT}/taler-bank/bank-explorer-password.txt}" \
"${HOME}/src/koopa/koopa-admin-secrets/koopa/host-root/taler-bank/bank-explorer-password.txt" \
"${HOME}/.config/taler-landing/bank-explorer-password.txt" "${HOME}/.config/taler-landing/bank-explorer-password.txt"
do do
[ -n "$f" ] && [ -f "$f" ] || continue [ -n "$f" ] && [ -f "$f" ] || continue
@ -962,23 +956,21 @@ if [ "${LADDER_PAY}" = "1" ] && [ -n "${PAY_LIST:-}" ] && [ "$FAIL_N_L" -eq 0 ];
MPW=$(read_secret "taler-merchant/merchant-goa-demo-cp4zqk-password.txt" 2>/dev/null || true) MPW=$(read_secret "taler-merchant/merchant-goa-demo-cp4zqk-password.txt" 2>/dev/null || true)
fi fi
if [ -z "$MPW" ] && [ "${CUR}" = "TESTPAYSAN" ]; then if [ -z "$MPW" ] && [ "${CUR}" = "TESTPAYSAN" ]; then
for f in \ if [ -n "${FRANCPAYSAN_SECRETS:-}" ] && [ -f "${FRANCPAYSAN_SECRETS}/stage/default-instance-token.txt" ]; then
"${FRANCPAYSAN_SECRETS:-}/stage/default-instance-token.txt" \ MPW=$(tr -d '\n\r' <"${FRANCPAYSAN_SECRETS}/stage/default-instance-token.txt")
"${HOME}/francpaysan-secrets/stage/default-instance-token.txt" \ fi
"${HOME}/src/francpaysan-secrets/stage/default-instance-token.txt"
do
[ -f "$f" ] || continue
MPW=$(tr -d '\n\r' <"$f")
break
done
if [ -z "$MPW" ]; then if [ -z "$MPW" ]; then
for host in "${INSIDE_SSH:-}" francpaysan-stage-user francpaysan-host; do _remote_mer="${FRANCPAYSAN_REMOTE_MERCHANT_TOKEN:-}"
[ -n "$host" ] || continue [ -z "$_remote_mer" ] && [ -n "${FRANCPAYSAN_REMOTE_SECRETS_ROOT:-}" ] && \
_remote_mer="${FRANCPAYSAN_REMOTE_SECRETS_ROOT}/merchant/secrets/default-instance-token.txt"
for host in ${INSIDE_SSH:+"$INSIDE_SSH"} ${FRANCPAYSAN_SSH:+"$FRANCPAYSAN_SSH"}; do
[ -n "$host" ] && [ -n "$_remote_mer" ] || continue
MPW=$(ssh -o BatchMode=yes -o ConnectTimeout=12 "$host" \ MPW=$(ssh -o BatchMode=yes -o ConnectTimeout=12 "$host" \
'tr -d "\n\r" </mnt/data/stagepaysan/merchant/secrets/default-instance-token.txt 2>/dev/null || true' \ "tr -d '\\n\\r' <${_remote_mer} 2>/dev/null || true" \
2>/dev/null || true) 2>/dev/null || true)
[ -n "$MPW" ] && break [ -n "$MPW" ] && break
done done
unset _remote_mer
fi fi
fi fi
if [ -z "$MPW" ]; then if [ -z "$MPW" ]; then

View file

@ -52,10 +52,10 @@ section "inside · collect (${PROFILE} · access=${INSIDE_ACCESS})"
info "flags" "INSIDE_ACCESS=${INSIDE_ACCESS} INSIDE_PODMAN=${INSIDE_PODMAN:-0} INSIDE_MODE=${INSIDE_MODE:-} LOCAL_STACK=${LOCAL_STACK:-0} SKIP_SSH=${SKIP_SSH:-0} KOOPA_SSH=${KOOPA_SSH:-} INSIDE_SSH=${INSIDE_SSH:-}" info "flags" "INSIDE_ACCESS=${INSIDE_ACCESS} INSIDE_PODMAN=${INSIDE_PODMAN:-0} INSIDE_MODE=${INSIDE_MODE:-} LOCAL_STACK=${LOCAL_STACK:-0} SKIP_SSH=${SKIP_SSH:-0} KOOPA_SSH=${KOOPA_SSH:-} INSIDE_SSH=${INSIDE_SSH:-}"
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# stage-lfp: low-priv stagepaysan on francpaysan-host # stage-lfp: low-priv stagepaysan on the FP stage host (INSIDE_SSH)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
if [ "$PROFILE" = "stage-lfp" ]; then if [ "$PROFILE" = "stage-lfp" ]; then
SSH_HOST="${INSIDE_SSH:-francpaysan-stage-user}" SSH_HOST="${INSIDE_SSH:-}"
BANK_CTR="${INSIDE_BANK_CTR:-stage-lfp-bank}" BANK_CTR="${INSIDE_BANK_CTR:-stage-lfp-bank}"
EX_CTR="${INSIDE_EXCHANGE_CTR:-stage-lfp-exchange-ansible}" EX_CTR="${INSIDE_EXCHANGE_CTR:-stage-lfp-exchange-ansible}"
MER_CTR="${INSIDE_MERCHANT_CTR:-stage-lfp-merchant}" MER_CTR="${INSIDE_MERCHANT_CTR:-stage-lfp-merchant}"

View file

@ -209,7 +209,7 @@ build_urls() {
if [ "$fam" = "goa" ] || [ "$fam" = "fp" ]; then if [ "$fam" = "goa" ] || [ "$fam" = "fp" ]; then
_catalog_urls "$fam" _catalog_urls "$fam"
# On-disk discovery (err pages only exist after failed runs; extras welcome) # On-disk discovery (err pages only exist after failed runs; extras welcome)
_discover_tree "${DEPLOY_WWW_ROOT:-/var/www/monitoring-sites}" "$fam" [ -n "${DEPLOY_WWW_ROOT:-}" ] && _discover_tree "${DEPLOY_WWW_ROOT}" "$fam"
_discover_tree "${MONPAGES_STAGING_BASE:-${HTML_OUT:-${HTML_BASE:-$HOME/monitoring-sites-staging}}}" "$fam" _discover_tree "${MONPAGES_STAGING_BASE:-${HTML_OUT:-${HTML_BASE:-$HOME/monitoring-sites-staging}}}" "$fam"
fi fi
;; ;;
@ -437,7 +437,7 @@ check_one() {
continue continue
fi fi
_mon_fail_or_soft "public mon page missing" \ _mon_fail_or_soft "public mon page missing" \
"$url -> HTTP $code merchant/API JSON code 21 (Caddy handle/redir; use redir * /path/ 302 inside handle; apply: sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh)" || { rm -f "$body"; return 1; } "$url -> HTTP $code merchant/API JSON code 21 (Caddy handle/redir; use redir * /path/ 302 inside handle${APPLY_MONITORING_LIVE:+; apply: sudo $APPLY_MONITORING_LIVE})" || { rm -f "$body"; return 1; }
rm -f "$body" rm -f "$body"
return 0 return 0
fi fi
@ -578,7 +578,7 @@ done
if [ "$ec" -ne 0 ]; then if [ "$ec" -ne 0 ]; then
echo " hint: public monitoring HTML not served (404 / merchant code 21)" echo " hint: public monitoring HTML not served (404 / merchant code 21)"
echo " publish staging HTML + configure reverse-proxy/Caddy handle for mon paths" echo " publish staging HTML + configure reverse-proxy/Caddy handle for mon paths"
echo " (on koopa: sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh)" echo " (set APPLY_MONITORING_LIVE in env; sudo "$APPLY_MONITORING_LIVE")"
echo " bare code 21: Caddy redir inside handle must be: redir * /path/ 302 (not redir /path/ 302)" echo " bare code 21: Caddy redir inside handle must be: redir * /path/ 302 (not redir /path/ 302)"
if [ "$_fam" = "fp" ]; then if [ "$_fam" = "fp" ]; then
echo " FP: only FP mon hosts are checked — wire Infomaniak vhost for /monitoring*" echo " FP: only FP mon hosts are checked — wire Infomaniak vhost for /monitoring*"
@ -599,7 +599,7 @@ if [ "$ec" -ne 0 ]; then
fi fi
done done
fi fi
_www="${DEPLOY_WWW_ROOT:-/var/www/monitoring-sites}" _www="${DEPLOY_WWW_ROOT:-}"
if [ -e "$_www" ] && [ ! -w "$_www" ]; then if [ -e "$_www" ] && [ ! -w "$_www" ]; then
echo " DEPLOY_WWW_ROOT=$_www not writable by $(id -un 2>/dev/null || echo user)" echo " DEPLOY_WWW_ROOT=$_www not writable by $(id -un 2>/dev/null || echo user)"
fi fi

View file

@ -178,7 +178,7 @@ if [ "${INSIDE_PODMAN:-0}" = "1" ] || [ "${INSIDE_MODE:-}" = "local-podman" ]; t
elif [ "${INSIDE_PROFILE:-}" = "stage-lfp" ] \ elif [ "${INSIDE_PROFILE:-}" = "stage-lfp" ] \
|| [ "${EXPECT_CURRENCY:-}" = "TESTPAYSAN" ] \ || [ "${EXPECT_CURRENCY:-}" = "TESTPAYSAN" ] \
|| [ -n "${INSIDE_SSH:-}" ]; then || [ -n "${INSIDE_SSH:-}" ]; then
_VERS_SSH_HOST="${INSIDE_SSH:-francpaysan-stage-user}" _VERS_SSH_HOST="${INSIDE_SSH:-}"
_VERS_BANK="${INSIDE_BANK_CTR:-stage-lfp-bank}" _VERS_BANK="${INSIDE_BANK_CTR:-stage-lfp-bank}"
_VERS_EX="${INSIDE_EXCHANGE_CTR:-stage-lfp-exchange-ansible}" _VERS_EX="${INSIDE_EXCHANGE_CTR:-stage-lfp-exchange-ansible}"
_VERS_MER="${INSIDE_MERCHANT_CTR:-stage-lfp-merchant}" _VERS_MER="${INSIDE_MERCHANT_CTR:-stage-lfp-merchant}"

View file

@ -21,7 +21,7 @@ Thin wrappers only set stack defaults:
| `run-fp-stage-monitoring.sh` | FP stage | `stagepaysan` | | `run-fp-stage-monitoring.sh` | FP stage | `stagepaysan` |
| `run-fp-prod-monitoring.sh` | FP prod | `francpaysan` | | `run-fp-prod-monitoring.sh` | FP prod | `francpaysan` |
| `run-host-report.sh` + `taler-monitoring-mytops-stage.{service,timer}` | mytops **stage / betel** only | `taler-monitoring` @ betel (4h) | | `run-host-report.sh` + `taler-monitoring-mytops-stage.{service,timer}` | mytops **stage / betel** only | `taler-monitoring` @ betel (4h) |
| `run-aptdeploy.sh` | CLI: ensure + **aptdeploy** (no HTML) | local if hostname=koopa, else **ssh koopa-external** | | `run-aptdeploy.sh` | CLI: ensure + **aptdeploy** (no HTML) | local if hostname=koopa, else **ssh $DEPLOY_SSH** |
| `run-aptdeploy-monitoring.sh` | apt-src tests → `/taler-monitoring-aptdeploy*` | `hernani` @ koopa (4h) | | `run-aptdeploy-monitoring.sh` | apt-src tests → `/taler-monitoring-aptdeploy*` | `hernani` @ koopa (4h) |
| `run-surface-monitoring.sh` | **surface** → only `/taler-monitoring-surface*` (ecosystem + mail + mattermost + versions) | `hernani` @ koopa (hourly) | | `run-surface-monitoring.sh` | **surface** → only `/taler-monitoring-surface*` (ecosystem + mail + mattermost + versions) | `hernani` @ koopa (hourly) |
| `run-mail-monitoring.sh` / `run-mattermost-monitoring.sh` | **deprecated v1.8.0** — aliases of surface | disabled timers | | `run-mail-monitoring.sh` / `run-mattermost-monitoring.sh` | **deprecated v1.8.0** — aliases of surface | disabled timers |
@ -110,7 +110,7 @@ cp ~/src/taler-monitoring/host-agent/env.example \
~/.config/taler-monitoring/env ~/.config/taler-monitoring/env
# ops workstation: # ops workstation:
./host-agent/install-host-agent.sh --remote koopa-external ./host-agent/install-host-agent.sh --remote $DEPLOY_SSH
# or on koopa: # or on koopa:
~/src/taler-monitoring/host-agent/install-host-agent.sh ~/src/taler-monitoring/host-agent/install-host-agent.sh

View file

@ -17,15 +17,15 @@ Public URLs return **merchant/bank JSON** like:
or a **404 HTML** page from the app reverse_proxy. or a **404 HTML** page from the app reverse_proxy.
Cause: live `/etc/caddy/Caddyfile` has **no** `handle /monitoring*` (falls through to Cause: live `/etc/caddy/Caddyfile` has **no** `handle /monitoring*` (falls through to
API). Prepared config is only under **`/home/hernani/koopa-caddy/Caddyfile`**. API). Prepared config is only under **`$KOOPA_CADDY_DIR/Caddyfile`**.
## One-shot as root (recommended) ## One-shot as root (recommended)
```bash ```bash
# absolute path required: as root, ~ is /root (not /home/hernani) # absolute path required: as root, ~ is /root (not /home/hernani)
sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh sudo $APPLY_MONITORING_LIVE
# or already root: # or already root:
# /home/hernani/koopa-caddy/apply-monitoring-live.sh # $APPLY_MONITORING_LIVE
``` ```
**Caddy bare-path redir (v1.9.2+):** inside a `handle` block use **Caddy bare-path redir (v1.9.2+):** inside a `handle` block use
@ -52,14 +52,14 @@ There is **no** public page `/taler-monitoring`. Each family needs **bare and sl
| **taler-monitoring-aptdeploy** | bare + slash + `_err` | **taler.hacktivism.ch only** | `taler-monitoring-aptdeploy.timer` (4h) | | **taler-monitoring-aptdeploy** | bare + slash + `_err` | **taler.hacktivism.ch only** | `taler-monitoring-aptdeploy.timer` (4h) |
HTML is generated as **hernani** into HTML is generated as **hernani** into
`/home/hernani/monitoring-sites-staging/`. `$DEPLOY_STAGING (or $HOME/monitoring-sites-staging)/`.
## Manual equivalent ## Manual equivalent
```bash ```bash
rsync -a --delete /home/hernani/monitoring-sites-staging/ /var/www/monitoring-sites/ rsync -a --delete $DEPLOY_STAGING (or $HOME/monitoring-sites-staging)/ /var/www/monitoring-sites/
chown -R hernani:caddy /var/www/monitoring-sites && chmod -R g+rwX /var/www/monitoring-sites chown -R hernani:caddy /var/www/monitoring-sites && chmod -R g+rwX /var/www/monitoring-sites
sudo /home/hernani/koopa-caddy/apply.sh # or apply-monitoring-live.sh sudo $KOOPA_CADDY_DIR/apply.sh # or apply-monitoring-live.sh
``` ```
Expect **200** (HTML with sticky bar). Not merchant JSON `code:21`. Expect **200** (HTML with sticky bar). Not merchant JSON `code:21`.
@ -67,7 +67,7 @@ Expect **200** (HTML with sticky bar). Not merchant JSON `code:21`.
## After each monitoring run (if www is not hernani-writable) ## After each monitoring run (if www is not hernani-writable)
```bash ```bash
rsync -a --delete /home/hernani/monitoring-sites-staging/ /var/www/monitoring-sites/ rsync -a --delete $DEPLOY_STAGING (or $HOME/monitoring-sites-staging)/ /var/www/monitoring-sites/
chown -R caddy:caddy /var/www/monitoring-sites chown -R caddy:caddy /var/www/monitoring-sites
``` ```

View file

@ -2,10 +2,10 @@
# ONE-SHOT as root: publish monitoring HTML + enable Caddy handles # ONE-SHOT as root: publish monitoring HTML + enable Caddy handles
# #
# Suite copy (taler-monitoring host-agent). Live install path on koopa: # Suite copy (taler-monitoring host-agent). Live install path on koopa:
# /home/hernani/koopa-caddy/apply-monitoring-live.sh # ${KOOPA_CADDY_DIR}/apply-monitoring-live.sh
# Prefer absolute path ( ~ expands to /root when already root ): # Prefer absolute path ( ~ expands to /root when already root ):
# sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh # sudo ${KOOPA_CADDY_DIR}/apply-monitoring-live.sh
# /home/hernani/koopa-caddy/apply-monitoring-live.sh # if already root # ${KOOPA_CADDY_DIR}/apply-monitoring-live.sh # if already root
# #
# After editing here: rsync to koopa ~/koopa-caddy/ before root apply. # After editing here: rsync to koopa ~/koopa-caddy/ before root apply.
set -euo pipefail set -euo pipefail
@ -13,9 +13,9 @@ if [[ "$(id -u)" -ne 0 ]]; then
exec sudo -E "$0" "$@" exec sudo -E "$0" "$@"
fi fi
STAGING=/home/hernani/monitoring-sites-staging STAGING="${DEPLOY_STAGING:-${HTML_OUT:-$HOME/monitoring-sites-staging}}"
WWW=/var/www/monitoring-sites WWW="${DEPLOY_WWW_ROOT:?set DEPLOY_WWW_ROOT in env}"
SRC=/home/hernani/koopa-caddy/Caddyfile SRC="${KOOPA_CADDY_DIR:?set KOOPA_CADDY_DIR in env}/Caddyfile"
DST=/etc/caddy/Caddyfile DST=/etc/caddy/Caddyfile
if [[ ! -f "$SRC" ]]; then if [[ ! -f "$SRC" ]]; then

View file

@ -11,7 +11,7 @@
# koopa-taler-deploy-test-apt-src-trixie-upgrade # koopa-taler-deploy-test-apt-src-trixie-upgrade
# koopa-taler-deploy-test-apt-src-trixie-testing-upgrade # koopa-taler-deploy-test-apt-src-trixie-testing-upgrade
# #
# Run as hernani on koopa. From elsewhere use run-aptdeploy.sh (ssh koopa-external). # Run as hernani on koopa. From elsewhere use run-aptdeploy.sh (ssh $DEPLOY_SSH or $APT_DEPLOY_SSH).
# #
set -euo pipefail set -euo pipefail

View file

@ -4,14 +4,14 @@
# # on koopa as hernani: # # on koopa as hernani:
# ~/src/taler-monitoring/host-agent/install-host-agent.sh # ~/src/taler-monitoring/host-agent/install-host-agent.sh
# # or from laptop: # # or from laptop:
# ./install-host-agent.sh --remote koopa-external # ./install-host-agent.sh --remote $DEPLOY_SSH
# #
# Suite tree is ONLY ~/src/taler-monitoring (standalone repo). No koopa-admin-log. # Suite tree is ONLY ~/src/taler-monitoring (standalone repo). No koopa-admin-log.
# #
set -euo pipefail set -euo pipefail
ROOT=$(cd "$(dirname "$0")" && pwd) ROOT=$(cd "$(dirname "$0")" && pwd)
REMOTE="${1:-}" REMOTE="${1:-}"
[ "${1:-}" = "--remote" ] && REMOTE="${2:-koopa-external}" [ "${1:-}" = "--remote" ] && REMOTE="${2:-${DEPLOY_SSH:-}}"
SUITE_URL="${SUITE_GIT_URL:-https://git.hacktivism.ch/hernani/taler-monitoring.git}" SUITE_URL="${SUITE_GIT_URL:-https://git.hacktivism.ch/hernani/taler-monitoring.git}"

View file

@ -14,7 +14,7 @@ set -euo pipefail
AGENT_DIR=$(cd "$(dirname "$0")" && pwd) AGENT_DIR=$(cd "$(dirname "$0")" && pwd)
BOOT_MON=$(cd "$AGENT_DIR/.." && pwd) BOOT_MON=$(cd "$AGENT_DIR/.." && pwd)
MODE="${1:-all}" MODE="${1:-all}"
APT_DEPLOY_SSH="${APT_DEPLOY_SSH:-koopa-external}" APT_DEPLOY_SSH="${APT_DEPLOY_SSH:-${DEPLOY_SSH:-}}"
OVERLAY_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/taler-monitoring/suite-overlay" OVERLAY_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/taler-monitoring/suite-overlay"
on_koopa() { on_koopa() {

View file

@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# FrancPaysan PROD host-agent (user francpaysan on francpaysan-host). # FrancPaysan PROD host-agent (user francpaysan on ).
# Shared reporting: run-host-report.sh (timeout, line-buffered log, first-run HTML). # Shared reporting: run-host-report.sh (timeout, line-buffered log, first-run HTML).
set -uo pipefail set -uo pipefail

View file

@ -1,5 +1,5 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# FrancPaysan STAGE host-agent (user stagepaysan on francpaysan-host). # FrancPaysan STAGE host-agent (user stagepaysan on ).
# Shared reporting: run-host-report.sh (timeout, line-buffered log, first-run HTML). # Shared reporting: run-host-report.sh (timeout, line-buffered log, first-run HTML).
set -uo pipefail set -uo pipefail

View file

@ -439,11 +439,11 @@ if [ -n "$DEPLOY_WWW" ]; then
elif [ -e "$DEPLOY_WWW" ]; then elif [ -e "$DEPLOY_WWW" ]; then
echo "ERROR: DEPLOY_WWW_ROOT=$DEPLOY_WWW exists but is not writable by $(id -un)" >&2 echo "ERROR: DEPLOY_WWW_ROOT=$DEPLOY_WWW exists but is not writable by $(id -un)" >&2
echo " public FQDN pages will stay missing/stale — fix ownership or run:" >&2 echo " public FQDN pages will stay missing/stale — fix ownership or run:" >&2
echo " sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh" >&2 echo " sudo ${APPLY_MONITORING_LIVE}" >&2
ec=1 ec=1
else else
echo "ERROR: DEPLOY_WWW_ROOT=$DEPLOY_WWW missing — public pages not published" >&2 echo "ERROR: DEPLOY_WWW_ROOT=$DEPLOY_WWW missing — public pages not published" >&2
echo " create tree + Caddy handles: sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh" >&2 echo " create tree + Caddy handles: sudo ${APPLY_MONITORING_LIVE}" >&2
ec=1 ec=1
fi fi
else else
@ -479,7 +479,7 @@ if [ "$_monpages_failed" = "1" ]; then
{ {
echo "" echo ""
echo "ERROR monpages: public FQDN monitoring HTML missing or merchant JSON code 21" echo "ERROR monpages: public FQDN monitoring HTML missing or merchant JSON code 21"
echo "ERROR monpages: fix with sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh (www + Caddy handles)" echo "ERROR monpages: fix with sudo ${APPLY_MONITORING_LIVE} (www + Caddy handles)"
} >>"$LOG" } >>"$LOG"
for host in $MON_HOSTS; do for host in $MON_HOSTS; do
htmlify_host "$host" htmlify_host "$host"

81
lib.sh
View file

@ -1,5 +1,22 @@
# shellcheck shell=bash # shellcheck shell=bash
# Shared helpers for taler-monitoring (laptop or koopa). # Shared helpers for taler-monitoring (laptop or koopa).
#
# Machine paths/SSH hosts: only from env (~/.config/taler-monitoring/env or
# TALER_MONITORING_ENV=…), installed via taler-monitoring-env — never hardcode.
# Load host env once (before any := defaults)
if [ "${_TALER_MON_ENV_LOADED:-0}" != "1" ]; then
_mon_cfg="${TALER_MONITORING_ENV:-${XDG_CONFIG_HOME:-$HOME/.config}/taler-monitoring/env}"
if [ -f "$_mon_cfg" ]; then
# shellcheck disable=SC1090
set -a
# shellcheck disable=SC1091
. "$_mon_cfg"
set +a
fi
unset _mon_cfg
export _TALER_MON_ENV_LOADED=1
fi
# Default stack = GOA / hacktivism (overridden by TALER_DOMAIN / --domain) # Default stack = GOA / hacktivism (overridden by TALER_DOMAIN / --domain)
# i18n (en default; fr for FrancPaysan — see i18n.sh / TALER_MON_LANG) # i18n (en default; fr for FrancPaysan — see i18n.sh / TALER_MON_LANG)
@ -22,9 +39,25 @@ fi
: "${EXCHANGE_LOCAL:=http://127.0.0.1:9011}" : "${EXCHANGE_LOCAL:=http://127.0.0.1:9011}"
: "${MERCHANT_LOCAL:=https://127.0.0.1:9010}" : "${MERCHANT_LOCAL:=https://127.0.0.1:9010}"
: "${LANDING_LOCAL:=http://127.0.0.1:9013}" : "${LANDING_LOCAL:=http://127.0.0.1:9013}"
: "${KOOPA_SSH:=koopa}" # Hostnames/paths: set via ~/.config/taler-monitoring/env (no hardcoded machine values).
# When LAN Host "koopa" is unreachable, try WAN DNAT (see ~/.ssh/config Host koopa-external). : "${KOOPA_SSH:=}"
: "${KOOPA_SSH_FALLBACKS:=koopa-external}" : "${KOOPA_SSH_FALLBACKS:=}"
: "${INSIDE_SSH:=}"
: "${FRANCPAYSAN_SSH:=}"
: "${DEVTESTING_SSH:=}"
: "${DEPLOY_SSH:=}"
: "${FIRECUDA_SSH:=}"
: "${HTML_OUT:=${HOME}/monitoring-sites-staging}"
: "${DEPLOY_STAGING:=${HTML_OUT}}"
: "${DEPLOY_WWW_ROOT:=}"
: "${APPLY_MONITORING_LIVE:=}"
: "${KOOPA_CADDY_DIR:=}"
: "${FRANCPAYSAN_SECRETS:=}"
: "${FRANCPAYSAN_REMOTE_SECRETS_ROOT:=}"
: "${FRANCPAYSAN_REMOTE_BANK_ADMIN_SECRET:=}"
: "${FRANCPAYSAN_REMOTE_BANK_EXPLORER_SECRET:=}"
: "${FRANCPAYSAN_REMOTE_MERCHANT_TOKEN:=}"
: "${WALLET_CLI:=}"
: "${MERCHANT_INSTANCE:=goa-demo-cp4zqk}" : "${MERCHANT_INSTANCE:=goa-demo-cp4zqk}"
# Merchant portal /private API: instance ids must be lowercase or you get odd 401s. # Merchant portal /private API: instance ids must be lowercase or you get odd 401s.
# (Display names may use capitals; path segment /instances/{id}/ must not.) # (Display names may use capitals; path segment /instances/{id}/ must not.)
@ -235,13 +268,13 @@ apply_taler_domain() {
: "${E2E_TEMPLATE_MAP:=5=oeufs-6 4.5=pain-seigle 6=jus-pomme 8.5=fromage-chevre 12=miel-printemps 25=panier-legumes}" : "${E2E_TEMPLATE_MAP:=5=oeufs-6 4.5=pain-seigle 6=jus-pomme 8.5=fromage-chevre 12=miel-printemps 25=panier-legumes}"
: "${E2E_PAY_VALUES:=5 8.5 6}" : "${E2E_PAY_VALUES:=5 8.5 6}"
: "${E2E_WITHDRAW_VALUES:=20 50}" : "${E2E_WITHDRAW_VALUES:=20 50}"
# Inside checks as low-priv stagepaysan (podman, no sudo) — not koopa # Inside checks as low-priv stagepaysan (podman, no sudo) — not koopa.
# INSIDE_SSH / container names: set in host env (no hardcoded SSH host).
INSIDE_PROFILE="${INSIDE_PROFILE:-stage-lfp}" INSIDE_PROFILE="${INSIDE_PROFILE:-stage-lfp}"
INSIDE_SSH="${INSIDE_SSH:-francpaysan-stage-user}"
INSIDE_BANK_CTR="${INSIDE_BANK_CTR:-stage-lfp-bank}" INSIDE_BANK_CTR="${INSIDE_BANK_CTR:-stage-lfp-bank}"
INSIDE_EXCHANGE_CTR="${INSIDE_EXCHANGE_CTR:-stage-lfp-exchange-ansible}" INSIDE_EXCHANGE_CTR="${INSIDE_EXCHANGE_CTR:-stage-lfp-exchange-ansible}"
INSIDE_MERCHANT_CTR="${INSIDE_MERCHANT_CTR:-stage-lfp-merchant}" INSIDE_MERCHANT_CTR="${INSIDE_MERCHANT_CTR:-stage-lfp-merchant}"
# Host pasta ports (127.0.0.1 on francpaysan-host) # Host pasta ports (127.0.0.1 on the FP host (INSIDE_SSH))
INSIDE_BANK_PORT="${INSIDE_BANK_PORT:-9032}" INSIDE_BANK_PORT="${INSIDE_BANK_PORT:-9032}"
INSIDE_EXCHANGE_PORT="${INSIDE_EXCHANGE_PORT:-9031}" INSIDE_EXCHANGE_PORT="${INSIDE_EXCHANGE_PORT:-9031}"
INSIDE_MERCHANT_PORT="${INSIDE_MERCHANT_PORT:-9030}" INSIDE_MERCHANT_PORT="${INSIDE_MERCHANT_PORT:-9030}"
@ -381,7 +414,7 @@ mon_ssh_ok() {
ssh "${SSH_BASE_OPTS[@]}" "$host" true >/dev/null 2>&1 ssh "${SSH_BASE_OPTS[@]}" "$host" true >/dev/null 2>&1
} }
# Pick a working SSH host: KOOPA_SSH first, then KOOPA_SSH_FALLBACKS (koopa-external). # Pick a working SSH host: KOOPA_SSH first, then KOOPA_SSH_FALLBACKS (from env).
# Sets KOOPA_SSH to the first host that answers. 0 = ok, 1 = none. # Sets KOOPA_SSH to the first host that answers. 0 = ok, 1 = none.
KOOPA_SSH_RESOLVED=0 KOOPA_SSH_RESOLVED=0
resolve_koopa_ssh() { resolve_koopa_ssh() {
@ -1195,26 +1228,8 @@ if [ -z "$SECRETS_ROOT" ]; then
SECRETS_ROOT="${KOOPA_ADMIN_SECRETS}/koopa/host-root" SECRETS_ROOT="${KOOPA_ADMIN_SECRETS}/koopa/host-root"
fi fi
fi fi
if [ -z "$SECRETS_ROOT" ]; then # No further home-path probes — set SECRETS_ROOT or KOOPA_ADMIN_SECRETS in env.
_mon_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
_admin_log="$(cd "${_mon_dir}/../.." && pwd)"
for d in \
"${_admin_log}/../koopa-admin-secrets/koopa/host-root" \
"${_admin_log}/../../koopa-admin-secrets/koopa/host-root" \
"${HOME}/taler/src/koopa-admin-secrets/koopa/host-root" \
"${HOME}/src/koopa/koopa-admin-secrets/koopa/host-root" \
"${HOME}/koopa-admin-secrets/koopa/host-root" \
"/Users/newkamek/src/koopa/koopa-admin-secrets/koopa/host-root" \
"$(cd "${_admin_log}/../.." 2>/dev/null && pwd)/koopa-admin-secrets/koopa/host-root"
do
# resolve .. without requiring the dir to exist first for cd
if [ -d "$d/taler-bank" ]; then
SECRETS_ROOT=$(cd "$d" && pwd)
break
fi
done
unset _mon_dir _admin_log d
fi
read_secret() { read_secret() {
local rel="$1" base val="" local rel="$1" base val=""
@ -1259,7 +1274,7 @@ secrets_hint() {
Prefer a local secrets file (not committed): Prefer a local secrets file (not committed):
cp secrets.env.example secrets.env cp secrets.env.example secrets.env
\$EDITOR secrets.env \$EDITOR secrets.env
Or set SECRETS_ROOT=\$HOME/src/koopa/koopa-admin-secrets/koopa/host-root Or set SECRETS_ROOT / KOOPA_ADMIN_SECRETS in ~/.config/taler-monitoring/env
Or export E2E_BANK_ADMIN_PASS / E2E_MERCHANT_TOKEN for one shot. Or export E2E_BANK_ADMIN_PASS / E2E_MERCHANT_TOKEN for one shot.
EOF EOF
} }
@ -1299,14 +1314,10 @@ find_wallet_cli() {
echo "$WALLET_CLI"; return 0 echo "$WALLET_CLI"; return 0
fi fi
local c cand local c cand
for c in \ # WALLET_CLI / WALLET_CLI_CANDIDATES from env; then portable package paths only.
# shellcheck disable=SC2086
for c in ${WALLET_CLI_CANDIDATES:-} \
"${HOME}/.local/bin/taler-wallet-cli.mjs" \ "${HOME}/.local/bin/taler-wallet-cli.mjs" \
"${HOME}/taler/src/taler-typescript-core/packages/taler-wallet-cli/bin/taler-wallet-cli.mjs" \
"${HOME}/src/taler-typescript-core/packages/taler-wallet-cli/bin/taler-wallet-cli.mjs" \
"${HOME}/taler/opt/taler-wallet-cli/usr/lib/taler-wallet-cli/node_modules/taler-wallet-cli/bin/taler-wallet-cli.mjs" \
/home/hernani/taler/opt/taler-wallet-cli/usr/lib/taler-wallet-cli/node_modules/taler-wallet-cli/bin/taler-wallet-cli.mjs \
/home/hernani/taler/src/taler-typescript-core/packages/taler-wallet-cli/bin/taler-wallet-cli.mjs \
/Users/newkamek/src/taler/taler-typescript-core/packages/taler-wallet-cli/bin/taler-wallet-cli.mjs \
/usr/lib/taler-wallet-cli/node_modules/taler-wallet-cli/bin/taler-wallet-cli.mjs \ /usr/lib/taler-wallet-cli/node_modules/taler-wallet-cli/bin/taler-wallet-cli.mjs \
/usr/share/taler-wallet-cli/bin/taler-wallet-cli.mjs /usr/share/taler-wallet-cli/bin/taler-wallet-cli.mjs
do do

View file

@ -513,7 +513,7 @@ metrics_taler_load() {
_m_bank="${INSIDE_BANK_CTR:-stage-lfp-bank}" _m_bank="${INSIDE_BANK_CTR:-stage-lfp-bank}"
_m_mer="${INSIDE_MERCHANT_CTR:-stage-lfp-merchant}" _m_mer="${INSIDE_MERCHANT_CTR:-stage-lfp-merchant}"
_m_ex="${INSIDE_EXCHANGE_CTR:-stage-lfp-exchange-ansible}" _m_ex="${INSIDE_EXCHANGE_CTR:-stage-lfp-exchange-ansible}"
_m_ssh="${INSIDE_SSH:-francpaysan-stage-user}" _m_ssh="${INSIDE_SSH:-}"
fi fi
remote_py=$(cat <<PY remote_py=$(cat <<PY
import base64, json, os, re, subprocess, time import base64, json, os, re, subprocess, time
@ -866,7 +866,7 @@ metrics_report_load() {
return 0 return 0
fi fi
if ! metrics_taler_load "$out" "$label"; then if ! metrics_taler_load "$out" "$label"; then
warn "load ${label}" "probe failed via ${KOOPA_SSH:-?}try KOOPA_SSH=koopa-external" warn "load ${label}" "probe failed via ${KOOPA_SSH:-?}set KOOPA_SSH / KOOPA_SSH_FALLBACKS in env"
return 1 return 1
fi fi
while IFS= read -r line; do while IFS= read -r line; do

View file

@ -30,8 +30,8 @@
# Default phases for -d stage.lefrancpaysan.ch: urls + inside + versions + e2e # Default phases for -d stage.lefrancpaysan.ch: urls + inside + versions + e2e
# inside uses francpaysan-stage-user (stagepaysan); stats from public HTTPS. # inside uses francpaysan-stage-user (stagepaysan); stats from public HTTPS.
# Admin credit (required for ATM withdraw ladder on stage): # Admin credit (required for ATM withdraw ladder on stage):
# E2E_BANK_ADMIN_PASS=… # or auto-load via SSH francpaysan-host # E2E_BANK_ADMIN_PASS=… # or auto-load via SSH
# FRANCPAYSAN_SSH=francpaysan-host # FRANCPAYSAN_SSH=
# FRANCPAYSAN_SECRETS=$HOME/francpaysan-secrets # FRANCPAYSAN_SECRETS=$HOME/francpaysan-secrets
# Public shop pays use E2E_USE_TEMPLATES=1 (default on TESTPAYSAN) — no merchant token. # Public shop pays use E2E_USE_TEMPLATES=1 (default on TESTPAYSAN) — no merchant token.

View file

@ -15,7 +15,7 @@ Applies to all nine fronts (GOA + FP stage + FP prod) in the default `SITES` lis
| Host | Role | | Host | Role |
|------|------| |------|------|
| **optional outside runner** (SSH alias via `FIRECUDA_SSH`) | optional runner (public DNS) | | **optional outside runner** (SSH alias via `FIRECUDA_SSH`) | optional runner (public DNS) |
| **koopa-external** | deploy staging + Caddy (root service) | | **deploy host (`DEPLOY_SSH`)** | deploy staging + Caddy (root service) |
| **host-agents** | primary: GOA + FP on-box (`../host-agent/`) | | **host-agents** | primary: GOA + FP on-box (`../host-agent/`) |
No secrets in `settings.conf` — only hosts, paths, site list. No secrets in `settings.conf` — only hosts, paths, site list.

View file

@ -6,17 +6,17 @@ Host Caddy runs as **root/systemd** (`caddy` user). Static monitoring HTML is
After host-agent / `generate-monitoring-sites.sh` + deploy (as hernani), files live in: After host-agent / `generate-monitoring-sites.sh` + deploy (as hernani), files live in:
```text ```text
/home/hernani/monitoring-sites-staging/<hostname>/monitoring/index.html $DEPLOY_STAGING (or $HOME/monitoring-sites-staging)/<hostname>/monitoring/index.html
/home/hernani/monitoring-sites-staging/<hostname>/monitoring_err/index.html $DEPLOY_STAGING (or $HOME/monitoring-sites-staging)/<hostname>/monitoring_err/index.html
``` ```
## One-shot as root (preferred) ## One-shot as root (preferred)
```bash ```bash
# absolute path — as root, ~ is /root (script not found under ~/koopa-caddy/…) # absolute path — as root, ~ is /root (script not found under ~/koopa-caddy/…)
sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh sudo $APPLY_MONITORING_LIVE
# same script is versioned in the suite: # same script is versioned in the suite:
# host-agent/apply-monitoring-live.sh → install/sync to /home/hernani/koopa-caddy/ # host-agent/apply-monitoring-live.sh → install/sync to $KOOPA_CADDY_DIR/
``` ```
That rsyncs staging → `/var/www/monitoring-sites`, installs the prepared That rsyncs staging → `/var/www/monitoring-sites`, installs the prepared
@ -26,10 +26,10 @@ Caddyfile, reloads Caddy, and smokes mon URLs (including bare surface).
```bash ```bash
install -d -o hernani -g caddy -m 755 /var/www/monitoring-sites install -d -o hernani -g caddy -m 755 /var/www/monitoring-sites
rsync -a --delete /home/hernani/monitoring-sites-staging/ /var/www/monitoring-sites/ rsync -a --delete $DEPLOY_STAGING (or $HOME/monitoring-sites-staging)/ /var/www/monitoring-sites/
chown -R hernani:caddy /var/www/monitoring-sites chown -R hernani:caddy /var/www/monitoring-sites
install -m 644 /home/hernani/koopa-caddy/Caddyfile /etc/caddy/Caddyfile install -m 644 $KOOPA_CADDY_DIR/Caddyfile /etc/caddy/Caddyfile
caddy validate --config /etc/caddy/Caddyfile caddy validate --config /etc/caddy/Caddyfile
systemctl reload caddy systemctl reload caddy
systemctl is-active caddy systemctl is-active caddy

View file

@ -28,10 +28,10 @@
# /var/www/monitoring-sites/taler.hacktivism.ch/taler-monitoring-*/index.html # /var/www/monitoring-sites/taler.hacktivism.ch/taler-monitoring-*/index.html
# #
# Live apply on koopa (absolute path — ~ as root is /root): # Live apply on koopa (absolute path — ~ as root is /root):
# sudo /home/hernani/koopa-caddy/apply-monitoring-live.sh # sudo ${APPLY_MONITORING_LIVE}
# Runtime-only (no sudo; hernani admin API): # Runtime-only (no sudo; hernani admin API):
# curl -g -X POST http://[::1]:2019/load -H 'Content-Type: text/caddyfile' \ # curl -g -X POST http://[::1]:2019/load -H 'Content-Type: text/caddyfile' \
# --data-binary @/home/hernani/koopa-caddy/Caddyfile # --data-binary @${KOOPA_CADDY_DIR}/Caddyfile
# --- only inside taler.hacktivism.ch { ... } --- # --- only inside taler.hacktivism.ch { ... } ---
@mon_bare path /monitoring /monitoring_err \ @mon_bare path /monitoring /monitoring_err \

View file

@ -13,8 +13,8 @@ set +a
WORK_ROOT="${WORK_ROOT:-/tmp/taler-monitoring-sites-work}" WORK_ROOT="${WORK_ROOT:-/tmp/taler-monitoring-sites-work}"
HTML_DIR="$WORK_ROOT/html" HTML_DIR="$WORK_ROOT/html"
DEPLOY_SSH="${DEPLOY_SSH:-koopa-external}" DEPLOY_SSH="${DEPLOY_SSH:-}"
DEPLOY_WWW_ROOT="${DEPLOY_WWW_ROOT:-/var/www/monitoring-sites}" DEPLOY_WWW_ROOT="${DEPLOY_WWW_ROOT:-}"
if [ ! -d "$HTML_DIR" ]; then if [ ! -d "$HTML_DIR" ]; then
echo "no HTML_DIR $HTML_DIR — run generate-monitoring-sites.sh first" >&2 echo "no HTML_DIR $HTML_DIR — run generate-monitoring-sites.sh first" >&2
@ -23,7 +23,7 @@ fi
echo "deploy $HTML_DIR${DEPLOY_SSH}:${DEPLOY_WWW_ROOT}/" echo "deploy $HTML_DIR${DEPLOY_SSH}:${DEPLOY_WWW_ROOT}/"
# Prefer writing to a hernani-owned staging dir if /var/www not writable # Prefer writing to a hernani-owned staging dir if /var/www not writable
STAGE_REMOTE="${DEPLOY_STAGING:-/home/hernani/monitoring-sites-staging}" STAGE_REMOTE="${DEPLOY_STAGING:-${DEPLOY_STAGING:-$HOME/monitoring-sites-staging}}"
ssh -o BatchMode=yes -o ConnectTimeout=20 "$DEPLOY_SSH" \ ssh -o BatchMode=yes -o ConnectTimeout=20 "$DEPLOY_SSH" \
"mkdir -p '$STAGE_REMOTE' '$DEPLOY_WWW_ROOT' 2>/dev/null || mkdir -p '$STAGE_REMOTE'" "mkdir -p '$STAGE_REMOTE' '$DEPLOY_WWW_ROOT' 2>/dev/null || mkdir -p '$STAGE_REMOTE'"

View file

@ -43,8 +43,8 @@ SKIP_SSH=1
CONTINUE_ON_ERROR=1 CONTINUE_ON_ERROR=1
PHASES_ERR=urls versions PHASES_ERR=urls versions
PHASES_OK=urls versions PHASES_OK=urls versions
DEPLOY_SSH=koopa-external DEPLOY_SSH=${DEPLOY_SSH:-}
DEPLOY_STAGING=/home/hernani/monitoring-sites-staging DEPLOY_STAGING=${DEPLOY_STAGING:-$HOME/monitoring-sites-staging}
WORK_ROOT= WORK_ROOT=
MONITORING_ROOT=.. MONITORING_ROOT=..
SOURCE_REPO_WEB=https://git.hacktivism.ch/hernani/taler-monitoring SOURCE_REPO_WEB=https://git.hacktivism.ch/hernani/taler-monitoring

View file

@ -7,13 +7,13 @@ if [ -z "$FIRECUDA" ]; then
echo "Set FIRECUDA_SSH to your outside-runner SSH host alias" >&2 echo "Set FIRECUDA_SSH to your outside-runner SSH host alias" >&2
exit 2 exit 2
fi fi
KOOPA="${DEPLOY_SSH:-koopa-external}" KOOPA="${DEPLOY_SSH:?set DEPLOY_SSH in env}"
REMOTE_HTML="${FIRECUDA_HTML:-var/taler-monitoring-sites-work/html/}" REMOTE_HTML="${FIRECUDA_HTML:-var/taler-monitoring-sites-work/html/}"
STAGE="${DEPLOY_STAGING:-/home/hernani/monitoring-sites-staging}" STAGE="${DEPLOY_STAGING:-${DEPLOY_STAGING:-$HOME/monitoring-sites-staging}}"
echo "firecuda:$REMOTE_HTML$KOOPA:$STAGE" echo "firecuda:$REMOTE_HTML$KOOPA:$STAGE"
ssh -o BatchMode=yes -o ConnectTimeout=20 "$KOOPA" "mkdir -p '$STAGE'" ssh -o BatchMode=yes -o ConnectTimeout=20 "$KOOPA" "mkdir -p '$STAGE'"
rsync -az --delete \ rsync -az --delete \
"${FIRECUDA}:${REMOTE_HTML}" \ "${FIRECUDA}:${REMOTE_HTML}" \
"${KOOPA}:${STAGE}/" "${KOOPA}:${STAGE}/"
echo "OK staged. Root: rsync to /var/www/monitoring-sites (see ROOT-ON-KOOPA.md)" echo "OK staged. Root: rsync to (see ROOT-ON-KOOPA.md)"

View file

@ -27,8 +27,8 @@ export PHASES_ERR="${PHASES_ERR:-urls versions}"
export PHASES_OK="${PHASES_OK:-urls versions}" export PHASES_OK="${PHASES_OK:-urls versions}"
export WORK_ROOT="${WORK_ROOT:-$HOME/var/taler-monitoring-sites-work}" export WORK_ROOT="${WORK_ROOT:-$HOME/var/taler-monitoring-sites-work}"
export MONITORING_ROOT="${MONITORING_ROOT:-$ROOT/..}" export MONITORING_ROOT="${MONITORING_ROOT:-$ROOT/..}"
export DEPLOY_SSH="${DEPLOY_SSH:-koopa-external}" export DEPLOY_SSH="${DEPLOY_SSH:-}"
export DEPLOY_STAGING="${DEPLOY_STAGING:-/home/hernani/monitoring-sites-staging}" export DEPLOY_STAGING="${DEPLOY_STAGING:-${DEPLOY_STAGING:-$HOME/monitoring-sites-staging}}"
# Prefer full 9-site list from settings or defaults inside generate script # Prefer full 9-site list from settings or defaults inside generate script
unset ONLY_HOSTS unset ONLY_HOSTS
@ -48,7 +48,7 @@ if [ -n "${DEPLOY_SSH:-}" ] && [ "${DEPLOY_FROM_FIRECUDA:-0}" = "1" ]; then
else else
echo "note: HTML at ${WORK_ROOT}/html — pull from laptop:" echo "note: HTML at ${WORK_ROOT}/html — pull from laptop:"
echo " rsync -az outside-runner:var/taler-monitoring-sites-work/html/ \\" echo " rsync -az outside-runner:var/taler-monitoring-sites-work/html/ \\"
echo " koopa-external:monitoring-sites-staging/" echo " $DEPLOY_SSH:monitoring-sites-staging/"
echo " # or: ./pull-firecuda-to-koopa.sh" echo " # or: ./pull-firecuda-to-koopa.sh"
fi fi

View file

@ -13,15 +13,15 @@ MONITORING_ROOT=..
SKIP_SSH=1 SKIP_SSH=1
# Deploy staging on koopa (host Caddy later — root copies to /var/www) # Deploy staging on koopa (host Caddy later — root copies to /var/www)
DEPLOY_SSH=koopa-external DEPLOY_SSH= # set SSH host for deploy
DEPLOY_SSH_FALLBACKS=koopa DEPLOY_SSH_FALLBACKS=koopa
# Static files for Caddy file_server (created per hostname) # Static files for Caddy file_server (created per hostname)
DEPLOY_WWW_ROOT=/var/www/monitoring-sites DEPLOY_WWW_ROOT= # e.g. /var/www/monitoring-sites
DEPLOY_SUDO=sudo DEPLOY_SUDO=sudo
CADDY_CONFIG=/etc/caddy/Caddyfile CADDY_CONFIG=/etc/caddy/Caddyfile
CADDY_MIRROR_REL=configs/caddy/Caddyfile CADDY_MIRROR_REL=configs/caddy/Caddyfile
# Working tree on deploy host for apply (optional) # Working tree on deploy host for apply (optional)
KOOPA_CADDY_DIR=/home/hernani/koopa-caddy KOOPA_CADDY_DIR= # absolute path to Caddy tree on mon host
# Source link for HTML footer (Forgejo) # Source link for HTML footer (Forgejo)
SOURCE_REPO_WEB=https://git.hacktivism.ch/hernani/taler-monitoring SOURCE_REPO_WEB=https://git.hacktivism.ch/hernani/taler-monitoring

View file

@ -150,7 +150,7 @@ Env (same meaning):
PERF_WARN_MS PERF_FAIL_MS (urls latency; default 8000 / 20000) PERF_WARN_MS PERF_FAIL_MS (urls latency; default 8000 / 20000)
QR_CHECK=0 skip QR form + qrencode/zbarimg (urls phase) QR_CHECK=0 skip QR form + qrencode/zbarimg (urls phase)
QR_ECC=M qrencode ECC level (default M) QR_ECC=M qrencode ECC level (default M)
KOOPA_SSH KOOPA_SSH_FALLBACKS (default koopa → koopa-external) KOOPA_SSH KOOPA_SSH_FALLBACKS (set KOOPA_SSH / KOOPA_SSH_FALLBACKS in env)
METRICS_LOAD=0 skip host/container RAM/CPU probes (e2e/ladder/inside) METRICS_LOAD=0 skip host/container RAM/CPU probes (e2e/ladder/inside)
EXPECT_WEBUI_VERSION=1.6.11 pin merchant /webui/version.txt (urls) EXPECT_WEBUI_VERSION=1.6.11 pin merchant /webui/version.txt (urls)
EXPECT_WEBUI_OVERLAY=selfbuild require substr in version-overlay.txt EXPECT_WEBUI_OVERLAY=selfbuild require substr in version-overlay.txt
@ -187,6 +187,21 @@ SPA pin after selfbuild:
EOF EOF
} }
# Machine-local paths/hosts from taler-monitoring-env install (no hardcodes in suite).
# Install: ~/src/taler-monitoring-env/bin/install-env.sh <machine>
if [ "${_TALER_MON_ENV_LOADED:-0}" != "1" ]; then
_mon_cfg="${TALER_MONITORING_ENV:-${XDG_CONFIG_HOME:-$HOME/.config}/taler-monitoring/env}"
if [ -f "$_mon_cfg" ]; then
# shellcheck disable=SC1090
set -a
# shellcheck disable=SC1091
. "$_mon_cfg"
set +a
fi
unset _mon_cfg
export _TALER_MON_ENV_LOADED=1
fi
# shellcheck source=lib.sh # shellcheck source=lib.sh
source "$ROOT/lib.sh" source "$ROOT/lib.sh"
# ensure i18n after domain may change later # ensure i18n after domain may change later