From c4cc3c80ea75d14c107e228bb6eb92a752197dd0 Mon Sep 17 00:00:00 2001 From: Repinoid Date: Sat, 10 Oct 2026 14:24:50 +0300 Subject: [PATCH] =?UTF-8?q?doc:=20systemd=20+=20=D0=BB=D0=BE=D0=BA=D0=B0?= =?UTF-8?q?=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20Redis=20(=D1=83=D1=81=D1=82?= =?UTF-8?q?=D0=BE=D0=B9=D1=87=D0=B8=D0=B2=D0=BE=D1=81=D1=82=D1=8C),=20?= =?UTF-8?q?=D0=B4=D0=B5=D1=84=D0=B5=D0=BA=D1=82=D1=8B=20seed,=20=D0=B3?= =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BB=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HISTORY/2026-10-10-session-log.md | 13 +++++++++ .../vm-public-entrypoint-2026-10-10.md | 27 +++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/HISTORY/2026-10-10-session-log.md b/HISTORY/2026-10-10-session-log.md index e2d5219..b7e6d12 100644 --- a/HISTORY/2026-10-10-session-log.md +++ b/HISTORY/2026-10-10-session-log.md @@ -92,6 +92,15 @@ - Коммиты `469132b`, `ca0372b`; тест `app/gosqs/tenant_helpers_test.go`. Проверено снаружи: `list-queues` → `https://sqs.sinefo.ru/t-.../orders`. +### 2.11. Устойчивость: systemd + локальный Redis +- Установлен `redis-server` (7.0.15) на 213, включён AOF (`appendonly yes`). +- systemd-юнит `shared-sqs.service` (`Restart=always`, `enable`) + `/etc/shared-sqs.env`. +- Проверено: сообщение пережило рестарт; `systemctl is-enabled/active` → enabled/active. +- **Дефекты seed (обнаружены и исправлены, коммит `c0aa618`):** демо-очереди не персистились; + каждый старт плодил нового демо-тенанта (утечка при `Restart=always`). Фикс: `SaveQueue`+ + `SaveMessages` + идемпотентность через `store.List()`. +- Управление: `sudo systemctl {status,restart,stop} shared-sqs`. + ## 3. Грабли (для повторного использования) 1. **`proxy_set_header Host $host` теряет порт** → SigV4 `SignatureDoesNotMatch`. @@ -104,6 +113,10 @@ 4. `pkill -f "http.server 10443"` по SSH **самоматчится** на строку ssh-команды и убивает сессию — использовать `pkill -x <имя>`. 5. Порт `8443` на 213 **нельзя занимать** — там DNAT транзита на Vultr. +6. **Managed Redis недоступен с 213**: его endpoint — внутренний k8s DNS + (`redisk8s..svc.cluster.local:6379`), резолвится только изнутри кластера. С ВМ — только + локальный Redis или внешний endpoint от NUBES. +7. Локальный Redis на 213 **не спасает от падения ВМ** (SQS и Redis — на одной машине, SPOF). ## 4. ОШИБКИ (сводка, включая ошибки Flash) diff --git a/doc/thinking/vm-public-entrypoint-2026-10-10.md b/doc/thinking/vm-public-entrypoint-2026-10-10.md index e4ce7be..42b73df 100644 --- a/doc/thinking/vm-public-entrypoint-2026-10-10.md +++ b/doc/thinking/vm-public-entrypoint-2026-10-10.md @@ -105,3 +105,30 @@ curl -sS https://sqs.sinefo.ru/health - `app/cmd/seed.go` — демо-очереди формируют URL через `gosqs.TenantQueueURL` (убрано дублирование логики — оно и было причиной, что фикс «не применялся»); - тест `app/gosqs/tenant_helpers_test.go`. + +## 8. Устойчивость: systemd + локальный Redis (2026-10-10) + +- **Redis** установлен на 213 (`apt install redis-server` 7.0.15), слушает `127.0.0.1:6379`, + включён **AOF** (`/etc/redis/redis.conf`: `appendonly yes`) — состояние переживает рестарт. +- **systemd-юнит** `/etc/systemd/system/shared-sqs.service`: `Restart=always`, `RestartSec=2`, + `WantedBy=multi-user.target` (автостарт при ребуте), `Requires=redis-server.service`, + `User=naeel`, `WorkingDirectory=/home/naeel/sqs-test`, `StandardOutput=append:.../sqs.log`. +- **env** `/etc/shared-sqs.env` (600, root): `SHARED_SQS_ADMIN_TOKEN`, `SHARED_SQS_SEED_DEMO`, + `SHARED_SQS_EXTERNAL_URL_BASE=https://sqs.sinefo.ru`, `REDIS_ADDR=127.0.0.1:6379`. +- Управление: `sudo systemctl {status,restart,stop,start} shared-sqs`. + +**Закрыто:** крах процесса (авторестарт) и ребут ВМ (автостарт + Redis с диска из AOF; проверено — +сообщение пережило рестарт). +**НЕ закрыто:** падение самой ВМ — SQS и Redis лежат на одной машине (single point of failure). +Настоящая отказоустойчивость — после Шага 3 (Redis на отдельном хосте + несколько инстансов). + +### Дефекты seed, обнаруженные при включении Redis (исправлены, коммит `c0aa618`) +1. **Демо-очереди не персистились** — после рестарта у демо-тенанта не было очередей. + Фикс: `persistence.SaveQueue` + `SaveMessages` в `app/cmd/seed.go`. +2. **Дубли тенантов** — каждый старт создавал нового демо-тенанта (новые креды). При + `Restart=always` это утечка. Фикс: идемпотентность в `seedDemoData` (проверка по имени + через `store.List()` → «сид пропущен»). + +### Для прода +`SHARED_SQS_SEED_DEMO=false` (демо-данные не нужны), тенанты/очереди создаются через API +(они персистятся штатно).