Google‑Suche
Ken Rockwell hat mich auf die Idee gebracht. Ken betreibt seit 1973 eine Webseite über Fotografie, die unterdessen sehr umfangreich ist. Eine ideale Quelle für Testberichte über Fotohardware. Das Design ist seit Jahren unverändert und ignoriert aktuelle Designtrends konsequent, der Inhalt steht im Vordergrund. Zudem funktioniert die Suche mit Google hervorragend:
[KEN ROCKWELL]
Um optimale Ergebnisse zu erzielen, muss die Website für die Google‑Crawler‑Bots optimiert sein.
Alternative im Intranet: Open WebUI
Für Recherchen mit eigener KI im eigenen, isolierten Netzwerk verwende ich Open WebUI mit einer Wissensbasis, welche von einem Agenten via API inkrementell ergänzt wird. Ausgangspunkt ist der Obsidian Vault, wo ich den Text für den Blog erstelle. Eine andere Variante wäre der Zugriff direkt auf die Ghost‑Plattform via API. Auch dies ist automatisiert mit einem Agenten möglich.
Cloudflare
Den Ghost-Blog betreibe ich zu Hause auf einem UNRAID-Server. In groben Zügen ist es hier beschrieben:
Von aussen erreichbar ist der Blog via Cloudflare-Tunnel. Der Schutz ist so deutlich höher, als wenn Ports direkt ins Internet exponiert werden.
Sicherheitsregeln für öffentliche Webseiten


Wer wird blockiert / überprüft?
- Alle normalen Nutzer und potenziell schädlichen Bots, die sich ausserhalb von Deutschland, der Schweiz, Frankreich und den USA befinden.
Wer darf ungehindert auf die Website zugreifen?
- Alle Besucher (egal ob Mensch oder legitimer Bot) aus DE, CH, FR und US.
- Bekannte Suchmaschinen-Crawler (Google, Bing etc.), selbst wenn deren Server in einem ganz anderen Land stehen. Dadurch wird verhindert, dass die Website fälschlicherweise aus dem Google-Index fliegt.
Das Geoblocking habe ich selber im Ausland getestet, es funktioniert. Aus Italien und England hatte ich keinen Zugriff. Meine Kinder konnten auf einer kürzlichen Reise nach Japan auch nicht darauf zugreifen. Mit einem VPN-Dienst dann der Block natürlich umgangen oder auch getestet werden.
Die Analyse mit Lighthouse hat nicht in allen Bereichen funktioniert, da der Google-Server offenbar in Finnland steht. Daher habe ich mit cf.client.bot allen durch Cloudflare verifizierten Bots nun Zugriff gewährt.
Sicherheitsregeln für private Webseiten

Bei einer privaten Website kann der Zugriff für Bots und Suchmaschinen-Crawler blockiert werden. So werden die Inhalte nicht indexiert und nicht öffentlich exponiert.
Analyse mit Google-Lighthouse
Um den Ghost-Blog für die Google-Suche zu optimieren, habe ich diese mit Lighthouse analysiert.
Das Ranking hat sich deutlich verbessert, nachdem ich dem Lighthouse-Bot aus Finnland Zugriff gewährt habe.
UNRAID Docker Setup
Nach der Analyse mit Lighthouse habe ich diese Variable hinzugefügt:
-e 'X-Forwarded-Proto'='https' Vollständige Konfiguration für Docker in UNRAID:
docker run \
-d \
--name='GHOSTsupportnet' \
--net='bridge' \
--pids-limit 2048 \
-e TZ="Europe/Berlin" \
-e HOST_OS="Unraid" \
-e HOST_HOSTNAME="ASRockMini" \
-e HOST_CONTAINERNAME="GHOSTsupportnet" \
-e 'database**connection**host'='192.168.16.44' \
-e 'database**connection**user'='ghost' \
-e 'database**connection**password'='passwort' \
-e 'database**connection**database'='ghost' \
-e 'url'='https://supportnet.ch/' \
-e 'mail**transport'='SMTP' \
-e 'mail**options**service'='Mailgun' \
-e 'mail**options**auth**user'='[email protected]' \
-e 'mail**options**auth**pass'='key' \
-e 'database**connection**port'='3301' \
-e 'mail**options**host'='smtp.eu.mailgun.org' \
-e 'mail**options**port'='465' \
-e 'mail**options**secure'='true' \
-e 'X-Forwarded-Proto'='https' \
-e 'database**client'='mysql' \
-e 'NODE_ENV'='production' \
-l net.unraid.docker.managed=dockerman \
-l net.unraid.docker.icon='https://raw.githubusercontent.com/cheesemarathon/docker-templates/master/images/Ghost.png' \
-p '2368:2368/tcp' \
-v '/mnt/cache/appdata/GHOSTsupportnet':'/var/lib/ghost/content':'rw' \
ghost:6Ghost Header Inject
Mit diesem zusätzlichen Code im Header hat Lighthouse das Ranking erhöht:
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="News aus der IT, Projekte bei PopNet Informatik AG & Kaformatik AG sowie spannende Hobby-Projekte von Peter Portmann." />Ghost Mitgliederverwaltung
Diese ist zusammen mit dem E‑Mail‑Newsletter eigentlich nur Proof of Concept. Ich verwende diese nicht produktiv. Wichtig ist mir eine Umgebung, welche mich grosse Mengen an Fotos mit Drag und Drop publizieren lässt und diese performant darstellt. Ghost ist hier deutlich leistungsfähiger als beispielsweise WordPress.
Für schnellere Ladezeiten habe ich nun die Mitgliederregistrierung und Verwaltung deaktiviert.
llms.txt
Wenn diese Datei bereitsteht, erhöht sich das Ranking für 'agentisches Browsing'. Da ich schon Cloudflare verwende, habe ich sie mit einem Worker bereitgestellt. Ghost unterstützt diese Funktion zurzeit noch nicht nativ.
Im Cloudflare‑Dashboard kann ein Worker unter Erstellen / Compute / Workers und Pages erstellt werden. Die Menüstruktur in Cloudflare ist kreativ und ändert sich ständig. Wenn die KI um Hilfe gebeten wird, sollte immer verlangt werden, dass wirklich die aktuellste Dokumentation gesucht wird.
Route
supportnet.ch/llms.txt*Code
export default {
async fetch(request) {
const url = new URL(request.url);
if (url.pathname ! "/llms.txt") {
return fetch(request);
}
const body = `# supportnet.ch
> Consulting mit und ohne KI. Massgeschneiderte IT-Lösungen mit dem Team von PopNet Informatik und Kaformatik Software Entwicklung.
supportnet.ch bietet Informationen, Beratung und technische Unterstützung rund um IT-Consulting, KI-Integration, individuelle Softwareentwicklung und digitale Infrastruktur.
## Primäre Links
- [Startseite](https://supportnet.ch/): Einstieg und Übersicht der Website.
- [Kontakt](https://supportnet.ch/kontakt/): Kontaktaufnahme für Beratung, Projekte und Anfragen.
## Details & Services
Diese Plattform bietet tiefgehende Expertise und Unterstützung in den folgenden Bereichen:
- IT-Consulting und Beratung mit und ohne Integration von Künstlicher Intelligenz
- Massgeschneiderte IT-Lösungen und Softwareentwicklung
- Systemintegration, Automatisierung und technische Projektumsetzung
- Zusammenarbeit und Umsetzung durch PopNet Informatik und Kaformatik Software Entwicklung
## Maschinenlesbare Quellen
- [Sitemap](https://supportnet.ch/sitemap.xml): Übersicht der öffentlich auffindbaren Seiten.
- [RSS Feed](https://supportnet.ch/rss/): Feed der neuesten öffentlichen Inhalte.
`;
return new Response(body, {
status: 200,
headers: {
"content-type": "text/plain; charset=utf-8",
"cache-control": "public, max-age=3600"
}
});
}
};Ranking mit Google-Lighthouse
Hier das Resultat noch Optimierung im Vergleich mit WordPress und Typo3 Webseiten.
supportnet.ch - Ghost-Blog

Vergleich:
kaformatik.ch - WordPress mit DIVI 4 Theme

Vergleich:
net-function - WordPress

Vergleich:
popnet.ch - Typo3

Ghost Suchfunktion mit Google-Suche ersetzen
Eigenes Suchfenster mit Codeinject im Header
Wenn oben rechts auf das Luppensymbol geklickt wird, erscheint nun ein separates Fenster:


Google Suche ohne Werbung oder KI-Inhalte
https://www.google.com/search?q=site:supportnet.ch+mylio&udm=14Der Parameter &udm=14 ist ein spezifischer Zusatz für die Adresszeile (URL) bei einer Google-Suche. Wenn dieser Parameter an die Such-URL angehängt wird, schaltet Google die Anzeige in den reinen Web-Modus.
Das bedeutet im Klartext: Du bekommst das „alte“, klassische Google zurück.
Was bewirkt &udm=14 genau?
Wenn du den Parameter nutzt, filtert Google die Suchergebnisse radikal und befreit die Seite von modernem Ballast.
- Keine AI Overviews: Die oft ungenauen oder störenden KI-Zusammenfassungen (Gemini) am Anfang der Suche werden komplett ausgeblendet.
- Weniger Ablenkung: Infoboxen (Knowledge Panels), Rezept-Karussells, Schlagzeilen-Boxen oder Widget-Einblendungen verschwinden.
- Fokus auf Textlinks: Dir werden fast ausschliesslich die klassischen, organischen „blauen Links“ und reine Texttreffer angezeigt.
Codeinjection im Header
<script>
(function() {
// Erstellt das Such-Overlay dynamisch im Hintergrund
function createSearchModal() {
if (document.getElementById('custom-search-modal')) return;
const modal = document.createElement('div');
modal.id = 'custom-search-modal';
modal.innerHTML = `
<div class="search-modal-content">
<h3>supportnet.ch Blog durchsuchen</h3>
<div class="search-modal-spacer"></div>
<form id="custom-search-form">
<input type="text" id="custom-search-input" placeholder="Suchbegriff eingeben..." autocomplete="off">
<div class="search-modal-buttons">
<button type="button" id="search-cancel-btn">Abbrechen</button>
<button type="submit" id="search-confirm-btn">SUCHEN</button>
</div>
</form>
</div>
`;
document.body.appendChild(modal);
// Event-Listener für das neue Fenster
const form = modal.querySelector('#custom-search-form');
const input = modal.querySelector('#custom-search-input');
const cancelBtn = modal.querySelector('#search-cancel-btn');
form.addEventListener('submit', function(e) {
e.preventDefault();
const query = input.value;
if (query && query.trim() ! "") {
const googleUrl = "https://www.google.com/search";
const myDomain = "supportnet.ch";
// &udm=14 schaltet auf die klassische textbasierte Websuche ohne Anzeigen und KI-Blöcke
window.location.href = `${googleUrl}?q=site:${myDomain}+${encodeURIComponent(query)}&udm=14`;
}
});
cancelBtn.addEventListener('click', closeSearchModal);
modal.addEventListener('click', function(e) {
if (e.target = modal) closeSearchModal();
});
}
function openSearchModal() {
createSearchModal();
const modal = document.getElementById('custom-search-modal');
modal.classList.add('is-active');
setTimeout(() => modal.querySelector('#custom-search-input').focus(), 50);
}
function closeSearchModal() {
const modal = document.getElementById('custom-search-modal');
if (modal) {
modal.classList.remove('is-active');
modal.querySelector('#custom-search-input').value = '';
}
}
// Globale Event-Abfänger (Klicks auf deine Theme-Buttons)
window.addEventListener('click', function(e) {
if (e.target.closest('[data-ghost-search]') || e.target.closest('.gh-search') || e.target.closest('.gh-nav-search')) {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
openSearchModal();
}
}, true);
// Tastatur-Shortcut (Strg + K / Cmd + K)
window.addEventListener('keydown', function(e) {
if ((e.ctrlKey || e.metaKey) && e.key = 'k') {
e.preventDefault();
e.stopPropagation();
e.stopImmediatePropagation();
openSearchModal();
}
if (e.key = 'Escape') {
closeSearchModal();
}
}, true);
})();
</script>
<style>
/* CSS für das elegante Such-Pop-up */
#custom-search-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.6);
display: flex;
align-items: center;
justify-content: center;
z-index: 999999;
opacity: 0;
pointer-events: none;
transition: opacity 0.2s ease;
font-family: "GeneralSans-Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
#custom-search-modal.is-active {
opacity: 1;
pointer-events: auto;
}
.search-modal-content {
background: #1c1c1e;
color: #E8E8E8;
padding: 25px;
border-radius: 12px;
width: 90%;
max-width: 500px;
box-shadow: 0 8px 32px rgba(0,0,0,0.5);
border: 1px solid #2c2c2e;
}
.search-modal-content h3 {
margin: 0;
font-size: 20px;
font-weight: 600;
color: #E8E8E8;
font-family: "ClashDisplay-Variable", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
}
.search-modal-spacer {
height: 20px;
}
#custom-search-input {
width: 100%;
padding: 12px;
background: #2c2c2e;
border: 1px solid #3a3a3c;
border-radius: 6px;
color: #fff;
font-size: 16px;
outline: none;
box-sizing: border-box;
transition: border-color 0.2s;
}
#custom-search-input:focus {
border-color: #e24303;
}
.search-modal-buttons {
display: flex;
justify-content: flex-end;
gap: 14px;
margin-top: 25px;
}
.search-modal-buttons button {
padding: 10px 24px;
font-size: 14px;
cursor: pointer;
transition: all 0.2s ease;
box-sizing: border-box;
border-radius: 6px;
}
#search-cancel-btn {
background: transparent;
border: 1px solid #3a3a3c;
color: #ffffff;
font-weight: 500;
}
#search-cancel-btn:hover {
border-color: #8e8e93;
background: rgba(255, 255, 255, 0.05);
}
#search-confirm-btn {
background: #e24303;
border: 1px solid #e24303;
color: #ffffff;
font-weight: bold;
letter-spacing: 0.5px;
}
#search-confirm-btn:hover {
background: #b83300;
border-color: #b83300;
}
</style>