Major collapses across 61 files (-2394 / +642, net -1752):
- Killed Zoo Auth Subnet: parallel auth chain contradicts hanzo.id Casdoor as canonical IAM
(deleted k8s/zoo-auth/, compose.auth.yml, auth-gateway/, chain-configs/auth-subnet-genesis.json)
- Postgres StatefulSet → SQLite + Litestream + MinIO replication (per memory no_postgres_sqlite_only)
Bridge becomes single-writer (replicas: 1) with restore init + replicate sidecar
- Plaintext Cloudflare API token in .env wiped; .env added to .gitignore
- 7× <your-domain> CI placeholders → kms.hanzo.ai
- 3 per-env manifests (3 × 130 lines, 90% dup) → 1 canonical manifests/services.yml (89 lines)
- 6 floating tags (:latest / :main) → :main-amd64 immutable per-arch
- Broken org refs ghcr.io/zoolabs/* + @zoolabs npm → ghcr.io/zooai/* + @zooai
- Workflow runner pool zoo-build-amd64 (wrong) → zoo-build-linux-amd64 (canonical)
- ENV var conflation ZOO_NETWORK_ID → LUX_NETWORK_ID + ZOO_EVM_CHAIN_ID
- Stale dev scripts (start/stop/status/setup.sh), convert-to-submodules.sh, Dockerfile.dev,
.gitmodules, zoo.id/ static page, retired ARC values, k8s/patches/ all removed
- Duplicate deploy.yml workflow (shadows ci.yml) killed
- Makefile extended with remote-ops targets (deploy-{dev,test,main}, pods-{dev,test,main}, verify)
Tier-1 metrics all zero: plaintext secrets, Postgres in source, /api/ in own routes, brand contamination.
Zoo L2 EVM on Lux mainnet remains GREEN (chainId 0x30e08, balance 5e27 wei).
All 4 kustomize overlays render clean (system=35, devnet=36, testnet=36, mainnet=39).
88 lines
2.3 KiB
Bash
Executable File
88 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Update a service entry in the canonical manifest.
|
|
#
|
|
# Usage:
|
|
# ./update-manifest.sh <service_key> <sha> <image>
|
|
#
|
|
# Example:
|
|
# ./update-manifest.sh zoo-ngo abc123def "ghcr.io/zooai/zoo-ngo:v1.2.3"
|
|
#
|
|
# Updates manifests/services.yml in-place. Python stdlib only — no yq /
|
|
# PyYAML dependency.
|
|
|
|
set -euo pipefail
|
|
|
|
SERVICE_KEY="${1:?Usage: update-manifest.sh <service_key> <sha> <image>}"
|
|
SHA="${2:?Missing sha}"
|
|
IMAGE="${3:?Missing image}"
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
ROOT_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
MANIFEST="${ROOT_DIR}/manifests/services.yml"
|
|
|
|
if [[ ! -f "${MANIFEST}" ]]; then
|
|
echo "::error::Manifest not found: ${MANIFEST}"
|
|
exit 1
|
|
fi
|
|
|
|
TIMESTAMP="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
|
|
echo "Updating manifest: ${SERVICE_KEY}"
|
|
echo " SHA: ${SHA}"
|
|
echo " Image: ${IMAGE}"
|
|
echo " Time: ${TIMESTAMP}"
|
|
|
|
python3 - "${MANIFEST}" "${SERVICE_KEY}" "${SHA}" "${IMAGE}" "${TIMESTAMP}" <<'PYEOF'
|
|
import sys
|
|
|
|
manifest_path = sys.argv[1]
|
|
service_key = sys.argv[2]
|
|
sha = sys.argv[3]
|
|
image = sys.argv[4]
|
|
timestamp = sys.argv[5]
|
|
|
|
with open(manifest_path, 'r') as f:
|
|
lines = f.readlines()
|
|
|
|
in_target = False
|
|
indent_level = 0
|
|
result = []
|
|
|
|
for line in lines:
|
|
stripped = line.lstrip().rstrip('\n')
|
|
|
|
if stripped == f"{service_key}:" or stripped == f"{service_key}: ":
|
|
leading = len(line) - len(line.lstrip())
|
|
if leading >= 2:
|
|
in_target = True
|
|
indent_level = leading
|
|
result.append(line)
|
|
continue
|
|
|
|
if in_target:
|
|
leading = len(line) - len(line.lstrip())
|
|
if stripped and not stripped.startswith('#') and leading <= indent_level:
|
|
in_target = False
|
|
result.append(line)
|
|
continue
|
|
|
|
if stripped.startswith('image:'):
|
|
result.append(f"{' ' * (indent_level + 2)}image: {image}\n")
|
|
continue
|
|
if stripped.startswith('sha:'):
|
|
result.append(f"{' ' * (indent_level + 2)}sha: \"{sha}\"\n")
|
|
continue
|
|
if stripped.startswith('updatedAt:'):
|
|
result.append(f"{' ' * (indent_level + 2)}updatedAt: \"{timestamp}\"\n")
|
|
continue
|
|
|
|
result.append(line)
|
|
|
|
with open(manifest_path, 'w') as f:
|
|
f.writelines(result)
|
|
|
|
print(f"Updated {service_key} in {manifest_path}")
|
|
PYEOF
|
|
|
|
echo "Manifest updated."
|