Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
132 lines (103 loc) · 6.66 KB
/
Copy pathMakefile
File metadata and controls
132 lines (103 loc) · 6.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
.PHONY: add-user remove-user bulk-import fleet-status bootstrap deploy restart logs backup status quota-report quota-reset set-limit security-check monitor monitor-alerts add-service service-health service-skills install-hooks admin-overview benchmark-1k demo
# ── Управление инстансами ──────────────────────────────────────────────────
# make add-user NAME=user-2 BOT_TOKEN=7xxx FULL_NAME="Example User" TG_ID=123456789
add-user:
@[ -n "$(NAME)" ] || (echo "❌ NAME= обязателен"; exit 1)
@[ -n "$(BOT_TOKEN)" ] || (echo "❌ BOT_TOKEN= обязателен"; exit 1)
@bash scripts/add-user.sh "$(NAME)" "$(BOT_TOKEN)" "$(FULL_NAME)" "$(TG_ID)"
# make remove-user NAME=user-2
remove-user:
@[ -n "$(NAME)" ] || (echo "❌ NAME= обязателен"; exit 1)
@bash scripts/remove-user.sh "$(NAME)"
# make bootstrap — подготовить hermes_data инстансов (каталоги, .env, SOUL.md, права)
bootstrap:
@bash scripts/provision-hermes-data.sh
@echo "✅ hermes_data готов"
# make bulk-import FILE=users.csv [SHARD_SIZE=100] — массовый онбординг до 1000 сотрудников
bulk-import:
@[ -n "$(FILE)" ] || (echo "❌ FILE= обязателен (CSV или JSON манифест)"; exit 1)
@python3 scripts/bulk-users.py import --file "$(FILE)" --shard-size "$${SHARD_SIZE:-100}"
# make fleet-status — сводка по парку инстансов и шардам
fleet-status:
@python3 scripts/bulk-users.py status
# make benchmark-1k — нагрузочный бенчмарк на 1000 конкурентных пользователей
benchmark-1k:
@python3 scripts/benchmark-1000-users.py
# make demo — быстрое 5-секундное интерактивное демо без Docker и внешних ключей
demo:
@bash scripts/quickstart-demo.sh
# ── Деплой ────────────────────────────────────────────────────────────────
deploy: bootstrap
docker compose up -d --build
@echo "✅ Все инстансы запущены"
# make install-hooks — автоперезапуск контейнеров при git pull
install-hooks:
@bash scripts/install-hooks.sh
# make restart NAME=user-2
restart:
@[ -n "$(NAME)" ] || (echo "❌ NAME= обязателен"; exit 1)
docker compose restart assistant-$(NAME)
# make logs NAME=user-2
logs:
@[ -n "$(NAME)" ] || (echo "❌ NAME= обязателен"; exit 1)
docker compose logs -f assistant-$(NAME)
status:
docker compose ps
backup:
@bash scripts/backup.sh
# ── Безопасность ───────────────────────────────────────────────────────────
# Проверка базовых требований безопасности (поддержка GNU stat и BSD stat на macOS)
security-check:
@echo "🔒 Проверка безопасности..."
@[ -f .env ] && (stat -c "%a" .env 2>/dev/null || stat -f "%Lp" .env 2>/dev/null) | grep -qE "^6[04]0$$" \
&& echo " ✅ .env: права 600/640" \
|| echo " ❌ .env: исправь права: chmod 600 .env"
@find instances -name ".env" | while read f; do \
mode=$$(stat -c "%a" "$$f" 2>/dev/null || stat -f "%Lp" "$$f" 2>/dev/null); \
echo "$$mode" | grep -qE "^6[04]0$$" \
&& echo " ✅ $$f: $${mode}" \
|| echo " ❌ $$f: chmod 600 $$f"; \
done
@grep -q "ANTHROPIC_API_KEY=sk-" .env 2>/dev/null \
&& echo " ✅ ANTHROPIC_API_KEY задан" \
|| echo " ❌ ANTHROPIC_API_KEY не задан в .env"
@grep -q "^QUOTA_ADMIN_TOKEN=.\{16\}" .env 2>/dev/null \
&& echo " ✅ QUOTA_ADMIN_TOKEN достаточно длинный" \
|| echo " ❌ QUOTA_ADMIN_TOKEN слишком короткий или не задан"
@! git ls-files .env 2>/dev/null | grep -q ".env" \
&& echo " ✅ .env не в git" \
|| echo " ❌ .env попал в git! git rm --cached .env"
@echo " ℹ️ Проверь: docker compose ps (все контейнеры healthy?)"
# ── Квоты токенов ─────────────────────────────────────────────────────────
# Отчёт по использованию: make quota-report / make quota-report MONTH=2026-03
quota-report:
@bash scripts/quota.sh report $(MONTH)
# Сбросить счётчик: make quota-reset NAME=user-2
quota-reset:
@[ -n "$(NAME)" ] || (echo "❌ NAME= обязателен"; exit 1)
@bash scripts/quota.sh reset $(NAME)
# Установить лимит БЕЗ рестарта: make set-limit NAME=user-2 LIMIT=500000
set-limit:
@[ -n "$(NAME)" ] || (echo "❌ NAME= обязателен"; exit 1)
@[ -n "$(LIMIT)" ] || (echo "❌ LIMIT= обязателен"; exit 1)
@bash scripts/quota.sh set-limit $(NAME) $(LIMIT)
# ── Resource Monitor ────────────────────────────────────────────────────────
monitor: ## Показать текущие метрики ресурсов
@bash scripts/monitor.sh metrics
monitor-alerts: ## Показать активные алерты
@bash scripts/monitor.sh alerts/active
# ── Service Agent ───────────────────────────────────────────────────────────
# make add-service NAME=svc-kyc PORT=8091 SKILLS=compliance,kyc
add-service: ## Добавить реплицированный service-инстанс (NAME=x PORT=y SKILLS=z)
@[ -n "$(NAME)" ] || (echo "❌ NAME= обязателен"; exit 1)
@bash scripts/add-service.sh "$(NAME)" "$(PORT)" "$(SKILLS)"
service-health: ## Проверить health service-инстанса
@curl -sf http://localhost:8090/v1/health | python3 -m json.tool
service-skills: ## Показать доступные скиллы service-инстанса
@curl -sf -H "Authorization: Bearer $${SERVICE_API_KEY}" http://localhost:8090/v1/skills | python3 -m json.tool
admin-overview: ## Сводка admin-dashboard: квоты + метрики + алерты
@curl -sf -X POST http://localhost:8090/v1/run \
-H "Authorization: Bearer $${SERVICE_API_KEY}" \
-H "Content-Type: application/json" \
-d '{"skill": "admin-dashboard", "caller": "makefile", "params": {"action": "overview"}}' \
| python3 -m json.tool