diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 72e6bef..828167b 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -28,16 +28,16 @@ 1. Не трогать рабочий код без явного указания. 2. Файлы редактируются локально: - ~/fission + ~/IoT - После ЛЮБЫХ изменений ОБЯЗАТЕЛЬНО синхронизировать на ВМ командой: - rsync -az \ - -e "ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10" \ - ~/fission/ \ - naeel@5.172.178.213:~/terra/fission/ + После ЛЮБЫХ изменений ОБЯЗАТЕЛЬНО синхронизировать на ВМ командой: + rsync -az \ + -e "ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10" \ + ~/IoT/ \ + naeel@5.172.178.213:~/terra/IoT/ -3. Git (add/commit/push) выполнять ЛОКАЛЬНО в ~/fission +3. Git (add/commit/push) выполнять ЛОКАЛЬНО в ~/IoT 4. Docker, kubectl и другие инфраструктурные команды — только через SSH на ВМ: ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10 naeel@5.172.178.213 'КОМАНДА' diff --git a/.github/pravila.md b/.github/pravila.md index 94bb3ba..668422d 100644 --- a/.github/pravila.md +++ b/.github/pravila.md @@ -13,14 +13,14 @@ ## Файловая система (актуально) -1. Все файлы редактируются локально: `~/fission` +1. Все файлы редактируются локально: `~/IoT` 2. После любых изменений — обязательно rsync на ВМ: rsync -az \ -e "ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no -o ConnectTimeout=10" \ - ~/fission/ \ - naeel@5.172.178.213:~/terra/fission/ + ~/IoT/ \ + naeel@5.172.178.213:~/terra/IoT/ -3. Git (add/commit/push) выполнять ЛОКАЛЬНО в ~/fission +3. Git (add/commit/push) выполнять ЛОКАЛЬНО в ~/IoT 4. Docker, kubectl и другие инфраструктурные команды — только через SSH на ВМ 5. Перед запуском любой команды на ВМ обязательно убедиться, что синхронизация (rsync) выполнена 6. SCP, sshfs, remote_dev и маунты больше НЕ используются @@ -86,7 +86,7 @@ LOG="test-results/$(date +%Y-%m-%d_%H-%M).log" ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no naeel@5.172.178.213 \ "bash ~/terra/fission/scripts/run_all.sh 2>&1 | tee ~/terra/fission/${LOG}" rsync -az -e "ssh -i ~/.ssh/naeel_vm_id_ed25519 -o StrictHostKeyChecking=no" \ - naeel@5.172.178.213:~/terra/fission/test-results/ ~/fission/test-results/ + naeel@5.172.178.213:~/terra/IoT/test-results/ ~/IoT/test-results/ ``` **Никогда не разбираться с результатами по памяти / буферу / чату. Только лог.** diff --git a/console/internal/api/server.go b/console/internal/api/server.go index 2d80888..09f0e2c 100644 --- a/console/internal/api/server.go +++ b/console/internal/api/server.go @@ -15,8 +15,8 @@ import ( "fission-console/internal/auth" "fission-console/internal/billing" "fission-console/internal/cloud" - "fission-console/internal/stats" "fission-console/internal/fission" + "fission-console/internal/stats" "fission-console/ui" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -84,8 +84,8 @@ type Config struct { Authenticator auth.Authenticator // слой аутентификации LLMUrl string LLMKey string - Billing billing.Store // слой статистики (NoopStore если не задан) - Stats stats.StatsProvider // аналитика (NoopProvider если не настроен) + Billing billing.Store // слой статистики (NoopStore если не задан) + Stats stats.StatsProvider // аналитика (NoopProvider если не настроен) } // NewServer создаёт и настраивает HTTP Server со всеми зависимостями. diff --git a/console/internal/stats/grafana.go b/console/internal/stats/grafana.go index e89c5db..74403f6 100644 --- a/console/internal/stats/grafana.go +++ b/console/internal/stats/grafana.go @@ -28,9 +28,9 @@ type GrafanaProvider struct { adminPass string http *http.Client - mu sync.RWMutex - tokens map[string]string // namespace → publicDashboardAccessToken - orgIDs map[string]int64 // namespace → grafana orgId + mu sync.RWMutex + tokens map[string]string // namespace → publicDashboardAccessToken + orgIDs map[string]int64 // namespace → grafana orgId } // NewGrafanaProvider создаёт GrafanaProvider. @@ -178,8 +178,8 @@ func (g *GrafanaProvider) ensureDatasource(ctx context.Context, orgID int64) err return fmt.Errorf("get main datasource: %w", err) } var ds struct { - URL string `json:"url"` - JSONData json.RawMessage `json:"jsonData"` + URL string `json:"url"` + JSONData json.RawMessage `json:"jsonData"` SecureJSONData struct { Password string `json:"password"` } `json:"secureJsonData"` @@ -196,9 +196,9 @@ func (g *GrafanaProvider) ensureDatasource(ctx context.Context, orgID int64) err "url": ds.URL, "access": "proxy", "jsonData": map[string]any{ - "sslmode": "disable", - "postgresVersion": 1700, - "timescaledb": false, + "sslmode": "disable", + "postgresVersion": 1700, + "timescaledb": false, }, "secureJsonData": ds.SecureJSONData, } @@ -270,8 +270,8 @@ func (g *GrafanaProvider) ensurePublicDashboard(ctx context.Context, orgID int64 // Создаём payload := map[string]any{ - "isEnabled": true, - "annotationsEnabled": false, + "isEnabled": true, + "annotationsEnabled": false, "timeSelectionEnabled": true, } resp, body, err = g.grafanaRequest(ctx, http.MethodPost, path, orgID, payload) diff --git a/console/internal/stats/noop.go b/console/internal/stats/noop.go index f66fca2..e90ad12 100644 --- a/console/internal/stats/noop.go +++ b/console/internal/stats/noop.go @@ -7,4 +7,4 @@ import "context" type NoopProvider struct{} func (NoopProvider) EnsureOrgForNamespace(_ context.Context, _, _ string) error { return nil } -func (NoopProvider) DashboardURL(_ context.Context, _ string) string { return "" } +func (NoopProvider) DashboardURL(_ context.Context, _ string) string { return "" } diff --git a/plan.md b/plan.md new file mode 100644 index 0000000..0409076 --- /dev/null +++ b/plan.md @@ -0,0 +1,37 @@ +# Демо-пайплайн: IoT → SQS → Fission + +## Архитектура + +1. **Крон-функция (Fission)** + - Парсит данные о погоде с сайта для нескольких городов + - Эмулирует IoT-датчики: отправляет данные в IoT-сервис (MQTT/HTTP) + +2. **IoT-сервис** + - Принимает данные от "датчиков" + - Публикует сообщения в очередь (SQS или аналог) + +3. **Очередь (SQS)** + - Хранит сообщения от IoT + - Триггерит Fission-функцию при появлении новых данных (MessageQueue Trigger) + +4. **Fission-функция** + - Получает данные из очереди + - Записывает их в таблицу (PostgreSQL, ClickHouse и т.д.) + +## Требования к Fission + +- Необходим MQ-триггер (MessageQueue Trigger) для автоматического запуска функции по сообщениям из очереди. +- Сейчас в Fission есть HTTP, Cron, Event, но нет универсального MQ-триггера. +- Возможные варианты: + - Реализовать внешний watcher (SQS/Kafka/RabbitMQ → invoke HTTP endpoint Fission) + - Добавить поддержку MQ-триггера в сам Fission (новый CRD + контроллер) + +## Примечания + +- Все компоненты связаны через API/очереди, каждый слой изолирован. +- Такой пайплайн типовой для облачных платформ и легко масштабируется. +- Для MVP достаточно watcher-а очереди, который вызывает функцию через HTTP. + +--- + +Если потребуется — расписать детальный план интеграции или примеры кода для каждого этапа. \ No newline at end of file