Compare commits

10 Commits
18 changed files with 970 additions and 11 deletions
+203
View File
@@ -0,0 +1,203 @@
# AGENTS.md — Machine-readable deployment instructions for AI agents
## Quick Start for AI Agents
You are an AI agent tasked with deploying `shared-sqs` to a Kubernetes cluster.
**Before proceeding, do the following:**
1. **Ask user for all required variables** from STEP 1 below. Do NOT proceed if any is missing.
2. **Check user's environment** by running:
```bash
kubectl version --client
helm version
```
If either command fails or returns an error — stop and inform the user that `kubectl` or `helm` are not installed.
3. **Then proceed with STEP 2** and follow the steps sequentially.
---
## YOUR TASK
Deploy `shared-sqs` to a Kubernetes cluster using the Helm chart in `./deploy/`.
---
## STEP 1 — COLLECT REQUIRED INFORMATION FROM USER
Ask the user for ALL of the following before doing anything else.
Do NOT proceed if any required value is missing.
### Required
| Variable | Description | Example |
|----------|-------------|---------|
| `REDIS_ADDR` | Redis address, format `host:port` | `redis.default.svc.cluster.local:6379` |
| `REDIS_PASSWORD` | Redis password | `mysecretpassword` |
| `ADMIN_TOKEN` | Admin API token, any random string | output of `openssl rand -hex 20` |
| `INGRESS_HOST` | Domain pointing to cluster ingress IP | `sqs.example.com` |
### Optional
| Variable | Default | Description |
|----------|---------|-------------|
| `REDIS_USER` | `default` | Redis username, change only if using Redis ACL |
| `NAMESPACE` | `shared-sqs` | Kubernetes namespace |
| `IMAGE_TAG` | `v0.1.24` | Service image version |
| `SEED_DEMO` | `true` | Create demo tenant on first start |
| `BILLING_ENABLED` | `false` | Enable billing to PostgreSQL |
| `PG_HOST` | — | Required only if BILLING_ENABLED=true |
| `PG_PORT` | `5432` | Required only if BILLING_ENABLED=true |
| `PG_DATABASE` | — | Required only if BILLING_ENABLED=true |
| `PG_USER` | — | Required only if BILLING_ENABLED=true |
| `PG_PASSWORD` | — | Required only if BILLING_ENABLED=true |
| `PG_SSLMODE` | `require` | Required only if BILLING_ENABLED=true |
---
## STEP 2 — CLONE REPOSITORY
```bash
git clone https://gitea.services.ngcloud.ru/Nail/shared-SQS.git
cd shared-SQS
```
---
## STEP 3 — EDIT deploy/values.yaml
Replace placeholder values with values collected in Step 1.
Mandatory substitutions:
- `your-redis-host:6379` → value of `REDIS_ADDR`
- `your-redis-password` → value of `REDIS_PASSWORD`
- `your-admin-token` → value of `ADMIN_TOKEN`
- `sqs.your-domain.com` → value of `INGRESS_HOST`
If `BILLING_ENABLED=true`, also set `billing.enabled: true` and fill all `billing.postgres.*` fields.
---
## STEP 4 — DEPLOY
```bash
helm install shared-sqs ./deploy -n shared-sqs --create-namespace
```
Expected output must contain:
```
STATUS: deployed
```
If output contains `Error:` — stop and report the error to the user.
---
## STEP 5 — WAIT FOR POD READY
```bash
kubectl rollout status deployment/shared-sqs -n shared-sqs --timeout=90s
```
Expected output:
```
deployment "shared-sqs" successfully rolled out
```
If timeout or error — run `kubectl describe pod -n shared-sqs` and report to user.
---
## STEP 6 — VERIFY SERVICE IS RESPONDING
```bash
curl -s https://<INGRESS_HOST>/health
```
Expected output:
```
OK
```
If response is not `OK` — check pod logs:
```bash
kubectl logs -n shared-sqs deployment/shared-sqs --tail=50
```
Report logs to user.
---
## STEP 7 — CREATE FIRST TENANT
```bash
curl -s -X POST https://<INGRESS_HOST>/admin/tenants \
-H "Authorization: Bearer <ADMIN_TOKEN>" \
-H "Content-Type: application/json" \
-d '{"name": "my-tenant"}'
```
Expected response contains `access_key` and `secret_key`:
```json
{
"id": "t-...",
"name": "my-tenant",
"access_key": "SSAK-...",
"secret_key": "...",
...
}
```
**Save `secret_key` — it is shown only once.**
If response contains `"error"` — report the full response to user.
---
## STEP 8 — VERIFY SQS WORKS
```bash
export AWS_ACCESS_KEY_ID="<access_key from step 7>"
export AWS_SECRET_ACCESS_KEY="<secret_key from step 7>"
export AWS_DEFAULT_REGION="us-east-1"
ENDPOINT="--endpoint-url https://<INGRESS_HOST>"
aws sqs create-queue --queue-name test-queue $ENDPOINT
```
Expected output contains `QueueUrl`.
---
## SUCCESS CRITERIA
Deployment is complete and correct when ALL of the following are true:
- [ ] `curl /health` returns `OK`
- [ ] Tenant created, `access_key` and `secret_key` received
- [ ] `aws sqs create-queue` returns a `QueueUrl`
---
## KNOWN ISSUES
| Problem | Cause | Fix |
|---------|-------|-----|
| Pod stuck in `Pending` | Not enough cluster resources | Check `kubectl describe pod` for resource limits |
| Pod in `CrashLoopBackOff` | Wrong Redis address or password | Check `kubectl logs`, fix `redis.addr` / `redis.password` in values.yaml, then `helm upgrade` |
| `curl /health` times out | DNS not pointing to ingress IP | Ask user to check DNS A-record for `INGRESS_HOST` |
| Admin API returns 401 | Wrong `ADMIN_TOKEN` | Token in `Authorization: Bearer` must match `admin.token` in values.yaml |
---
## UPGRADE
```bash
helm upgrade shared-sqs ./deploy -n shared-sqs
```
## UNINSTALL
```bash
helm uninstall shared-sqs -n shared-sqs
kubectl delete namespace shared-sqs
```
+53 -11
View File
@@ -4,6 +4,39 @@
Сервис предназначен для работы через стандартные AWS SDK и AWS CLI: в обычном клиентском коде меняется только endpoint. Сервис предназначен для работы через стандартные AWS SDK и AWS CLI: в обычном клиентском коде меняется только endpoint.
## Быстрый старт — деплой
### 1. Заполнить параметры
Отредактировать `deploy/values.yaml`:
- Redis хост и пароль
- Ingress домен (для доступа извне)
- PostgreSQL credentials (опционально, для биллинга)
### 2. Деплоить
```bash
kubectl create namespace shared-sqs
helm install shared-sqs ./deploy -n shared-sqs
```
### 3. Проверить что работает
```bash
# Дождаться pod ready (1/1)
kubectl -n shared-sqs get pod -w
# Запустить тесты
cd tests-deploy
bash run.sh
```
**Результат:** PASS=7 FAIL=0 ✅
Полная инструкция с примерами параметров → [tests-deploy/README.md](tests-deploy/README.md)
---
## Демо-стенд ## Демо-стенд
| | | | | |
@@ -20,7 +53,7 @@ Demo token и demo credentials предназначены для ознаком
Важно для demo stand: Важно для demo stand:
- demo tenant общий, поэтому очереди и сообщения в нём могут меняться во время просмотра; - demo tenant общий, поэтому очереди и сообщения в нём могут меняться во время просмотра;
- `QueueUrl` может выглядеть как внутренний адрес сервиса, это нормально для данного стенда: передавайте его обратно как есть и продолжайте использовать `--endpoint-url https://qu.kube5s.ru`. - \`QueueUrl\` может выглядеть как внутренний адрес сервиса, это нормально для данного стенда: передавайте его обратно как есть и продолжайте использовать \`--endpoint-url https://qu.kube5s.ru\`.
## Что поддерживается ## Что поддерживается
@@ -52,8 +85,8 @@ shared-SQS покрывает 17 SQS-операций:
Для быстрого демо доступны оба публичных входа: Для быстрого демо доступны оба публичных входа:
- Web UI: используйте `demo-ui-shared-sqs-ngcloud-2026` - Web UI: используйте \`demo-ui-shared-sqs-ngcloud-2026\`
- AWS CLI / SDK: используйте demo `Access Key / Secret Key` - AWS CLI / SDK: используйте demo \`Access Key / Secret Key\`
Для ознакомительного доступа можно использовать demo credentials: Для ознакомительного доступа можно использовать demo credentials:
@@ -66,23 +99,23 @@ ENDPOINT="--endpoint-url https://qu.kube5s.ru"
Для входа в Web UI: Для входа в Web UI:
1. Откройте `https://qu.kube5s.ru/ui/` 1. Откройте \`https://qu.kube5s.ru/ui/\`
2. Вставьте `demo-ui-shared-sqs-ngcloud-2026` 2. Вставьте \`demo-ui-shared-sqs-ngcloud-2026\`
3. После входа вы попадёте в demo tenant и увидите его очереди и сообщения 3. После входа вы попадёте в demo tenant и увидите его очереди и сообщения
### 2. Получить свои credentials через Web UI ### 2. Получить свои credentials через Web UI
Если нужен полноценный доступ к своим очередям и сообщениям, используйте Web UI: Если нужен полноценный доступ к своим очередям и сообщениям, используйте Web UI:
1. Откройте `https://qu.kube5s.ru/ui/` 1. Откройте \`https://qu.kube5s.ru/ui/\`
2. В поле входа вставьте свой `API Token (nubes JWT)` 2. В поле входа вставьте свой \`API Token (nubes JWT)\`
3. Этот токен пользователь получает в панели управления облаком Nubes 3. Этот токен пользователь получает в панели управления облаком Nubes
4. После успешного входа shared-SQS автоматически создаёт tenant и показывает `Access Key` и `Secret Key` 4. После успешного входа shared-SQS автоматически создаёт tenant и показывает \`Access Key\` и \`Secret Key\`
5. Эти `Access Key / Secret Key` дальше используются в AWS CLI, boto3, AWS SDK for JavaScript и других клиентах 5. Эти \`Access Key / Secret Key\` дальше используются в AWS CLI, boto3, AWS SDK for JavaScript и других клиентах
Важно: Важно:
- `Secret Key` показывается только один раз, его нужно сохранить - \`Secret Key\` показывается только один раз, его нужно сохранить
- для AWS CLI и SDK нужен не UI token, а именно выданные сервисом `Access Key / Secret Key` - для AWS CLI и SDK нужен не UI token, а именно выданные сервисом \`Access Key / Secret Key\`
Примеры ниже можно запускать либо с demo credentials, либо со своими tenant credentials. Примеры ниже можно запускать либо с demo credentials, либо со своими tenant credentials.
@@ -97,6 +130,7 @@ ENDPOINT="--endpoint-url https://qu.kube5s.ru"
### Создать очередь ### Создать очередь
```bash
```bash ```bash
aws sqs create-queue --queue-name demo-queue $ENDPOINT aws sqs create-queue --queue-name demo-queue $ENDPOINT
``` ```
@@ -228,3 +262,11 @@ AWS_ACCESS_KEY_ID=... AWS_SECRET_ACCESS_KEY=... bash hardcore_test.sh
Краткий пользовательский summary лежит в файле `BENCHMARK-COMPARISON.md`. Краткий пользовательский summary лежит в файле `BENCHMARK-COMPARISON.md`.
Ключевой вывод: shared-SQS показывает конкурентоспособные результаты относительно Yandex MQ и покрывает полный набор заявленных пользовательских сценариев. Ключевой вывод: shared-SQS показывает конкурентоспособные результаты относительно Yandex MQ и покрывает полный набор заявленных пользовательских сценариев.
## Self-hosted — развернуть у себя
Если хотите запустить shared-SQS в собственном Kubernetes-кластере — см. [deploy/README.md](deploy/README.md).
> **Деплой через AI-агента** — в репозитории есть [AGENTS.md](AGENTS.md): машиночитаемая пошаговая инструкция.
> Если AI-агент встроен в вашу среду разработки (Copilot, Cursor, Claude Dev и др.) — он найдёт файл сам и проведёт весь деплой.
> Если нет — просто скопируйте содержимое [AGENTS.md](AGENTS.md) в любой веб-чат (ChatGPT, Claude и др.) и AI пошагово поможет вам задеплоить.
+9
View File
@@ -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"
+161
View File
@@ -0,0 +1,161 @@
# shared-sqs — Self-hosted Helm Chart
Этот Helm-чарт разворачивает [shared-sqs](https://gitea.services.ngcloud.ru/Nail/shared-SQS) — AWS SQS-совместимый сервис очередей — в вашем Kubernetes-кластере.
После деплоя клиенты подключаются через стандартный AWS SDK / CLI, меняя только `endpoint_url` на ваш домен.
---
## Что потребуется заранее
| Компонент | Зачем | Примечание |
|-----------|-------|------------|
| Kubernetes кластер | Платформа | Любой вариант: k3s, EKS, GKE, bare-metal |
| **Redis ≥ 6** | Хранит все очереди и сообщения | Внешний или задеплоенный в кластер |
| **Ingress NGINX** | Принимает внешние HTTP/HTTPS запросы | `helm install ingress-nginx ingress-nginx/ingress-nginx` |
| **cert-manager** | Автоматически выпускает TLS-сертификат | `helm install cert-manager jetstack/cert-manager --set installCRDs=true` |
| **DNS-запись** | Связывает ваш домен с кластером | A-запись домена → External IP вашего ingress-контроллера |
| PostgreSQL *(опционально)* | Биллинг — учёт операций | Если не нужен — `billing.enabled: false` |
Узнать External IP ingress-контроллера:
```bash
kubectl get svc -n ingress-nginx ingress-nginx-controller
# Смотрите колонку EXTERNAL-IP
```
---
## Деплой через AI-агента
В корне репозитория есть файл [AGENTS.md](../AGENTS.md) — машиночитаемая инструкция для AI-агентов.
**Если AI-агент встроен в вашу среду** (Copilot, Cursor, Claude Dev, OpenAI Codex и др.) — он найдёт `AGENTS.md` сам, запросит у вас нужные параметры (Redis, домен, токен) и проведёт весь деплой без вашего участия.
**Если AI-агента нет** — просто откройте [AGENTS.md](../AGENTS.md), скопируйте его содержимое целиком и вставьте в любой веб-чат (ChatGPT, Claude, Gemini). AI увидит пошаговый сценарий, спросит ваши параметры и поможет всё задеплоить.
---
## Установка вручную
### 1. Клонируйте репозиторий
```bash
git clone https://gitea.services.ngcloud.ru/Nail/shared-SQS.git
cd shared-SQS
```
### 2. Отредактируйте `deploy/values.yaml`
Обязательно заполните:
```yaml
redis:
addr: "ваш-redis-хост:6379"
password: "ваш-redis-пароль"
admin:
token: "придумайте-любой-токен" # например: openssl rand -hex 20
ingress:
host: "sqs.ваш-домен.com"
```
Если PostgreSQL не нужен — оставьте `billing.enabled: false`.
### 3. Задеплойте
```bash
helm install shared-sqs ./deploy -n shared-sqs --create-namespace
```
### 4. Проверьте что всё поднялось
```bash
# Под должен быть Running и Ready
kubectl get pods -n shared-sqs
# Сервис должен ответить OK
curl https://sqs.ваш-домен.com/health
```
---
## Параметры values.yaml
| Параметр | Описание | Пример |
|----------|----------|--------|
| `namespace` | Kubernetes namespace | `shared-sqs` |
| `image.tag` | Версия образа | `v0.1.24` |
| `redis.addr` | Адрес Redis в формате `host:port` | `redis.default.svc:6379` |
| `redis.user` | Redis-пользователь (обычно `default`) | `default` |
| `redis.password` | Пароль Redis | — |
| `admin.token` | Токен для Admin API (`/admin/*`) | любая строка |
| `seedDemo` | Создать demo-тенанта при старте | `true` / `false` |
| `resources` | CPU и Memory лимиты пода | см. defaults |
| `ingress.enabled` | Включить Ingress | `true` |
| `ingress.className` | Ingress класс | `nginx` |
| `ingress.host` | Домен сервиса | `sqs.example.com` |
| `ingress.annotations` | Аннотации (cert-manager, timeouts) | см. defaults |
| `ingress.tls.enabled` | Включить TLS через cert-manager | `true` |
| `ingress.tls.secretName` | Имя Secret для TLS-сертификата | `shared-sqs-tls` |
| `billing.enabled` | Включить запись статистики в PostgreSQL | `false` |
| `billing.postgres.*` | Параметры подключения к PostgreSQL | — |
---
## Admin API — создание тенантов
После деплоя сервис готов принимать SQS-запросы, но для этого нужен тенант с credentials.
### Создать тенанта
```bash
curl -s -X POST https://sqs.ваш-домен.com/admin/tenants \
-H "Authorization: Bearer ВАШ_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "my-tenant"}'
```
Ответ:
```json
{
"id": "my-tenant",
"access_key": "SSAK-...",
"secret_key": "..."
}
```
> **Сохраните `secret_key`** — он показывается только один раз.
### Использовать credentials в AWS CLI
```bash
export AWS_ACCESS_KEY_ID="SSAK-..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_DEFAULT_REGION="us-east-1"
ENDPOINT="--endpoint-url https://sqs.ваш-домен.com"
aws sqs create-queue --queue-name my-queue $ENDPOINT
aws sqs send-message --queue-url "..." --message-body "Hello" $ENDPOINT
```
---
## Обновление
```bash
helm upgrade shared-sqs ./deploy -n shared-sqs
```
## Удаление
```bash
helm uninstall shared-sqs -n shared-sqs
kubectl delete namespace shared-sqs
```
---
## Полная документация
Использование сервиса (AWS CLI, boto3, Node.js) — в [основном README](../README.md).
+26
View File
@@ -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 }}
+85
View File
@@ -0,0 +1,85 @@
# deployment.yaml — Deployment shared-sqs с RollingUpdate
# Created: 2026-04-11
apiVersion: apps/v1
kind: Deployment
metadata:
name: shared-sqs
namespace: {{ .Values.namespace }}
labels:
{{- include "shared-sqs.labels" . | nindent 4 }}
spec:
replicas: 1
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
{{- include "shared-sqs.selectorLabels" . | nindent 6 }}
template:
metadata:
labels:
{{- include "shared-sqs.selectorLabels" . | nindent 8 }}
spec:
containers:
- name: shared-sqs
image: "naeel/shared-sqs:{{ .Values.image.tag }}"
imagePullPolicy: IfNotPresent
ports:
- containerPort: 4100
name: http
env:
- name: SHARED_SQS_ADMIN_TOKEN
valueFrom:
secretKeyRef:
name: shared-sqs-admin
key: token
- name: SHARED_SQS_SEED_DEMO
value: {{ .Values.seedDemo | quote }}
- name: REDIS_ADDR
valueFrom:
secretKeyRef:
name: shared-sqs-redis
key: addr
- name: REDIS_USER
valueFrom:
secretKeyRef:
name: shared-sqs-redis
key: user
- name: REDIS_PASSWORD
valueFrom:
secretKeyRef:
name: shared-sqs-redis
key: password
{{- if .Values.billing.enabled }}
- name: BILLING_PG_HOST
value: {{ .Values.billing.postgres.host | quote }}
- name: BILLING_PG_PORT
value: {{ .Values.billing.postgres.port | quote }}
- name: BILLING_PG_DATABASE
value: {{ .Values.billing.postgres.database | quote }}
- name: BILLING_PG_USER
value: {{ .Values.billing.postgres.user | quote }}
- name: BILLING_PG_SSLMODE
value: {{ .Values.billing.postgres.sslmode | quote }}
- name: BILLING_PG_PASSWORD
valueFrom:
secretKeyRef:
name: shared-sqs-billing-pg
key: password
{{- end }}
resources:
{{- toYaml .Values.resources | nindent 10 }}
livenessProbe:
httpGet:
path: /health
port: 4100
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /health
port: 4100
initialDelaySeconds: 3
periodSeconds: 5
+34
View File
@@ -0,0 +1,34 @@
# ingress.yaml — Ingress для shared-sqs (условный, включается через values)
# Created: 2026-04-11
{{- if .Values.ingress.enabled }}
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: shared-sqs-ingress
namespace: {{ .Values.namespace }}
labels:
{{- include "shared-sqs.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
ingressClassName: {{ .Values.ingress.className }}
rules:
- host: {{ .Values.ingress.host }}
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: shared-sqs
port:
number: 4100
{{- if .Values.ingress.tls.enabled }}
tls:
- hosts:
- {{ .Values.ingress.host }}
secretName: {{ .Values.ingress.tls.secretName }}
{{- end }}
{{- end }}
+7
View File
@@ -0,0 +1,7 @@
{{/*
namespace.yaml — не создаём namespace из чарта,
т.к. он может уже существовать (managed платформой или вручную).
Создавать namespace перед helm install:
kubectl create namespace {{ .Values.namespace }}
Created: 2026-04-11
*/}}
+12
View File
@@ -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 }}
+15
View File
@@ -0,0 +1,15 @@
# secret-billing.yaml — Secret с PostgreSQL credentials для billing
# Создаётся только если billing.enabled=true и existingSecret не указан
# Created: 2026-04-12
{{- if and .Values.billing.enabled (not .Values.billing.postgres.existingSecret) }}
apiVersion: v1
kind: Secret
metadata:
name: shared-sqs-billing-pg
namespace: {{ .Values.namespace }}
labels:
{{- include "shared-sqs.labels" . | nindent 4 }}
type: Opaque
stringData:
password: {{ required "billing.postgres.password is required when billing is enabled" .Values.billing.postgres.password | quote }}
{{- end }}
+14
View File
@@ -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 }}
+18
View File
@@ -0,0 +1,18 @@
# service.yaml — Service для shared-sqs
# Created: 2026-04-11
apiVersion: v1
kind: Service
metadata:
name: shared-sqs
namespace: {{ .Values.namespace }}
labels:
{{- include "shared-sqs.labels" . | nindent 4 }}
spec:
type: ClusterIP
selector:
{{- include "shared-sqs.selectorLabels" . | nindent 4 }}
ports:
- name: http
port: 4100
targetPort: 4100
protocol: TCP
+72
View File
@@ -0,0 +1,72 @@
# values.yaml — параметры деплоя shared-sqs
# Updated: 2026-04-13
#
# ЧТО ЭТО:
# shared-sqs — AWS SQS-совместимый сервис очередей сообщений для Kubernetes.
# Работает как замена Amazon SQS: клиенты используют стандартный AWS SDK/CLI,
# просто указывая свой endpoint вместо amazonaws.com.
#
# ЧТО НУЖНО ЗАРАНЕЕ:
# 1. Redis — для хранения очередей и сообщений (любой Redis ≥ 6)
# 2. PostgreSQL — для биллинга (можно отключить: billing.enabled: false)
# 3. Ingress NGINX — установлен в кластере (принимает внешние запросы)
# 4. cert-manager — для автовыпуска TLS-сертификата (letsencrypt)
# 5. DNS-запись — ваш домен должен указывать на IP ingress-контроллера
#
# КАК ДЕПЛОИТЬ:
# helm install shared-sqs ./deploy -n shared-sqs --create-namespace
#
# КАК ОБНОВИТЬ:
# helm upgrade shared-sqs ./deploy -n shared-sqs
# Namespace в Kubernetes куда будет задеплоен сервис
namespace: shared-sqs
# Версия образа сервиса
image:
tag: "v0.1.24"
# Redis — хранит все очереди и сообщения.
# addr: адрес в формате host:port (внутренний K8s DNS или внешний IP)
# user: Redis-пользователь (по умолчанию "default" — стандартный встроенный пользователь Redis)
redis:
addr: "rfrm-redisk8s.54467f74-67f5-4ca7-9b4a-bdd50e8c23d6.svc:6379"
user: "default"
password: "your-redis-password"
# Ingress — домен и TLS сертификат
ingress:
enabled: true
host: "qu.kube5s.ru"
tls:
enabled: true
issuer: "letsencrypt-prod"
# Токен для административного API (/admin/*).
# Используется для создания тенантов и управления ими.
admin:
token: "sqs-admin-7a7d8bd0c060a75c198d48680f34077a"
# Создать demo-тенанта при первом старте (удобно для проверки работы).
# В продакшне можно поставить false.
seedDemo: true
# Лимиты ресурсов для пода. Для начала этих значений достаточно.
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "256Mi"
cpu: "500m"
# PostgreSQL — для биллинга
billing:
enabled: true
postgres:
host: "postgresqlk8s-master.dc5db45d-f8b4-4fd0-ad33-ec4dd017f2d5.svc.cluster.local"
port: 5432
database: "sqsdb"
user: "super"
sslmode: "require"
password: "your-postgres-password"
+8
View File
@@ -0,0 +1,8 @@
# .env.local.example — Переопределения параметров тестов
# Скопируй в .env.local и измени значения если нужно
# Переопределить endpoint SQS (если другой домен)
# BASE_URL="https://my-custom-sqs.example.com"
# Переопределить admin token (если другой токен)
# ADMIN_TOKEN="my-custom-admin-token-123"
+124
View File
@@ -0,0 +1,124 @@
# Tests Deploy
Скрипты для verification и testing development deployment shared-SQS.
## ⚠️ ПЕРЕД ТЕСТАМИ: Деплой сервиса
### Шаг 1: Заполнить параметры
Отредактировать `deploy/values.yaml`:
```yaml
redis:
addr: "your-redis-host:6379" # где Redis
user: "default"
password: "your-redis-password"
admin:
token: "sqs-admin-..." # токен для admin API
ingress:
host: "your-domain.com" # домен для доступа к SQS
billing:
postgres:
host: "your-postgres-host" # где PostgreSQL
password: "your-postgres-password"
```
### Шаг 2: Деплоить через Helm
```bash
# Из корня репозитория
helm install shared-sqs ./deploy \
-n shared-sqs \
--create-namespace
# Проверить что pod running
kubectl -n shared-sqs get pod
```
### Шаг 3: Когда pod ready (1/1) — запускать тесты
```bash
cd tests-deploy
bash run.sh
```
---
## Быстрые тесты (7 операций SQS, ~30 сек)
```bash
cd tests-deploy
bash run.sh
```
**Что тестируется:**
- CreateQueue, DeleteQueue
- ListQueues, GetQueueUrl
- SendMessage, ReceiveMessage
- DeleteMessage
## Полный набор тестов (18 операций, batch, visibility, tags)
```bash
cd tests-deploy
bash stress.sh
```
**Дополнительно тестируется:**
- GetQueueAttributes, SetQueueAttributes
- TagQueue, ListQueueTags, UntagQueue
- ChangeMessageVisibility, ChangeMessageVisibilityBatch
- SendMessageBatch, ReceiveMessage batch
- DeleteMessageBatch
- PurgeQueue
## Как это работает
### Автоматическое извлечение параметров
`run.sh` и `stress.sh` автоматически читают параметры из `deploy/values.yaml`:
- `ingress.host` → BASE_URL для API
- `admin.token` → ADMIN_TOKEN
- Используются demo credentials для SQS операций (встроены)
### Проверка доступности
Перед запуском тестов скрипты проверяют доступность сервиса через `curl /health`.
### Override параметров
Если нужно использовать свои значения, создайте `.env.local`:
```bash
# .env.local
export BASE_URL="https://your-domain.com"
export AWS_ACCESS_KEY_ID="your-access-key"
export AWS_SECRET_ACCESS_KEY="your-secret-key"
```
## Файлы
- `run.sh` — запуск quick тестов
- `stress.sh` — запуск полного набора
- `quick.sh` — alias для run.sh
- `README.md` — эта инструкция
- `.env.local.example` — пример override-файла
## Требования
- bash 4.0+
- curl
- aws-cli
- Депложенный shared-SQS с ingress доступом
- kubectl (для проверки пода)
## Результаты
**Успехом считается:**
- PASS=7 FAIL=0 для quick tests
- PASS=18 FAIL=0 для stress tests
После тестов очереди автоматически удаляются.
+5
View File
@@ -0,0 +1,5 @@
#!/bin/bash
# quick.sh — запуск быстрых тестов (7 основных операций SQS)
REPO_ROOT="$(dirname "$(cd "$(dirname "$0")" && pwd)")"
"$REPO_ROOT/tests-deploy/run.sh" 2>&1
+82
View File
@@ -0,0 +1,82 @@
#!/bin/bash
# run.sh — запуск тестов shared-sqs для verification деплоя
# 2026-04-13 — автоматическое извлечение параметров из deploy/values.yaml
set -e
echo "shared-sqs Тесты"
echo
# Переход в корневую папку репозитория (parent от tests-deploy/)
REPO_ROOT="$(dirname "$(cd "$(dirname "$0")" && pwd)")"
VALUES_FILE="$REPO_ROOT/deploy/values.yaml"
QUICK_TEST="$REPO_ROOT/quick_test.sh"
ENV_LOCAL="$REPO_ROOT/tests-deploy/.env.local"
# Функция для извлечения параметров из YAML
extract_param() {
local file="$1"
local key="$2"
grep "$key:" "$file" | head -1 | sed -n "s/.*$key: \"\([^\"]*\).*/\1/p"
}
# Функция для извлечения nested параметров (ingress.host)
extract_nested() {
local file="$1"
local section="$2"
local key="$3"
grep -A5 "^$section:" "$file" | grep "$key:" | sed -n "s/.*$key: \"\([^\"]*\).*/\1/p"
}
# Проверка наличия файлов
if [ ! -f "$VALUES_FILE" ]; then
echo "❌ Ошибка: не найден $VALUES_FILE"
exit 1
fi
if [ ! -f "$QUICK_TEST" ]; then
echo "❌ Ошибка: не найден $QUICK_TEST"
echo " Ожидался: $QUICK_TEST"
exit 1
fi
echo "Читаю параметры из deploy/values.yaml..."
# Извлечение параметров
INGRESS_HOST=$(extract_nested "$VALUES_FILE" "ingress" "host")
ADMIN_TOKEN=$(extract_param "$VALUES_FILE" "token")
# Demo credentials — для ознакомительного тестирования
AWS_ACCESS_KEY_ID="SSAK-demo-shared-sqs"
AWS_SECRET_ACCESS_KEY="demo-secret-key-shared-sqs-ngcloud-2026"
AWS_DEFAULT_REGION="us-east-1"
BASE_URL="https://$INGRESS_HOST"
# Override из .env.local (если существует)
if [ -f "$ENV_LOCAL" ]; then
echo " → Загружу override из .env.local"
# shellcheck disable=SC1090
source "$ENV_LOCAL"
fi
echo "✅ Параметры загружены:"
echo " BASE_URL: $BASE_URL"
echo " ADMIN_TOKEN: ${ADMIN_TOKEN:0:20}..."
echo
# Проверка доступности сервиса
echo "🔍 Проверяю доступность..."
if ! curl -sf "$BASE_URL/health" > /dev/null 2>&1; then
echo "❌ Сервис недоступен по $BASE_URL"
exit 1
fi
echo "✅ Сервис доступен"
echo
# Запуск тестов
echo "════════════════════════════════════════════"
echo "🚀 Запускаю quick_test.sh..."
echo "════════════════════════════════════════════"
export BASE_URL ADMIN_TOKEN AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION
bash "$QUICK_TEST"
+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
# stress.sh — запуск полного набора тестов (18+ операций, batch operations, visibility change)
REPO_ROOT="$(dirname "$(cd "$(dirname "$0")" && pwd)")"
VALUES_FILE="$REPO_ROOT/deploy/values.yaml"
HARDCORE_TEST="$REPO_ROOT/hardcore_test.sh"
# Извлечение параметров (скопировано из run.sh)
extract_param() {
local file="$1"
local key="$2"
grep "$key:" "$file" | head -1 | sed -n "s/.*$key: \"\([^\"]*\).*/\1/p"
}
extract_nested() {
local file="$1"
local section="$2"
local key="$3"
grep -A5 "^$section:" "$file" | grep "$key:" | sed -n "s/.*$key: \"\([^\"]*\).*/\1/p"
}
INGRESS_HOST=$(extract_nested "$VALUES_FILE" "ingress" "host")
ADMIN_TOKEN=$(extract_param "$VALUES_FILE" "token")
AWS_ACCESS_KEY_ID="SSAK-demo-shared-sqs"
AWS_SECRET_ACCESS_KEY="demo-secret-key-shared-sqs-ngcloud-2026"
AWS_DEFAULT_REGION="us-east-1"
BASE_URL="https://$INGRESS_HOST"
# Override из .env.local
ENV_LOCAL="$REPO_ROOT/tests-deploy/.env.local"
if [ -f "$ENV_LOCAL" ]; then
source "$ENV_LOCAL"
fi
echo "════════════════════════════════════════════"
echo "🧪 Полный набор тестов (stress)"
echo "════════════════════════════════════════════"
echo
export BASE_URL ADMIN_TOKEN AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION
bash "$HARDCORE_TEST"