206 lines
18 KiB
Python
206 lines
18 KiB
Python
#!/usr/bin/env python3
|
|
"""Create all hub pages in Wiki.js via GraphQL API."""
|
|
import json, sys
|
|
|
|
JWT = sys.argv[1] if len(sys.argv) > 1 else ""
|
|
|
|
pages = [
|
|
{
|
|
"title": "Machines & OS",
|
|
"path": "machines",
|
|
"tags": ["machines", "nixos", "ubuntu"],
|
|
"desc": "System configuration for all fleet machines",
|
|
"content": (
|
|
'<div class="container">'
|
|
'<div style="padding:64px 0 32px">'
|
|
'<h1 class="hero__heading" style="font-size:48px">MACHINES & OS</h1>'
|
|
'<p class="hero__subtitle">NixOS and Ubuntu fleet management. Desktop configurations, server deployments, and system administration across all homelab machines.</p>'
|
|
'</div></div>'
|
|
'<div class="container"><span class="section-label">Machines</span>'
|
|
'<div class="explore__grid">'
|
|
'<div class="card"><h2 class="card__heading">sam-desktop</h2><p class="card__subtitle">NixOS 25.11 · Primary Dev</p><p class="card__body">Main development workstation. Niri compositor, 62.7 GB RAM, Pi coding agent.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">nixos-desktop</h2><p class="card__subtitle">NixOS · Server & Docker</p><p class="card__body">Secondary NixOS machine running Docker: Mosquitto, N8N, Snapcast, Pi-Hole backup.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">sam-ubuntu1</h2><p class="card__subtitle">Ubuntu · Docker Host</p><p class="card__body">Primary Docker host running 47+ containers: Wiki.js, Gitea, HA, Caddy, Immich.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Proxmox & Infrastructure</h2><p class="card__subtitle">VM Hosts · Backup</p><p class="card__body">Hypervisor layer, Proxmox Backup Server, and VM management.</p><span class="card__arrow">→</span></div>'
|
|
'</div></div>'
|
|
'<footer class="footer"><p class="footer__text">SYSARCH · Technical Knowledge Base</p></footer>'
|
|
)
|
|
},
|
|
{
|
|
"title": "Docker Ecosystem",
|
|
"path": "docker",
|
|
"tags": ["docker", "containers", "services"],
|
|
"desc": "Docker container management across two hosts",
|
|
"content": (
|
|
'<div class="container"><div style="padding:64px 0 32px">'
|
|
'<h1 class="hero__heading" style="font-size:48px">DOCKER ECOSYSTEM</h1>'
|
|
'<p class="hero__subtitle">Container orchestration for 47+ self-hosted services across nixos-desktop and sam-ubuntu1. Compose stacks, port mapping, volumes, and backups.</p>'
|
|
'</div></div>'
|
|
'<div class="container">'
|
|
'<span class="section-label">Host: nixos-desktop</span>'
|
|
'<div class="explore__grid">'
|
|
'<div class="card"><h2 class="card__heading">Mosquitto MQTT</h2><p class="card__subtitle">Message Broker</p><p class="card__body">Central MQTT broker for all IoT devices. Handles sensor data and event messaging.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">N8N Automation</h2><p class="card__subtitle">Workflow Automation</p><p class="card__body">Node-based automation connecting services, handling webhooks and NFC events.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Snapcast Audio</h2><p class="card__subtitle">Multi-Room Audio</p><p class="card__body">Synchronized audio server with voice assistant integration.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Pi-Hole Backup</h2><p class="card__subtitle">DNS Redundancy</p><p class="card__body">Secondary DNS server synced with primary via NebulaSync.</p><span class="card__arrow">→</span></div>'
|
|
'</div>'
|
|
'<span class="section-label" style="margin-top:64px">Host: sam-ubuntu1</span>'
|
|
'<div class="explore__grid">'
|
|
'<div class="card"><h2 class="card__heading">Caddy Proxy</h2><p class="card__subtitle">Reverse Proxy</p><p class="card__body">Reverse proxy for all *.lab.audasmedia.com.au domains with auto TLS.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Wiki.js & Gitea</h2><p class="card__subtitle">Docs & Git</p><p class="card__body">This wiki platform plus self-hosted Git with CI/CD.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Home Assistant</h2><p class="card__subtitle">Smart Home</p><p class="card__body">Central automation platform managing 30+ IoT devices.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Pi-Hole & DNS</h2><p class="card__subtitle">Primary DNS</p><p class="card__body">Primary DNS sinkhole with ad blocking and local resolution.</p><span class="card__arrow">→</span></div>'
|
|
'</div></div>'
|
|
'<footer class="footer"><p class="footer__text">SYSARCH · Technical Knowledge Base</p></footer>'
|
|
)
|
|
},
|
|
{
|
|
"title": "Dev & AI",
|
|
"path": "dev-ai",
|
|
"tags": ["dev", "ai", "pi-agent", "neovim"],
|
|
"desc": "Development environment and AI coding tools",
|
|
"content": (
|
|
'<div class="container"><div style="padding:64px 0 32px">'
|
|
'<h1 class="hero__heading" style="font-size:48px">DEV & AI</h1>'
|
|
'<p class="hero__subtitle">AI-powered development environment. Pi Coding Agent framework, Neovim configuration, terminal tooling, and AI skill development.</p>'
|
|
'</div></div>'
|
|
'<div class="container"><span class="section-label">Core Tools</span>'
|
|
'<div class="explore__grid">'
|
|
'<div class="card"><h2 class="card__heading">Pi Coding Agent</h2><p class="card__subtitle">Primary AI Tool</p><p class="card__body">Main AI coding agent. Framework, MCP tools, sub-agents, and workflow automation.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Neovim Setup</h2><p class="card__subtitle">Editor Config</p><p class="card__body">Neovim with LSP, plugins, keybindings and AI integration.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Terminal & CLI</h2><p class="card__subtitle">Shell & Tooling</p><p class="card__body">Terminal multiplexing, shell config, CLI tools, and productivity workflows.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Skills & Extensions</h2><p class="card__subtitle">AI Framework</p><p class="card__body">System Architect, Design Build, Security Scanning, and custom extensions.</p><span class="card__arrow">→</span></div>'
|
|
'</div>'
|
|
'<span class="section-label" style="margin-top:64px">Other Tools</span>'
|
|
'<div class="explore__grid">'
|
|
'<div class="card"><h2 class="card__heading">Open Code / Aider</h2><p class="card__subtitle">Alternative AI Tools</p><p class="card__body">Configurations for occasional use alongside Pi agent.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Hermes / OpenClaw</h2><p class="card__subtitle">Specialized Agents</p><p class="card__body">Agent configurations for specialized tasks.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Templates & Prompts</h2><p class="card__subtitle">Reusable Patterns</p><p class="card__body">Prompt templates and workflow patterns for AI development.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">VSCode Setup</h2><p class="card__subtitle">Sporadic GUI Editor</p><p class="card__body">VSCode for occasional GUI-based editing tasks.</p><span class="card__arrow">→</span></div>'
|
|
'</div></div>'
|
|
'<footer class="footer"><p class="footer__text">SYSARCH · Technical Knowledge Base</p></footer>'
|
|
)
|
|
},
|
|
{
|
|
"title": "AI Resume System",
|
|
"path": "ai-resume",
|
|
"tags": ["ai-resume", "langchain", "rag", "react"],
|
|
"desc": "AI-powered resume and portfolio system",
|
|
"content": (
|
|
'<div class="container"><div style="padding:64px 0 32px">'
|
|
'<h1 class="hero__heading" style="font-size:48px">AI RESUME SYSTEM</h1>'
|
|
'<p class="hero__subtitle">Multi-container system that scrapes websites and Obsidian notes to build a RAG knowledge base. LangChain-powered chatbot answers questions about my work.</p>'
|
|
'</div></div>'
|
|
'<div class="container"><span class="section-label">Components</span>'
|
|
'<div class="explore__grid">'
|
|
'<div class="card"><h2 class="card__heading">Architecture</h2><p class="card__subtitle">System Design</p><p class="card__body">End-to-end pipeline: scrape, ingest, embed, retrieve, chat.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Docker Containers</h2><p class="card__subtitle">Infrastructure</p><p class="card__body">Scraper, vector DB, API server, React frontend, supporting services.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">LangChain Pipeline</h2><p class="card__subtitle">Core AI Logic</p><p class="card__body">Document chunking, embeddings, RAG, prompt templates, LLM config.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">React Websites</h2><p class="card__subtitle">Frontend</p><p class="card__body">Portfolio sites embedding the AI chatbot for employer showcase.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Obsidian Ingestion</h2><p class="card__subtitle">Note Pipeline</p><p class="card__body">Scraping, parsing, and embedding Obsidian vaults with wikilinks.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading">Content Sources</h2><p class="card__subtitle">Gardening · Wiki · Notes</p><p class="card__body">All ingested content: gardening, Wiki.js, Obsidian, GitHub projects.</p><span class="card__arrow">→</span></div>'
|
|
'</div></div>'
|
|
'<footer class="footer"><p class="footer__text">SYSARCH · Technical Knowledge Base</p></footer>'
|
|
)
|
|
},
|
|
{
|
|
"title": "Home Assistant & IoT",
|
|
"path": "home-iot",
|
|
"tags": ["home-assistant", "iot", "esp32", "automation"],
|
|
"desc": "Smart home automation and IoT project documentation",
|
|
"content": (
|
|
'<div class="container"><div style="padding:64px 0 32px">'
|
|
'<h1 class="hero__heading" style="font-size:48px">HOME ASSISTANT & IOT</h1>'
|
|
'<p class="hero__subtitle">Smart home automation, ESP32 sensor networks, GPS tracking, garden systems, pet care, voice integration — 28 projects tied through HA and MQTT.</p>'
|
|
'</div></div>'
|
|
'<div class="container"><span class="section-label">Architecture</span>'
|
|
'<div class="explore__grid" style="grid-template-columns:repeat(3,1fr)">'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">How It All Works</h2><p class="card__body">End-to-end IoT: sensors, MQTT, HA automations, voice, dashboards.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Mosquitto MQTT</h2><p class="card__body">Broker config, topics, security, bridging devices to Home Assistant.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Voice & Speech</h2><p class="card__body">Custom voice assistant, Piper TTS, Snapcast integration.</p><span class="card__arrow">→</span></div>'
|
|
'</div>'
|
|
'<span class="section-label">Hardware & Skills Catalog</span>'
|
|
'<div class="explore__grid">'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Electronics Guide</h2><p class="card__subtitle">Soldering · Wiring</p><p class="card__body">Breadboarding, connectors, relays, resistors, capacitors, foundations.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Sensors</h2><p class="card__subtitle">20+ Types</p><p class="card__body">PIR, temp, humidity, light, moisture, gas, radar, GPS, ultrasonic.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Microcontrollers</h2><p class="card__subtitle">ESP32 · RPi</p><p class="card__body">Dev boards, programming, flashing, power management.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">IoT Projects</h2><p class="card__subtitle">28 Projects</p><p class="card__body">GPS tracking, garden, pets, voice assistant, ESP32 networks, cams.</p><span class="card__arrow">→</span></div>'
|
|
'</div></div>'
|
|
'<footer class="footer"><p class="footer__text">SYSARCH · Technical Knowledge Base</p></footer>'
|
|
)
|
|
},
|
|
{
|
|
"title": "Snapcast Audio",
|
|
"path": "audio",
|
|
"tags": ["snapcast", "audio", "raspberry-pi"],
|
|
"desc": "Multi-room synchronized audio system",
|
|
"content": (
|
|
'<div class="container"><div style="padding:64px 0 32px">'
|
|
'<h1 class="hero__heading" style="font-size:48px">SNAPCAST AUDIO</h1>'
|
|
'<p class="hero__subtitle">Synchronized multi-room audio with Snapcast. Raspberry Pi clients, voice assistant integration, and Home Assistant control.</p>'
|
|
'</div></div>'
|
|
'<div class="container">'
|
|
'<div class="explore__grid" style="grid-template-columns:repeat(3,1fr)">'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Architecture</h2><p class="card__body">Snapcast server, multi-room sync, audio sources, voice integration.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">RPi Clients</h2><p class="card__body">Client setup, audio output, placement for room coverage.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Configuration</h2><p class="card__body">Server config, stream management, latency tuning.</p><span class="card__arrow">→</span></div>'
|
|
'</div></div>'
|
|
'<footer class="footer"><p class="footer__text">SYSARCH · Technical Knowledge Base</p></footer>'
|
|
)
|
|
},
|
|
{
|
|
"title": "Network",
|
|
"path": "network",
|
|
"tags": ["network", "dns", "caddy", "security", "vpn"],
|
|
"desc": "Network topology and infrastructure",
|
|
"content": (
|
|
'<div class="container"><div style="padding:64px 0 32px">'
|
|
'<h1 class="hero__heading" style="font-size:48px">NETWORK</h1>'
|
|
'<p class="hero__subtitle">Homelab network infrastructure spanning multiple subnets, DNS, reverse proxy, security, and VPN connectivity.</p>'
|
|
'</div></div>'
|
|
'<div class="container">'
|
|
'<div class="explore__grid" style="grid-template-columns:repeat(3,1fr)">'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Topology</h2><p class="card__body">Network diagram, subnet layout, routing, device addressing.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">DNS & Pi-Hole</h2><p class="card__body">DNS servers, ad blocking, local resolution, DHCP config.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Caddy Proxy</h2><p class="card__body">Reverse proxy, TLS, service routing, security headers.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Security</h2><p class="card__body">Firewall, SSH hardening, fail2ban, network segmentation.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">VPN</h2><p class="card__body">VPN server, client config, remote access, site-to-site.</p><span class="card__arrow">→</span></div>'
|
|
'<div class="card"><h2 class="card__heading" style="font-size:18px">Monitoring</h2><p class="card__body">Uptime monitoring, bandwidth tracking, alerting.</p><span class="card__arrow">→</span></div>'
|
|
'</div></div>'
|
|
'<footer class="footer"><p class="footer__text">SYSARCH · Technical Knowledge Base</p></footer>'
|
|
)
|
|
}
|
|
]
|
|
|
|
# Build batch query
|
|
mutations = []
|
|
for idx, p in enumerate(pages):
|
|
content_escaped = p['content'].replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n')
|
|
tag_str = json.dumps(p['tags'])
|
|
mutation = f''' p{idx}: pages {{
|
|
create(
|
|
title: "{p['title']}"
|
|
path: "{p['path']}"
|
|
content: "{content_escaped}"
|
|
editor: "wysiwyg"
|
|
isPublished: true
|
|
isPrivate: false
|
|
locale: "en"
|
|
tags: {tag_str}
|
|
description: "{p['desc']}"
|
|
) {{
|
|
page {{ id path title }}
|
|
responseResult {{ succeeded message }}
|
|
}}
|
|
}}'''
|
|
mutations.append(mutation)
|
|
|
|
query = 'mutation {\n' + '\n'.join(mutations) + '\n}'
|
|
payload = {"query": query}
|
|
print(f"Payload: {len(json.dumps(payload))} chars", file=sys.stderr)
|
|
|
|
with open('/tmp/wikijs-create-hubs.json', 'w') as f:
|
|
json.dump(payload, f)
|
|
|
|
print(json.dumps(payload))
|
|
PYEOF |