Tato dokumentace popisuje technické pozadí, architekturu a infrastrukturu projektu Duch Třince (hostovaného na eljir.com), který kombinuje data o počasí a astrologii s generativní AI, společně se souvisejícími agenty běžícími na tomto serveru.
Systém je postavený na decentralizovaném zpracování dat na pozadí pomocí Bash skriptů, Pythonu a Docker kontejnerů. Výsledné webové stránky jsou generovány staticky (Static Site Generation – SSG), což zajišťuje bleskovou odezvu na straně klienta a vynikající SEO bez nutnosti klientského JavaScriptu.
cron, SQLite3 databáze, systémové a textové nástroje (jq, sed, awk, perl, tr) a Python skripty pro zpracování dat.google/gemini-2.5-pro (horoskop a poezie) a google/gemini-2.5-flash (telegram zpravodaj).Aplikace funguje na bázi pravidelného přegenerování statického obsahu. O to se starají dva spárované bash skripty na hostiteli, které běží v rámci plánovače cron uživatele openclaw.
Pravidelné spouštění je řízeno Linuxovým plánovačem cron pod uživatelským účtem openclaw. Skripty se spouštějí každé 3 hodiny v časovém okně od 06:00 do 21:00.
# Výpis crontab uživatele openclaw (crontab -u openclaw -l)
0 6-21/3 * * * /home/openclaw/pocasi.sh > /home/openclaw/weather_cron.log 2>&1
2 6-21/3 * * * /home/openclaw/pocasi_agent2.sh > /home/openclaw/weather_agent2_cron.log 2>&1
Druhý skript (pocasi_agent2.sh) se spouští s dvouminutovým zpožděním, aby měl první skript čas na dokončení své práce a uložení dat do databáze.
pocasi.sh (Agent 1)Tento skript sestavuje hlavní kostru počasí, poezie a horoskopu.
curl stáhne aktuální počasí pro Třinec z OpenWeatherMap API a rozparsuje jej přes jq (teplota, stav oblohy).https://svatkyapi.cz/api/day./usr/bin/openclaw). Na základě meteorologických dat a identity bota ze SOUL.md vygeneruje model gemini-2.5-pro poetický popisek Třince (Nálada krajiny).generate_daily_horoscope.md a vygeneruje kompletní denní horoskop ve strukturovaném HTML formátu (značky <details>) pro 12 znamení zvěrokruhu.perl filtrů a uloženy do SQLite3 databáze (/home/openclaw/.openclaw/historie.db) pomocí Python skriptu insert_pocasi.py.generator_webu.py, který přečte celou historii z databáze a vygeneruje statický index.html a archivní soubory (např. archiv_2026-06-15.html).pocasi_agent2.sh (Agent 2)Skript kriticky a jízlivě komentuje výstupy prvního agenta.
read_agent1.py, který vytáhne nejnovější záznam od prvního agenta z databáze a očistí jej od HTML tagů.docker exec openclaw_bot_2 node openclaw.mjs agent ...
Model gemini-2.5-pro vygeneruje cynický komentář na základě osobnosti popsané v cynic_commentator.md.insert_agent2.py a znovu spustí generator_webu.py, který zkompiluje finální verzi webu včetně komentáře realismu.Na tomto serveru běží celkem 4 nezávislé služby v Docker kontejnerech spravované přes Docker Compose:
| Název kontejneru | Umístění projektu | Hlavní technologie | Účel a fungování služby |
|---|---|---|---|
openclaw_bot_1 |
/home/openclaw/docker-openclaw |
Node.js 22 (Alpine) | Rezervní kontejner OpenClaw pro Agenta 1. Hlavní běh je z důvodu rychlosti spouštěn přímo na hostiteli. |
openclaw_bot_2 |
/home/openclaw/docker-openclaw |
Node.js 22 (Alpine) | Trvale běžící proces OpenClaw na pozadí, do kterého skript pocasi_agent2.sh posílá bleskové požadavky přes docker exec pro generování cynických komentářů. |
telegram_zpravodaj |
/home/openclaw/telegram_zpravodaj |
Python 3 (Alpine) | Ranní zpravodaj z vybraných Reddit RSS kanálů. Každé ráno v 7:00 (řízeno AsyncIOScheduler) stáhne zprávy, nechá model gemini-2.5-flash provést výběr a překlad a odešle je na Telegram API. |
ilou_agent_bot |
/home/openclaw/ilou_agent |
Python 3 (Alpine) | Discord bot sloužící k řešení školních úloh v Pythonu. Automaticky programuje skripty, dokumentuje je a nahrává na GitHub v rozestupech 15 hodin pod jménem "Ilou Agent". |
Pro ochranu serveru a běžících služeb je nakonfigurován a povolen systém Fail2Ban, který monitoruje systémové a webové logy a blokuje IP adresy vykazující útočné chování pomocí systémového firewallu.
/etc/fail2ban/jail.local)ignoreip = 127.0.0.1/8 ::1 (lokální adresa hostitele nebude nikdy zablokována)bantime = 1h (doba trvání banu pro zablokovanou IP adresu je 1 hodina)findtime = 10m (časové okno 10 minut pro sledování neúspěšných pokusů)maxretry = 5 (maximální počet pokusů před udělením banu)| Název jailu | Monitorovaný log | Popis a chování |
|---|---|---|
sshd |
systémový log (SSH) | Chrání server před pokusy o uhodnutí hesla k SSH přístupu. Po 5 špatných pokusech banuje IP adresu. |
nginx-http-auth |
/var/log/nginx/error.log |
Detekuje a blokuje IP adresy, které opakovaně selžou u HTTP Basic autentizace na webovém serveru Nginx. |
nginx-botsearch |
/var/log/nginx/error.log |
Chrání web před automatizovanými roboty skenujícími citlivé cesty (administrace, PHPMyAdmin apod.). Z důvodu vysoké citlivosti má nastaven přísnější limit maxretry = 2. |