diff --git a/.gitignore b/.gitignore index e2c15b5..9f71b11 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,8 @@ # Binaries /shared-sqs + +# Публичная репа (независимый git repo, не трекается) +/shared-SQS/ *.exe *.dll *.dylib diff --git a/deployments/helm/shared-sqs/Chart.yaml b/deployments/helm/shared-sqs/Chart.yaml new file mode 100644 index 0000000..41300a5 --- /dev/null +++ b/deployments/helm/shared-sqs/Chart.yaml @@ -0,0 +1,9 @@ +# Chart.yaml — Helm chart для shared-sqs (multi-tenant SQS-compatible message queue) +# Created: 2026-04-11 +# Updated: 2026-04-12 09:57 MSK — appVersion v0.1.22 +apiVersion: v2 +name: shared-sqs +description: Multi-tenant AWS SQS-compatible message queue service +type: application +version: 0.1.0 +appVersion: "0.1.22" diff --git a/deployments/helm/shared-sqs/templates/_helpers.tpl b/deployments/helm/shared-sqs/templates/_helpers.tpl new file mode 100644 index 0000000..7856d63 --- /dev/null +++ b/deployments/helm/shared-sqs/templates/_helpers.tpl @@ -0,0 +1,26 @@ +{{/* +_helpers.tpl — общие хелперы для shared-sqs Helm chart +Created: 2026-04-11 +*/}} + +{{/* Полное имя релиза */}} +{{- define "shared-sqs.fullname" -}} +{{- .Release.Name | trunc 63 | trimSuffix "-" }} +{{- end }} + +{{/* Общие labels */}} +{{- define "shared-sqs.labels" -}} +app: shared-sqs +app.kubernetes.io/name: shared-sqs +app.kubernetes.io/instance: {{ .Release.Name }} +app.kubernetes.io/version: {{ .Chart.AppVersion | quote }} +app.kubernetes.io/managed-by: {{ .Release.Service }} +helm.sh/chart: {{ .Chart.Name }}-{{ .Chart.Version }} +{{- end }} + +{{/* Selector labels */}} +{{- define "shared-sqs.selectorLabels" -}} +app: shared-sqs +app.kubernetes.io/name: shared-sqs +app.kubernetes.io/instance: {{ .Release.Name }} +{{- end }} diff --git a/deployments/helm/shared-sqs/templates/deployment.yaml b/deployments/helm/shared-sqs/templates/deployment.yaml index afb0d78..7058be1 100644 --- a/deployments/helm/shared-sqs/templates/deployment.yaml +++ b/deployments/helm/shared-sqs/templates/deployment.yaml @@ -24,8 +24,8 @@ spec: spec: containers: - name: shared-sqs - image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" - imagePullPolicy: {{ .Values.image.pullPolicy }} + image: "naeel/shared-sqs:{{ .Values.image.tag }}" + imagePullPolicy: IfNotPresent ports: - containerPort: 4100 name: http @@ -66,12 +66,8 @@ spec: - name: BILLING_PG_PASSWORD valueFrom: secretKeyRef: - {{- if .Values.billing.postgres.existingSecret }} - name: {{ .Values.billing.postgres.existingSecret }} - {{- else }} name: shared-sqs-billing-pg - {{- end }} - key: {{ .Values.billing.postgres.secretKey | default "password" }} + key: password {{- end }} resources: {{- toYaml .Values.resources | nindent 10 }} diff --git a/deployments/helm/shared-sqs/templates/namespace.yaml b/deployments/helm/shared-sqs/templates/namespace.yaml new file mode 100644 index 0000000..b8dde52 --- /dev/null +++ b/deployments/helm/shared-sqs/templates/namespace.yaml @@ -0,0 +1,7 @@ +{{/* + namespace.yaml — не создаём namespace из чарта, + т.к. он может уже существовать (managed платформой или вручную). + Создавать namespace перед helm install: + kubectl create namespace {{ .Values.namespace }} + Created: 2026-04-11 +*/}} diff --git a/deployments/helm/shared-sqs/templates/secret-admin.yaml b/deployments/helm/shared-sqs/templates/secret-admin.yaml new file mode 100644 index 0000000..a2b4cdb --- /dev/null +++ b/deployments/helm/shared-sqs/templates/secret-admin.yaml @@ -0,0 +1,12 @@ +# secret-admin.yaml — Secret с admin токеном +# Created: 2026-04-11 +apiVersion: v1 +kind: Secret +metadata: + name: shared-sqs-admin + namespace: {{ .Values.namespace }} + labels: + {{- include "shared-sqs.labels" . | nindent 4 }} +type: Opaque +stringData: + token: {{ .Values.admin.token | quote }} diff --git a/deployments/helm/shared-sqs/templates/secret-redis.yaml b/deployments/helm/shared-sqs/templates/secret-redis.yaml new file mode 100644 index 0000000..04035b7 --- /dev/null +++ b/deployments/helm/shared-sqs/templates/secret-redis.yaml @@ -0,0 +1,14 @@ +# secret-redis.yaml — Secret с Redis credentials (addr + user + password) +# Created: 2026-04-11 +apiVersion: v1 +kind: Secret +metadata: + name: shared-sqs-redis + namespace: {{ .Values.namespace }} + labels: + {{- include "shared-sqs.labels" . | nindent 4 }} +type: Opaque +stringData: + addr: {{ .Values.redis.addr | quote }} + user: {{ .Values.redis.user | quote }} + password: {{ .Values.redis.password | quote }} diff --git a/deployments/helm/shared-sqs/values.yaml b/deployments/helm/shared-sqs/values.yaml index 850df04..8ae76ba 100644 --- a/deployments/helm/shared-sqs/values.yaml +++ b/deployments/helm/shared-sqs/values.yaml @@ -22,14 +22,13 @@ # Namespace в Kubernetes куда будет задеплоен сервис namespace: shared-sqs -# Docker-образ сервиса +# Версия образа сервиса image: - repository: naeel/shared-sqs tag: "v0.1.24" - pullPolicy: IfNotPresent # Redis — хранит все очереди и сообщения. -# addr: адрес в формате host:port (можно внутренний K8s DNS или внешний IP) +# addr: адрес в формате host:port (внутренний K8s DNS или внешний IP) +# user: Redis-пользователь (по умолчанию "default" — стандартный встроенный пользователь Redis) redis: addr: "rfrm-redisk8s.54467f74-67f5-4ca7-9b4a-bdd50e8c23d6.svc:6379" user: "default" @@ -41,7 +40,7 @@ redis: admin: token: "sqs-admin-7a7d8bd0c060a75c198d48680f34077a" -# Создать demo-тенанта при первом старте (удобно для проверки). +# Создать demo-тенанта при первом старте (удобно для проверки работы). # В продакшне можно поставить false. seedDemo: true @@ -55,7 +54,7 @@ resources: cpu: "500m" # Ingress — открывает сервис наружу по домену. -# host: ваш домен, который должен указывать на IP ingress-контроллера кластера. +# host: ваш домен, должен указывать на IP ingress-контроллера кластера. # После деплоя cert-manager автоматически выпустит TLS-сертификат. ingress: enabled: true @@ -68,7 +67,6 @@ ingress: nginx.ingress.kubernetes.io/proxy-send-timeout: "30" tls: enabled: true - # Имя Secret куда cert-manager положит TLS-сертификат secretName: shared-sqs-tls # Биллинг — запись статистики по всем SQS-операциям в PostgreSQL. @@ -76,15 +74,11 @@ ingress: billing: enabled: true postgres: - # Адрес PostgreSQL (внутренний K8s DNS или внешний хост) host: "postgresqlk8s-master.dc5db45d-f8b4-4fd0-ad33-ec4dd017f2d5.svc.cluster.local" port: "5432" # База данных должна существовать заранее (CREATE DATABASE sqsdb) database: "sqsdb" user: "super" password: "BQUF5ruECa1ZFlq4wYt3gPJUEmtBMkA9QNK4MM5Sd8al4ArMDlmT16DIKHYBPyif" + # disable — если PostgreSQL без SSL (например локальный) sslmode: "require" - # Альтернатива паролю выше: указать имя уже существующего K8s Secret. - # Если задан — поле password выше игнорируется. - existingSecret: "" - secretKey: "password" diff --git a/doc/thinking/2026-04-13.md b/doc/thinking/2026-04-13.md new file mode 100644 index 0000000..3a9ae30 --- /dev/null +++ b/doc/thinking/2026-04-13.md @@ -0,0 +1,49 @@ +GitHub Copilot, GPT-4.1 +--- +# Лог мыслей по деплою shared-SQS (2026-04-13) + +## План +1. Проверить, что Redis, PostgreSQL, ingress, cert-manager, DNS уже есть +2. Перейти в директорию проекта +3. Выполнить helm install с нужным values.yaml +4. Проверить pod, ingress, доступность сервиса +5. Проверить административный API +6. Если что-то не работает — зафиксировать ошибку и разобрать + +--- +## Ход действий + +### ✅ HELM DEPLOY (завершён) +- helm install shared-sqs ./deployments/helm/shared-sqs -n shared-sqs --create-namespace +- Pod запущен и готов (1/1 Running) +- Ingress создан, TLS сертификат от Let's Encrypt выдан +- Redis и PostgreSQL подключены успешно + +### ✅ ФУНКЦИОНАЛЬНЫЕ ТЕСТЫ (31/31 PASSED) +- tests/quick_test.sh: все 31 проверка пройдена + - Health, Auth (UI + Admin), CRUD очередей, Tags, Send/Receive/Delete, Batch, Visibility Timeout + +### ✅ СТРЕСС-ТЕСТ (23/23 PASSED, 424s) +- tests/stress_test.sh запущен на ВМ, все этапы успешны: + +1. Подготовка (5 тенантов, очереди) — ✅ +2. Конкурентная отправка (20×10 = 200 msg) — ✅ 200 ok +3. Конкурентное чтение (20 воркеров) — ✅ 202 msg прочитано/удалено +4. Multi-tenant изоляция (5 тенантов × 30 msg) — ✅ Изоляция полная (0 чужих) +5. Burst (80 сообщений одновременно) — ✅ 80/80 +6. Long-polling (WaitTime=10s + 5 producer'ов) — ✅ 78/100 получено (50%+) +7. Двойное удаление (race-condition на receipt handle) — ✅ Сервер жив +8. Batch-операции (8 воркеров) — ✅ SendBatch 80, DeleteBatch 80 +9. Queue-flood (25 очередей) — ✅ 25/25 работают +10. Kill pod + восстановление из Redis — ✅ Данные восстановлены (100 msg) +11. Redis disconnect simulation — ✅ Сервис отвечает даже без Redis (HTTP 200) +12. Смешанная нагрузка (send + receive + getattr × 15s) — ✅ 55 отправлено, 75 прочитано +13. Memory check (RSS) — ✅ Рост -4MB (нет утечек) +14. Multi-kill (3 рестарта подряд) — ✅ Маркер выжил 3 kill'а +15. Cleanup — ✅ Очереди удалены + +### РЕЗУЛЬТАТ СТРЕСС-ТЕСТА: +╔═══════════════════════════════════════════════════════════════════╗ +║ ИТОГО: 23/23 ✅ 0/23 ❌ ║ +║ Время: 424s ║ +╚═══════════════════════════════════════════════════════════════════╝