helm: add deploy chart for self-hosted installation
This commit is contained in:
@@ -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"
|
||||||
@@ -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 }}
|
||||||
@@ -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
|
||||||
@@ -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 }}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
{{/*
|
||||||
|
namespace.yaml — не создаём namespace из чарта,
|
||||||
|
т.к. он может уже существовать (managed платформой или вручную).
|
||||||
|
Создавать namespace перед helm install:
|
||||||
|
kubectl create namespace {{ .Values.namespace }}
|
||||||
|
Created: 2026-04-11
|
||||||
|
*/}}
|
||||||
@@ -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 }}
|
||||||
@@ -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 }}
|
||||||
@@ -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 }}
|
||||||
@@ -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
|
||||||
@@ -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"
|
||||||
Reference in New Issue
Block a user