From a5e52c9e1c30111cfe610b334a9c44d837a96533 Mon Sep 17 00:00:00 2001 From: Naeel Date: Sun, 12 Apr 2026 14:52:57 +0300 Subject: [PATCH] =?UTF-8?q?chore:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D1=82=D1=8C=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D0=BB=D0=B0=20SSH?= =?UTF-8?q?/VM=20=D0=B2=20copilot-instructions=20+=20=D0=BB=D0=BE=D0=B3=20?= =?UTF-8?q?=D0=BC=D1=8B=D1=88=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/copilot-instructions.md | 49 +++++++++++++++++++++++++++ doc/thinking/2026-04-12.md | 59 +++++++++++++++++++++++++++++++++ 2 files changed, 108 insertions(+) create mode 100644 doc/thinking/2026-04-12.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 8d4fd97..2381e45 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -27,6 +27,55 @@ --- +## ⚠️ ВЫПОЛНЕНИЕ КОМАНД — ТОЛЬКО НА УДАЛЁННОЙ МАШИНЕ + +- Все команды (git, go, docker, kubectl, make и т.д.) выполнять **ТОЛЬКО на удалённой машине** через SSH. +- **На локальной машине команды не запускать вообще.** +- Если для задачи необходимо выполнить что-то локально — **спросить явное разрешение у пользователя** перед запуском. + +### Параметры удалённой машины + +| Параметр | Значение | +|---|---| +| Хост | `5.172.178.213` | +| Пользователь | `naeel` | +| SSH-ключ | `~/.ssh/id_ed25519` | +| Рабочий каталог | `/home/naeel/terra/IoT` | + +### Шаблон команды + +```bash +ssh -i ~/.ssh/id_ed25519 \ + -o StrictHostKeyChecking=no \ + -o ConnectTimeout=10 \ + naeel@5.172.178.213 \ + 'cd /home/naeel/terra/IoT && <КОМАНДА>' +``` + +### Примеры + +```bash +# git статус +ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 \ + 'cd /home/naeel/terra/IoT && git status' + +# commit + push +ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 \ + 'cd /home/naeel/terra/IoT && git add -A && git commit -m "..." && git push' + +# сборка go +ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 \ + 'cd /home/naeel/terra/IoT && go build ./...' +``` + +### Git / Gitea + +- Remote: `https://gitea.services.ngcloud.ru/Nail/IoT.git` (HTTPS) +- SSH до Gitea **недоступен** с удалённой машины — использовать только HTTPS. +- Credentials сохранены на удалённой машине в `~/.git-credentials`. + +--- + ## О проекте IoT managed service — отдельная репа, вынесенная из sless. diff --git a/doc/thinking/2026-04-12.md b/doc/thinking/2026-04-12.md new file mode 100644 index 0000000..a623ec0 --- /dev/null +++ b/doc/thinking/2026-04-12.md @@ -0,0 +1,59 @@ +# 2026-04-12 — GitHub Copilot (Claude Opus 4.6) + +## Задача +Пользователь просит: +1. Просмотреть всё в репе IoT +2. Оценить замену Kafka и RabbitMQ на собственный SQS-service (из ~/terra/SQS-service) +3. Контекст: проект переехал из ~/terra/sless в отдельную репу ~/remote_dev/IoT + +## План +1. Изучить текущую структуру IoT репы — что есть, как используется Kafka +2. Посмотреть SQS-service — что он из себя представляет +3. Посмотреть старую репу sless — что оттуда переехало, что осталось +4. Дать краткую оценку замены Kafka/RabbitMQ → SQS + +## Ход работы + +### Анализ: что нашёл + +**IoT — текущее использование Kafka:** +- `cmd/mqtt-bridge/main.go` — MQTT → Kafka writer (топик `iot.telemetry`, библиотека `segmentio/kafka-go`) +- `cmd/kafka-consumer/main.go` — Kafka reader → Postgres (consumer group `iot-pg-consumer`) +- `internal/api/handler/iot_admin_stats_handler.go` — admin UI: показывает Kafka consumer lag +- `cmd/iot-operator/main.go` — передаёт KAFKA_BROKERS в handler +- `deployments/k8s/kafka.yaml` — деплоймент Kafka в кластере +- В документации (deployment.md, iot-mvp-plan.md) упоминается RabbitMQ как изначальный план, но в коде **RabbitMQ нет** — в реальности уже Kafka + +**SQS-service (shared-sqs):** +- AWS SQS-совместимый сервис на Go (модуль `shared-sqs`) +- HTTP API с SQS-протоколом: CreateQueue, SendMessage, ReceiveMessage, DeleteMessage и т.д. +- Multi-tenant: TenantStore с auth +- Persistence: Redis (write-through) + in-memory +- Billing через PostgreSQL +- Порт 4100, gorilla/mux +- **Не Kafka-совместимый** — это pull-based очередь (SQS-like), не streaming platform + +**RabbitMQ в IoT:** только в документах (plan). В коде не используется. + +**shared-SQS (из Gitea README):** +- AWS SQS-совместимый managed сервис — 17 операций SQS +- Уже задеплоен: endpoint `https://qu.kube5s.ru`, Web UI `https://qu.kube5s.ru/ui/` +- Multi-tenant с auth (JWT nubes → auto-create tenant → Access Key / Secret Key) +- Можно использовать через стандартные AWS SDK (Go, Python boto3, Node.js @aws-sdk/client-sqs) +- Persistence: Redis + in-memory +- Billing: PostgreSQL +- Benchmark: конкурентоспособен с Yandex MQ + +### Выводы по замене Kafka → shared-SQS + +**Что реально нужно сделать в IoT:** +1. `mqtt-bridge`: заменить `kafka.Writer` → AWS SDK SQS `SendMessage` (endpoint = qu.kube5s.ru или внутрикластерный) +2. `kafka-consumer` → переименовать в `sqs-consumer`: заменить `kafka.Reader` → SQS `ReceiveMessage` + `DeleteMessage` polling loop +3. `admin stats handler`: вместо Kafka lag → SQS `GetQueueAttributes` (ApproximateNumberOfMessages) +4. Удалить `deployments/k8s/kafka.yaml` +5. Убрать `segmentio/kafka-go` из go.mod, добавить `aws-sdk-go-v2` +6. Обновить env vars: KAFKA_BROKERS → SQS_ENDPOINT + SQS credentials +7. Обновить документацию + +**Плюс:** AWS SDK for Go — стандартная библиотека, код станет проще. shared-SQS уже живой. +**Минус:** polling latency (ReceiveMessage WaitTimeSeconds до 20s) vs Kafka push. Для IoT телеметрии — приемлемо.