Правки различные

This commit is contained in:
mi
2026-08-26 11:05:32 +03:00
parent c1e49fb15d
commit 728b9826a3
36 changed files with 722 additions and 1986 deletions
+6 -119
View File
@@ -1,7 +1,8 @@
# SigNoz для HAN Chat
Одноузловой self-hosted SigNoz на Ubuntu 24.04 через официальный
`foundryctl` и Docker Compose.
`foundryctl` и Docker Compose. Исполняемый порядок раскатки, lockdown и
обновления — только в [docs/RUNBOOK.ru.md](docs/RUNBOOK.ru.md).
Сетевая модель:
@@ -19,127 +20,13 @@
- рабочий приватный интерфейс с адресом `192.168.0.5`;
- доступ к ВМ по SSH через приватную сеть до отключения внешнего IP.
## Установка
Скопируйте эту папку на ВМ, например в `/opt/signoz`:
```bash
rsync -rltD --no-perms --no-owner --no-group -ivc --delete \
--exclude='.env' \
--exclude='dist/' \
--exclude='secrets/' \
--exclude='pours/' \
--exclude='casting.yaml.lock' \
-e "ssh -i ~/.ssh/hansel-private" \
/mnt/c/Users/MI/Documents/Assistent/HAN_chat_specification/codebase/Signoz/ \
root@135.106.166.7:/opt/signoz/
```
Исключения `pours/` и `casting.yaml.lock` обязательны при повторной
синхронизации: Foundry создаёт их непосредственно на VM. Без исключений
`rsync --delete` удалит runtime-конфигурацию, которой нет локально.
На ВМ:
```bash
cd /opt/signoz
sed -i 's/\r$//' scripts/*.sh
chmod +x scripts/*.sh
sudo ./scripts/05-configure-private-network.sh
sudo PRIVATE_IP=192.168.0.5 ./scripts/00-check-vm.sh
sudo ./scripts/10-install-docker.sh
sudo PRIVATE_IP=192.168.0.5 ./scripts/20-deploy-signoz.sh
```
После запуска создайте первого администратора и организацию SigNoz. До этого
OpAMP не выдаст ingester рабочую OTLP-конфигурацию, хотя контейнер будет
выглядеть запущенным.
Адреса `127.0.0.1` всегда означают loopback той машины, на которой
интерпретируются. HAN_CHAT имеет приватный адрес `192.168.0.1`, а SigNoz —
`192.168.0.5`. UI слушает `127.0.0.1:8080` именно на VM SigNoz.
Для постоянного доступа после удаления публичного IP SigNoz добавьте в
`C:\Users\MI\.ssh\config`:
```sshconfig
Host han-jump
HostName 135.106.164.58
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
```
Затем ssh signoz-ui -N
(устаревшее:
На рабочем компьютере откройте туннель до SigNoz через HAN_CHAT:
```powershell
ssh -L 8080:127.0.0.1:8080 signoz-private -N
```
)
Маршрут SSH: Windows → публичный адрес HAN_CHAT → `192.168.0.5:22`.
Назначение `127.0.0.1:8080` в `-L` открывает конечная VM SigNoz, а не
HAN_CHAT.
Откройте `http://127.0.0.1:8080`, создайте администратора/организацию, затем
на VM выполните:
```bash
cd /opt/signoz
sudo docker compose -f pours/deployment/compose.yaml restart ingester
sudo ./scripts/30-verify-signoz.sh
```
После успешной проверки настройте host firewall. Подставьте реальный приватный
IP backend:
```bash
sudo OTLP_SOURCE=192.168.0.1 \
ADMIN_CIDR=192.168.0.0/24 \
PRIVATE_IP=192.168.0.5 \
./scripts/40-configure-firewall.sh
```
Затем выполните чек-лист из [docs/NETWORK.md](docs/NETWORK.md), подключите
backend по [docs/BACKEND_OTLP.md](docs/BACKEND_OTLP.md) и только после
успешной end-to-end проверки удалите внешний IP.
## Проверка и управление
```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 --tail=200
sudo docker compose -f pours/deployment/compose.yaml restart
```
Не редактируйте `pours/` вручную: Foundry перегенерирует эту папку.
Постоянные изменения вносятся в `casting.yaml`, после чего снова запускается
`20-deploy-signoz.sh`.
Обновление требует временного доступа к Docker Hub, GitHub и SigNoz:
```bash
cd /opt/signoz
sudo ./scripts/20-deploy-signoz.sh
```
Перед обновлением сделайте snapshot диска ВМ. Данные находятся в Docker
volumes ClickHouse и PostgreSQL; `docker compose down -v` удалит их и поэтому
для штатного обслуживания запрещён.
## Документация
- [RUNBOOK.ru.md](docs/RUNBOOK.ru.md) — раскатка ВМ3, verify, firewall,
lockdown, обновление и rollback;
- [NETWORK.md](docs/NETWORK.md) — сеть, группа безопасности, SSH-туннель;
- [BACKEND_OTLP.md](docs/BACKEND_OTLP.md) — передача телеметрии HAN Chat;
- [SIGNOZ_RUNBOOK.md](docs/SIGNOZ_RUNBOOK.md) — что смотреть в SigNoz;
- [SIGNOZ_RUNBOOK.md](docs/SIGNOZ_RUNBOOK.md) — ежедневная работа в UI и
разбор инцидентов;
- [MVP_DASHBOARDS_ALERTS.md](docs/MVP_DASHBOARDS_ALERTS.md) — versioned
спецификация первых dashboards и alerts.
+12 -9
View File
@@ -1,5 +1,9 @@
# Сеть и доступ
Исполняемый порядок раскатки, включая Netplan, SG и lockdown — в
[RUNBOOK.ru.md](RUNBOOK.ru.md). Этот файл фиксирует сетевую диагностику и
проверки доступа.
## Сбор диагностики
До изменения Netplan выполните и сохраните вывод:
@@ -50,29 +54,28 @@ sudo ./scripts/05-configure-private-network.sh
```bash
ip -br -4 address show eth1
ip route get 192.168.0.1
ping -c 3 192.168.0.1
```
С другой VM приватной сети проверьте:
С другой VM приватной сети проверьте SSH. ICMP в группе безопасности обычно
закрыт, `ping` не является проверкой связности:
```bash
ping -c 3 192.168.0.5
ssh -i ~/.ssh/hansel-private root@192.168.0.5
ssh -i ~/.ssh/hansel-private -o ConnectTimeout=5 root@192.168.0.5
```
Если новая SSH-сессия работает, вернитесь в первую и подтвердите Netplan
клавишей Enter. Если нет — не подтверждайте: через 120 секунд произойдёт откат.
Отсутствие ответа на ping само по себе может означать запрет ICMP; SSH является
основной проверкой.
## Группа безопасности
Минимальные входящие правила для VM SigNoz:
- TCP 22 от административного узла/подсети приватной сети;
- TCP 4317 от security groups/private IP ВМ1 и ВМ2;
- TCP 4318 от ВМ1/ВМ2 только если планируется OTLP/HTTP;
- TCP 22: на хосте UFW разрешает любой источник; конкретные IP/подсети
задаются в SG или файрволе приватной сети провайдера;
- TCP 4317 от приватной подсети `192.168.0.0/24` (ВМ1 и ВМ2);
- TCP 4318 от той же подсети, если нужен OTLP/HTTP;
- никаких входящих правил для 8080, 5432, 8123, 9000, 9181.
UI только через SSH `-L 8080:127.0.0.1:8080`.
Для текущего backend используется OTLP/gRPC, поэтому после проверки 4318 можно
закрыть. Исходящий доступ к приватной сети оставьте. Для обновления временно
+407
View File
@@ -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, не в этом же
окне раскатки.
+4
View File
@@ -1,5 +1,9 @@
# Работа с SigNoz для HAN Chat
Это эксплуатационный runbook UI: фильтры, ежедневная проверка и разбор
инцидентов. Раскатка ВМ3, lockdown и обновление стека — только в
[RUNBOOK.ru.md](RUNBOOK.ru.md).
## Базовые фильтры
Во всех разделах начинайте с:
+29 -12
View File
@@ -36,18 +36,35 @@ else
fail "DNS не разрешает адреса репозиториев"
fi
for url in \
https://archive.ubuntu.com \
https://download.docker.com \
https://registry-1.docker.io \
https://github.com \
https://signoz.io; do
if curl -4fsSI --connect-timeout 8 --max-time 15 "$url" >/dev/null; then
ok "доступен $url"
else
fail "нет доступа к $url"
fi
done
probe_https() {
local label="$1"
local url="$2"
shift 2
local code
code="$(curl -4sS -o /dev/null -w '%{http_code}' \
--connect-timeout 8 --max-time 15 "$url" || true)"
local expected
for expected in "$@"; do
if [[ "$code" == "$expected" ]]; then
ok "доступен $label"
return 0
fi
done
fail "нет доступа к $label (HTTP ${code:-нет ответа})"
}
# Сайты отвечают 2xx/3xx. Docker Registry API на /v2/ без токена штатно
# отдаёт 401; корень registry-1.docker.io часто даёт 404 — это не отказ сети.
probe_https https://archive.ubuntu.com https://archive.ubuntu.com \
200 301 302 303 307 308
probe_https https://download.docker.com https://download.docker.com \
200 301 302 303 307 308
probe_https https://registry-1.docker.io https://registry-1.docker.io/v2/ \
200 401
probe_https https://github.com https://github.com \
200 301 302 303 307 308
probe_https https://signoz.io https://signoz.io \
200 301 302 303 307 308
echo
echo "=== Занятость портов ==="
@@ -2,43 +2,70 @@
set -Eeuo pipefail
PRIVATE_IP="${PRIVATE_IP:-192.168.0.5}"
ADMIN_CIDR="${ADMIN_CIDR:-192.168.0.0/24}"
OTLP_SOURCE="${OTLP_SOURCE:-}"
PRIVATE_CIDR="${PRIVATE_CIDR:-192.168.0.0/24}"
if [[ $EUID -ne 0 ]]; then
echo "Запустите через sudo." >&2
exit 1
fi
if [[ -z "$OTLP_SOURCE" ]]; then
echo "Укажите приватный IP backend, например:" >&2
echo " sudo OTLP_SOURCE=192.168.0.1 $0" >&2
[[ "$PRIVATE_CIDR" =~ ^[0-9.]+/[0-9]+$ ]] || {
echo "Некорректный PRIVATE_CIDR: ${PRIVATE_CIDR}" >&2
exit 1
fi
}
ip -4 addr show | grep -Fq "inet ${PRIVATE_IP}/" || {
echo "Приватный адрес ${PRIVATE_IP} не найден." >&2
exit 1
}
echo "SSH будет разрешён только из ${ADMIN_CIDR}."
echo "OTLP будет разрешён только от ${OTLP_SOURCE}."
echo "До продолжения проверьте отдельную SSH-сессию через приватную сеть."
cat <<EOF
Будут применены правила UFW:
входящий по умолчанию: deny
исходящий по умолчанию: allow
TCP 22 с любого источника (ограничение IP — в SG провайдера)
TCP 4317/4318 только из ${PRIVATE_CIDR} на ${PRIVATE_IP} (ВМ1 и ВМ2)
TCP 8080 не открывается: UI только через SSH-туннель на 127.0.0.1:8080
Пример туннеля с рабочей станции:
ssh -i ~/.ssh/hansel -L 8080:127.0.0.1:8080 root@<IP_ВМ3> -N
До продолжения откройте вторую SSH-сессию, чтобы не потерять доступ.
EOF
read -r -p "Введите APPLY для применения правил: " answer
[[ "$answer" == APPLY ]] || { echo "Отменено."; exit 1; }
apt-get update
apt-get install -y ufw
if ! command -v ufw >/dev/null; then
apt-get update
apt-get install -y ufw
fi
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw logging medium
ufw allow from "$ADMIN_CIDR" to "$PRIVATE_IP" port 22 proto tcp comment "SigNoz admin SSH"
ufw allow from "$OTLP_SOURCE" to "$PRIVATE_IP" port 4317 proto tcp comment "HAN OTLP gRPC"
ufw allow from "$OTLP_SOURCE" to "$PRIVATE_IP" port 4318 proto tcp comment "HAN OTLP HTTP"
# Источник SSH на хосте не фильтруем: allow-list делает файрвол приватной
# сети / SG провайдера. Проброс UI идёт внутри этой сессии и не требует 8080.
ufw allow 22/tcp comment "SSH (source limited by provider SG)"
ufw allow from "$PRIVATE_CIDR" to "$PRIVATE_IP" port 4317 proto tcp \
comment "HAN OTLP gRPC from private net"
ufw allow from "$PRIVATE_CIDR" to "$PRIVATE_IP" port 4318 proto tcp \
comment "HAN OTLP HTTP from private net"
ufw --force enable
ufw status verbose
cat <<'EOF'
cat <<EOF
Важно: Docker-публикации могут обходить цепочку UFW INPUT. Основная фильтрация
источника OTLP должна оставаться в облачной группе безопасности. casting.yaml
дополнительно привязывает OTLP только к приватному IP, а UI — к loopback.
UI не публикуется. Туннель:
ssh -i ~/.ssh/hansel -L 8080:127.0.0.1:8080 root@<IP_ВМ3> -N
затем http://127.0.0.1:8080 на рабочей станции.
Docker-публикации могут обходить UFW INPUT. Если 4317 доступен вне
${PRIVATE_CIDR}, ограничьте источник в SG провайдера. casting.yaml биндит
OTLP на ${PRIVATE_IP}, UI — на loopback.
EOF