Правки различные
This commit is contained in:
@@ -0,0 +1,407 @@
|
||||
# Runbook развёртывания SigNoz (ВМ3)
|
||||
|
||||
Это единственный исполняемый runbook раскатки self-hosted SigNoz для HAN Chat.
|
||||
Команды выполняет оператор; repository automation их не запускает.
|
||||
|
||||
ВМ3 — private/no-egress узел по
|
||||
[`arch-06-service-hosting-security.md`](../../../architectory/arch-06-service-hosting-security.md):
|
||||
после приёмки нет internet ingress, нет постоянного internet egress, UI не
|
||||
публикуется, OTLP доступен только из приватной сети. Раскатка не завершена,
|
||||
пока не закрыт lockdown и обе группы проверок (снаружи и из private network).
|
||||
|
||||
Эксплуатация UI, разбор инцидентов и алерты — в
|
||||
[`SIGNOZ_RUNBOOK.md`](SIGNOZ_RUNBOOK.md). Подключение приложений —
|
||||
[`BACKEND_OTLP.md`](BACKEND_OTLP.md). Сеть и группы безопасности —
|
||||
[`NETWORK.md`](NETWORK.md).
|
||||
|
||||
## 0. Назначение, инвентарь и stop conditions
|
||||
|
||||
Каталог репозитория: `HAN_chat_specification/VM3_signoz/Signoz/`.
|
||||
Рабочий каталог на ВМ: `/opt/signoz`. Compose Foundry создаёт в
|
||||
`pours/deployment/compose.yaml`; этот каталог принадлежит runtime ВМ и не
|
||||
хранится в git.
|
||||
|
||||
Текущее окружение (подставьте актуальные значения, если они изменились):
|
||||
|
||||
| Узел | Публичный IP | Приватный IP |
|
||||
|---|---|---|
|
||||
| ВМ1 HAN Chat (jump) | `135.106.164.58` | `192.168.0.1` |
|
||||
| ВМ2 Processing | — | `192.168.0.4` |
|
||||
| ВМ3 SigNoz | `135.106.166.7` только на bootstrap | `192.168.0.5` |
|
||||
|
||||
Порты:
|
||||
|
||||
- OTLP/gRPC: `192.168.0.5:4317` — основной ingest ВМ1 и ВМ2;
|
||||
- OTLP/HTTP: `192.168.0.5:4318` — диагностика, после приёмки можно закрыть;
|
||||
- UI/API: `127.0.0.1:8080` на ВМ3, доступ только через SSH-туннель;
|
||||
- ClickHouse `8123/9000`, PostgreSQL `5432`, ClickHouse Keeper `9181` наружу
|
||||
не публикуются.
|
||||
|
||||
SSH-ключи (не коммитьте private keys):
|
||||
|
||||
- jump/ВМ1: `C:\Users\MI\.ssh\hansel`;
|
||||
- приватный вход на ВМ3: `C:\Users\MI\.ssh\hansel-private`.
|
||||
|
||||
Stop condition: нет приватного `192.168.0.5`, MAC `eth1` не совпал, нет
|
||||
исходящего HTTPS на bootstrap, заняты `8080/4317/4318`, Compose публикует
|
||||
служебный порт на `0.0.0.0`, не создан первый администратор SigNoz, verify
|
||||
скрипт завершился ошибкой, нет альтернативного SSH через jump, нет snapshot
|
||||
диска перед lockdown/обновлением.
|
||||
|
||||
Запрещены: `docker compose down -v`, `docker volume prune`,
|
||||
`docker system prune --volumes`; ручное редактирование `pours/`;
|
||||
`rsync --delete` без исключений `pours/` и `casting.yaml.lock`; публикация
|
||||
`8080/4317/4318` на всех интерфейсах; постоянный public SSH «на будущее».
|
||||
|
||||
Текущие host-скрипты выполняются от `root`. Роли `deploy`/`admin` из arch-06
|
||||
на ВМ3 ещё не автоматизированы; не имитируйте их вручную поверх Foundry.
|
||||
|
||||
## 1. Предварительные условия (облако)
|
||||
|
||||
До копирования файлов на ВМ подготовьте вне Compose:
|
||||
|
||||
1. Fresh Ubuntu 24.04, минимум 4 GiB RAM (лучше 8 GiB) и 30 GiB свободно
|
||||
в `/opt`. Для эксплуатации ClickHouse закладывайте запас диска под
|
||||
retention.
|
||||
2. Private subnet `192.168.0.0/24` с ВМ1, ВМ2 и managed PostgreSQL.
|
||||
Приватный адрес ВМ3 — `192.168.0.5`.
|
||||
3. Временный public IP только на окно bootstrap. Cloud SG на этом этапе:
|
||||
SSH TCP 22 с trusted ops CIDR, исходящий HTTPS/DNS к Docker Hub, GitHub,
|
||||
`signoz.io`, Ubuntu archive. Порты `8080/4317/4318/5432/8123/9000/9181`
|
||||
из интернета запрещены.
|
||||
4. После lockdown целевая SG:
|
||||
- TCP 22 от jump/приватной подсети (`192.168.0.1` или SG ВМ1);
|
||||
- TCP 4317 от приватных IP/SG ВМ1 и ВМ2;
|
||||
- TCP 4318 только если оставлен HTTP ingest;
|
||||
- никакого internet ingress;
|
||||
- internet egress закрыт, кроме согласованного break-glass окна.
|
||||
5. Зафиксируйте MAC приватного NIC. Скрипт
|
||||
`05-configure-private-network.sh` по умолчанию ждёт
|
||||
`eth1` / `fa:16:3e:b6:c6:70`. Если MAC другой — передайте
|
||||
`PRIVATE_MAC` явно, не правьте cloud-init `eth0`.
|
||||
|
||||
## 2. SSH-доступ оператора
|
||||
|
||||
На Windows добавьте в `C:\Users\MI\.ssh\config`:
|
||||
|
||||
```sshconfig
|
||||
Host han-jump
|
||||
HostName 135.106.164.58
|
||||
User root
|
||||
IdentityFile C:\Users\MI\.ssh\hansel
|
||||
|
||||
Host signoz-bootstrap
|
||||
HostName 135.106.166.7
|
||||
User root
|
||||
IdentityFile C:\Users\MI\.ssh\hansel
|
||||
|
||||
Host signoz-private
|
||||
HostName 192.168.0.5
|
||||
User root
|
||||
IdentityFile C:\Users\MI\.ssh\hansel-private
|
||||
ProxyJump han-jump
|
||||
|
||||
Host signoz-ui
|
||||
HostName 192.168.0.5
|
||||
User root
|
||||
IdentityFile C:\Users\MI\.ssh\hansel-private
|
||||
ProxyJump han-jump
|
||||
LocalForward 8080 127.0.0.1:8080
|
||||
```
|
||||
|
||||
До lockdown: `ssh signoz-bootstrap`. После появления приватного адреса
|
||||
проверьте `ssh signoz-private`, не закрывая bootstrap-сессию. Для UI:
|
||||
|
||||
```powershell
|
||||
ssh signoz-ui -N
|
||||
```
|
||||
|
||||
Откройте `http://127.0.0.1:8080`. Туннель обязан указывать на loopback
|
||||
**ВМ3**. Не используйте `-L 8080:192.168.0.5:8080` через jump: UI слушает
|
||||
`127.0.0.1:8080` на SigNoz, а не на `192.168.0.5`.
|
||||
|
||||
## 3. Передача каталога на ВМ
|
||||
|
||||
С WSL, не закрывая исключений. `pours/` и `casting.yaml.lock` создаёт
|
||||
Foundry на ВМ; без исключений `rsync --delete` уничтожит runtime.
|
||||
|
||||
Первичная установка (публичный IP ещё есть):
|
||||
|
||||
```bash
|
||||
rsync -rltD --no-perms --no-owner --no-group -ivc \
|
||||
--exclude='.env' \
|
||||
--exclude='dist/' \
|
||||
--exclude='secrets/' \
|
||||
--exclude='pours/' \
|
||||
--exclude='casting.yaml.lock' \
|
||||
-e "ssh -i ~/.ssh/hansel" \
|
||||
/mnt/c/Users/MI/Documents/Assistent/HAN_chat_specification/VM3_signoz/Signoz/ \
|
||||
root@135.106.166.7:/opt/signoz/
|
||||
```
|
||||
|
||||
Повторная синхронизация после lockdown — через jump (`signoz-private`) и
|
||||
с `--delete`, сохранив те же exclude.
|
||||
|
||||
На ВМ:
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sed -i 's/\r$//' scripts/*.sh
|
||||
chmod +x scripts/*.sh
|
||||
```
|
||||
|
||||
Не копируйте `.env`, ключи и `pours/`. Постоянные правки портов вносятся
|
||||
только в `casting.yaml`, затем снова запускается `20-deploy-signoz.sh`.
|
||||
|
||||
## 4. Приватный интерфейс
|
||||
|
||||
Сохраните диагностику по [`NETWORK.md`](NETWORK.md). Default route должен
|
||||
остаться на публичном `eth0`; у `eth1` gateway нет.
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sudo ./scripts/05-configure-private-network.sh
|
||||
```
|
||||
|
||||
Пока `netplan try` ждёт 120 секунд, во **второй** сессии проверьте:
|
||||
|
||||
```bash
|
||||
ip -br -4 address show eth1
|
||||
ip route get 192.168.0.1
|
||||
```
|
||||
|
||||
С ВМ1. ICMP в SG обычно закрыт, `ping` не используйте:
|
||||
|
||||
```bash
|
||||
ssh -i ~/.ssh/hansel-private -o ConnectTimeout=5 root@192.168.0.5
|
||||
```
|
||||
|
||||
Подтверждайте Netplan Enter только после успешного SSH с ВМ1.
|
||||
|
||||
## 5. Preflight и Docker
|
||||
|
||||
Исходящий интернет на этом шаге ещё нужен.
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sudo PRIVATE_IP=192.168.0.5 ./scripts/00-check-vm.sh
|
||||
sudo ./scripts/10-install-docker.sh
|
||||
```
|
||||
|
||||
`00-check-vm.sh` требует Ubuntu 24.04, ≥4 GiB RAM, ≥30 GiB в `/opt`, адрес
|
||||
`192.168.0.5`, DNS/HTTPS к Docker Hub, GitHub и SigNoz, свободные
|
||||
`8080/4317/4318`. Любой `FAIL` — stop.
|
||||
|
||||
## 6. Первый запуск SigNoz
|
||||
|
||||
`casting.yaml` обязан содержать bind `192.168.0.5:4317/4318` и
|
||||
`127.0.0.1:8080`. Скрипт остановится, если Foundry опубликует эти порты на
|
||||
`0.0.0.0`.
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sudo PRIVATE_IP=192.168.0.5 ./scripts/20-deploy-signoz.sh
|
||||
```
|
||||
|
||||
Ожидается: `foundryctl gauge/forge`, `compose pull/up`, UI health на
|
||||
`http://127.0.0.1:8080/api/v1/health` за ≤5 минут. Контейнеры `running` ещё
|
||||
не означают готовый ingest: до создания организации OpAMP не выдаёт
|
||||
ingester рабочую OTLP-конфигурацию.
|
||||
|
||||
## 7. Первый администратор
|
||||
|
||||
На рабочей станции:
|
||||
|
||||
```powershell
|
||||
ssh signoz-ui -N
|
||||
```
|
||||
|
||||
Откройте `http://127.0.0.1:8080`, создайте организацию и администратора.
|
||||
Пароль не сохраняйте в репозитории и history. Затем на ВМ3:
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sudo docker compose -f pours/deployment/compose.yaml restart ingester
|
||||
```
|
||||
|
||||
Без этого шага TCP `4317` может слушаться, а телеметрия — не приниматься.
|
||||
|
||||
## 8. Verify стека
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sudo PRIVATE_IP=192.168.0.5 ./scripts/30-verify-signoz.sh
|
||||
sudo docker compose -f pours/deployment/compose.yaml ps -a
|
||||
ss -lntp '( sport = :8080 or sport = :4317 or sport = :4318 )'
|
||||
```
|
||||
|
||||
Ожидается healthy PostgreSQL, ClickHouse Keeper, ClickHouse, SigNoz UI;
|
||||
TCP `4317` на `192.168.0.5`; HTTP `4318` принимает пустой OTLP JSON;
|
||||
`8080` только на `127.0.0.1`. Любой `FAIL` — смотрите
|
||||
`docker compose -f pours/deployment/compose.yaml logs --tail=200`, не
|
||||
продолжайте к firewall/lockdown.
|
||||
|
||||
С ВМ1 и ВМ2:
|
||||
|
||||
```bash
|
||||
timeout 3 bash -c 'exec 3<>/dev/tcp/192.168.0.5/4317' \
|
||||
&& echo 'OTLP gRPC reachable'
|
||||
```
|
||||
|
||||
## 9. Host firewall и cloud SG
|
||||
|
||||
Скрипт интерактивный: введите `APPLY` только после второй живой SSH-сессии.
|
||||
Он сбрасывает UFW и ставит:
|
||||
|
||||
- TCP 22 с любого источника — allow-list IP задаёте в SG/файрволе
|
||||
приватной сети провайдера;
|
||||
- TCP 4317 и 4318 на `192.168.0.5` только из `192.168.0.0/24` (ВМ1 и ВМ2);
|
||||
- 8080 не открывается. UI остаётся на `127.0.0.1:8080` и доступен так:
|
||||
|
||||
```powershell
|
||||
ssh -i C:\Users\MI\.ssh\hansel -L 8080:127.0.0.1:8080 root@<IP_ВМ3> -N
|
||||
```
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sudo PRIVATE_IP=192.168.0.5 \
|
||||
PRIVATE_CIDR=192.168.0.0/24 \
|
||||
./scripts/40-configure-firewall.sh
|
||||
```
|
||||
|
||||
UFW INPUT не фильтрует все Docker-публикации. Источник OTLP дополнительно
|
||||
держите в SG. `casting.yaml` биндит OTLP на приватный IP, UI — на loopback.
|
||||
|
||||
В SG не открывайте публично 8080/5432/8123/9000/9181. SSH 22 режьте
|
||||
источником на стороне провайдера, не на UFW.
|
||||
|
||||
## 10. Подключение ВМ1 и ВМ2
|
||||
|
||||
Не считайте раскатку ВМ3 законченной по одной проверке TCP `4317`. Канал ingest
|
||||
настраивается на application VM по [`BACKEND_OTLP.md`](BACKEND_OTLP.md):
|
||||
|
||||
```dotenv
|
||||
OTEL_EXPORTER_OTLP_ENDPOINT=http://otel-collector:4317
|
||||
OTEL_REMOTE_ENDPOINT=192.168.0.5:4317
|
||||
OTEL_REMOTE_AUTH_HEADER=
|
||||
OTEL_REMOTE_TLS_INSECURE=true
|
||||
```
|
||||
|
||||
`OTEL_REMOTE_TLS_INSECURE=true` допустим только в этой изолированной
|
||||
приватной сети. После recreate collector на каждой VM отправьте canary
|
||||
traces и найдите в SigNoz:
|
||||
|
||||
```text
|
||||
service.name = han-chat-otlp-smoke
|
||||
service.namespace = han-chat
|
||||
deployment.environment = production-like
|
||||
```
|
||||
|
||||
Collector сохраняет около 10% успешных traces: для smoke нужно порядка
|
||||
100 traces, не 10. End-to-end и outage/recovery acceptance описаны в
|
||||
`BACKEND_OTLP.md`; без них отсутствие ошибок в UI не доказывает здоровье
|
||||
HAN Chat.
|
||||
|
||||
## 11. Snapshot, reboot gate и lockdown
|
||||
|
||||
До удаления public IP:
|
||||
|
||||
1. `ssh signoz-private` открывается отдельной сессией.
|
||||
2. Туннель `signoz-ui` показывает UI, администратор существует.
|
||||
3. `30-verify-signoz.sh` без ошибок.
|
||||
4. С ВМ1 и ВМ2 доступен `192.168.0.5:4317`.
|
||||
5. В SigNoz есть свежий canary или production-like trace.
|
||||
6. Все критичные контейнеры `running`/`healthy`.
|
||||
7. Создан snapshot диска ВМ3.
|
||||
8. В SG нет публичного доступа к служебным портам.
|
||||
|
||||
Reboot gate. Не закрывайте jump/console доступ:
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sudo ./scripts/30-verify-signoz.sh
|
||||
sudo systemctl is-enabled docker.service
|
||||
sudo systemctl reboot
|
||||
```
|
||||
|
||||
После reconnect через `signoz-private` повторите verify, `compose ps`,
|
||||
слушатели портов и canary с ВМ1.
|
||||
|
||||
Lockdown по arch-06:
|
||||
|
||||
- удалите public IP `135.106.166.7`;
|
||||
- уберите internet ingress из SG, включая public SSH;
|
||||
- закройте общий internet egress (DNS/NTP/private OTLP остаются);
|
||||
- с внешней сети SSH и `8080/4317` недоступны;
|
||||
- из private network SSH через jump и OTLP `4317` работают;
|
||||
- bootstrap installer-файлы и ненужные package caches можно удалить.
|
||||
|
||||
Раскатка не завершена, пока lockdown не зафиксирован. Постоянно оставлять
|
||||
public IP «для обновлений» запрещено.
|
||||
|
||||
## 12. Штатное обслуживание и обновление
|
||||
|
||||
Проверка:
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
sudo ./scripts/30-verify-signoz.sh
|
||||
sudo docker compose -f pours/deployment/compose.yaml ps
|
||||
sudo docker compose -f pours/deployment/compose.yaml logs --since=30m
|
||||
df -h
|
||||
docker system df
|
||||
```
|
||||
|
||||
Не редактируйте `pours/` вручную. Изменение bind-адресов — только
|
||||
`casting.yaml` + `20-deploy-signoz.sh`.
|
||||
|
||||
Обновление — break-glass по arch-06: временный исходящий HTTPS к Docker Hub,
|
||||
GitHub и SigNoz, минимальное окно, затем повтор lockdown.
|
||||
|
||||
```bash
|
||||
cd /opt/signoz
|
||||
# 1. snapshot диска
|
||||
# 2. временный egress
|
||||
sudo df -h
|
||||
sudo ./scripts/20-deploy-signoz.sh
|
||||
sudo ./scripts/30-verify-signoz.sh
|
||||
# 3. проверить сохранность старых traces/metrics
|
||||
# 4. закрыть egress
|
||||
```
|
||||
|
||||
Перед обновлением синхронизируйте git-каталог на ВМ с теми же exclude, что
|
||||
в §3. После обновления повторите smoke canary с ВМ1.
|
||||
|
||||
## 13. Rollback и потеря ВМ
|
||||
|
||||
Откат приложения: предыдущий проверенный `casting.yaml` + повтор
|
||||
`20-deploy-signoz.sh` **без** `-v`. Данные живут в Docker volumes ClickHouse
|
||||
и PostgreSQL; их удаление — потеря телеметрии.
|
||||
|
||||
Потеря ВМ3: новая Ubuntu 24.04 этим runbook, тот же приватный `192.168.0.5`
|
||||
(или согласованная смена endpoint на ВМ1/ВМ2), новые volumes пустые.
|
||||
Исторические traces не восстанавливаются без snapshot диска. Collectors на
|
||||
ВМ1/ВМ2 fail-open для бизнеса и буферизуют в bounded queue; это не замена
|
||||
SigNoz.
|
||||
|
||||
Компрометация host: не «чистите» ВМ. Изолируйте, сохраните evidence,
|
||||
ротируйте доступ и раскатывайте заново из trusted image.
|
||||
|
||||
## 14. Acceptance record
|
||||
|
||||
Сохраните без паролей:
|
||||
|
||||
- дата/UTC окна, исполнитель, approver;
|
||||
- публичный IP bootstrap и факт его удаления;
|
||||
- приватный IP, MAC `eth1`, правила SG и `ufw status`;
|
||||
- вывод `00-check-vm.sh` и `30-verify-signoz.sh`;
|
||||
- `docker compose ps` и image ids;
|
||||
- факт создания организации/администратора (без секрета);
|
||||
- ссылка на canary trace `han-chat-otlp-smoke`;
|
||||
- snapshot id, reboot gate, lockdown checks снаружи и из private network;
|
||||
- следующее согласованное окно для dashboards/alerts по
|
||||
[`MVP_DASHBOARDS_ALERTS.md`](MVP_DASHBOARDS_ALERTS.md).
|
||||
|
||||
После приёмки ежедневная работа — [`SIGNOZ_RUNBOOK.md`](SIGNOZ_RUNBOOK.md).
|
||||
Dashboards и paging alerts создавайте только после baseline, не в этом же
|
||||
окне раскатки.
|
||||
Reference in New Issue
Block a user