initial COM1 gateway system blueprint
This commit is contained in:
66
bin/hxki_birth_from_tresor.sh
Executable file
66
bin/hxki_birth_from_tresor.sh
Executable 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"
|
||||
152
bin/hxki_falkenstein_birth_certificate.sh
Executable file
152
bin/hxki_falkenstein_birth_certificate.sh
Executable 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
57
bin/hxki_fix_host80.sh
Executable 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
79
bin/hxki_fix_web_v2.sh
Executable 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."
|
||||
228
bin/hxki_homepage_falkenstein_setup.sh
Executable file
228
bin/hxki_homepage_falkenstein_setup.sh
Executable 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
20
bin/hxki_orchestra_repair.sh
Executable 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
103
bin/hxki_setup_web.sh
Executable 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
46
bin/hxki_system_birth.sh
Executable 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"
|
||||
Reference in New Issue
Block a user