initial COM1 gateway system blueprint

This commit is contained in:
harald
2026-03-06 14:37:04 +00:00
commit 48cd0f8d3c
395 changed files with 29966 additions and 0 deletions

66
bin/hxki_birth_from_tresor.sh Executable file
View File

@@ -0,0 +1,66 @@
#!/usr/bin/env bash
set -euo pipefail
# Verzeichnis deines Inventar-Repos (lokal auf Falkenstein!)
INVENTORY_DIR="/opt/hx-ki/repos/hxki-inventory"
REPORT_DIR="/opt/hx-ki/reports"
mkdir -p "$REPORT_DIR"
TS="$(date +"%Y-%m-%d_%H%M%S")"
OUT="${REPORT_DIR}/HXKI_System_BirthCertificate_${TS}.txt"
{
echo "=== HXKI SYSTEM GEBURTSURKUNDE ==="
echo "Quelle: $INVENTORY_DIR"
echo "Zeitpunkt: $(date)"
echo
echo "1) Gesamtübersicht"
echo "------------------"
echo -n "Gesamtgröße des Tresors: "
du -sh "$INVENTORY_DIR" | awk '{print $1}'
echo -n "Anzahl Dateien gesamt: "
find "$INVENTORY_DIR" -type f | wc -l
echo
echo "2) Verzeichnisstruktur (Top-Level, Tiefe 2)"
echo "------------------------------------------"
find "$INVENTORY_DIR" -maxdepth 2 -type d | sed "s|$INVENTORY_DIR|.|"
echo
echo "3) Größte 20 Dateien im Tresor"
echo "------------------------------"
# benötigt GNU find (auf Ubuntu Standard)
find "$INVENTORY_DIR" -type f -printf '%s %p\n' \
| sort -nr \
| head -20 \
| awk '{printf "%10.1f MB %s\n", $1/1024/1024, $2}'
echo
echo "4) Inventar- und Log-Dateien (Auszug)"
echo "-------------------------------------"
INVENT_FILES=$(find "$INVENTORY_DIR" -type f \( -iname "*inventory*" -o -iname "*inventar*" -o -iname "*.log" \) | head -10)
if [ -z "$INVENT_FILES" ]; then
echo "Keine Inventar-/Log-Dateien gefunden."
else
for f in $INVENT_FILES; do
echo
echo "--- Datei: ${f#$INVENTORY_DIR/} ---"
echo "(erste 40 Zeilen)"
echo
sed -n '1,40p' "$f"
echo
done
fi
echo
echo "5) Zusammenfassung"
echo "------------------"
echo "Diese Geburtsurkunde beschreibt den Zustand des HX-KI Tresors"
echo "auf Falkenstein zum angegebenen Zeitpunkt (Größe, Struktur,"
echo "wichtigste Dateien und Inventarauszüge)."
echo
} > "$OUT"
echo "$OUT"

View File

@@ -0,0 +1,152 @@
#!/usr/bin/env bash
# ==========================================
# HX-KI FALKENSTEIN - BIRTH CERTIFICATE V1.0
# ==========================================
set -euo pipefail
# Basispfade
REPORT_DIR="/opt/hx-ki/reports"
mkdir -p "$REPORT_DIR"
TIMESTAMP="$(date +"%Y-%m-%d_%H%M%S")"
REPORT_FILE="${REPORT_DIR}/hxki_falkenstein_birth_certificate_${TIMESTAMP}.txt"
# Header
{
echo "==============================================="
echo " HX-KI SYSTEM GEBURTSURKUNDE FALKENSTEIN"
echo "==============================================="
echo "Erzeugt am: $(date)"
echo
} > "$REPORT_FILE"
# 1) Server-Basisdaten
{
echo "1) SERVER-BASISDATEN"
echo "--------------------"
echo "Hostname: $(hostname)"
echo "OS: $(grep PRETTY_NAME /etc/os-release | cut -d= -f2- | tr -d '\"')"
echo "Kernel: $(uname -r)"
echo "CPU: $(lscpu | grep 'Model name' | sed 's/Model name:\s*//')"
echo "CPU Cores: $(nproc)"
echo "RAM (gesamt): $(grep MemTotal /proc/meminfo | awk '{printf \"%.1f GB\", $2/1024/1024}')"
echo "Swap: $(grep SwapTotal /proc/meminfo | awk '{printf \"%.1f GB\", $2/1024/1024}')"
echo "Root-Filesystem: $(df -h / | tail -1 | awk '{print $2 \" gesamt, \" $3 \" belegt, \" $4 \" frei (\" $5 \" genutzt)\"}')"
echo
} >> "$REPORT_FILE"
# 2) Docker / Container / Services
{
echo "2) DOCKER & CONTAINERZUSTAND"
echo "----------------------------"
if command -v docker >/dev/null 2>&1; then
echo "Docker Version: $(docker --version)"
echo
echo "Laufende Container:"
docker ps --format "table {{.Names}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}" || echo "Keine laufenden Container gefunden."
else
echo "Docker ist nicht installiert oder nicht im PATH."
fi
echo
} >> "$REPORT_FILE"
# 3) Wichtige HX-KI-Komponenten erkennen
{
echo "3) HX-KI KOMPONENTEN FALKENSTEIN"
echo "----------------------------------"
echo "Hinweis: Erkennung über Container-Namen (hxki-*)"
if command -v docker >/dev/null 2>&1; then
# Liste typischer Dienste
SERVICES=(
"hxki-gitea"
"hxki-grafana"
"hxki-prometheus"
"hxki-n8n"
"hxki-mariadb"
"hxki-mautic"
"hxki-syncthing"
"hxki-nats"
"hxki-web"
"hxki-postgres"
"hxki-mailcow"
)
for s in "${SERVICES[@]}"; do
if docker ps --format '{{.Names}}' | grep -q "^${s}$"; then
status="$(docker ps --filter "name=${s}" --format '{{.Status}}')"
image="$(docker ps --filter "name=${s}" --format '{{.Image}}')"
echo "- ${s}: LAUFEND (${status}, Image: ${image})"
elif docker ps -a --format '{{.Names}}' | grep -q "^${s}$"; then
status="$(docker ps -a --filter "name=${s}" --format '{{.Status}}')"
image="$(docker ps -a --filter "name=${s}" --format '{{.Image}}')"
echo "- ${s}: INSTALLIERT, ABER NICHT LAUFEND (${status}, Image: ${image})"
else
echo "- ${s}: NICHT GEFUNDEN"
fi
done
else
echo "Docker nicht verfügbar Komponenten können nicht geprüft werden."
fi
echo
} >> "$REPORT_FILE"
# 4) Netzwerke & Ports
{
echo "4) NETZWERK & PORTS"
echo "-------------------"
if command -v docker >/dev/null 2>&1; then
echo "Docker-Netzwerke:"
docker network ls || echo "Keine Netzwerke gefunden."
echo
fi
echo "Aktiv lauschende Ports (netstat/ss):"
if command -v ss >/dev/null 2>&1; then
ss -tulpn | sed -n '1,50p'
elif command -v netstat >/dev/null 2>&1; then
netstat -tulpn | sed -n '1,50p'
else
echo "Weder ss noch netstat verfügbar."
fi
echo
} >> "$REPORT_FILE"
# 5) HX-KI Verzeichnisstruktur (falls vorhanden)
{
echo "5) HX-KI VERZEICHNISSTRUKTUR (KURZÜBERSICHT)"
echo "--------------------------------------------"
HX_DIR="/opt/hx-ki"
if [ -d "$HX_DIR" ]; then
echo "Basisverzeichnis: $HX_DIR"
echo
echo "Top-Level-Struktur:"
find "$HX_DIR" -maxdepth 2 -type d | sed "s|$HX_DIR|/opt/hx-ki|"
else
echo "$HX_DIR existiert nicht oder ist nicht erreichbar."
fi
echo
} >> "$REPORT_FILE"
# 6) Zusammenfassung
{
echo "6) KURZZUSAMMENFASSUNG FALKENSTEIN STATUS"
echo "-------------------------------------------"
echo "Dieser Bericht fasst den aktuellen Systemzustand des HX-KI Knotens"
echo "Falkenstein zusammen (Serverressourcen, Container, Netzwerke, HX-KI"
echo "Kernkomponenten und Basisstruktur)."
echo
echo "Berichtsdatei:"
echo " $REPORT_FILE"
echo
echo "Hinweis:"
echo "- Dies ist die 'Geburtsurkunde' des Systemzustands zum Zeitpunkt:"
echo " $(date)"
echo "- Der Bericht kann jederzeit erneut erzeugt werden."
echo
} >> "$REPORT_FILE"
echo "HX-KI Geburtsurkunde für Falkenstein erstellt:"
echo " $REPORT_FILE"

57
bin/hxki_fix_host80.sh Executable file
View File

@@ -0,0 +1,57 @@
#!/usr/bin/env bash
set -euo pipefail
DOCKER_DIR="/opt/hx-ki/docker"
cd "$DOCKER_DIR"
echo "=> Backup docker-compose.yml ..."
cp docker-compose.yml docker-compose.yml.bak_host80_$(date +%Y%m%d_%H%M%S)
echo "=> Entferne NUR Host-Port-80-Mappings aus docker-compose.yml ..."
awk '
BEGIN {
in_ports = 0
ports_n = 0
}
{
line = $0
# Wenn wir gerade in einem ports:-Block sind
if (in_ports) {
if ($1 ~ /^-/) {
# Host-Port 80? Dann überspringen
if (line ~ /(^[[:space:]]*-[[:space:]]*"80:[0-9]+")|(^[[:space:]]*-[[:space:]]*80:[0-9]+)/) {
next
} else {
ports_buf[++ports_n] = line
next
}
} else {
# Ende des ports:-Blocks
in_ports = 0
if (ports_n > 0) {
print ports_header
for (i = 1; i <= ports_n; i++) print ports_buf[i]
}
ports_n = 0
# fällt jetzt durch und verarbeitet die aktuelle Zeile normal
}
}
# Neuer ports:-Block
if (line ~ /^[[:space:]]+ports:/) {
in_ports = 1
ports_header = line
ports_n = 0
next
}
# Normale Zeile
print line
}
' docker-compose.yml > docker-compose.yml.tmp
mv docker-compose.yml.tmp docker-compose.yml
echo "=> Orchester starten ..."
docker compose up -d --remove-orphans

79
bin/hxki_fix_web_v2.sh Executable file
View File

@@ -0,0 +1,79 @@
#!/usr/bin/env bash
set -euo pipefail
DOCKER_DIR="/opt/hx-ki/docker"
cd "$DOCKER_DIR"
echo "==> Schritt 1: Backups der Compose-Dateien anlegen ..."
for f in docker-compose.yml docker-compose.override.yml; do
if [ -f "$f" ]; then
cp "$f" "${f}.bak_hxkiweb_$(date +%Y%m%d_%H%M%S)"
echo " Backup erstellt: ${f}.bak_hxkiweb_..."
else
echo " Hinweis: $f nicht vorhanden, überspringe."
fi
done
echo "==> Schritt 2: Eventuelle alte hxki-web Container entfernen ..."
docker rm -f hxki-web docker-hxki-web-1 2>/dev/null || true
echo "==> Schritt 3: In ALLEN Compose-Dateien 'ports:'-Blöcke von hxki-web entfernen ..."
for f in docker-compose.yml docker-compose.override.yml; do
if [ ! -f "$f" ]; then
continue
fi
echo " Bearbeite $f ..."
awk '
# Start des hxki-web Blocks erkennen (egal wie eingerückt)
/^[[:space:]]*hxki-web:/ {
in_hw = 1
print
next
}
# Wenn wir im hxki-web Block sind und eine Zeile mit \"ports:\" kommt,
# Ports-Block markieren, aber nicht drucken
in_hw && $1 == "ports:" {
in_ports = 1
next
}
# Solange wir im Ports-Block sind:
in_ports {
# Zeilen mit \"-\" (Port-Mapping) überspringen
if ($1 == "-") next
# Erste Zeile, die kein \"-\" mehr ist -> Ports-Block Ende
in_ports = 0
}
# Wenn wir im hxki-web Block sind und eine leere Zeile kommt,
# ist der Block als solcher zu Ende
in_hw && NF == 0 {
in_hw = 0
print
next
}
# Alle anderen Zeilen ganz normal drucken
{ print }
' "$f" > "$f.tmp" && mv "$f.tmp" "$f"
done
echo "==> Schritt 4: Compose-Konfiguration prüfen (Services auflisten) ..."
docker compose config --services || true
echo "==> Schritt 5: Orchester starten (inkl. Entfernen von Waisen-Containern) ..."
docker compose up -d --remove-orphans
echo "==> Schritt 6: Status von hxki-web prüfen ..."
docker ps | grep hxki-web || echo " Hinweis: Kein laufender Container mit 'hxki-web' im Namen gefunden."
echo "==> Schritt 7: Caddy neu laden (falls vorhanden) ..."
if docker ps | grep -q hx-caddy-caddy-1; then
docker exec -it hx-caddy-caddy-1 caddy reload || echo " Hinweis: Caddy-Reload hat eine Warnung produziert."
else
echo " Hinweis: Caddy-Container hx-caddy-caddy-1 läuft nicht oder heißt anders."
fi
echo "==> FERTIG: Alle ports:-Blöcke für hxki-web entfernt, Orchester läuft neu."

View File

@@ -0,0 +1,228 @@
#!/usr/bin/env bash
set -euo pipefail
echo "=== HX-KI Homepage Setup (Falkenstein) ==="
########################################
# 0. PARAMETER
########################################
# Falls dein Next.js-Projekt woanders liegt: HIER anpassen.
WEB_ROOT="/opt/hx-ki/web/nextjs"
WORKSPACE="/opt/hx-ki/workspaces/homepage"
AGENT_DIR="/opt/hx-ki/agents"
API_DIR="$WEB_ROOT/app/api/homepage"
echo "WEB_ROOT: $WEB_ROOT"
echo "WORKSPACE: $WORKSPACE"
echo "AGENT_DIR: $AGENT_DIR"
echo "API_DIR: $API_DIR"
echo
########################################
# 1. VERZEICHNISSE ANLEGEN
########################################
mkdir -p "$WORKSPACE"
mkdir -p "$AGENT_DIR"
mkdir -p "$API_DIR"
echo "✔ Verzeichnisse angelegt."
########################################
# 2. BASIS-HOMEPAGE.JSON ANLEGEN (FALLS NICHT VORHANDEN)
########################################
HOMEPAGE_JSON="$WORKSPACE/homepage.json"
if [[ ! -f "$HOMEPAGE_JSON" ]]; then
cat > "$HOMEPAGE_JSON" <<EOF
{
"hero_title": "HX-KI Cognitive Clarity",
"hero_sub": "Vom Chaos zur Klarheit. Falkenstein liefert nur aus dem Workspace.",
"sections": [
{
"title": "Status",
"text": "Die Homepage wird jetzt aus /opt/hx-ki/workspaces/homepage/homepage.json versorgt."
},
{
"title": "Architektur",
"text": "Falkenstein greift NICHT auf Gehirn oder Motor zu. Nur Workspace."
}
]
}
EOF
echo "✔ Default homepage.json erstellt: $HOMEPAGE_JSON"
else
echo "✔ homepage.json existiert bereits wird NICHT überschrieben."
fi
########################################
# 3. JSON-AGENT ANLEGEN (ERZEUGT/ÜBERSCHREIBT HOMEPAGE.JSON)
########################################
AGENT_SCRIPT="$AGENT_DIR/json_homepage_agent.py"
cat > "$AGENT_SCRIPT" <<'EOF'
#!/usr/bin/env python3
import json
import os
WORKSPACE = "/opt/hx-ki/workspaces/homepage"
FILE = os.path.join(WORKSPACE, "homepage.json")
os.makedirs(WORKSPACE, exist_ok=True)
content = {
"hero_title": "HX-KI Dynamischer JSON-Agent",
"hero_sub": "Content kommt aus dem Workspace auf Falkenstein kein Zugriff auf Gehirn oder Motor.",
"sections": [
{
"title": "Agent-Status",
"text": "Dieser JSON-Agent kann von Events, Cron, KI oder Mautic getriggert werden."
},
{
"title": "Architektur-Sicherheit",
"text": "Falkenstein liest nur den Workspace. Nürnberg & Helsinki bleiben intern."
}
]
}
with open(FILE, "w") as f:
json.dump(content, f, indent=2)
print(f"✔ homepage.json durch json_homepage_agent.py erzeugt/aktualisiert: {FILE}")
EOF
chmod +x "$AGENT_SCRIPT"
echo "✔ JSON-Agent angelegt: $AGENT_SCRIPT"
########################################
# 4. SELBSTHEILUNG FÜR HOMEPAGE.JSON
########################################
REPAIR_SCRIPT="$WORKSPACE/repair_homepage_json.sh"
cat > "$REPAIR_SCRIPT" <<'EOF'
#!/usr/bin/env bash
set -euo pipefail
FILE="/opt/hx-ki/workspaces/homepage/homepage.json"
echo "=== Repair homepage.json ==="
if [[ ! -f "$FILE" ]]; then
echo "✘ homepage.json fehlt wird neu erstellt."
cat > "$FILE" <<EOF2
{
"hero_title": "HX-KI Repair Mode",
"hero_sub": "homepage.json war weg und wurde automatisch neu erstellt.",
"sections": [
{
"title": "Hinweis",
"text": "Dies ist ein Fallback-Content aus repair_homepage_json.sh."
}
]
}
EOF2
echo "✔ homepage.json neu angelegt."
exit 0
fi
# JSON grob prüfen (ohne jq, über Python)
python3 - <<PYEOF
import json, sys
try:
json.load(open("$FILE", "r"))
except Exception as e:
sys.exit(1)
PYEOF
if [[ $? -eq 0 ]]; then
echo "✔ homepage.json ist gültiges JSON."
else
echo "✘ homepage.json ist defekt wird repariert."
cat > "$FILE" <<EOF3
{
"hero_title": "HX-KI Repair Mode",
"hero_sub": "homepage.json war defekt und wurde automatisch repariert.",
"sections": [
{
"title": "Hinweis",
"text": "Der vorherige Inhalt war ungültig. Dies ist ein Fallback."
}
]
}
EOF3
echo "✔ homepage.json repariert."
fi
EOF
chmod +x "$REPAIR_SCRIPT"
echo "✔ Repair-Skript angelegt: $REPAIR_SCRIPT"
########################################
# 5. CRONJOB FÜR SELBSTHEILUNG (ALLE 5 MINUTEN)
########################################
CRON_LINE="*/5 * * * * $REPAIR_SCRIPT >/dev/null 2>&1"
# Cron nur hinzufügen, wenn noch nicht vorhanden
( crontab -l 2>/dev/null | grep -v "$REPAIR_SCRIPT" || true; echo "$CRON_LINE" ) | crontab -
echo "✔ Cronjob für Repair installiert (alle 5 Minuten)."
########################################
# 6. NEXT.JS API-ROUTE FÜR /api/homepage
########################################
ROUTE_FILE="$API_DIR/route.ts"
cat > "$ROUTE_FILE" <<'EOF'
import { NextResponse } from "next/server";
import fs from "fs";
export async function GET() {
const path = "/opt/hx-ki/workspaces/homepage/homepage.json";
try {
const raw = fs.readFileSync(path, "utf-8");
const data = JSON.parse(raw);
return NextResponse.json(data);
} catch (err) {
console.error("Error reading homepage.json:", err);
return NextResponse.json(
{
error: "Homepage content not available",
details: "Check /opt/hx-ki/workspaces/homepage/homepage.json on Falkenstein."
},
{ status: 500 }
);
}
}
EOF
echo "✔ Next.js API-Route erstellt: $ROUTE_FILE"
########################################
# 7. ERSTEN LAUF DES JSON-AGENTEN AUSFÜHREN
########################################
echo "=== Erster Lauf des JSON-Agents ==="
"$AGENT_SCRIPT" || echo "Warnung: JSON-Agent konnte nicht ausgeführt werden."
echo
echo "=== Fertig. Schritte als Nächstes: ==="
echo "1) Stelle sicher, dass WEB_ROOT korrekt ist (aktuell: $WEB_ROOT)."
echo "2) Baue/Starte dein hxki-web / Next.js-Container neu."
echo "3) Rufe im Browser /api/homepage auf dort sollte JSON kommen."
echo "4) Binde in app/page.tsx o.ä. fetch('https://DEINE-DOMAIN/api/homepage') ein."
echo
echo "=== HX-KI Homepage Setup (Falkenstein) COMPLETE ==="

20
bin/hxki_orchestra_repair.sh Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env bash
set -euo pipefail
DOCKER_DIR="/opt/hx-ki/docker"
cd "$DOCKER_DIR"
echo "=> Backup docker-compose.yml ..."
cp docker-compose.yml docker-compose.yml.bak_orchestra_$(date +%Y%m%d_%H%M%S)
echo "=> Entferne Service 'hxki-web' aus docker-compose.yml ..."
awk '
/^[[:space:]]*hxki-web:/ { in_blk=1; next }
in_blk && NF==0 { in_blk=0; next }
!in_blk { print }
' docker-compose.yml > docker-compose.yml.tmp
mv docker-compose.yml.tmp docker-compose.yml
echo "=> Orchester starten ..."
docker compose up -d --remove-orphans

103
bin/hxki_setup_web.sh Executable file
View File

@@ -0,0 +1,103 @@
#!/usr/bin/env bash
set -euo pipefail
WEB_DIR="/opt/hx-ki/web/hx-ki-website"
COMPOSE_FILE="/opt/hx-ki/docker/docker-compose.yml"
CADDY_FILE="/opt/hx-ki/caddy/Caddyfile"
echo "==> Prüfe, ob Web-Verzeichnis existiert: $WEB_DIR"
if [ ! -d "$WEB_DIR" ]; then
echo "FEHLER: Verzeichnis $WEB_DIR existiert nicht."
echo "Bitte sicherstellen: ZIP entpackt nach /opt/hx-ki/web/hx-ki-website"
exit 1
fi
echo "==> Erstelle/überschreibe Dockerfile im Web-Verzeichnis ..."
cat > "$WEB_DIR/Dockerfile" << 'EOF_DF'
FROM node:20-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
ENV NODE_ENV=production
ENV PORT=3003
EXPOSE 3003
CMD ["npm", "start"]
EOF_DF
echo "==> Sicherung von docker-compose.yml anlegen ..."
cp "$COMPOSE_FILE" "${COMPOSE_FILE}.bak_website_$(date +%Y%m%d_%H%M%S)"
echo "==> Prüfe, ob Service 'hxki-web' bereits existiert ..."
if grep -q "hxki-web:" "$COMPOSE_FILE"; then
echo "Service 'hxki-web' ist bereits in $COMPOSE_FILE vorhanden. Überspringe Einfügen."
else
echo "==> Füge Service 'hxki-web' in docker-compose.yml ein ..."
awk '
BEGIN {added=0}
/^services:/ {print; in_services=1; next}
in_services && !added && ($0 !~ /^ /) {
print " hxki-web:";
print " container_name: hxki-web";
print " build:";
print " context: /opt/hx-ki/web/hx-ki-website";
print " restart: unless-stopped";
print " networks:";
print " - hxki-internal";
print "";
added=1;
}
{print}
END {
if (in_services && !added) {
print " hxki-web:";
print " container_name: hxki-web";
print " build:";
print " context: /opt/hx-ki/web/hx-ki-website";
print " restart: unless-stopped";
print " networks:";
print " - hxki-internal";
print "";
}
}
' "$COMPOSE_FILE" > "${COMPOSE_FILE}.tmp"
mv "${COMPOSE_FILE}.tmp" "$COMPOSE_FILE"
fi
echo "==> Sicherung der Caddyfile anlegen ..."
cp "$CADDY_FILE" "${CADDY_FILE}.bak_website_$(date +%Y%m%d_%H%M%S)"
echo "==> Prüfe, ob hx-ki.com bereits in Caddyfile existiert ..."
if grep -q "hx-ki.com" "$CADDY_FILE"; then
echo "ACHTUNG: Ein Eintrag für hx-ki.com existiert bereits."
echo "Ich füge KEINEN neuen Block hinzu, um nichts zu zerschießen."
echo "Bitte später manuell prüfen/anpassen: $CADDY_FILE"
else
echo "==> Ergänze hx-ki.com Block in Caddyfile ..."
cat >> "$CADDY_FILE" << 'EOF_CF'
hx-ki.com {
encode gzip
reverse_proxy hxki-web:3003
}
EOF_CF
fi
echo "==> Baue Service hxki-web über das Orchester-Compose ..."
cd /opt/hx-ki/docker
docker compose build hxki-web
echo "==> Starte komplettes Orchester (inkl. hxki-web) ..."
docker compose up -d
echo "==> Caddy neu laden ..."
docker exec -it hx-caddy-caddy-1 caddy reload || echo "Hinweis: Caddy-Reload fehlgeschlagen, bitte prüfen."
echo "==> Fertig. hxki-web ist jetzt Teil des Orchesters und im internen Netz erreichbar."

46
bin/hxki_system_birth.sh Executable file
View File

@@ -0,0 +1,46 @@
#!/usr/bin/env bash
set -euo pipefail
REPORT_DIR="/opt/hx-ki/reports"
mkdir -p "$REPORT_DIR"
TIMESTAMP="$(date +"%Y-%m-%d_%H%M%S")"
OUTFILE="${REPORT_DIR}/HXKI_System_BirthCertificate_${TIMESTAMP}.txt"
# Hosts
NBG="ubuntu-8gb-nbg1-1"
HEL="ubuntu-16gb-hel1-1"
FSN="localhost"
# Node-Script (muss auf allen Servern liegen)
NODE_SCRIPT="/opt/hx-ki/bin/hxki_node_birth_certificate.sh"
echo "=== HXKI SYSTEM GEBURTSURKUNDE ===" > "$OUTFILE"
echo "Erstellt: $(date)" >> "$OUTFILE"
echo >> "$OUTFILE"
make_section () {
local HOST="$1"
local NAME="$2"
echo "--- Knoten: ${NAME} ---" >> "$OUTFILE"
if [ "$HOST" = "localhost" ]; then
NODE_FILE=$(sudo $NODE_SCRIPT | tail -n1)
cat "$NODE_FILE" >> "$OUTFILE"
else
REMOTE_FILE=$(ssh "$HOST" "sudo $NODE_SCRIPT" | tail -n1)
scp "$HOST:$REMOTE_FILE" /tmp/hxki_node.txt >/dev/null
cat /tmp/hxki_node.txt >> "$OUTFILE"
fi
echo >> "$OUTFILE"
echo >> "$OUTFILE"
}
make_section "$NBG" "NUERNBERG"
make_section "$HEL" "HELSINKI"
make_section "$FSN" "FALKENSTEIN"
echo "FERTIG."
echo "$OUTFILE"