diff --git a/Makefile b/Makefile index 4e0ce3a..a767e4d 100644 --- a/Makefile +++ b/Makefile @@ -3,7 +3,7 @@ # Registry: Docker Hub (naeel/shared-sqs) IMAGE_REPO=naeel/shared-sqs -VERSION=v0.1.26 +VERSION=v0.1.27 LDFLAGS=-X shared-sqs/app/models.Version=$(VERSION) BINARY=shared-sqs diff --git a/app/router/router.go b/app/router/router.go index ed90466..2c63d9b 100644 --- a/app/router/router.go +++ b/app/router/router.go @@ -39,6 +39,9 @@ func New(tenantStore *tenant.TenantStore, adminToken string) http.Handler { // /health — публичный, без auth r.HandleFunc("/health", health).Methods("GET") + // /static — логотип, favicon для публичных страниц + r.PathPrefix("/static").Handler(ui.StaticHandler()).Methods("GET") + // /metrics — Prometheus endpoint для Victoria Metrics scrape r.Handle("/metrics", promhttp.Handler()).Methods("GET") @@ -58,7 +61,16 @@ func New(tenantStore *tenant.TenantStore, adminToken string) http.Handler { // r.NewRoute().Subrouter() с Use() некорректно работает в gorilla/mux v1.8.0 // при пустом prefix — ответы теряются. Поэтому используем явную обёртку. sqsAuth := auth.AuthMiddleware(tenantStore) - r.Handle("/", sqsAuth(http.HandlerFunc(actionHandler))).Methods("GET", "POST") + // Корень: GET без Action — публичная страница-описание сервиса; + // всё остальное (POST, или GET с Action/X-Amz-Target) — SQS API за tenant auth. + rootHandler := func(w http.ResponseWriter, req *http.Request) { + if req.Method == http.MethodGet && extractAction(req) == "" { + ui.InfoHandler(models.Version).ServeHTTP(w, req) + return + } + sqsAuth(http.HandlerFunc(actionHandler)).ServeHTTP(w, req) + } + r.HandleFunc("/", rootHandler).Methods("GET", "POST") r.Handle("/{account}", sqsAuth(http.HandlerFunc(actionHandler))).Methods("GET", "POST") r.Handle("/queue/{queueName}", sqsAuth(http.HandlerFunc(actionHandler))).Methods("GET", "POST") r.Handle("/{account}/{queueName}", sqsAuth(http.HandlerFunc(actionHandler))).Methods("GET", "POST") diff --git a/app/ui/embed.go b/app/ui/embed.go index ebd318d..3777766 100644 --- a/app/ui/embed.go +++ b/app/ui/embed.go @@ -5,13 +5,38 @@ package ui import ( "embed" + "io/fs" "net/http" + "strings" ) -//go:embed index.html +//go:embed index.html info.html static var content embed.FS // Handler — возвращает http.Handler, раздающий встроенный index.html func Handler() http.Handler { return http.FileServer(http.FS(content)) } + +// InfoHandler — публичная страница-описание сервиса (GET /) с подстановкой версии +func InfoHandler(version string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + body, err := content.ReadFile("info.html") + if err != nil { + http.Error(w, "info page unavailable", http.StatusInternalServerError) + return + } + html := strings.ReplaceAll(string(body), "{{VERSION}}", version) + w.Header().Set("Content-Type", "text/html; charset=utf-8") + _, _ = w.Write([]byte(html)) + }) +} + +// StaticHandler — раздаёт /static/* (логотип, favicon) для публичных страниц +func StaticHandler() http.Handler { + sub, err := fs.Sub(content, "static") + if err != nil { + panic(err) + } + return http.StripPrefix("/static/", http.FileServer(http.FS(sub))) +} diff --git a/app/ui/index.html b/app/ui/index.html index b1d9002..ceab565 100644 --- a/app/ui/index.html +++ b/app/ui/index.html @@ -347,7 +347,7 @@ td.msg-expand { padding: 0 !important; border-bottom: 1px solid var(--border); }
Multi-tenant очередь, совместимая с AWS SQS API. Каждый тенант получает изолированное пространство очередей.
+AWS Signature V4iot-naeel)Все команды отправляются на корень POST https://sqs.containerk8s.dev.nubes.ru/ с параметром Action.
| Action | Описание |
|---|---|
CreateQueue | Создать очередь |
ListQueues | Список очередей тенанта |
GetQueueUrl | URL очереди по имени |
GetQueueAttributes | Атрибуты очереди |
SetQueueAttributes | Изменить атрибуты очереди |
SendMessage | Отправить сообщение |
SendMessageBatch | Отправить до 10 сообщений разом |
ReceiveMessage | Получить сообщения (long polling до 20с) |
DeleteMessage | Удалить сообщение |
DeleteMessageBatch | Удалить до 10 сообщений разом |
ChangeMessageVisibility | Изменить таймаут видимости сообщения |
ChangeMessageVisibilityBatch | Пакетно изменить таймаут видимости |
PurgeQueue | Очистить очередь |
DeleteQueue | Удалить очередь |
TagQueue | Назначить теги очереди |
UntagQueue | Снять теги с очереди |
ListQueueTags | Список тегов очереди |
export AWS_ACCESS_KEY_ID=<Access Key из /ui>
+export AWS_SECRET_ACCESS_KEY=<Secret Key из /ui>
+ aws sqs create-queue --queue-name demo \
+ --endpoint-url https://sqs.containerk8s.dev.nubes.ru \
+ --region us-east-1
+ aws sqs send-message --queue-url <QueueUrl> \
+ --message-body "hello nubes" \
+ --endpoint-url https://sqs.containerk8s.dev.nubes.ru \
+ --region us-east-1
+ aws sqs receive-message --queue-url <QueueUrl> \
+ --endpoint-url https://sqs.containerk8s.dev.nubes.ru --region us-east-1
+
+aws sqs delete-message --queue-url <QueueUrl> \
+ --receipt-handle <ReceiptHandle> \
+ --endpoint-url https://sqs.containerk8s.dev.nubes.ru --region us-east-1
+