homelab-codex-ws/scripts/kb/publish.sh

74 lines
2.4 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# scripts/kb/publish.sh — publikacja kb-site (kroki 2-4 z kb/runbooks/kb-site-deploy.md)
#
# Uruchamiane z węzła generującego (SATURN/SOLARIA), nie z PIHA.
# Kolejność bramek: token -> generacja -> --check -> sanity linków -> upload -> smoke test.
# Każda bramka zatrzymuje publikację przy porażce — patrz runbook, sekcja 2-3.
#
# Usage: scripts/kb/publish.sh
set -euo pipefail
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
PIHA_HOST="${PIHA_HOST:-piha.local}"
BASE_URL="https://kb-e2a24af3.okit.pl"
TOKEN_FILE="/opt/homelab/config/kb-site/.env"
BUILD_DIR="$REPO_ROOT/build/kb-site"
TARBALL="/tmp/kb-site.tgz"
log() {
echo "[kb-publish] $*"
}
fail() {
echo "[kb-publish] BLAD: $*" >&2
exit 1
}
log "krok 1/6: wczytanie ACCESS_TOKEN z $TOKEN_FILE"
[[ -f "$TOKEN_FILE" ]] || fail "brak pliku $TOKEN_FILE — patrz kb/runbooks/kb-site-deploy.md sekcja 0"
set -a
# shellcheck disable=SC1090
. "$TOKEN_FILE"
set +a
[[ -n "${ACCESS_TOKEN:-}" ]] || fail "ACCESS_TOKEN pusty w $TOKEN_FILE — nie publikuje bez tokenu"
log "krok 2/6: generacja treści (gen_pages.py --base-url $BASE_URL)"
cd "$REPO_ROOT"
python3 scripts/kb/gen_pages.py --base-url "$BASE_URL"
log "krok 3/6: kontrola wyciekow (gen_pages.py --check)"
if ! python3 scripts/kb/gen_pages.py --check; then
fail "--check wykryl wyciek — publikacja WSTRZYMANA, popraw zrodlo i uruchom ponownie"
fi
log "krok 4/6: sanity check — token w linkach index.html"
KEY_COUNT=$(grep -c 'key=' "$BUILD_DIR/index.html" || true)
[[ "$KEY_COUNT" -gt 0 ]] || fail "0 wystapien 'key=' w $BUILD_DIR/index.html — token nie trafil do linkow"
log " -> $KEY_COUNT linkow z tokenem"
log "krok 5/6: pakowanie i wgranie na $PIHA_HOST"
tar -czf "$TARBALL" -C "$BUILD_DIR" .
log " -> scp $TARBALL do $PIHA_HOST:/tmp/kb-site.tgz"
scp "$TARBALL" "$PIHA_HOST:/tmp/kb-site.tgz"
log " -> helper alpine: podmiana wolumenu kb-site_kb-site_content"
ssh "$PIHA_HOST" 'docker run --rm \
-v kb-site_kb-site_content:/content \
-v /tmp:/src:ro \
alpine sh -c "rm -rf /content/* /content/.[!.]* 2>/dev/null; \
tar -xzf /src/kb-site.tgz -C /content"'
log " -> sprzatanie /tmp (lokalnie i na $PIHA_HOST)"
rm -f "$TARBALL"
ssh "$PIHA_HOST" 'rm -f /tmp/kb-site.tgz'
log "krok 6/6: smoke test na $PIHA_HOST:8250"
SMOKE_OUTPUT=$(ssh "$PIHA_HOST" 'curl -s localhost:8250' | head -c 300)
log " -> odpowiedz (pierwsze 300 znakow):"
echo "$SMOKE_OUTPUT"
log "publikacja zakonczona."