From d9950ad4d43231695df3dd07250fd1da48fa8500 Mon Sep 17 00:00:00 2001 From: Naeel Date: Mon, 13 Apr 2026 07:06:33 +0300 Subject: [PATCH] helm: add deploy chart for self-hosted installation --- deploy/Chart.yaml | 9 +++ deploy/templates/_helpers.tpl | 26 +++++++++ deploy/templates/deployment.yaml | 85 ++++++++++++++++++++++++++++ deploy/templates/ingress.yaml | 34 +++++++++++ deploy/templates/namespace.yaml | 7 +++ deploy/templates/secret-admin.yaml | 12 ++++ deploy/templates/secret-billing.yaml | 15 +++++ deploy/templates/secret-redis.yaml | 14 +++++ deploy/templates/service.yaml | 18 ++++++ deploy/values.yaml | 84 +++++++++++++++++++++++++++ 10 files changed, 304 insertions(+) create mode 100644 deploy/Chart.yaml create mode 100644 deploy/templates/_helpers.tpl create mode 100644 deploy/templates/deployment.yaml create mode 100644 deploy/templates/ingress.yaml create mode 100644 deploy/templates/namespace.yaml create mode 100644 deploy/templates/secret-admin.yaml create mode 100644 deploy/templates/secret-billing.yaml create mode 100644 deploy/templates/secret-redis.yaml create mode 100644 deploy/templates/service.yaml create mode 100644 deploy/values.yaml diff --git a/deploy/Chart.yaml b/deploy/Chart.yaml new file mode 100644 index 0000000..41300a5 --- /dev/null +++ b/deploy/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/deploy/templates/_helpers.tpl b/deploy/templates/_helpers.tpl new file mode 100644 index 0000000..7856d63 --- /dev/null +++ b/deploy/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/deploy/templates/deployment.yaml b/deploy/templates/deployment.yaml new file mode 100644 index 0000000..7058be1 --- /dev/null +++ b/deploy/templates/deployment.yaml @@ -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 diff --git a/deploy/templates/ingress.yaml b/deploy/templates/ingress.yaml new file mode 100644 index 0000000..27dc6ae --- /dev/null +++ b/deploy/templates/ingress.yaml @@ -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 }} diff --git a/deploy/templates/namespace.yaml b/deploy/templates/namespace.yaml new file mode 100644 index 0000000..b8dde52 --- /dev/null +++ b/deploy/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/deploy/templates/secret-admin.yaml b/deploy/templates/secret-admin.yaml new file mode 100644 index 0000000..a2b4cdb --- /dev/null +++ b/deploy/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/deploy/templates/secret-billing.yaml b/deploy/templates/secret-billing.yaml new file mode 100644 index 0000000..884831d --- /dev/null +++ b/deploy/templates/secret-billing.yaml @@ -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 }} diff --git a/deploy/templates/secret-redis.yaml b/deploy/templates/secret-redis.yaml new file mode 100644 index 0000000..04035b7 --- /dev/null +++ b/deploy/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/deploy/templates/service.yaml b/deploy/templates/service.yaml new file mode 100644 index 0000000..830eeaa --- /dev/null +++ b/deploy/templates/service.yaml @@ -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 diff --git a/deploy/values.yaml b/deploy/values.yaml new file mode 100644 index 0000000..4e553be --- /dev/null +++ b/deploy/values.yaml @@ -0,0 +1,84 @@ +# 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: "your-redis-host:6379" + user: "default" + password: "your-redis-password" + +# Токен для административного API (/admin/*). +# Используется для создания тенантов и управления ими. +# Придумайте любую строку, например: openssl rand -hex 20 +admin: + token: "your-admin-token" + +# Создать demo-тенанта при первом старте (удобно для проверки работы). +# В продакшне можно поставить false. +seedDemo: true + +# Лимиты ресурсов для пода. Для начала этих значений достаточно. +resources: + requests: + memory: "64Mi" + cpu: "50m" + limits: + memory: "256Mi" + cpu: "500m" + +# Ingress — открывает сервис наружу по домену. +# host: ваш домен, должен указывать на IP ingress-контроллера кластера. +# После деплоя cert-manager автоматически выпустит TLS-сертификат. +ingress: + enabled: true + className: nginx + host: "sqs.your-domain.com" + annotations: + cert-manager.io/cluster-issuer: letsencrypt-prod + nginx.ingress.kubernetes.io/proxy-body-size: "10m" + nginx.ingress.kubernetes.io/proxy-read-timeout: "30" + nginx.ingress.kubernetes.io/proxy-send-timeout: "30" + tls: + enabled: true + secretName: shared-sqs-tls + +# Биллинг — запись статистики по всем SQS-операциям в PostgreSQL. +# Если PostgreSQL нет — поставьте enabled: false, остальное игнорируется. +billing: + enabled: false + postgres: + host: "your-postgres-host" + port: "5432" + # База данных должна существовать заранее (CREATE DATABASE sqsdb) + database: "sqsdb" + user: "postgres" + password: "your-postgres-password" + # disable — если PostgreSQL без SSL (например локальный) + sslmode: "require"