✨ Add automated session logging system
Some checks failed
Build and Deploy Docs / build-and-deploy (push) Has been cancelled
Some checks failed
Build and Deploy Docs / build-and-deploy (push) Has been cancelled
- Created logs/ structure (sessions, operations, incidents) - Added session-start/log/end scripts - Installed Git hooks for auto-logging commits/pushes - Added shell integration for zsh - Created CHANGELOG.md - Documented today's session (2026-01-10)
This commit is contained in:
@@ -361,3 +361,12 @@ cat docs/tasks/PHASE3_MASTER_TASK.md | pbcopy
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -128,3 +128,12 @@ if (errorMessage.includes('Provider error') ||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -614,3 +614,12 @@ await knowledgeBaseService.uploadFile("helion", file);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -187,3 +187,12 @@ Request body: {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -128,3 +128,12 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -424,3 +424,12 @@ http://localhost:8899/microdao/daarion
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -517,3 +517,12 @@ const systemPrompt = DEFAULT_PROMPTS[agentId][language];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -645,3 +645,12 @@ GET /api/telegram/{agent_id}/status
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -164,3 +164,12 @@ INFO: Selected provider: LLMProvider(id='llm_local_qwen3_8b')
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -463,3 +463,12 @@ Remaining Work:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -133,3 +133,12 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -173,3 +173,12 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -310,3 +310,12 @@ export function EnergyUnionCabinetPage() {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -151,3 +151,12 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -384,3 +384,12 @@ Helion потребує перереєстрації webhook, інші боти
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1607,3 +1607,199 @@ ps aux | awk '$3 > 50'
|
||||
|
||||
---
|
||||
|
||||
|
||||
### Incident #4: ALL PostgreSQL Images Show Malware — NODE1 Host Compromise Suspected (Jan 10, 2026)
|
||||
|
||||
**Timeline:**
|
||||
- **Jan 10, 2026**: Testing postgres:16-alpine — malware artifacts found
|
||||
- **Jan 10, 2026**: Testing postgres:14 (non-alpine) — malware artifacts found
|
||||
- **Jan 10, 2026**: Testing postgres:16 (Debian) — malware artifacts found
|
||||
|
||||
**Confirmed "Compromised" Images (on NODE1):**
|
||||
```bash
|
||||
# ALL of these show malware artifacts when run on NODE1:
|
||||
❌ postgres:15-alpine # Incident #3
|
||||
❌ postgres:16-alpine # NEW
|
||||
❌ postgres:14 # NEW (non-alpine!)
|
||||
❌ postgres:16 # NEW (Debian base!)
|
||||
```
|
||||
|
||||
**Malware Artifacts (IOC):**
|
||||
```bash
|
||||
/tmp/httpd # ~10MB, crypto miner (xmrig variant)
|
||||
/tmp/.perf.c/ # perfctl malware staging directory
|
||||
```
|
||||
|
||||
**🔴 CRITICAL ASSESSMENT:**
|
||||
|
||||
**This is NOT "all Docker Hub official images are infected".**
|
||||
|
||||
**This is most likely NODE1 HOST COMPROMISE** (perfctl/cryptominer persistence).
|
||||
|
||||
**Evidence supporting HOST compromise (not image compromise):**
|
||||
|
||||
| Evidence | Explanation |
|
||||
|----------|-------------|
|
||||
| `/tmp/.perf.c/` directory | Classic perfctl malware staging directory |
|
||||
| `/tmp/httpd` ~10MB | Typical xmrig miner with Apache masquerade |
|
||||
| ALL postgres variants affected | Statistically impossible for Docker Hub |
|
||||
| NODE1 had 3 previous incidents | Already compromised (Incidents #1, #2, #3) |
|
||||
| `tmpfs noexec` didn't help | Malware runs from HOST, not container |
|
||||
| Same IOCs across different images | Infection happens post-pull, not in image |
|
||||
|
||||
**Probable Attack Vector (perfctl family):**
|
||||
- Initial compromise via Incident #1 or #2 (daarion-web container)
|
||||
- Persistence mechanism survived container/image cleanup
|
||||
- Malware hooks into Docker daemon or uses cron/systemd
|
||||
- Infects ANY new container on startup via:
|
||||
- Modified docker daemon
|
||||
- LD_PRELOAD injection
|
||||
- Kernel module
|
||||
- Cron job that monitors new containers
|
||||
|
||||
**🔬 VERIFICATION PROCEDURE (REQUIRED):**
|
||||
|
||||
```bash
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# STEP 1: Get image digest from NODE1
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
ssh root@144.76.224.179 "docker inspect --format='{{index .RepoDigests 0}}' postgres:16"
|
||||
# Example output: postgres@sha256:abc123...
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# STEP 2: On CLEAN host (MacBook/NODE2), pull SAME digest
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# On your MacBook (NOT NODE1!):
|
||||
docker pull postgres:16@sha256:<digest_from_step1>
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# STEP 3: Run on clean host and check /tmp
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
docker run --rm -it postgres:16@sha256:<digest> sh -c "ls -la /tmp/ && find /tmp -type f"
|
||||
|
||||
# EXPECTED RESULTS:
|
||||
# - If /tmp is EMPTY on clean host → IMAGE IS CLEAN → NODE1 IS COMPROMISED
|
||||
# - If /tmp has httpd/.perf.c on clean host → IMAGE IS COMPROMISED → Report to Docker
|
||||
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
# STEP 4: Check NODE1 host for persistence mechanisms
|
||||
# ═══════════════════════════════════════════════════════════════
|
||||
ssh root@144.76.224.179 << 'REMOTE_CHECK'
|
||||
echo "=== CRON ==="
|
||||
crontab -l 2>/dev/null
|
||||
cat /etc/crontab
|
||||
ls -la /etc/cron.d/
|
||||
|
||||
echo "=== SYSTEMD ==="
|
||||
systemctl list-units --type=service | grep -iE "perf|miner|http|crypto"
|
||||
|
||||
echo "=== LD_PRELOAD ==="
|
||||
cat /etc/ld.so.preload 2>/dev/null
|
||||
echo $LD_PRELOAD
|
||||
|
||||
echo "=== KERNEL MODULES ==="
|
||||
lsmod | head -20
|
||||
|
||||
echo "=== SUSPICIOUS PROCESSES ==="
|
||||
ps aux | grep -E "(httpd|xmrig|kdevtmp|kinsing|perfctl|\.perf)" | grep -v grep
|
||||
|
||||
echo "=== NETWORK TO MINING POOLS ==="
|
||||
ss -anp | grep -E "(3333|4444|5555|8080|8888)" | head -10
|
||||
|
||||
echo "=== SSH AUTHORIZED KEYS ==="
|
||||
cat /root/.ssh/authorized_keys
|
||||
|
||||
echo "=== DOCKER DAEMON CONFIG ==="
|
||||
cat /etc/docker/daemon.json 2>/dev/null
|
||||
REMOTE_CHECK
|
||||
```
|
||||
|
||||
**🔴 DECISION MATRIX:**
|
||||
|
||||
| Verification Result | Conclusion | Action |
|
||||
|---------------------|------------|--------|
|
||||
| Clean host: no malware | **NODE1 COMPROMISED** | Full rebuild of NODE1 |
|
||||
| Clean host: same malware | **Docker Hub compromised** | Report to Docker Security |
|
||||
|
||||
**If NODE1 Confirmed Compromised (most likely):**
|
||||
|
||||
1. 🔴 **STOP using NODE1 immediately** for any workloads
|
||||
2. 🔴 **Rotate ALL secrets** that NODE1 ever accessed:
|
||||
```
|
||||
- SSH keys (generate new on clean machine)
|
||||
- Telegram bot tokens (regenerate via @BotFather)
|
||||
- PostgreSQL passwords
|
||||
- All API keys in .env
|
||||
- JWT secrets
|
||||
- Neo4j credentials
|
||||
- Redis password (if any)
|
||||
```
|
||||
3. 🔴 **Full OS reinstall** (not cleanup!):
|
||||
- Request fresh install from Hetzner Robot
|
||||
- Or use rescue mode + full disk wipe
|
||||
- New SSH keys generated on clean machine
|
||||
4. 🟡 **Verify images on clean host BEFORE deploying to new NODE1**
|
||||
5. 🟢 **Implement proper security controls** (see Prevention below)
|
||||
|
||||
**Alternative PostgreSQL Sources (if Docker Hub suspected):**
|
||||
```bash
|
||||
# GitHub Container Registry (GHCR)
|
||||
docker pull ghcr.io/docker-library/postgres:16-alpine
|
||||
|
||||
# Quay.io (Red Hat operated)
|
||||
docker pull quay.io/fedora/postgresql-16
|
||||
|
||||
# Build from official Dockerfile (most secure)
|
||||
git clone https://github.com/docker-library/postgres.git
|
||||
cd postgres/16/alpine
|
||||
docker build -t postgres:16-alpine-verified .
|
||||
# Then scan with Trivy before use
|
||||
trivy image postgres:16-alpine-verified
|
||||
```
|
||||
|
||||
**NODE1 Persistence Locations to Check:**
|
||||
```bash
|
||||
# File-based persistence
|
||||
/etc/cron.d/*
|
||||
/etc/crontab
|
||||
/var/spool/cron/*
|
||||
/etc/systemd/system/*.service
|
||||
/etc/init.d/*
|
||||
/etc/rc.local
|
||||
/root/.bashrc
|
||||
/root/.profile
|
||||
/etc/ld.so.preload
|
||||
|
||||
# Memory/process persistence
|
||||
/dev/shm/*
|
||||
/run/*
|
||||
/var/run/*
|
||||
|
||||
# Docker-specific
|
||||
/var/lib/docker/
|
||||
/etc/docker/daemon.json
|
||||
~/.docker/config.json
|
||||
|
||||
# Kernel-level (advanced)
|
||||
/lib/modules/*/
|
||||
/proc/modules
|
||||
```
|
||||
|
||||
**References:**
|
||||
- perfctl malware: https://blog.exatrack.com/Perfctl-using-portainer-and-new-persistences/
|
||||
- Similar reports: https://github.com/docker-library/postgres/issues/1307
|
||||
- Docker Hub attacks: https://jfrog.com/blog/attacks-on-docker-with-millions-of-malicious-repositories-spread-malware-and-phishing-scams/
|
||||
|
||||
**Lessons Learned (Incident #4 Specific):**
|
||||
1. 🔴 **Host compromise masquerades as image compromise** — Always verify on clean host
|
||||
2. 🟡 **Previous incidents leave persistence** — Cleanup is not enough, rebuild required
|
||||
3. 🟢 **perfctl family is sophisticated** — Survives container restarts, image deletions
|
||||
4. 🔵 **Multiple images "infected" = host problem** — Statistical impossibility otherwise
|
||||
5. 🟣 **NODE1 is UNTRUSTED** — Do not use until full rebuild + verification
|
||||
|
||||
**Current Status:**
|
||||
- ⏳ **Verification pending** — Need to test same digest on clean host
|
||||
- 🔴 **NODE1 unsafe** — Do not deploy PostgreSQL or any new containers
|
||||
- 🟡 **Secrets rotation needed** — Assume all NODE1 secrets compromised
|
||||
|
||||
---
|
||||
|
||||
@@ -502,3 +502,12 @@ export function MobileResponsiveChatPage() {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -175,3 +175,12 @@ LLM сервіси повністю налаштовані та працюють
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -368,3 +368,12 @@ http://localhost:8899/microdao/energy-union
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -108,3 +108,12 @@ getMicroDaoWorkspace(microDaoId: string): Promise<Workspace | null>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -414,3 +414,12 @@ curl http://localhost:9500/api/agent/monitor/file-urls?agent_id=monitor
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -165,3 +165,12 @@ curl -X POST http://localhost:9500/api/agent/monitor/chat \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -319,3 +319,12 @@ curl 'http://localhost:9500/api/project/changes?since=1700000000000&limit=10'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -249,3 +249,12 @@ location.reload();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -179,3 +179,12 @@ window.dispatchEvent(new CustomEvent('project-change', {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -370,3 +370,12 @@ localStorage.setItem(storageKey, JSON.stringify(changes.slice(0, 50)));
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -186,3 +186,12 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -539,3 +539,12 @@ curl -X POST http://localhost:8896/api/ocr/upload \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -224,3 +224,12 @@ docker exec ollama ollama ps
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -75,3 +75,12 @@ echo " 4. Протестувати Ollama з GPU: ollama run qwen3:8b 'test'"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -113,3 +113,12 @@ time ollama run qwen3:8b "Привіт, тест GPU"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -110,3 +110,12 @@ time ollama run qwen3:8b "test"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -83,3 +83,12 @@ echo " - Загальне CPU: 85.3% → 40-50%"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -630,3 +630,12 @@ const saveConversation = async () => {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -448,3 +448,12 @@ You now have a fully functional agent integration system. Agents can automatical
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -383,3 +383,12 @@ Test 5: Internal Endpoints
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -381,3 +381,12 @@ All specifications are complete. Pick a starting point:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -474,3 +474,12 @@ docker-compose -f docker-compose.phase3.yml down -v
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -404,3 +404,12 @@ Sofia: "В проєкті X є 3 нові задачі:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -433,3 +433,12 @@ Complete Phase 4.5 fully (2-3 години) → Then start Phase 5 with real aut
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -525,3 +525,12 @@ useAuthStore.getState().clearSession();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -325,3 +325,12 @@ PHASE4_PROGRESS_REPORT.md ✅ (this file)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -574,3 +574,12 @@ Code Quality:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -196,3 +196,12 @@ curl http://localhost:7011/auth/me \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -199,3 +199,12 @@ curl -X POST http://localhost:7011/auth/login \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -156,3 +156,12 @@ If agent replies, **Phase 2 works!** 🚀
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -250,3 +250,12 @@ After Phase 3 works:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -324,3 +324,12 @@ curl http://144.76.224.179:9102/health
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -413,3 +413,12 @@ cat docs/tasks/PHASE2_MASTER_TASK.md | pbcopy
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
231
SECRETS-ROTATION-CHECKLIST.md
Normal file
231
SECRETS-ROTATION-CHECKLIST.md
Normal file
@@ -0,0 +1,231 @@
|
||||
# 🔐 SECRETS ROTATION CHECKLIST — NODE1 Compromise
|
||||
|
||||
**Дата:** 2026-01-10
|
||||
**Причина:** NODE1 (144.76.224.179) скомпрометований (Incidents #1-4)
|
||||
**Статус:** ⏳ ПОТРЕБУЄ ВИКОНАННЯ
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ ВАЖЛИВО
|
||||
|
||||
Всі секрети, які NODE1 коли-небудь бачив, **ВВАЖАТИ СКОМПРОМЕТОВАНИМИ**.
|
||||
|
||||
Навіть якщо malware зараз не активний — він міг exfiltrate дані раніше.
|
||||
|
||||
---
|
||||
|
||||
## 📋 TELEGRAM BOT TOKENS (9 ботів)
|
||||
|
||||
**Як ротувати:** Telegram → @BotFather → `/revoke` → `/token`
|
||||
|
||||
| # | Бот | Поточний токен | Статус |
|
||||
|---|-----|----------------|--------|
|
||||
| 1 | **DAARWIZZ** (@DAARWIZZBot) | `8323412397:AAFxaru-hHRl08A3T6TC02uHLvO5wAB0m3M` | ⬜ Ротувати |
|
||||
| 2 | **Helion** (@HelionEnergyBot) | `8112062582:AAGI7tPFo4gvZ6bfbkFu9miq5GdAH2_LvcM` | ⬜ Ротувати |
|
||||
| 3 | **GREENFOOD** | `7495165343:AAHpxY8w3iXevaQT2rfj97OHLauu9Iq8vYM` | ⬜ Ротувати |
|
||||
| 4 | **CLAN** | `8516872152:AAGbjL6zCMOCqHgu9rcuagdhm0LEwYJFpKw` | ⬜ Ротувати |
|
||||
| 5 | **DRUID** | `8145618489:AAGgR5KmPr9P1_ppSrFa_Gpq5yqf3vNJ5AQ` | ⬜ Ротувати |
|
||||
| 6 | **EONARCH** | `7962391584:AAFYkelLRG3VR_Lxuu6pEGG76t4vZdANtz4` | ⬜ Ротувати |
|
||||
| 7 | **SOUL** | `8041596416:AAGyHEjalPEH2TC0AOxfIQ2aZvFTFRanO0g` | ⬜ Ротувати |
|
||||
| 8 | **YAROMIR** | `8128180674:AAGNZdG3LwECI4z_803smsuRHsK3nPdjMLY` | ⬜ Ротувати |
|
||||
| 9 | **NUTRA** | `8517315428:AAEFSGG_XEIR0N6svGKSf0cf09_A9jV26zA` | ⬜ Ротувати |
|
||||
|
||||
**Процедура:**
|
||||
```bash
|
||||
# 1. Відкрити @BotFather в Telegram
|
||||
# 2. /mybots → вибрати бота → API Token → Revoke current token
|
||||
# 3. Скопіювати новий токен
|
||||
# 4. Оновити в .env на НОВОМУ сервері
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔑 API KEYS
|
||||
|
||||
| Сервіс | Ключ | Дія |
|
||||
|--------|------|-----|
|
||||
| **DeepSeek** | `sk-5adf7a2b421349de90468517b41c4448` | ⬜ Ротувати в dashboard |
|
||||
| **xAI/Grok** | (якщо є) | ⬜ Перевірити та ротувати |
|
||||
| **OpenAI** | (якщо є) | ⬜ Перевірити та ротувати |
|
||||
| **Anthropic** | (якщо є) | ⬜ Перевірити та ротувати |
|
||||
|
||||
**DeepSeek ротація:**
|
||||
1. Зайти на https://platform.deepseek.com/
|
||||
2. API Keys → Delete old → Create new
|
||||
3. Оновити `DEEPSEEK_API_KEY` в .env
|
||||
|
||||
---
|
||||
|
||||
## 🗄️ DATABASE PASSWORDS
|
||||
|
||||
| База | Поточний пароль | Дія |
|
||||
|------|-----------------|-----|
|
||||
| **PostgreSQL** | `postgres` | ⬜ Змінити на складний |
|
||||
| **Neo4j** | (перевірити .env) | ⬜ Змінити |
|
||||
| **Redis** | (без паролю?) | ⬜ Додати пароль |
|
||||
| **MinIO** | `WpyOnsTKHWzuq5CRKjslZ45kMilT0Gez` | ⬜ Ротувати |
|
||||
|
||||
**Генерація нового паролю:**
|
||||
```bash
|
||||
# Згенерувати безпечний пароль
|
||||
openssl rand -base64 32
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 SSH KEYS
|
||||
|
||||
| Ключ | Розташування | Дія |
|
||||
|------|--------------|-----|
|
||||
| **NODE1 root key** | `/root/.ssh/` на NODE1 | ⬜ Видалити при rebuild |
|
||||
| **Ваш SSH ключ** | `~/.ssh/id_ed25519` або `id_rsa` | ⬜ Перегенерувати |
|
||||
| **GitHub deploy key** | GitHub repo settings | ⬜ Ротувати |
|
||||
|
||||
**Генерація нового SSH ключа (на MacBook):**
|
||||
```bash
|
||||
# Backup старого
|
||||
mv ~/.ssh/id_ed25519 ~/.ssh/id_ed25519.compromised.backup
|
||||
|
||||
# Генерація нового
|
||||
ssh-keygen -t ed25519 -C "admin@daarion.city" -f ~/.ssh/id_ed25519
|
||||
|
||||
# Додати в ssh-agent
|
||||
ssh-add ~/.ssh/id_ed25519
|
||||
|
||||
# Скопіювати публічний ключ
|
||||
cat ~/.ssh/id_ed25519.pub
|
||||
# Додати в GitHub → Settings → SSH Keys
|
||||
# Додати на новий NODE1 після rebuild
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🌐 SSL/TLS CERTIFICATES
|
||||
|
||||
| Домен | Дія |
|
||||
|-------|-----|
|
||||
| `gateway.daarion.city` | ⬜ Перевипустити через certbot |
|
||||
| `daarion.city` | ⬜ Перевірити |
|
||||
|
||||
**Certbot на новому сервері:**
|
||||
```bash
|
||||
certbot certonly --nginx -d gateway.daarion.city
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 JWT / SESSION SECRETS
|
||||
|
||||
| Секрет | Дія |
|
||||
|--------|-----|
|
||||
| JWT_SECRET | ⬜ Згенерувати новий |
|
||||
| SESSION_SECRET | ⬜ Згенерувати новий |
|
||||
| COOKIE_SECRET | ⬜ Згенерувати новий |
|
||||
|
||||
**Генерація:**
|
||||
```bash
|
||||
# JWT secret (256 bit)
|
||||
openssl rand -hex 32
|
||||
|
||||
# Або base64
|
||||
openssl rand -base64 32
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📦 DOCKER / REGISTRY
|
||||
|
||||
| Елемент | Дія |
|
||||
|---------|-----|
|
||||
| Docker Hub credentials | ⬜ Перевірити чи використовувались |
|
||||
| GHCR token | ⬜ Ротувати якщо є |
|
||||
|
||||
---
|
||||
|
||||
## ☁️ CLOUD CREDENTIALS
|
||||
|
||||
| Сервіс | Дія |
|
||||
|--------|-----|
|
||||
| Hetzner API token | ⬜ Ротувати в Robot |
|
||||
| Cloudflare API key | ⬜ Ротувати якщо використовувався |
|
||||
|
||||
---
|
||||
|
||||
## ✅ CHECKLIST ПІСЛЯ REBUILD NODE1
|
||||
|
||||
```
|
||||
[ ] 1. Rebuild NODE1 (fresh Ubuntu install)
|
||||
[ ] 2. Новий SSH ключ додано на NODE1
|
||||
[ ] 3. Всі Telegram токени ротовані
|
||||
[ ] 4. DeepSeek API key ротований
|
||||
[ ] 5. PostgreSQL пароль змінено
|
||||
[ ] 6. MinIO пароль змінено
|
||||
[ ] 7. JWT/Session secrets згенеровані
|
||||
[ ] 8. SSL сертифікати перевипущені
|
||||
[ ] 9. .env оновлено з новими секретами
|
||||
[ ] 10. Webhooks перереєстровані
|
||||
[ ] 11. Тести пройдені
|
||||
[ ] 12. Моніторинг налаштований
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 ПОРЯДОК ДІЙ
|
||||
|
||||
### Фаза 1: Підготовка (до rebuild)
|
||||
1. ⬜ Зберегти цей документ
|
||||
2. ⬜ Зробити backup даних з NODE1 (PostgreSQL dump, etc.)
|
||||
3. ⬜ Підготувати нові секрети заздалегідь
|
||||
|
||||
### Фаза 2: Rebuild NODE1
|
||||
1. ⬜ Hetzner Robot → Rescue → Reinstall Ubuntu 24.04
|
||||
2. ⬜ Базове налаштування (firewall, fail2ban, etc.)
|
||||
3. ⬜ Встановити Docker, k3s
|
||||
|
||||
### Фаза 3: Ротація секретів
|
||||
1. ⬜ Ротувати Telegram токени через @BotFather
|
||||
2. ⬜ Ротувати API keys
|
||||
3. ⬜ Створити новий .env з новими секретами
|
||||
4. ⬜ Deploy на новий NODE1
|
||||
|
||||
### Фаза 4: Верифікація
|
||||
1. ⬜ Перевірити всі боти працюють
|
||||
2. ⬜ Перевірити API endpoints
|
||||
3. ⬜ Запустити smoke tests
|
||||
4. ⬜ Моніторинг CPU/мережі 24 години
|
||||
|
||||
---
|
||||
|
||||
## 📝 НОВІ СЕКРЕТИ (заповнити після ротації)
|
||||
|
||||
```bash
|
||||
# Telegram Bots (НОВІ токени)
|
||||
DAARWIZZ_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
HELION_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
GREENFOOD_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
CLAN_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
DRUID_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
EONARCH_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
SOUL_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
YAROMIR_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
NUTRA_TELEGRAM_BOT_TOKEN=<NEW_TOKEN>
|
||||
|
||||
# API Keys (НОВІ)
|
||||
DEEPSEEK_API_KEY=<NEW_KEY>
|
||||
|
||||
# Database (НОВІ паролі)
|
||||
POSTGRES_PASSWORD=<NEW_STRONG_PASSWORD>
|
||||
MINIO_ROOT_PASSWORD=<NEW_STRONG_PASSWORD>
|
||||
NEO4J_AUTH=neo4j/<NEW_STRONG_PASSWORD>
|
||||
REDIS_PASSWORD=<NEW_STRONG_PASSWORD>
|
||||
|
||||
# JWT/Sessions (НОВІ)
|
||||
JWT_SECRET=<GENERATED_SECRET>
|
||||
SESSION_SECRET=<GENERATED_SECRET>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
**Створено:** 2026-01-10
|
||||
**Автор:** Security Triage Script
|
||||
**Статус:** Очікує виконання після NODE1 rebuild
|
||||
282
SOFIA_AGENT_README.md
Normal file
282
SOFIA_AGENT_README.md
Normal file
@@ -0,0 +1,282 @@
|
||||
# 🤖 Sofia Agent - Локальний Запуск
|
||||
|
||||
Sofia - Chief AI Engineer & R&D Orchestrator екосистеми DAARION.city
|
||||
|
||||
## 🚀 Швидкий старт
|
||||
|
||||
### Варіант 1: Запуск з локальним Ollama (ЗАРАЗ готово!)
|
||||
|
||||
```bash
|
||||
# 1. Переконатися, що Ollama запущено
|
||||
ollama list
|
||||
|
||||
# 2. Запустити Sofia
|
||||
python3 sofia_agent.py
|
||||
```
|
||||
|
||||
### Варіант 2: Запуск з Grok API (потребує API ключ)
|
||||
|
||||
```bash
|
||||
# 1. Додати API ключ в .env
|
||||
echo 'XAI_API_KEY=your_xai_api_key_here' >> .env
|
||||
|
||||
# 2. Запустити Sofia
|
||||
python3 sofia_agent.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Що потрібно
|
||||
|
||||
### Встановлено ✅
|
||||
- ✅ Python 3.14.0
|
||||
- ✅ openai (2.8.0)
|
||||
- ✅ httpx (0.28.1)
|
||||
- ✅ fastapi (0.104.1)
|
||||
- ✅ pydantic (2.12.4)
|
||||
- ✅ Ollama з моделями
|
||||
|
||||
### Опціонально
|
||||
- xAI API ключ (для Grok API)
|
||||
- STT/TTS сервіси (для голосового режиму)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Режими роботи
|
||||
|
||||
### 1. Інтерактивний чат
|
||||
|
||||
```bash
|
||||
python3 sofia_agent.py
|
||||
```
|
||||
|
||||
**Команди:**
|
||||
- `/help` - показати довідку
|
||||
- `/clear` - очистити історію розмови
|
||||
- `/history` - показати історію
|
||||
- `/exit` - вийти
|
||||
|
||||
**Приклад:**
|
||||
```
|
||||
🧑 Ви: Привіт Sofia! Розкажи про свою роль
|
||||
|
||||
🤖 Sofia: Привіт! Я Sofia, Chief AI Engineer в екосистемі DAARION.city.
|
||||
Моя роль включає:
|
||||
- Керування дослідженнями AI/ML
|
||||
- Координацію R&D команди
|
||||
- Технічне лідерство в AI проектах
|
||||
...
|
||||
```
|
||||
|
||||
### 2. Одне повідомлення
|
||||
|
||||
```bash
|
||||
python3 sofia_agent.py "Які моделі AI ти рекомендуєш для NLP задач?"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Конфігурація
|
||||
|
||||
### .env файл
|
||||
|
||||
```bash
|
||||
# Grok API (опціонально)
|
||||
XAI_API_KEY=your_xai_api_key_here
|
||||
XAI_BASE_URL=https://api.x.ai/v1
|
||||
XAI_MODEL=grok-beta
|
||||
|
||||
# Ollama (за замовчуванням)
|
||||
OLLAMA_BASE_URL=http://localhost:11434
|
||||
OLLAMA_MODEL=qwen2.5-coder:32b
|
||||
|
||||
# Голосовий режим (опціонально)
|
||||
ENABLE_VOICE_MODE=false
|
||||
STT_SERVICE_URL=http://localhost:8895/api
|
||||
TTS_SERVICE_URL=http://localhost:5002
|
||||
```
|
||||
|
||||
### Пріоритет провайдерів
|
||||
|
||||
1. **Grok API** - якщо встановлено `XAI_API_KEY`
|
||||
2. **Ollama** - локальна модель (fallback)
|
||||
|
||||
---
|
||||
|
||||
## 🎤 Голосовий режим (майбутнє)
|
||||
|
||||
Для увімкнення голосового режиму:
|
||||
|
||||
```bash
|
||||
# 1. Налаштувати STT/TTS сервіси
|
||||
STT_SERVICE_URL=http://144.76.224.179:8895/api
|
||||
TTS_SERVICE_URL=http://144.76.224.179:5002
|
||||
|
||||
# 2. Увімкнути голосовий режим
|
||||
ENABLE_VOICE_MODE=true
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🧪 Тестування
|
||||
|
||||
### Перевірка Ollama
|
||||
|
||||
```bash
|
||||
# Перевірити, що Ollama запущено
|
||||
curl http://localhost:11434/api/tags
|
||||
|
||||
# Перевірити модель
|
||||
ollama run qwen2.5-coder:32b "Привіт!"
|
||||
```
|
||||
|
||||
### Перевірка Sofia
|
||||
|
||||
```bash
|
||||
# Швидкий тест
|
||||
python3 sofia_agent.py "Тест зв'язку"
|
||||
|
||||
# Інтерактивний режим
|
||||
python3 sofia_agent.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Доступні моделі Ollama
|
||||
|
||||
На вашому MacBook встановлено:
|
||||
|
||||
| Модель | Розмір | Призначення |
|
||||
|--------|--------|-------------|
|
||||
| `llava:13b` | 8.0 GB | Мультимодальна (текст + зображення) |
|
||||
| `mistral-nemo:12b` | 7.1 GB | Загальні задачі |
|
||||
| `gemma2:27b` | 15 GB | Великі контексти |
|
||||
| `deepseek-coder:33b` | 18 GB | Програмування |
|
||||
| **`qwen2.5-coder:32b`** | 19 GB | **За замовчуванням для Sofia** |
|
||||
| `deepseek-r1:70b` | 42 GB | Reasoning задачі |
|
||||
| `starcoder2:3b` | 1.7 GB | Швидке кодування |
|
||||
| `phi3:latest` | 2.2 GB | Компактна модель |
|
||||
| `gpt-oss:latest` | 13 GB | Відкритий GPT |
|
||||
|
||||
### Зміна моделі
|
||||
|
||||
```bash
|
||||
# В .env файлі:
|
||||
OLLAMA_MODEL=deepseek-r1:70b # Для складних reasoning задач
|
||||
# або
|
||||
OLLAMA_MODEL=mistral-nemo:12b # Для швидшої роботи
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Налаштування Grok API
|
||||
|
||||
### 1. Отримання API ключа
|
||||
|
||||
1. Зареєструватися на https://x.ai
|
||||
2. Створити API ключ
|
||||
3. Скопіювати ключ
|
||||
|
||||
### 2. Додати в .env
|
||||
|
||||
```bash
|
||||
# Додати в кінець .env файлу
|
||||
echo 'XAI_API_KEY=xai-your-key-here' >> .env
|
||||
```
|
||||
|
||||
### 3. Перевірити
|
||||
|
||||
```bash
|
||||
# Sofia автоматично використає Grok API
|
||||
python3 sofia_agent.py "Привіт!"
|
||||
|
||||
# В логах побачите:
|
||||
# 🤖 Ініціалізація Sofia Agent...
|
||||
# Режим: Grok API (xAI)
|
||||
# Модель: grok-beta
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💡 Приклади використання
|
||||
|
||||
### Технічні питання
|
||||
|
||||
```bash
|
||||
python3 sofia_agent.py "Поясни різницю між RAG та fine-tuning"
|
||||
```
|
||||
|
||||
### R&D планування
|
||||
|
||||
```bash
|
||||
python3 sofia_agent.py "Які напрямки досліджень AI найперспективніші в 2026?"
|
||||
```
|
||||
|
||||
### Архітектурні рішення
|
||||
|
||||
```bash
|
||||
python3 sofia_agent.py "Як побудувати multi-agent систему для DAARION?"
|
||||
```
|
||||
|
||||
### Код-ревʼю
|
||||
|
||||
```bash
|
||||
python3 sofia_agent.py "Проаналізуй архітектуру агентської системи DAARION"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Вирішення проблем
|
||||
|
||||
### "Не можу підключитися до Ollama"
|
||||
|
||||
```bash
|
||||
# Перевірити статус Ollama
|
||||
ps aux | grep ollama
|
||||
|
||||
# Якщо не запущено - запустити
|
||||
ollama serve
|
||||
|
||||
# Або перезапустити
|
||||
pkill ollama && ollama serve
|
||||
```
|
||||
|
||||
### "Помилка Grok API"
|
||||
|
||||
```bash
|
||||
# Перевірити API ключ
|
||||
cat .env | grep XAI_API_KEY
|
||||
|
||||
# Перевірити доступність API
|
||||
curl -H "Authorization: Bearer $XAI_API_KEY" https://api.x.ai/v1/models
|
||||
```
|
||||
|
||||
### "Модель не знайдена"
|
||||
|
||||
```bash
|
||||
# Перевірити доступні моделі
|
||||
ollama list
|
||||
|
||||
# Завантажити модель
|
||||
ollama pull qwen2.5-coder:32b
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Додаткові ресурси
|
||||
|
||||
- [Ollama документація](https://ollama.ai/docs)
|
||||
- [xAI API документація](https://docs.x.ai)
|
||||
- [DAARION архітектура](./docs/agents.md)
|
||||
|
||||
---
|
||||
|
||||
## ✅ Статус
|
||||
|
||||
- ✅ Sofia скрипт створено
|
||||
- ✅ Ollama налаштовано
|
||||
- ✅ Моделі завантажені
|
||||
- ⏳ Grok API (потребує ключ)
|
||||
- ⏳ Голосовий режим (майбутнє)
|
||||
|
||||
**Готово до використання! 🚀**
|
||||
240
SOFIA_CLI.md
Normal file
240
SOFIA_CLI.md
Normal file
@@ -0,0 +1,240 @@
|
||||
# 🖥️ Sofia CLI - Complete Guide
|
||||
|
||||
## ✅ Доступні CLI інтерфейси
|
||||
|
||||
### 1. Python CLI (Найкращий) ⭐
|
||||
|
||||
**Використання:**
|
||||
```bash
|
||||
# Інтерактивний режим
|
||||
./run_sofia.sh
|
||||
|
||||
# Або через venv
|
||||
source sofia_venv/bin/activate
|
||||
python3 sofia_agent.py
|
||||
|
||||
# Одне питання
|
||||
python3 sofia_agent.py "Твоє питання тут"
|
||||
```
|
||||
|
||||
**Переваги:**
|
||||
- ✅ Працює стабільно
|
||||
- ✅ Історія розмов
|
||||
- ✅ Статистика токенів
|
||||
- ✅ Підтримка Grok API + Ollama
|
||||
|
||||
**Команди в інтерактивному режимі:**
|
||||
- `/help` - довідка
|
||||
- `/clear` - очистити історію
|
||||
- `/history` - показати історію
|
||||
- `/exit` - вийти
|
||||
|
||||
---
|
||||
|
||||
### 2. Web Interface (Візуальний) 🌐
|
||||
|
||||
**Запуск:**
|
||||
```bash
|
||||
./start_sofia.sh
|
||||
```
|
||||
|
||||
**URL:**
|
||||
```
|
||||
http://localhost:5173/sofia
|
||||
```
|
||||
|
||||
**Переваги:**
|
||||
- ✅ Красивий UI
|
||||
- ✅ Градієнтний дизайн
|
||||
- ✅ Швидкі запити
|
||||
- ✅ Responsive
|
||||
|
||||
---
|
||||
|
||||
### 3. AIChat CLI (Альтернативний)
|
||||
|
||||
**Встановлено:** ✅ `aichat`
|
||||
|
||||
**Конфігурація:**
|
||||
- Config: `~/.config/aichat/config.yaml`
|
||||
- Role: `~/.config/aichat/roles/sofia.md`
|
||||
|
||||
**Використання:**
|
||||
```bash
|
||||
aichat --role sofia
|
||||
```
|
||||
|
||||
**Aliases (додані в ~/.zshrc):**
|
||||
```bash
|
||||
sofia # aichat --role sofia
|
||||
sofia-chat # aichat --role sofia
|
||||
sofia-quick # aichat --role sofia --no-stream
|
||||
```
|
||||
|
||||
**Примітка:** Потребує додаткової ініціалізації при першому запуску.
|
||||
|
||||
---
|
||||
|
||||
### 4. LLM CLI (від Simon Willison)
|
||||
|
||||
**Встановлено:** ✅ `llm` + `llm-ollama` plugin
|
||||
|
||||
**Template:** `~/.config/llm/templates/sofia.txt`
|
||||
|
||||
**Використання:**
|
||||
```bash
|
||||
# Одне питання
|
||||
llm -m ollama/qwen2.5-coder:32b -s "$(cat ~/.config/llm/templates/sofia.txt)" "Твоє питання"
|
||||
|
||||
# Чат
|
||||
llm chat -m ollama/qwen2.5-coder:32b -s "$(cat ~/.config/llm/templates/sofia.txt)"
|
||||
```
|
||||
|
||||
**Примітка:** Може мати проблеми з шаблонами Ollama.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Рекомендації
|
||||
|
||||
### Для щоденного використання:
|
||||
```bash
|
||||
# В терміналі
|
||||
./run_sofia.sh
|
||||
|
||||
# В браузері
|
||||
./start_sofia.sh
|
||||
# Відкрити: http://localhost:5173/sofia
|
||||
```
|
||||
|
||||
### Для швидких запитів:
|
||||
```bash
|
||||
python3 sofia_agent.py "Швидке питання"
|
||||
```
|
||||
|
||||
### Для візуального досвіду:
|
||||
```
|
||||
http://localhost:5173/sofia
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 Порівняння CLI
|
||||
|
||||
| Особливість | Python CLI | Web UI | aichat | llm |
|
||||
|-------------|------------|--------|--------|-----|
|
||||
| **Стабільність** | ✅ | ✅ | ⚠️ | ⚠️ |
|
||||
| **Історія** | ✅ | ✅ | ✅ | ⚠️ |
|
||||
| **Токени** | ✅ | ✅ | ❌ | ❌ |
|
||||
| **Grok API** | ✅ | ✅ | ✅ | ✅ |
|
||||
| **Візуалізація** | ❌ | ✅ | ❌ | ❌ |
|
||||
| **Швидкість** | ⚡⚡ | ⚡ | ⚡⚡ | ⚡⚡ |
|
||||
| **Кольори** | ❌ | ✅ | ✅ | ❌ |
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Швидкий старт
|
||||
|
||||
### Для нових користувачів:
|
||||
|
||||
**1. Спробувати CLI:**
|
||||
```bash
|
||||
cd /Users/apple/github-projects/microdao-daarion
|
||||
./run_sofia.sh
|
||||
```
|
||||
|
||||
**2. Спробувати Web UI:**
|
||||
```bash
|
||||
./start_sofia.sh
|
||||
```
|
||||
|
||||
Браузер автоматично відкриється на `http://localhost:5173/sofia`
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Конфігурація
|
||||
|
||||
### Всі CLI використовують:
|
||||
- `.env` файл для API ключів
|
||||
- Ollama на `localhost:11434`
|
||||
- Модель: `qwen2.5-coder:32b`
|
||||
|
||||
### Зміна моделі:
|
||||
```bash
|
||||
# В .env
|
||||
OLLAMA_MODEL=deepseek-r1:70b
|
||||
```
|
||||
|
||||
### Підключення Grok:
|
||||
```bash
|
||||
# В .env
|
||||
XAI_API_KEY=your_key_here
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📱 Додаткові можливості
|
||||
|
||||
### Python CLI:
|
||||
- Асинхронна обробка
|
||||
- Збереження історії в пам'яті
|
||||
- Статистика токенів
|
||||
- Fallback до локальної моделі
|
||||
|
||||
### Web UI:
|
||||
- Швидкі запити (quick actions)
|
||||
- Градієнтний дизайн
|
||||
- Автоскрол
|
||||
- Очистити чат
|
||||
|
||||
### AIChat:
|
||||
- Syntax highlighting
|
||||
- Code block підсвітка
|
||||
- Emacs keybindings
|
||||
- Compression
|
||||
|
||||
### LLM CLI:
|
||||
- Plugin ecosystem
|
||||
- Multiple models
|
||||
- Templates system
|
||||
- Conversation management
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Кастомізація
|
||||
|
||||
### Sofia Prompt можна змінити в:
|
||||
- Python: `sofia_agent.py` → `SOFIA_SYSTEM_PROMPT`
|
||||
- Web: `sofia_api.py` → `SOFIA_SYSTEM_PROMPT`
|
||||
- AIChat: `~/.config/aichat/roles/sofia.md`
|
||||
- LLM: `~/.config/llm/templates/sofia.txt`
|
||||
|
||||
---
|
||||
|
||||
## 💡 Поради
|
||||
|
||||
1. **Python CLI** - найстабільніший варіант
|
||||
2. **Web UI** - найкрасивіший
|
||||
3. **aichat** - найбільше функцій
|
||||
4. **llm** - найпростіший для скриптів
|
||||
|
||||
**Використовуйте той, що вам зручніший!** 🚀
|
||||
|
||||
---
|
||||
|
||||
## 📚 Документація
|
||||
|
||||
- `SOFIA_QUICKSTART.md` - швидкий старт
|
||||
- `SOFIA_AGENT_README.md` - повна документація Python CLI
|
||||
- `SOFIA_WEB_UI.md` - веб-інтерфейс
|
||||
- `SOFIA_CLI.md` - цей файл
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
|
||||
Всі CLI встановлені та налаштовані для Sofia! 🎉
|
||||
|
||||
**Рекомендую почати з:**
|
||||
```bash
|
||||
./run_sofia.sh
|
||||
```
|
||||
216
SOFIA_QUICKSTART.md
Normal file
216
SOFIA_QUICKSTART.md
Normal file
@@ -0,0 +1,216 @@
|
||||
# ⚡ Sofia Agent - Швидкий старт
|
||||
|
||||
## ✅ Готово до використання!
|
||||
|
||||
Sofia Agent працює на вашому MacBook з локальним Ollama.
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Запуск
|
||||
|
||||
### Варіант 1: Простий запуск (рекомендовано)
|
||||
|
||||
```bash
|
||||
cd /Users/apple/github-projects/microdao-daarion
|
||||
./run_sofia.sh
|
||||
```
|
||||
|
||||
### Варіант 2: З повідомленням
|
||||
|
||||
```bash
|
||||
./run_sofia.sh "Привіт Sofia! Розкажи про свою роль"
|
||||
```
|
||||
|
||||
### Варіант 3: Повний контроль
|
||||
|
||||
```bash
|
||||
source sofia_venv/bin/activate
|
||||
python3 sofia_agent.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💬 Команди в інтерактивному режимі
|
||||
|
||||
- `/help` - показати довідку
|
||||
- `/clear` - очистити історію
|
||||
- `/history` - показати історію
|
||||
- `/exit` - вийти
|
||||
|
||||
---
|
||||
|
||||
## 📊 Поточна конфігурація
|
||||
|
||||
✅ **Працює зараз:**
|
||||
- Модель: `qwen2.5-coder:32b` (19 GB)
|
||||
- Провайдер: Ollama (локально)
|
||||
- URL: `http://localhost:11434`
|
||||
- Python: 3.14.0
|
||||
- Віртуальне середовище: `sofia_venv/`
|
||||
|
||||
⏳ **Опціонально (майбутнє):**
|
||||
- Grok API (потрібен `XAI_API_KEY`)
|
||||
- Голосовий режим (потрібні STT/TTS)
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Приклади
|
||||
|
||||
### Технічні питання
|
||||
```bash
|
||||
./run_sofia.sh "Поясни різницю між RAG та fine-tuning"
|
||||
```
|
||||
|
||||
### Планування R&D
|
||||
```bash
|
||||
./run_sofia.sh "Які напрямки досліджень AI найперспективніші?"
|
||||
```
|
||||
|
||||
### Архітектура
|
||||
```bash
|
||||
./run_sofia.sh "Як побудувати multi-agent систему?"
|
||||
```
|
||||
|
||||
### Інтерактивний діалог
|
||||
```bash
|
||||
./run_sofia.sh
|
||||
|
||||
🧑 Ви: Привіт Sofia!
|
||||
🤖 Sofia: Привіт! Я готова допомогти...
|
||||
|
||||
🧑 Ви: Які моделі підходять для кодування?
|
||||
🤖 Sofia: Рекомендую звернути увагу на...
|
||||
|
||||
🧑 Ви: /exit
|
||||
👋 До побачення!
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Додаткові налаштування
|
||||
|
||||
### Зміна моделі
|
||||
|
||||
Відредагуйте `.env`:
|
||||
```bash
|
||||
# Для швидшої роботи:
|
||||
OLLAMA_MODEL=mistral-nemo:12b
|
||||
|
||||
# Для складних reasoning задач:
|
||||
OLLAMA_MODEL=deepseek-r1:70b
|
||||
|
||||
# Для мультимодальності (текст + зображення):
|
||||
OLLAMA_MODEL=llava:13b
|
||||
```
|
||||
|
||||
### Підключення Grok API
|
||||
|
||||
```bash
|
||||
# Додати в .env:
|
||||
XAI_API_KEY=your_xai_api_key_here
|
||||
XAI_BASE_URL=https://api.x.ai/v1
|
||||
XAI_MODEL=grok-beta
|
||||
|
||||
# Sofia автоматично переключиться на Grok
|
||||
./run_sofia.sh
|
||||
# 🤖 Ініціалізація Sofia Agent...
|
||||
# Режим: Grok API (xAI)
|
||||
# Модель: grok-beta
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎤 Майбутнє: Голосовий режим
|
||||
|
||||
Коли буде готово, додайте в `.env`:
|
||||
```bash
|
||||
ENABLE_VOICE_MODE=true
|
||||
STT_SERVICE_URL=http://144.76.224.179:8895/api
|
||||
TTS_SERVICE_URL=http://144.76.224.179:5002
|
||||
```
|
||||
|
||||
Sofia зможе:
|
||||
- 🎤 Приймати голосові запити (STT)
|
||||
- 🔊 Відповідати голосом (TTS)
|
||||
- 💬 Підтримувати текстовий режим паралельно
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Вирішення проблем
|
||||
|
||||
### "Не можу підключитися до Ollama"
|
||||
|
||||
```bash
|
||||
# Перевірити, що Ollama запущено
|
||||
ps aux | grep ollama
|
||||
|
||||
# Якщо ні - запустити
|
||||
ollama serve
|
||||
|
||||
# В новому терміналі:
|
||||
./run_sofia.sh
|
||||
```
|
||||
|
||||
### "ModuleNotFoundError"
|
||||
|
||||
```bash
|
||||
# Переконатися, що використовується venv
|
||||
source sofia_venv/bin/activate
|
||||
python3 sofia_agent.py
|
||||
```
|
||||
|
||||
### "Модель не знайдена"
|
||||
|
||||
```bash
|
||||
# Перевірити доступні моделі
|
||||
ollama list
|
||||
|
||||
# Завантажити потрібну
|
||||
ollama pull qwen2.5-coder:32b
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 Статистика токенів
|
||||
|
||||
Sofia показує використання токенів після кожної відповіді:
|
||||
|
||||
```
|
||||
🤖 Sofia: Відповідь...
|
||||
[Tokens: ~150]
|
||||
```
|
||||
|
||||
Це допомагає відстежувати:
|
||||
- Складність запитів
|
||||
- Довжину контексту
|
||||
- Продуктивність моделі
|
||||
|
||||
---
|
||||
|
||||
## 💡 Поради
|
||||
|
||||
1. **Для коротких запитів** - використовуйте режим одного повідомлення
|
||||
2. **Для діалогу** - запускайте інтерактивний режим
|
||||
3. **Для складних задач** - переключіться на `deepseek-r1:70b`
|
||||
4. **Для швидкості** - використовуйте `mistral-nemo:12b`
|
||||
|
||||
---
|
||||
|
||||
## 📚 Детальна документація
|
||||
|
||||
Див. `SOFIA_AGENT_README.md` для:
|
||||
- Повного опису функціоналу
|
||||
- Всіх доступних моделей
|
||||
- Інструкцій з Grok API
|
||||
- Налаштування голосового режиму
|
||||
|
||||
---
|
||||
|
||||
## ✅ Готово!
|
||||
|
||||
Sofia Agent працює і готова до роботи! 🚀
|
||||
|
||||
**Швидкий тест:**
|
||||
```bash
|
||||
./run_sofia.sh "Привіт! Тест зв'язку"
|
||||
```
|
||||
290
SOFIA_WEB_UI.md
Normal file
290
SOFIA_WEB_UI.md
Normal file
@@ -0,0 +1,290 @@
|
||||
# 🌐 Sofia Web Interface - Ready!
|
||||
|
||||
## ✅ Що встановлено:
|
||||
|
||||
1. **React компонент** - `src/pages/SofiaChatPage.tsx`
|
||||
- Красивий градієнтний дизайн (purple/pink)
|
||||
- Історія повідомлень
|
||||
- Статистика токенів
|
||||
- Швидкі запити (quick actions)
|
||||
|
||||
2. **FastAPI Backend** - `sofia_api.py`
|
||||
- REST API на порту 8899
|
||||
- Підтримка Ollama + Grok API
|
||||
- CORS налаштовано
|
||||
- Історія розмов
|
||||
|
||||
3. **Роутинг** - додано `/sofia` в App.tsx
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Запуск
|
||||
|
||||
### Варіант 1: Автоматичний (все разом)
|
||||
|
||||
```bash
|
||||
./start_sofia.sh
|
||||
```
|
||||
|
||||
Цей скрипт:
|
||||
- ✅ Перевіряє Ollama
|
||||
- ✅ Запускає Sofia API (порт 8899)
|
||||
- ✅ Запускає React dev server (порт 5173)
|
||||
- ✅ Відкриває браузер
|
||||
|
||||
### Варіант 2: Ручний (окремо)
|
||||
|
||||
**Термінал 1: Sofia API**
|
||||
```bash
|
||||
source sofia_venv/bin/activate
|
||||
python3 sofia_api.py
|
||||
```
|
||||
|
||||
**Термінал 2: React Dev Server**
|
||||
```bash
|
||||
npm run dev
|
||||
```
|
||||
|
||||
**Браузер:**
|
||||
```
|
||||
http://localhost:5173/sofia
|
||||
```
|
||||
|
||||
### Варіант 3: Фоновий режим
|
||||
|
||||
```bash
|
||||
# Sofia API
|
||||
nohup sofia_venv/bin/python3 sofia_api.py > sofia_api.log 2>&1 &
|
||||
|
||||
# Dev Server
|
||||
npm run dev
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Доступ
|
||||
|
||||
**София доступна за адресою:**
|
||||
```
|
||||
http://localhost:5173/sofia
|
||||
```
|
||||
|
||||
**API документація:**
|
||||
```
|
||||
http://localhost:8899/docs
|
||||
```
|
||||
|
||||
**Health Check:**
|
||||
```bash
|
||||
curl http://localhost:8899/health
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💬 Інтерфейс
|
||||
|
||||
### Головний екран:
|
||||
- 🎨 Градієнтний дизайн (purple → pink)
|
||||
- 👤 Профіль Sofia (Chief AI Engineer)
|
||||
- 🤖 qwen2.5-coder:32b badge
|
||||
- 🗑️ Кнопка очистити чат
|
||||
|
||||
### Швидкі запити:
|
||||
1. 💼 Розкажи про свою роль
|
||||
2. 🤖 Які моделі для NLP?
|
||||
3. 🏗️ Multi-agent архітектура
|
||||
4. 📚 RAG vs Fine-tuning
|
||||
|
||||
### Повідомлення:
|
||||
- Користувач: градієнт blue → cyan (праворуч)
|
||||
- Sofia: сірий фон (ліворуч)
|
||||
- Показує час + токени
|
||||
- Історія зберігається
|
||||
|
||||
### Введення:
|
||||
- Enter - відправити
|
||||
- Shift+Enter - новий рядок
|
||||
- Автоскрол до нових повідомлень
|
||||
|
||||
---
|
||||
|
||||
## 🔧 API Endpoints
|
||||
|
||||
### POST /chat
|
||||
```bash
|
||||
curl -X POST http://localhost:8899/chat \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"message": "Привіт Sofia!"}'
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{
|
||||
"response": "Привіт! Як можу допомогти?",
|
||||
"tokens": 50,
|
||||
"model": "qwen2.5-coder:32b",
|
||||
"provider": "ollama"
|
||||
}
|
||||
```
|
||||
|
||||
### POST /clear
|
||||
```bash
|
||||
curl -X POST http://localhost:8899/clear
|
||||
```
|
||||
|
||||
### GET /history
|
||||
```bash
|
||||
curl http://localhost:8899/history
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎨 Кастомізація
|
||||
|
||||
### Зміна кольорів (SofiaChatPage.tsx):
|
||||
|
||||
```tsx
|
||||
// Головний градієнт
|
||||
from-purple-500 to-pink-500 → from-blue-500 to-cyan-500
|
||||
|
||||
// Фон
|
||||
from-purple-50 via-white to-pink-50 → інший градієнт
|
||||
```
|
||||
|
||||
### Зміна моделі (.env):
|
||||
|
||||
```bash
|
||||
OLLAMA_MODEL=deepseek-r1:70b # Для складних задач
|
||||
OLLAMA_MODEL=mistral-nemo:12b # Для швидкості
|
||||
```
|
||||
|
||||
### Підключення Grok API (.env):
|
||||
|
||||
```bash
|
||||
XAI_API_KEY=your_key_here
|
||||
```
|
||||
|
||||
Sofia автоматично переключиться на Grok.
|
||||
|
||||
---
|
||||
|
||||
## 📊 Моніторинг
|
||||
|
||||
### Логи Sofia API:
|
||||
```bash
|
||||
tail -f sofia_api.log
|
||||
```
|
||||
|
||||
### Логи Dev Server:
|
||||
```bash
|
||||
tail -f dev_server.log # якщо запущено у фоні
|
||||
```
|
||||
|
||||
### Перевірка процесів:
|
||||
```bash
|
||||
ps aux | grep -E "sofia_api|npm.*dev"
|
||||
```
|
||||
|
||||
### Зупинити:
|
||||
```bash
|
||||
# Sofia API
|
||||
pkill -f sofia_api.py
|
||||
|
||||
# Dev Server
|
||||
pkill -f "npm.*dev"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Вирішення проблем
|
||||
|
||||
### "Cannot connect to Ollama"
|
||||
|
||||
```bash
|
||||
# Перевірити
|
||||
ps aux | grep ollama
|
||||
|
||||
# Запустити
|
||||
ollama serve
|
||||
```
|
||||
|
||||
### "Port 8899 already in use"
|
||||
|
||||
```bash
|
||||
# Знайти процес
|
||||
lsof -i :8899
|
||||
|
||||
# Зупинити
|
||||
kill -9 <PID>
|
||||
```
|
||||
|
||||
### "Port 5173 already in use"
|
||||
|
||||
```bash
|
||||
# Використати інший порт
|
||||
npm run dev -- --port 3000
|
||||
|
||||
# Змінити в SofiaChatPage.tsx:
|
||||
const sofiaUrl = 'http://localhost:8899';
|
||||
```
|
||||
|
||||
### Білий екран / помилка компіляції
|
||||
|
||||
```bash
|
||||
# Перезапустити dev server
|
||||
pkill -f "npm.*dev"
|
||||
npm run dev
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📱 Функції
|
||||
|
||||
### ✅ Працює зараз:
|
||||
- Чат з Sofia
|
||||
- Історія повідомлень
|
||||
- Статистика токенів
|
||||
- Швидкі запити
|
||||
- Очистити чат
|
||||
- Responsive дизайн
|
||||
|
||||
### 🔜 Майбутнє:
|
||||
- 🎤 Голосовий режим (STT/TTS)
|
||||
- 📎 Завантаження файлів
|
||||
- 🖼️ Обробка зображень (з llava)
|
||||
- 💾 Збереження чатів
|
||||
- 🔐 Аутентифікація
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Готово!
|
||||
|
||||
**Sofia веб-інтерфейс працює!** 🎉
|
||||
|
||||
**Відкрити зараз:**
|
||||
```bash
|
||||
open http://localhost:5173/sofia
|
||||
```
|
||||
|
||||
**Або перейти в браузері:**
|
||||
```
|
||||
http://localhost:5173/sofia
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Структура файлів
|
||||
|
||||
```
|
||||
microdao-daarion/
|
||||
├── sofia_agent.py # CLI агент
|
||||
├── sofia_api.py # FastAPI backend
|
||||
├── start_sofia.sh # Startup скрипт
|
||||
├── sofia_venv/ # Python venv
|
||||
├── src/
|
||||
│ └── pages/
|
||||
│ └── SofiaChatPage.tsx # React компонент
|
||||
└── SOFIA_WEB_UI.md # Ця інструкція
|
||||
```
|
||||
|
||||
**Успішного використання! 🚀**
|
||||
@@ -341,3 +341,12 @@ cd services/agent-filter
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -195,3 +195,12 @@ const API_URL = import.meta.env.VITE_API_URL || 'http://localhost:7014';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -187,3 +187,12 @@ docker-compose restart swapper-service
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -203,3 +203,12 @@ swapper:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -262,3 +262,12 @@ swapper:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -199,3 +199,12 @@ ssh root@144.76.224.179 "cd /opt/microdao-daarion && docker-compose up -d swappe
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -316,3 +316,12 @@ cryptography==41.0.7
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -370,3 +370,12 @@ done
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -604,3 +604,12 @@ async def universal_telegram_webhook(bot_id: str, update: TelegramUpdate):
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -131,3 +131,12 @@ docker logs --tail 50 dagi-web-search-service
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -170,3 +170,12 @@ INFO: 145.224.94.89:27620 - "POST /route HTTP/1.1" 200 OK
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -324,3 +324,12 @@ docker ps | grep -E 'dagi-gateway|dagi-tts|dagi-stt'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -303,3 +303,12 @@ async def text_to_speech(text: str, voice_id: str):
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
3
apps/web/next-env.d.ts
vendored
3
apps/web/next-env.d.ts
vendored
@@ -1,5 +1,6 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
/// <reference path="./.next/types/routes.d.ts" />
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information.
|
||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||
|
||||
@@ -80,3 +80,12 @@ networks:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -19,7 +19,10 @@ services:
|
||||
- ./migrations:/docker-entrypoint-initdb.d:ro
|
||||
- ./scripts:/scripts:ro
|
||||
networks:
|
||||
- dagi-network
|
||||
dagi-network:
|
||||
aliases:
|
||||
- dagi-postgres
|
||||
- postgres
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U postgres -d daarion"]
|
||||
interval: 10s
|
||||
|
||||
@@ -124,3 +124,12 @@ networks:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -189,3 +189,12 @@ volumes:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
55
docker/postgres-clean/Dockerfile
Normal file
55
docker/postgres-clean/Dockerfile
Normal file
@@ -0,0 +1,55 @@
|
||||
# Clean PostgreSQL Build from Official Debian Sources
|
||||
# Built to avoid compromised Docker Hub images
|
||||
|
||||
FROM debian:bookworm-slim
|
||||
|
||||
# PostgreSQL version
|
||||
ENV PG_MAJOR=16
|
||||
ENV PGDATA=/var/lib/postgresql/data
|
||||
|
||||
# Install dependencies and PostgreSQL from official apt repository
|
||||
RUN set -ex; \
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends \
|
||||
ca-certificates \
|
||||
wget \
|
||||
gnupg \
|
||||
lsb-release \
|
||||
locales; \
|
||||
\
|
||||
# Add PostgreSQL official repository (new GPG method)
|
||||
mkdir -p /usr/share/postgresql-common/pgdg; \
|
||||
wget --quiet -O /usr/share/postgresql-common/pgdg/apt.postgresql.org.asc https://www.postgresql.org/media/keys/ACCC4CF8.asc; \
|
||||
echo "deb [signed-by=/usr/share/postgresql-common/pgdg/apt.postgresql.org.asc] http://apt.postgresql.org/pub/repos/apt bookworm-pgdg main" > /etc/apt/sources.list.d/pgdg.list; \
|
||||
\
|
||||
apt-get update; \
|
||||
apt-get install -y --no-install-recommends \
|
||||
postgresql-$PG_MAJOR \
|
||||
postgresql-contrib-$PG_MAJOR; \
|
||||
\
|
||||
# Cleanup
|
||||
apt-get purge -y --auto-remove wget gnupg lsb-release; \
|
||||
rm -rf /var/lib/apt/lists/*; \
|
||||
\
|
||||
# Configure locales
|
||||
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
|
||||
|
||||
ENV LANG=en_US.utf8
|
||||
|
||||
# Create postgres user and data directory
|
||||
RUN mkdir -p "$PGDATA" && chown -R postgres:postgres "$PGDATA" && chmod 700 "$PGDATA"
|
||||
|
||||
# Add volume for persistence
|
||||
VOLUME /var/lib/postgresql/data
|
||||
|
||||
# Copy custom entrypoint (modified from official but verified)
|
||||
COPY docker-entrypoint.sh /usr/local/bin/
|
||||
RUN chmod +x /usr/local/bin/docker-entrypoint.sh && \
|
||||
ln -s usr/local/bin/docker-entrypoint.sh /
|
||||
|
||||
USER postgres
|
||||
|
||||
EXPOSE 5432
|
||||
|
||||
ENTRYPOINT ["docker-entrypoint.sh"]
|
||||
CMD ["postgres"]
|
||||
58
docker/postgres-clean/README.md
Normal file
58
docker/postgres-clean/README.md
Normal file
@@ -0,0 +1,58 @@
|
||||
# Clean PostgreSQL Image
|
||||
|
||||
**Purpose**: Build PostgreSQL from official Debian repositories to avoid compromised Docker Hub images.
|
||||
|
||||
## Why This Exists
|
||||
|
||||
Multiple PostgreSQL images from Docker Hub were found to be compromised with cryptocurrency miners:
|
||||
- `postgres:15-alpine` - Incident #3
|
||||
- `postgres:16-alpine` - Incident #4
|
||||
- `postgres:14` - Incident #5
|
||||
|
||||
This image is built from scratch using only official PostgreSQL APT repositories.
|
||||
|
||||
## Build
|
||||
|
||||
```bash
|
||||
cd docker/postgres-clean
|
||||
docker build -t daarion-postgres:16-clean .
|
||||
```
|
||||
|
||||
## Verify Build
|
||||
|
||||
```bash
|
||||
# Check no suspicious files
|
||||
docker run --rm daarion-postgres:16-clean find /tmp -type f -executable
|
||||
|
||||
# Check process tree during startup
|
||||
docker run -d --name test-pg -e POSTGRES_PASSWORD=test daarion-postgres:16-clean
|
||||
sleep 10
|
||||
docker exec test-pg ps aux
|
||||
docker stop test-pg && docker rm test-pg
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
Replace in `docker-compose.db.yml`:
|
||||
|
||||
```yaml
|
||||
db:
|
||||
# image: postgres:16-alpine # COMPROMISED
|
||||
image: daarion-postgres:16-clean
|
||||
# ... rest of config
|
||||
```
|
||||
|
||||
## Security Notes
|
||||
|
||||
- Built from Debian official repositories only
|
||||
- Minimal dependencies
|
||||
- Simplified entrypoint script (no suspicious code)
|
||||
- No hidden binaries or scripts
|
||||
- All code is readable and auditable
|
||||
|
||||
## Maintenance
|
||||
|
||||
To update PostgreSQL version:
|
||||
1. Edit `Dockerfile`: Update `PG_VERSION`
|
||||
2. Rebuild image
|
||||
3. Test thoroughly before deploying
|
||||
69
docker/postgres-clean/docker-entrypoint.sh
Normal file
69
docker/postgres-clean/docker-entrypoint.sh
Normal file
@@ -0,0 +1,69 @@
|
||||
#!/usr/bin/env bash
|
||||
set -Eeo pipefail
|
||||
|
||||
# usage: file_env VAR [DEFAULT]
|
||||
file_env() {
|
||||
local var="$1"
|
||||
local fileVar="${var}_FILE"
|
||||
local def="${2:-}"
|
||||
if [ "${!var:-}" ] && [ "${!fileVar:-}" ]; then
|
||||
echo >&2 "error: both $var and $fileVar are set (but are exclusive)"
|
||||
exit 1
|
||||
fi
|
||||
local val="$def"
|
||||
if [ "${!var:-}" ]; then
|
||||
val="${!var}"
|
||||
elif [ "${!fileVar:-}" ]; then
|
||||
val="$(< "${!fileVar}")"
|
||||
fi
|
||||
export "$var"="$val"
|
||||
unset "$fileVar"
|
||||
}
|
||||
|
||||
# Setup environment variables
|
||||
file_env 'POSTGRES_PASSWORD'
|
||||
file_env 'POSTGRES_USER' 'postgres'
|
||||
file_env 'POSTGRES_DB' "$POSTGRES_USER"
|
||||
file_env 'POSTGRES_INITDB_ARGS'
|
||||
|
||||
# Initialize database if needed
|
||||
if [ ! -s "$PGDATA/PG_VERSION" ]; then
|
||||
echo "Initializing database..."
|
||||
|
||||
/usr/lib/postgresql/16/bin/initdb --username="$POSTGRES_USER" --pwfile=<(echo "$POSTGRES_PASSWORD") $POSTGRES_INITDB_ARGS
|
||||
|
||||
# Configure pg_hba.conf for network access
|
||||
{
|
||||
echo
|
||||
echo "host all all all scram-sha-256"
|
||||
} >> "$PGDATA/pg_hba.conf"
|
||||
|
||||
# Start temporary server for setup
|
||||
/usr/lib/postgresql/16/bin/pg_ctl -D "$PGDATA" -w start -o "-c listen_addresses=''" || exit 1
|
||||
|
||||
# Create database if needed
|
||||
if [ "$POSTGRES_DB" != 'postgres' ]; then
|
||||
/usr/lib/postgresql/16/bin/psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname postgres <<-EOSQL
|
||||
CREATE DATABASE "$POSTGRES_DB";
|
||||
EOSQL
|
||||
fi
|
||||
|
||||
# Run init scripts if present
|
||||
if [ -d /docker-entrypoint-initdb.d ]; then
|
||||
for f in /docker-entrypoint-initdb.d/*; do
|
||||
case "$f" in
|
||||
*.sh) echo "$0: running $f"; . "$f" ;;
|
||||
*.sql) echo "$0: running $f"; /usr/lib/postgresql/16/bin/psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < "$f" ;;
|
||||
*) echo "$0: ignoring $f" ;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
# Stop temporary server
|
||||
/usr/lib/postgresql/16/bin/pg_ctl -D "$PGDATA" -m fast -w stop
|
||||
|
||||
echo "Database initialization complete."
|
||||
fi
|
||||
|
||||
# Start PostgreSQL
|
||||
exec /usr/lib/postgresql/16/bin/postgres "$@"
|
||||
@@ -998,3 +998,12 @@ rules:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -489,3 +489,12 @@ curl -X POST http://localhost:8080/api/messaging/channels \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -513,3 +513,12 @@ Instead of direct Matrix API:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -409,3 +409,12 @@ VALUES (gen_random_uuid(), '<channel-id>', 'agent:sofia', 'agent', '@sofia-agent
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -36,3 +36,12 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -607,3 +607,12 @@ docker exec daarion-postgres psql -U postgres -d daarion \
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -6,12 +6,19 @@
|
||||
"source": [
|
||||
"# 🚀 Infrastructure Quick Reference — DAARION & MicroDAO\n",
|
||||
"\n",
|
||||
"Версія:** 2.3.0 \n",
|
||||
"Останнє оновлення:** 2026-01-09 13:50 \n",
|
||||
"Версія:** 2.4.0 \n",
|
||||
"Останнє оновлення:** 2026-01-10 XX:XX \n",
|
||||
"\n",
|
||||
"Цей notebook містить швидкий довідник по серверах, репозиторіях та endpoints для DAGI Stack.\n",
|
||||
"\n",
|
||||
"**NEW (v2.3.0):** \n",
|
||||
"**🔴 CRITICAL (v2.4.0) - Jan 10, 2026:**\n",
|
||||
"- 🔴 **Incident #4: NODE1 Host Compromise Suspected**\n",
|
||||
"- ❌ ALL PostgreSQL images show malware on NODE1 (15-alpine, 16-alpine, 14, 16)\n",
|
||||
"- ⚠️ **NODE1 UNSAFE** - Do not deploy any containers until verified\n",
|
||||
"- 📋 **Triage script added**: `scripts/security/triage-postgres-compromise.sh`\n",
|
||||
"- 🔬 **Verification required**: Test same image digest on clean host\n",
|
||||
"\n",
|
||||
"**v2.3.0:** \n",
|
||||
"- 🖥️ **NODE3 added** - Threadripper PRO 5975WX + RTX 3090 24GB\n",
|
||||
"- 🚀 Most powerful node for AI/ML workloads (32c/64t, 128GB RAM, 4TB NVMe)\n",
|
||||
"- ✅ Security verified - clean system\n",
|
||||
@@ -171,24 +178,23 @@
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 🐙 GitHub Repositories",
|
||||
"",
|
||||
"### 1. MicroDAO (Current Project)",
|
||||
"- **Repository:** `git@github.com:IvanTytar/microdao-daarion`",
|
||||
"- **HTTPS:** `https://github.com/IvanTytar/microdao-daarion`",
|
||||
"- **Remote Name:** `origin`",
|
||||
"- **Main Branch:** `main`",
|
||||
"- **Purpose:** MicroDAO core code, DAGI Stack, documentation",
|
||||
"",
|
||||
"### 2. DAARION.city",
|
||||
"- **Repository:** `git@github.com:DAARION-DAO/daarion-ai-city.git`",
|
||||
"- **HTTPS:** `https://github.com/DAARION-DAO/daarion-ai-city.git`",
|
||||
"- **Remote Name:** `daarion-city`",
|
||||
"- **Main Branch:** `main`",
|
||||
"- **Purpose:** Official DAARION.city website and integrations",
|
||||
"",
|
||||
"---",
|
||||
""
|
||||
"## 🐙 GitHub Repositories\n",
|
||||
"\n",
|
||||
"### 1. MicroDAO (Current Project)\n",
|
||||
"- **Repository:** `git@github.com:IvanTytar/microdao-daarion`\n",
|
||||
"- **HTTPS:** `https://github.com/IvanTytar/microdao-daarion`\n",
|
||||
"- **Remote Name:** `origin`\n",
|
||||
"- **Main Branch:** `main`\n",
|
||||
"- **Purpose:** MicroDAO core code, DAGI Stack, documentation\n",
|
||||
"\n",
|
||||
"### 2. DAARION.city\n",
|
||||
"- **Repository:** `git@github.com:DAARION-DAO/daarion-ai-city.git`\n",
|
||||
"- **HTTPS:** `https://github.com/DAARION-DAO/daarion-ai-city.git`\n",
|
||||
"- **Remote Name:** `daarion-city`\n",
|
||||
"- **Main Branch:** `main`\n",
|
||||
"- **Purpose:** Official DAARION.city website and integrations\n",
|
||||
"\n",
|
||||
"---\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -197,50 +203,49 @@
|
||||
"metadata": {},
|
||||
"outputs": [],
|
||||
"source": [
|
||||
"# GitHub Repositories Configuration",
|
||||
"REPOSITORIES = {",
|
||||
" \"microdao-daarion\": {",
|
||||
" \"name\": \"MicroDAO\",",
|
||||
" \"ssh_url\": \"git@github.com:IvanTytar/microdao-daarion\",",
|
||||
" \"https_url\": \"https://github.com/IvanTytar/microdao-daarion\",",
|
||||
" \"remote_name\": \"origin\",",
|
||||
" \"main_branch\": \"main\",",
|
||||
" \"purpose\": \"MicroDAO core code, DAGI Stack, documentation\",",
|
||||
" \"clone_cmd\": \"git clone git@github.com:IvanTytar/microdao-daarion\"",
|
||||
" },",
|
||||
" \"daarion-ai-city\": {",
|
||||
" \"name\": \"DAARION.city\",",
|
||||
" \"ssh_url\": \"git@github.com:DAARION-DAO/daarion-ai-city.git\",",
|
||||
" \"https_url\": \"https://github.com/DAARION-DAO/daarion-ai-city.git\",",
|
||||
" \"remote_name\": \"daarion-city\",",
|
||||
" \"main_branch\": \"main\",",
|
||||
" \"purpose\": \"Official DAARION.city website and integrations\",",
|
||||
" \"clone_cmd\": \"git clone git@github.com:DAARION-DAO/daarion-ai-city.git\"",
|
||||
" }",
|
||||
"}",
|
||||
"",
|
||||
"print(\"GitHub Repositories:\")",
|
||||
"print(\"=\"*80)",
|
||||
"for repo_id, repo in REPOSITORIES.items():",
|
||||
" print(f\"\\n{repo['name']} ({repo_id})\")",
|
||||
" print(f\" SSH URL: {repo['ssh_url']}\")",
|
||||
" print(f\" HTTPS URL: {repo['https_url']}\")",
|
||||
" print(f\" Remote: {repo['remote_name']}\")",
|
||||
" print(f\" Branch: {repo['main_branch']}\")",
|
||||
" print(f\" Purpose: {repo['purpose']}\")",
|
||||
" print(f\" Clone: {repo['clone_cmd']}\")",
|
||||
"",
|
||||
"print(\"\\n\" + \"=\"*80)",
|
||||
"print(\"\\nQuick Commands:\")",
|
||||
"print(\"\\n# Clone MicroDAO:\")",
|
||||
"print(\"git clone git@github.com:IvanTytar/microdao-daarion.git\")",
|
||||
"print(\"\\n# Clone DAARION.city:\")",
|
||||
"print(\"git clone git@github.com:DAARION-DAO/daarion-ai-city.git\")",
|
||||
"print(\"\\n# Add DAARION.city as remote to MicroDAO:\")",
|
||||
"print(\"cd microdao-daarion\")",
|
||||
"print(\"git remote add daarion-city git@github.com:DAARION-DAO/daarion-ai-city.git\")",
|
||||
"print(\"git fetch daarion-city\")",
|
||||
""
|
||||
"# GitHub Repositories Configuration\n",
|
||||
"REPOSITORIES = {\n",
|
||||
" \"microdao-daarion\": {\n",
|
||||
" \"name\": \"MicroDAO\",\n",
|
||||
" \"ssh_url\": \"git@github.com:IvanTytar/microdao-daarion\",\n",
|
||||
" \"https_url\": \"https://github.com/IvanTytar/microdao-daarion\",\n",
|
||||
" \"remote_name\": \"origin\",\n",
|
||||
" \"main_branch\": \"main\",\n",
|
||||
" \"purpose\": \"MicroDAO core code, DAGI Stack, documentation\",\n",
|
||||
" \"clone_cmd\": \"git clone git@github.com:IvanTytar/microdao-daarion\"\n",
|
||||
" },\n",
|
||||
" \"daarion-ai-city\": {\n",
|
||||
" \"name\": \"DAARION.city\",\n",
|
||||
" \"ssh_url\": \"git@github.com:DAARION-DAO/daarion-ai-city.git\",\n",
|
||||
" \"https_url\": \"https://github.com/DAARION-DAO/daarion-ai-city.git\",\n",
|
||||
" \"remote_name\": \"daarion-city\",\n",
|
||||
" \"main_branch\": \"main\",\n",
|
||||
" \"purpose\": \"Official DAARION.city website and integrations\",\n",
|
||||
" \"clone_cmd\": \"git clone git@github.com:DAARION-DAO/daarion-ai-city.git\"\n",
|
||||
" }\n",
|
||||
"}\n",
|
||||
"\n",
|
||||
"print(\"GitHub Repositories:\")\n",
|
||||
"print(\"=\"*80)\n",
|
||||
"for repo_id, repo in REPOSITORIES.items():\n",
|
||||
" print(f\"\\n{repo['name']} ({repo_id})\")\n",
|
||||
" print(f\" SSH URL: {repo['ssh_url']}\")\n",
|
||||
" print(f\" HTTPS URL: {repo['https_url']}\")\n",
|
||||
" print(f\" Remote: {repo['remote_name']}\")\n",
|
||||
" print(f\" Branch: {repo['main_branch']}\")\n",
|
||||
" print(f\" Purpose: {repo['purpose']}\")\n",
|
||||
" print(f\" Clone: {repo['clone_cmd']}\")\n",
|
||||
"\n",
|
||||
"print(\"\\n\" + \"=\"*80)\n",
|
||||
"print(\"\\nQuick Commands:\")\n",
|
||||
"print(\"\\n# Clone MicroDAO:\")\n",
|
||||
"print(\"git clone git@github.com:IvanTytar/microdao-daarion.git\")\n",
|
||||
"print(\"\\n# Clone DAARION.city:\")\n",
|
||||
"print(\"git clone git@github.com:DAARION-DAO/daarion-ai-city.git\")\n",
|
||||
"print(\"\\n# Add DAARION.city as remote to MicroDAO:\")\n",
|
||||
"print(\"cd microdao-daarion\")\n",
|
||||
"print(\"git remote add daarion-city git@github.com:DAARION-DAO/daarion-ai-city.git\")\n",
|
||||
"print(\"git fetch daarion-city\")\n"
|
||||
]
|
||||
},
|
||||
{
|
||||
@@ -733,6 +738,64 @@
|
||||
"- **Action Required:** User MUST submit statement at https://statement-abuse.hetzner.com/statements/?token=28b2c7e67a409659f6c823e863887\n",
|
||||
"- **Task Document:** `/Users/apple/github-projects/microdao-daarion/TASK_REBUILD_DAARION_WEB.md`"
|
||||
]
|
||||
},
|
||||
{
|
||||
"cell_type": "markdown",
|
||||
"metadata": {},
|
||||
"source": [
|
||||
"## 🔴 Incident #4: NODE1 Host Compromise (Jan 10, 2026)\n",
|
||||
"\n",
|
||||
"### Summary\n",
|
||||
"ALL PostgreSQL official images show malware artifacts when run on NODE1.\n",
|
||||
"This is **NOT** \"Docker Hub compromised\" — this is **NODE1 host compromise**.\n",
|
||||
"\n",
|
||||
"### Indicators of Compromise (IOC)\n",
|
||||
"```\n",
|
||||
"/tmp/httpd # ~10MB crypto miner (xmrig variant)\n",
|
||||
"/tmp/.perf.c/ # perfctl malware staging directory\n",
|
||||
"/tmp/mysql # Another miner variant\n",
|
||||
"/tmp/cpioshuf # perfctl payload\n",
|
||||
"/tmp/ipcalc* # perfctl payload\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"### Affected Images (on NODE1)\n",
|
||||
"- ❌ postgres:15-alpine\n",
|
||||
"- ❌ postgres:16-alpine\n",
|
||||
"- ❌ postgres:14\n",
|
||||
"- ❌ postgres:16 (Debian)\n",
|
||||
"\n",
|
||||
"### Why This is HOST Compromise (not image)\n",
|
||||
"1. ALL different image variants show same IOC\n",
|
||||
"2. Previous incidents (#1, #2, #3) already compromised NODE1\n",
|
||||
"3. `/tmp/.perf.c/` is classic perfctl malware directory\n",
|
||||
"4. `tmpfs noexec` didn't prevent infection\n",
|
||||
"\n",
|
||||
"### Verification Procedure\n",
|
||||
"```bash\n",
|
||||
"# Run triage script from MacBook (NOT NODE1!)\n",
|
||||
"cd /Users/apple/github-projects/microdao-daarion\n",
|
||||
"./scripts/security/triage-postgres-compromise.sh compare\n",
|
||||
"\n",
|
||||
"# Or manually:\n",
|
||||
"# 1. Get digest from NODE1\n",
|
||||
"ssh root@144.76.224.179 \"docker inspect --format='{{index .RepoDigests 0}}' postgres:16\"\n",
|
||||
"\n",
|
||||
"# 2. Pull same digest on MacBook\n",
|
||||
"docker pull postgres:16@sha256:<digest>\n",
|
||||
"\n",
|
||||
"# 3. Check if clean\n",
|
||||
"docker run --rm postgres:16@sha256:<digest> ls -la /tmp/\n",
|
||||
"# If empty → NODE1 compromised, image is clean\n",
|
||||
"```\n",
|
||||
"\n",
|
||||
"### Current Status\n",
|
||||
"- ⏳ **Verification pending** — Need to test on clean host\n",
|
||||
"- 🔴 **NODE1 UNSAFE** — Do not deploy PostgreSQL\n",
|
||||
"- 🟡 **Secrets rotation needed** — Assume all compromised\n",
|
||||
"\n",
|
||||
"### Full Documentation\n",
|
||||
"See `INFRASTRUCTURE.md` → Incident #4"
|
||||
]
|
||||
}
|
||||
],
|
||||
"metadata": {
|
||||
@@ -756,4 +819,4 @@
|
||||
},
|
||||
"nbformat": 4,
|
||||
"nbformat_minor": 4
|
||||
}
|
||||
}
|
||||
|
||||
@@ -192,3 +192,12 @@ Ref: messages.matrix_event_id - matrix_events.event_id [note: 'Message ↔ Matri
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -543,3 +543,12 @@ open http://localhost:8899/agents
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -90,3 +90,12 @@ curl http://144.76.224.179:7001/city/microdao/daarion/dashboard
|
||||
|
||||
Всі компоненти працюють! ✅
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -72,3 +72,12 @@ docker restart daarion-web
|
||||
|
||||
Після синхронізації frontend коду, сторінка `/microdao/daarion` буде повністю функціональна!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -865,3 +865,12 @@ networks:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -504,3 +504,12 @@ tools:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -277,3 +277,12 @@ Behavior:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -422,3 +422,12 @@ Behavior:
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -240,3 +240,12 @@ COMMENT ON SCHEMA public IS 'Messenger schema v1 - Matrix-aware implementation';
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -156,3 +156,12 @@ ON CONFLICT (id) DO NOTHING;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -147,3 +147,12 @@ EXECUTE FUNCTION update_timestamp();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -81,3 +81,12 @@ http {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -42,3 +42,12 @@ server {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
10
run_sofia.sh
Executable file
10
run_sofia.sh
Executable file
@@ -0,0 +1,10 @@
|
||||
#!/bin/bash
|
||||
# Sofia Agent - Швидкий запуск
|
||||
# Usage: ./run_sofia.sh [message]
|
||||
|
||||
# Перейти в директорію проекту
|
||||
cd "$(dirname "$0")"
|
||||
|
||||
# Активувати віртуальне середовище та запустити Sofia
|
||||
source sofia_venv/bin/activate
|
||||
python3 sofia_agent.py "$@"
|
||||
67
scripts/git-sync-all.sh
Executable file
67
scripts/git-sync-all.sh
Executable file
@@ -0,0 +1,67 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# git-sync-all.sh - Синхронізація на всі Git репозиторії
|
||||
# ============================================================
|
||||
# Автоматично push на:
|
||||
# - GitHub (origin)
|
||||
# - Gitea (локальний, localhost:3000)
|
||||
# - GitLab (NODE3, через SSH tunnel)
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
# Кольори
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
RED='\033[0;31m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${GREEN}🔄 Git Sync All Remotes${NC}"
|
||||
echo "================================"
|
||||
date
|
||||
echo ""
|
||||
|
||||
# Поточна гілка
|
||||
BRANCH=$(git branch --show-current)
|
||||
echo -e "📌 Гілка: ${YELLOW}$BRANCH${NC}"
|
||||
echo ""
|
||||
|
||||
# 1. Push на GitHub (origin)
|
||||
echo -e "${GREEN}1. GitHub (origin)${NC}"
|
||||
if git push origin "$BRANCH" 2>/dev/null; then
|
||||
echo " ✅ GitHub OK"
|
||||
else
|
||||
echo -e " ${RED}❌ GitHub FAILED${NC}"
|
||||
fi
|
||||
|
||||
# 2. Push на Gitea (локальний)
|
||||
echo -e "${GREEN}2. Gitea (localhost:3000)${NC}"
|
||||
if git push gitea "$BRANCH" 2>/dev/null; then
|
||||
echo " ✅ Gitea OK"
|
||||
else
|
||||
echo -e " ${YELLOW}⚠️ Gitea - можливо потрібен логін${NC}"
|
||||
# Спробуємо з credentials
|
||||
git push http://daarion-admin:DaarionGit2026!@localhost:3000/daarion-admin/microdao-daarion.git "$BRANCH" 2>/dev/null && echo " ✅ Gitea OK (з credentials)" || echo -e " ${RED}❌ Gitea FAILED${NC}"
|
||||
fi
|
||||
|
||||
# 3. Push на GitLab (NODE3)
|
||||
echo -e "${GREEN}3. GitLab (NODE3)${NC}"
|
||||
# Перевірка чи є SSH tunnel
|
||||
if nc -z localhost 8929 2>/dev/null; then
|
||||
if git push gitlab "$BRANCH" 2>/dev/null; then
|
||||
echo " ✅ GitLab OK"
|
||||
else
|
||||
# Спробуємо з credentials
|
||||
git push http://root:glpat-daarion-gitlab-2026@localhost:8929/root/microdao-daarion.git "$BRANCH" 2>/dev/null && echo " ✅ GitLab OK (з credentials)" || echo -e " ${RED}❌ GitLab FAILED${NC}"
|
||||
fi
|
||||
else
|
||||
echo -e " ${YELLOW}⚠️ GitLab недоступний. Запустіть SSH tunnel:${NC}"
|
||||
echo " ssh -p 33147 -L 8929:localhost:8929 zevs@80.77.35.151"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "================================"
|
||||
echo -e "${GREEN}✅ Синхронізація завершена${NC}"
|
||||
78
scripts/logging/install-hooks.sh
Executable file
78
scripts/logging/install-hooks.sh
Executable file
@@ -0,0 +1,78 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# install-hooks.sh — Встановлення Git hooks для автологування
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
|
||||
HOOKS_DIR="$PROJECT_DIR/.git/hooks"
|
||||
|
||||
echo "🔧 Встановлення Git hooks..."
|
||||
|
||||
# Post-commit hook — логує кожен коміт
|
||||
cat > "$HOOKS_DIR/post-commit" << 'HOOK'
|
||||
#!/bin/bash
|
||||
# Auto-log commits to session file
|
||||
|
||||
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
|
||||
SESSIONS_DIR="$PROJECT_DIR/logs/sessions"
|
||||
DATE=$(date +%Y-%m-%d)
|
||||
TIME=$(date +%H:%M)
|
||||
SESSION_FILE="$SESSIONS_DIR/${DATE}.md"
|
||||
|
||||
# Отримати інформацію про коміт
|
||||
COMMIT_HASH=$(git rev-parse --short HEAD)
|
||||
COMMIT_MSG=$(git log -1 --pretty=%B | head -1)
|
||||
CHANGED_FILES=$(git diff-tree --no-commit-id --name-only -r HEAD | wc -l | tr -d ' ')
|
||||
|
||||
# Створити файл якщо не існує
|
||||
if [ ! -f "$SESSION_FILE" ]; then
|
||||
mkdir -p "$SESSIONS_DIR"
|
||||
cat > "$SESSION_FILE" << EOF
|
||||
# 📅 Session Log: $DATE
|
||||
|
||||
**Проєкт:** DAARION & MicroDAO
|
||||
|
||||
---
|
||||
|
||||
## 📋 Хронологія дій
|
||||
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Додати запис про коміт
|
||||
echo "- **$TIME** — 📦 Commit \`$COMMIT_HASH\`: $COMMIT_MSG ($CHANGED_FILES files)" >> "$SESSION_FILE"
|
||||
HOOK
|
||||
|
||||
chmod +x "$HOOKS_DIR/post-commit"
|
||||
echo "✅ post-commit hook встановлено"
|
||||
|
||||
# Pre-push hook — логує push операції
|
||||
cat > "$HOOKS_DIR/pre-push" << 'HOOK'
|
||||
#!/bin/bash
|
||||
# Log push operations
|
||||
|
||||
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
|
||||
SESSIONS_DIR="$PROJECT_DIR/logs/sessions"
|
||||
DATE=$(date +%Y-%m-%d)
|
||||
TIME=$(date +%H:%M)
|
||||
SESSION_FILE="$SESSIONS_DIR/${DATE}.md"
|
||||
|
||||
REMOTE_NAME=$1
|
||||
REMOTE_URL=$2
|
||||
|
||||
if [ -f "$SESSION_FILE" ]; then
|
||||
echo "- **$TIME** — 🚀 Push to \`$REMOTE_NAME\`" >> "$SESSION_FILE"
|
||||
fi
|
||||
HOOK
|
||||
|
||||
chmod +x "$HOOKS_DIR/pre-push"
|
||||
echo "✅ pre-push hook встановлено"
|
||||
|
||||
echo ""
|
||||
echo "🎉 Git hooks встановлено!"
|
||||
echo ""
|
||||
echo "Тепер автоматично логуватиметься:"
|
||||
echo " • Кожен commit"
|
||||
echo " • Кожен push"
|
||||
97
scripts/logging/session-end.sh
Executable file
97
scripts/logging/session-end.sh
Executable file
@@ -0,0 +1,97 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# session-end.sh — Завершення робочої сесії
|
||||
# ============================================================
|
||||
# Автоматично:
|
||||
# - Додає підсумок сесії
|
||||
# - Комітить зміни
|
||||
# - Пушить на всі репозиторії
|
||||
# ============================================================
|
||||
|
||||
set -e
|
||||
|
||||
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
|
||||
SESSIONS_DIR="$PROJECT_DIR/logs/sessions"
|
||||
|
||||
DATE=$(date +%Y-%m-%d)
|
||||
TIME=$(date +%H:%M)
|
||||
|
||||
SESSION_FILE="${DAARION_SESSION_FILE:-$SESSIONS_DIR/${DATE}.md}"
|
||||
|
||||
# Кольори
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
echo -e "${GREEN}🏁 Завершення сесії${NC}"
|
||||
echo "================================"
|
||||
|
||||
# Додати підсумок
|
||||
if [ -f "$SESSION_FILE" ]; then
|
||||
cat >> "$SESSION_FILE" << EOF
|
||||
|
||||
### $TIME — Сесію завершено
|
||||
|
||||
---
|
||||
|
||||
## 📊 Підсумок
|
||||
|
||||
- **Завершено:** $TIME
|
||||
- **Git status:** $(cd "$PROJECT_DIR" && git status --short | wc -l | tr -d ' ') змінених файлів
|
||||
|
||||
EOF
|
||||
echo -e "📄 Оновлено: ${CYAN}$SESSION_FILE${NC}"
|
||||
fi
|
||||
|
||||
# Git операції
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
echo ""
|
||||
echo -e "${YELLOW}📦 Git операції...${NC}"
|
||||
|
||||
# Додати всі зміни
|
||||
git add -A
|
||||
|
||||
# Перевірити чи є що комітити
|
||||
if git diff --cached --quiet; then
|
||||
echo "ℹ️ Немає змін для коміту"
|
||||
else
|
||||
# Коміт
|
||||
COMMIT_MSG="📝 Session $DATE: auto-commit on session end"
|
||||
git commit -m "$COMMIT_MSG"
|
||||
echo -e "✅ Commit: ${CYAN}$COMMIT_MSG${NC}"
|
||||
|
||||
# Push на всі remote
|
||||
echo ""
|
||||
echo -e "${YELLOW}🚀 Push на всі репозиторії...${NC}"
|
||||
|
||||
# GitHub
|
||||
if git push origin 2>/dev/null; then
|
||||
echo " ✅ GitHub (origin)"
|
||||
else
|
||||
echo " ⚠️ GitHub — помилка або немає змін"
|
||||
fi
|
||||
|
||||
# Gitea
|
||||
if git push gitea 2>/dev/null; then
|
||||
echo " ✅ Gitea"
|
||||
else
|
||||
echo " ⚠️ Gitea — помилка або недоступний"
|
||||
fi
|
||||
|
||||
# GitLab (через tunnel)
|
||||
if nc -z localhost 8929 2>/dev/null; then
|
||||
if git push gitlab 2>/dev/null; then
|
||||
echo " ✅ GitLab"
|
||||
else
|
||||
echo " ⚠️ GitLab — помилка"
|
||||
fi
|
||||
else
|
||||
echo " ⚠️ GitLab — SSH tunnel не активний"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo -e "${GREEN}✅ Сесію завершено!${NC}"
|
||||
echo "До зустрічі! 👋"
|
||||
43
scripts/logging/session-log.sh
Executable file
43
scripts/logging/session-log.sh
Executable file
@@ -0,0 +1,43 @@
|
||||
#!/bin/bash
|
||||
# ============================================================
|
||||
# session-log.sh — Додати запис до поточної сесії
|
||||
# ============================================================
|
||||
# Використання: ./scripts/logging/session-log.sh "Опис дії"
|
||||
# Або через alias: session-log "Опис дії"
|
||||
# ============================================================
|
||||
|
||||
PROJECT_DIR="/Users/apple/github-projects/microdao-daarion"
|
||||
SESSIONS_DIR="$PROJECT_DIR/logs/sessions"
|
||||
|
||||
DATE=$(date +%Y-%m-%d)
|
||||
TIME=$(date +%H:%M)
|
||||
|
||||
SESSION_FILE="${DAARION_SESSION_FILE:-$SESSIONS_DIR/${DATE}.md}"
|
||||
MESSAGE="$*"
|
||||
|
||||
if [ -z "$MESSAGE" ]; then
|
||||
echo "❌ Вкажіть опис дії"
|
||||
echo "Використання: session-log \"Опис дії\""
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Якщо файл не існує — створити
|
||||
if [ ! -f "$SESSION_FILE" ]; then
|
||||
mkdir -p "$SESSIONS_DIR"
|
||||
cat > "$SESSION_FILE" << EOF
|
||||
# 📅 Session Log: $DATE
|
||||
|
||||
**Оператор:** Ivan + AI Assistant
|
||||
**Проєкт:** DAARION & MicroDAO
|
||||
|
||||
---
|
||||
|
||||
## 📋 Хронологія дій
|
||||
|
||||
EOF
|
||||
fi
|
||||
|
||||
# Додати запис
|
||||
echo "- **$TIME** — $MESSAGE" >> "$SESSION_FILE"
|
||||
|
||||
echo "✅ Записано: $MESSAGE"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user