From 9203af90d525485ac1d7f7884eb0bbb6d3037f6f Mon Sep 17 00:00:00 2001 From: PTah Date: Tue, 26 May 2026 20:28:05 +1000 Subject: [PATCH] docs: native Ubuntu install as primary; systemd and nginx - install-ubuntu-24.04-native.md (production) and -docker.md (alternative) - deploy/systemd/sac-api.service, nginx/sac.conf.example, env.native.example - deployment, README, INDEX, work-plan, TZ updated --- README.md | 7 +- backend/README.md | 34 ++-- deploy/.env.example | 3 +- deploy/README.md | 16 +- deploy/env.native.example | 19 ++ deploy/nginx/sac.conf.example | 44 +++++ deploy/systemd/sac-api.service | 21 +++ docs/INDEX.md | 6 +- docs/TZ.md | 2 +- docs/deployment.md | 190 ++++++------------- docs/install-ubuntu-24.04-docker.md | 105 +++++++++++ docs/install-ubuntu-24.04-native.md | 281 ++++++++++++++++++++++++++++ docs/install-ubuntu-24.04.md | 279 ++------------------------- docs/work-plan.md | 2 +- 14 files changed, 582 insertions(+), 427 deletions(-) create mode 100644 deploy/env.native.example create mode 100644 deploy/nginx/sac.conf.example create mode 100644 deploy/systemd/sac-api.service create mode 100644 docs/install-ubuntu-24.04-docker.md create mode 100644 docs/install-ubuntu-24.04-native.md diff --git a/README.md b/README.md index 6ebd49a..fa0d268 100644 --- a/README.md +++ b/README.md @@ -12,9 +12,9 @@ ## Статус проекта -**Фаза 1B:** backend (FastAPI ingest), Docker Compose. Параллельно — интеграция `UseSAC` в агентах (фаза 1A). +**Фаза 1B:** backend (FastAPI ingest), развёртывание **native** (systemd + PostgreSQL + nginx). Параллельно — `UseSAC` в агентах (фаза 1A). -**Подготовка сервера:** [docs/install-ubuntu-24.04.md](docs/install-ubuntu-24.04.md) +**Подготовка сервера Ubuntu:** [docs/install-ubuntu-24.04-native.md](docs/install-ubuntu-24.04-native.md) ## Документация @@ -26,7 +26,8 @@ | [docs/agent-integration.md](docs/agent-integration.md) | Интеграция агентов, режим `UseSAC` | | [docs/work-plan.md](docs/work-plan.md) | План работ (этапы разработки) | | [docs/roadmap.md](docs/roadmap.md) | Дорожная карта продуктовых фаз | -| [docs/install-ubuntu-24.04.md](docs/install-ubuntu-24.04.md) | Установка софта на Ubuntu 24.04 (пошагово) | +| [docs/install-ubuntu-24.04-native.md](docs/install-ubuntu-24.04-native.md) | **Ubuntu 24.04 — native (основной)** | +| [docs/install-ubuntu-24.04-docker.md](docs/install-ubuntu-24.04-docker.md) | Ubuntu 24.04 — Docker (альтернатива) | | [docs/deployment.md](docs/deployment.md) | Развёртывание и эксплуатация | | [docs/workspace-three-repos.md](docs/workspace-three-repos.md) | Multi-root workspace для трёх репо | diff --git a/backend/README.md b/backend/README.md index acd43b1..bd9365e 100644 --- a/backend/README.md +++ b/backend/README.md @@ -2,29 +2,37 @@ FastAPI + PostgreSQL + Alembic. -## Локальная разработка (без Docker) +## Production (native на Ubuntu 24.04) + +См. **[docs/install-ubuntu-24.04-native.md](../docs/install-ubuntu-24.04-native.md)**. + +Кратко: + +```bash +cd /opt/security-alert-center/backend +python3.12 -m venv .venv && .venv/bin/pip install -r requirements.txt +# /etc/security-alert-center/sac-api.env — см. deploy/env.native.example +alembic upgrade head +systemctl start sac-api +``` + +## Локальная разработка ```bash cd backend python3.12 -m venv .venv -source .venv/bin/activate # Windows: .venv\Scripts\activate +source .venv/bin/activate pip install -r requirements.txt export DATABASE_URL=postgresql+psycopg2://sac:sac@localhost:5432/sac -export SAC_BOOTSTRAP_API_KEY=sac_dev_test_key_change_me +export SAC_BOOTSTRAP_API_KEY=sac_dev_test_key +export EVENT_SCHEMA_PATH=../schemas/event-schema-v1.json alembic upgrade head uvicorn app.main:app --reload --port 8000 ``` -## Docker (из корня репозитория) +## Docker (альтернатива) -```bash -cd deploy -cp .env.example .env -# отредактировать .env -docker compose up -d -docker compose run --rm migrate -curl http://127.0.0.1:8000/health -``` +[docs/install-ubuntu-24.04-docker.md](../docs/install-ubuntu-24.04-docker.md) ## API @@ -32,5 +40,3 @@ curl http://127.0.0.1:8000/health |-------|------|------| | GET | `/health` | нет | | POST | `/api/v1/events` | Bearer API key | - -См. [docs/agent-integration.md](../docs/agent-integration.md) и [docs/event-schema-v1.json](../docs/event-schema-v1.json). diff --git a/deploy/.env.example b/deploy/.env.example index 3b0cd75..52d6204 100644 --- a/deploy/.env.example +++ b/deploy/.env.example @@ -1,4 +1,5 @@ -# Скопировать: cp .env.example .env (или в /etc/security-alert-center/.env) +# Только для Docker Compose (см. docs/install-ubuntu-24.04-docker.md). +# Production native: deploy/env.native.example → /etc/security-alert-center/sac-api.env # PostgreSQL POSTGRES_USER=sac diff --git a/deploy/README.md b/deploy/README.md index 59f5232..b48004c 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -1,10 +1,18 @@ # Deploy +## Production (native) — основной путь + +1. [docs/install-ubuntu-24.04-native.md](../docs/install-ubuntu-24.04-native.md) +2. `deploy/env.native.example` → `/etc/security-alert-center/sac-api.env` +3. `deploy/systemd/sac-api.service` → `/etc/systemd/system/` +4. `deploy/nginx/sac.conf.example` → `/etc/nginx/sites-available/sac` + +## Альтернатива: Docker + +Только для стенда. См. [docs/install-ubuntu-24.04-docker.md](../docs/install-ubuntu-24.04-docker.md). + ```bash -cp .env.example .env -nano .env +cp .env.example .env # docker-only docker compose up -d --build docker compose run --rm migrate ``` - -Полная инструкция для Ubuntu 24.04: [../docs/install-ubuntu-24.04.md](../docs/install-ubuntu-24.04.md) diff --git a/deploy/env.native.example b/deploy/env.native.example new file mode 100644 index 0000000..d1c46cb --- /dev/null +++ b/deploy/env.native.example @@ -0,0 +1,19 @@ +# Native (systemd): скопировать в /etc/security-alert-center/sac-api.env +# chmod 600 /etc/security-alert-center/sac-api.env +# chown root:sac /etc/security-alert-center/sac-api.env + +DATABASE_URL=postgresql+psycopg2://sac:CHANGE_ME_POSTGRES_PASSWORD@127.0.0.1:5432/sac + +SAC_PUBLIC_URL=https://sac.example.com +JWT_SECRET=CHANGE_ME_openssl_rand_hex_32 + +# API key для агентов: Authorization: Bearer <ключ> +# python3.12 -c "import secrets; print('sac_'+secrets.token_urlsafe(32))" +SAC_BOOTSTRAP_API_KEY=sac_replace_with_generated_key + +EVENT_SCHEMA_PATH=/opt/security-alert-center/schemas/event-schema-v1.json + +SAC_ADMIN_USERNAME=admin +SAC_ADMIN_PASSWORD= + +CORS_ORIGINS=* diff --git a/deploy/nginx/sac.conf.example b/deploy/nginx/sac.conf.example new file mode 100644 index 0000000..3ee289a --- /dev/null +++ b/deploy/nginx/sac.conf.example @@ -0,0 +1,44 @@ +# /etc/nginx/sites-available/sac +# Замените sac.example.com на ваш FQDN. +# API слушает только 127.0.0.1:8000 (systemd sac-api). + +upstream sac_api { + server 127.0.0.1:8000; + keepalive 8; +} + +server { + listen 80; + listen [::]:80; + server_name sac.example.com; + + location /.well-known/acme-challenge/ { + root /var/www/html; + } + + location / { + return 301 https://$host$request_uri; + } +} + +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name sac.example.com; + + # После certbot пути подставятся автоматически, либо укажите вручную: + # ssl_certificate /etc/letsencrypt/live/sac.example.com/fullchain.pem; + # ssl_certificate_key /etc/letsencrypt/live/sac.example.com/privkey.pem; + + client_max_body_size 2m; + + location / { + proxy_pass http://sac_api; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 60s; + } +} diff --git a/deploy/systemd/sac-api.service b/deploy/systemd/sac-api.service new file mode 100644 index 0000000..9650912 --- /dev/null +++ b/deploy/systemd/sac-api.service @@ -0,0 +1,21 @@ +[Unit] +Description=Security Alert Center API (FastAPI) +Documentation=https://git.kalinamall.ru/PapaTramp/security-alert-center +After=network-online.target postgresql.service +Wants=network-online.target +Requires=postgresql.service + +[Service] +Type=simple +User=sac +Group=sac +WorkingDirectory=/opt/security-alert-center/backend +EnvironmentFile=/etc/security-alert-center/sac-api.env +Environment=PYTHONPATH=/opt/security-alert-center/backend +ExecStart=/opt/security-alert-center/backend/.venv/bin/uvicorn app.main:app --host 127.0.0.1 --port 8000 +Restart=on-failure +RestartSec=5 +NoNewPrivileges=true + +[Install] +WantedBy=multi-user.target diff --git a/docs/INDEX.md b/docs/INDEX.md index ff4ddc9..4338845 100644 --- a/docs/INDEX.md +++ b/docs/INDEX.md @@ -9,8 +9,10 @@ | [event-schema-v1.json](event-schema-v1.json) | JSON Schema событий | | [work-plan.md](work-plan.md) | План работ по фазам | | [roadmap.md](roadmap.md) | Дорожная карта версий | -| [install-ubuntu-24.04.md](install-ubuntu-24.04.md) | **Подготовка сервера:** Docker, git, firewall, первый запуск | -| [deployment.md](deployment.md) | Ubuntu 24.04, backup, TLS | +| [install-ubuntu-24.04-native.md](install-ubuntu-24.04-native.md) | **Подготовка сервера (native)** | +| [install-ubuntu-24.04-docker.md](install-ubuntu-24.04-docker.md) | Подготовка сервера (Docker, альтернатива) | +| [install-ubuntu-24.04.md](install-ubuntu-24.04.md) | Указатель | +| [deployment.md](deployment.md) | Эксплуатация, backup, TLS | | [workspace-three-repos.md](workspace-three-repos.md) | Cursor multi-root | ## Порядок чтения diff --git a/docs/TZ.md b/docs/TZ.md index 2092384..be3522d 100644 --- a/docs/TZ.md +++ b/docs/TZ.md @@ -235,7 +235,7 @@ flowchart LR | Frontend | Vue 3 + Vite, UI-kit (Naive UI / PrimeVue), ECharts | | Realtime | Server-Sent Events (приоритет MVP) | | Reverse proxy | nginx | -| Развёртывание | Docker Compose **или** native systemd (на выбор при реализации) | +| Развёртывание | **Native:** PostgreSQL + systemd + nginx (production). Docker Compose — альтернатива для стенда | Детали — [architecture.md](architecture.md). diff --git a/docs/deployment.md b/docs/deployment.md index a13bc0a..1b8f9a3 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -1,9 +1,23 @@ # Развёртывание на Ubuntu 24.04 -Руководство для эксплуатации SAC. +Эксплуатация SAC: **native** (PostgreSQL + systemd + nginx). Docker — только альтернатива. -> **Подготовка чистого сервера (установка Docker, git, firewall, первый запуск):** -> **[install-ubuntu-24.04.md](install-ubuntu-24.04.md)** — пошаговые команды для администратора. +## Руководства по установке + +| Документ | Назначение | +|----------|------------| +| **[install-ubuntu-24.04-native.md](install-ubuntu-24.04-native.md)** | **Production** — пошаговая подготовка сервера | +| [install-ubuntu-24.04-docker.md](install-ubuntu-24.04-docker.md) | Стенд / отладка (Compose) | +| [install-ubuntu-24.04.md](install-ubuntu-24.04.md) | Указатель | + +## Артефакты native в репозитории + +``` +deploy/ + env.native.example → /etc/security-alert-center/sac-api.env + systemd/sac-api.service → /etc/systemd/system/ + nginx/sac.conf.example → /etc/nginx/sites-available/sac +``` --- @@ -14,136 +28,65 @@ | ОС | Ubuntu 24.04 LTS | Ubuntu 24.04 LTS | | CPU | 2 vCPU | 4 vCPU | | RAM | 4 GB | 8 GB | -| Диск | 50 GB SSD | 100+ GB SSD (отдельный том для PostgreSQL) | -| Сеть | Статический IP или DNS | TLS-сертификат (Let's Encrypt / внутренний CA) | +| Диск | 50 GB SSD | 100+ GB SSD | -**Порты:** - -| Порт | Назначение | -|------|------------| -| 443 | HTTPS (UI + API ingest) | -| 80 | Редирект на 443 (опционально) | - -PostgreSQL **не** публикуется наружу. +**Порты снаружи:** 443 (nginx), 80 (редирект). API `8000` — только `127.0.0.1`. PostgreSQL — только localhost. --- ## 2. Сетевые правила -**Исходящие с агентов:** - -- Linux (ssh-monitor) → `https://sac.example.com:443` -- Windows (RDP-monitor) → тот же URL - -**Исходящие с SAC:** - -- `api.telegram.org` (если Telegram) -- SMTP-сервер организации - -**Входящие на SAC:** - -- 443 от сетей, где расположены агенты и админы UI +**Агенты →** `https://sac.example.com/api/v1/events` +**SAC →** Telegram, SMTP (исходящие) +**Админы →** 443 (UI/API через nginx) --- -## 3. Вариант A: Docker Compose (рекомендуется) +## 3. Вариант A: Native (production) -Целевая структура (фаза 1): +Компоненты на хосте: -``` -deploy/ - docker-compose.yml - .env.example - nginx/ - sac.conf -``` +| Компонент | Как | +|-----------|-----| +| PostgreSQL 16 | `apt`, БД `sac` | +| SAC API | Python 3.12 venv, **systemd** `sac-api` | +| TLS / proxy | **nginx** | +| UI (позже) | static в `/var/www/sac/` | -Сервисы: +Полная инструкция: **[install-ubuntu-24.04-native.md](install-ubuntu-24.04-native.md)**. -- `postgres:16` -- `api` (FastAPI) -- `worker` (тот же образ, другая command) -- `nginx` (static + proxy) - -### 3.1. Установка Docker +Кратко: ```bash -sudo apt update -sudo apt install -y ca-certificates curl -# Официальная инструкция Docker CE для Ubuntu 24.04 -``` - -### 3.2. Конфигурация - -```bash -sudo mkdir -p /etc/security-alert-center -sudo cp deploy/.env.example /etc/security-alert-center/.env -sudo chmod 600 /etc/security-alert-center/.env -# Заполнить: POSTGRES_PASSWORD, JWT_SECRET, TELEGRAM_*, SAC_PUBLIC_URL -``` - -### 3.3. Запуск - -```bash -cd /opt/security-alert-center/deploy -sudo docker compose up -d -sudo docker compose exec api alembic upgrade head -``` - -### 3.4. Обновление - -```bash -git pull -sudo docker compose build -sudo docker compose up -d -sudo docker compose exec api alembic upgrade head +systemctl status sac-api +curl -sS http://127.0.0.1:8000/health +curl -sS https://sac.example.com/health ``` --- -## 4. Вариант B: Native systemd +## 4. Вариант B: Docker Compose (альтернатива) -Пакеты: - -```bash -sudo apt install -y postgresql nginx python3.12 python3.12-venv -``` - -- PostgreSQL: БД `sac`, пользователь `sac` -- venv в `/opt/security-alert-center/.venv` -- Units: `sac-api.service`, `sac-worker.service` -- Static UI в `/var/www/sac/` -- nginx site `/etc/nginx/sites-available/sac` - -Детальные unit-файлы — при реализации фазы 1. +См. [install-ubuntu-24.04-docker.md](install-ubuntu-24.04-docker.md) и `deploy/docker-compose.yml`. +**Не используется** для production KalinaMall. --- ## 5. TLS -- Публичный: **certbot** + nginx -- Внутренний: корпоративный CA, полный chain в nginx - -Агенты должны доверять CA (или `SAC_TLS_SKIP_VERIFY=1` только для dev — **запрещено в prod**). +- **certbot** + nginx (Let's Encrypt) +- Внутренний CA — сертификаты в nginx, доверие на агентах Windows/Linux --- -## 6. Резервное копирование - -### 6.1. Ежедневный pg_dump +## 6. Резервное копирование (native) ```bash -# /etc/cron.d/sac-backup (пример) -0 3 * * * postgres pg_dump -Fc sac > /var/backups/sac/sac_$(date +\%Y\%m\%d).dump +# /etc/cron.d/sac-backup +0 3 * * * postgres pg_dump -Fc -U sac sac > /var/backups/sac/sac_$(date +\%Y\%m\%d).dump ``` -Ротация: 14 daily + 4 weekly. - -### 6.2. Восстановление (тест раз в месяц) - -```bash -pg_restore -d sac_restored /var/backups/sac/sac_YYYYMMDD.dump -``` +Восстановление: `pg_restore -d sac_restored /var/backups/sac/sac_YYYYMMDD.dump` --- @@ -151,48 +94,25 @@ pg_restore -d sac_restored /var/backups/sac/sac_YYYYMMDD.dump | Задача | Периодичность | |--------|---------------| -| `unattended-upgrades` security | автоматически | -| Проверка диска PostgreSQL | еженедельно | -| Ротация логов nginx/app | logrotate | -| Проверка `/health` | каждые 5 мин (Uptime Kuma / cron) | -| Review Problems «хост мёртв» | ежедневно | +| `unattended-upgrades` | автоматически | +| `journalctl -u sac-api` | по инцидентам | +| `/health` | каждые 5 мин | | Тест restore БД | ежемесячно | --- -## 8. Мониторинг самого SAC +## 8. Обновление (native) -- `GET https://sac.example.com/health` → `200`, `"database": "ok"` -- Алерт если нет ingest с активного хоста > 90 мин (настраивается) -- Диск > 85% — алерт ОС - ---- - -## 9. Создание API key для хоста - -(После реализации UI) - -1. Войти как admin → Hosts → Add / Generate API key. -2. Скопировать ключ в `/etc/ssh-monitor.conf` или RDP-конфиг. -3. `UseSAC=exclusive`, перезапуск агента. -4. `--check-sac` на хосте. - ---- - -## 10. Чеклист первого prod-развёртывания - -- [ ] Ubuntu 24.04, hostname, DNS A-record -- [ ] TLS работает -- [ ] PostgreSQL backup настроен -- [ ] `.env` не в git, chmod 600 -- [ ] Создан admin-пользователь -- [ ] Telegram test notification -- [ ] Тестовый ingest с одного Linux и одного Windows -- [ ] Firewall: только нужные порты +```bash +cd /opt/security-alert-center && sudo -u sac git pull +sudo -u sac backend/.venv/bin/pip install -r backend/requirements.txt +sudo -u sac bash -c 'set -a; source /etc/security-alert-center/sac-api.env; set +a; cd backend && .venv/bin/alembic upgrade head' +sudo systemctl restart sac-api +``` --- ## См. также -- [TZ.md](TZ.md) §5, §9 +- [TZ.md](TZ.md) - [agent-integration.md](agent-integration.md) diff --git a/docs/install-ubuntu-24.04-docker.md b/docs/install-ubuntu-24.04-docker.md new file mode 100644 index 0000000..c2900d2 --- /dev/null +++ b/docs/install-ubuntu-24.04-docker.md @@ -0,0 +1,105 @@ +# Ubuntu 24.04 — установка SAC (Docker Compose) + +**Альтернативный** способ. В KalinaMall для production используется **[native](install-ubuntu-24.04-native.md)**. + +Docker удобен для локальной отладки или изолированного стенда. + +--- + +## 0. Исходные данные + +| Параметр | Пример | +|----------|--------| +| Каталог | `/opt/security-alert-center` | + +--- + +## 1. Базовая ОС и ufw + +Как в [native-руководстве](install-ubuntu-24.04-native.md) §1 (без PostgreSQL/nginx на хосте, если всё в контейнерах — nginx можно на хосте для TLS). + +--- + +## 2. Git и клон + +```bash +sudo apt install -y git +sudo git clone https://git.kalinamall.ru/PapaTramp/security-alert-center.git /opt/security-alert-center +sudo chown -R "$USER:$USER" /opt/security-alert-center +``` + +--- + +## 3. Docker Engine + Compose + +```bash +sudo apt install -y ca-certificates curl gnupg +sudo install -m 0755 -d /etc/apt/keyrings +curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg +sudo chmod a+r /etc/apt/keyrings/docker.gpg + +echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu noble stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + +sudo apt update +sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin +sudo usermod -aG docker "$USER" +# перелогиниться +docker compose version +``` + +--- + +## 4. Конфигурация + +```bash +sudo mkdir -p /etc/security-alert-center +cp /opt/security-alert-center/deploy/.env.example /etc/security-alert-center/.env +chmod 600 /etc/security-alert-center/.env +nano /etc/security-alert-center/.env +ln -sf /etc/security-alert-center/.env /opt/security-alert-center/deploy/.env +``` + +Заполнить: `POSTGRES_PASSWORD`, `JWT_SECRET`, `SAC_PUBLIC_URL`, `SAC_BOOTSTRAP_API_KEY`. + +--- + +## 5. Запуск + +```bash +cd /opt/security-alert-center/deploy +docker compose up -d --build +docker compose run --rm migrate +docker compose ps +curl -sS http://127.0.0.1:8000/health +``` + +--- + +## 6. Бэкап (Docker) + +```bash +sudo tee /etc/cron.d/sac-backup <<'EOF' +0 3 * * * root docker compose -f /opt/security-alert-center/deploy/docker-compose.yml exec -T postgres pg_dump -U sac -Fc sac > /var/backups/sac/sac_$(date +\%Y\%m\%d).dump +EOF +``` + +--- + +## 7. Обновление + +```bash +cd /opt/security-alert-center +git pull +cd deploy +docker compose build +docker compose up -d +docker compose run --rm migrate +``` + +--- + +## См. также + +- [install-ubuntu-24.04-native.md](install-ubuntu-24.04-native.md) — основной путь +- [../deploy/docker-compose.yml](../deploy/docker-compose.yml) diff --git a/docs/install-ubuntu-24.04-native.md b/docs/install-ubuntu-24.04-native.md new file mode 100644 index 0000000..a0fd879 --- /dev/null +++ b/docs/install-ubuntu-24.04-native.md @@ -0,0 +1,281 @@ +# Ubuntu 24.04 — установка SAC (native, без Docker) + +Пошаговое руководство: **PostgreSQL + Python venv + systemd + nginx**. +Рекомендуемый путь для production. + +--- + +## 0. Исходные данные + +| Параметр | Пример | +|----------|--------| +| FQDN | `sac.kalinin.example` | +| IP | `10.0.0.50` | +| Каталог | `/opt/security-alert-center` | +| Пользователь сервиса | `sac` | +| API только на localhost | `127.0.0.1:8000` | +| Снаружи | nginx → 443 → API | + +--- + +## 1. Базовая настройка ОС + +```bash +sudo apt update +sudo apt upgrade -y +sudo timedatectl set-timezone Europe/Moscow +``` + +### Firewall (ufw) + +```bash +sudo apt install -y ufw +sudo ufw default deny incoming +sudo ufw default allow outgoing +sudo ufw allow OpenSSH +sudo ufw allow 80/tcp +sudo ufw allow 443/tcp +sudo ufw enable +sudo ufw status verbose +``` + +--- + +## 2. Пакеты + +```bash +sudo apt install -y \ + git \ + postgresql \ + postgresql-contrib \ + nginx \ + python3.12 \ + python3.12-venv \ + python3-pip \ + jq \ + certbot \ + python3-certbot-nginx +``` + +Проверка: + +```bash +python3.12 --version +psql --version +nginx -v +``` + +--- + +## 3. Клонирование репозитория + +```bash +sudo mkdir -p /opt +sudo git clone https://git.kalinamall.ru/PapaTramp/security-alert-center.git /opt/security-alert-center +``` + +--- + +## 4. PostgreSQL + +Создать пользователя и БД (пароль сохраните для `.env`): + +```bash +sudo -u postgres psql <<'SQL' +CREATE USER sac WITH PASSWORD 'ЗАМЕНИТЕ_НА_ДЛИННЫЙ_ПАРОЛЬ'; +CREATE DATABASE sac OWNER sac; +GRANT ALL PRIVILEGES ON DATABASE sac TO sac; +SQL +``` + +PostgreSQL по умолчанию слушает `127.0.0.1` — для SAC этого достаточно. +Проверка: + +```bash +psql "postgresql://sac@127.0.0.1/sac" -c 'SELECT 1' +``` + +Каталог бэкапов: + +```bash +sudo mkdir -p /var/backups/sac +sudo chown postgres:postgres /var/backups/sac +``` + +--- + +## 5. Пользователь `sac` и Python venv + +```bash +sudo useradd --system --home /opt/security-alert-center --shell /usr/sbin/nologin sac || true +sudo chown -R sac:sac /opt/security-alert-center + +cd /opt/security-alert-center/backend +sudo -u sac python3.12 -m venv .venv +sudo -u sac .venv/bin/pip install --upgrade pip +sudo -u sac .venv/bin/pip install -r requirements.txt +``` + +--- + +## 6. Конфигурация `/etc/security-alert-center` + +```bash +sudo mkdir -p /etc/security-alert-center +sudo chmod 750 /etc/security-alert-center +sudo cp /opt/security-alert-center/deploy/env.native.example /etc/security-alert-center/sac-api.env +sudo chmod 600 /etc/security-alert-center/sac-api.env +sudo nano /etc/security-alert-center/sac-api.env +``` + +Обязательно задать: + +- `DATABASE_URL` — с паролем PostgreSQL из шага 4 +- `JWT_SECRET` — `openssl rand -hex 32` +- `SAC_PUBLIC_URL` — `https://sac.kalinin.example` (как будет с nginx) +- `SAC_BOOTSTRAP_API_KEY` — `python3.12 -c "import secrets; print('sac_'+secrets.token_urlsafe(32))"` +- `EVENT_SCHEMA_PATH=/opt/security-alert-center/schemas/event-schema-v1.json` + +--- + +## 7. Миграции БД + +```bash +cd /opt/security-alert-center/backend +sudo -u sac bash -c 'set -a; source /etc/security-alert-center/sac-api.env; set +a; .venv/bin/alembic upgrade head' +``` + +--- + +## 8. systemd + +```bash +sudo cp /opt/security-alert-center/deploy/systemd/sac-api.service /etc/systemd/system/ +sudo systemctl daemon-reload +sudo systemctl enable sac-api +sudo systemctl start sac-api +sudo systemctl status sac-api --no-pager +``` + +Логи: + +```bash +journalctl -u sac-api -f +``` + +--- + +## 9. nginx и TLS + +```bash +sudo cp /opt/security-alert-center/deploy/nginx/sac.conf.example /etc/nginx/sites-available/sac +sudo ln -sf /etc/nginx/sites-available/sac /etc/nginx/sites-enabled/sac +# убрать default при необходимости: sudo rm /etc/nginx/sites-enabled/default +sudo nginx -t +sudo systemctl reload nginx +``` + +В `sac.conf` замените `server_name` на ваш FQDN. + +Let's Encrypt: + +```bash +sudo certbot --nginx -d sac.kalinin.example +``` + +--- + +## 10. Проверка + +Локально на сервере: + +```bash +curl -sS http://127.0.0.1:8000/health | jq . +``` + +Через nginx (после TLS): + +```bash +curl -sS https://sac.kalinin.example/health | jq . +``` + +Тест ingest (подставьте `SAC_BOOTSTRAP_API_KEY`): + +```bash +API_KEY="ваш_ключ_из_sac-api.env" +curl -sS -X POST http://127.0.0.1:8000/api/v1/events \ + -H "Authorization: Bearer ${API_KEY}" \ + -H "Content-Type: application/json" \ + -d '{ + "schema_version": "1.0", + "event_id": "00000000-0000-4000-8000-000000000002", + "occurred_at": "2026-05-26T12:00:00+03:00", + "source": {"product": "ssh-monitor", "product_version": "test"}, + "host": {"hostname": "test-host", "os_family": "linux"}, + "category": "agent", + "type": "agent.test", + "severity": "info", + "title": "Test", + "summary": "Native install check" + }' +``` + +Ожидается HTTP **202** и `"status": "accepted"`. + +--- + +## 11. Резервное копирование + +```bash +sudo tee /etc/cron.d/sac-backup <<'EOF' +0 3 * * * postgres pg_dump -Fc -U sac sac > /var/backups/sac/sac_$(date +\%Y\%m\%d).dump +EOF +``` + +Для `pg_dump` без пароля в cron настройте `~postgres/.pgpass` (см. документацию PostgreSQL). + +--- + +## 12. Обновление SAC + +```bash +cd /opt/security-alert-center +sudo -u sac git pull +sudo -u sac backend/.venv/bin/pip install -r backend/requirements.txt +sudo -u sac bash -c 'set -a; source /etc/security-alert-center/sac-api.env; set +a; cd backend && .venv/bin/alembic upgrade head' +sudo systemctl restart sac-api +``` + +--- + +## 13. Чеклист + +- [ ] Ubuntu 24.04, timezone +- [ ] ufw: 22, 80, 443 +- [ ] PostgreSQL: БД `sac`, пользователь `sac` +- [ ] venv, зависимости установлены +- [ ] `/etc/security-alert-center/sac-api.env`, chmod 600 +- [ ] `alembic upgrade head` без ошибок +- [ ] `sac-api` active (systemd) +- [ ] nginx + TLS +- [ ] `/health` ok, ingest 202 +- [ ] cron backup + +--- + +## 14. Устранение неполадок + +| Симптом | Действие | +|---------|----------| +| `database: error` | `journalctl -u sac-api`; проверить `DATABASE_URL`, `systemctl status postgresql` | +| 401 ingest | ключ в `Authorization: Bearer`; проверить `SAC_BOOTSTRAP_API_KEY` | +| 502 от nginx | API не слушает: `ss -lntp \| grep 8000`, `systemctl restart sac-api` | +| Schema errors 422 | путь `EVENT_SCHEMA_PATH`, наличие файла schema | + +--- + +## См. также + +- [install-ubuntu-24.04.md](install-ubuntu-24.04.md) — указатель +- [install-ubuntu-24.04-docker.md](install-ubuntu-24.04-docker.md) — альтернатива (не prod) +- [deployment.md](deployment.md) diff --git a/docs/install-ubuntu-24.04.md b/docs/install-ubuntu-24.04.md index 6b2fff4..8ea46d2 100644 --- a/docs/install-ubuntu-24.04.md +++ b/docs/install-ubuntu-24.04.md @@ -1,277 +1,24 @@ -# Подготовка сервера Ubuntu 24.04 для Security Alert Center +# Подготовка сервера Ubuntu 24.04 для SAC -Пошаговое руководство: установка софта на **чистый** или обновлённый хост перед развёртыванием SAC. -Целевой способ запуска — **Docker Compose** (рекомендуется). В конце — проверка и ссылка на [deployment.md](deployment.md). +В эксплуатации KalinaMall используется **только native** (без Docker): PostgreSQL, Python venv, systemd, nginx. ---- +## Руководства -## 0. Исходные данные +| Путь | Когда использовать | +|------|-------------------| +| **[install-ubuntu-24.04-native.md](install-ubuntu-24.04-native.md)** | **Основной** — подготовка и запуск SAC | +| [install-ubuntu-24.04-docker.md](install-ubuntu-24.04-docker.md) | Альтернатива (Docker Compose), не для prod | -Запишите до начала: - -| Параметр | Пример | -|----------|--------| -| FQDN | `sac.kalinin.example` | -| IP | `10.0.0.50` | -| Пользователь sudo | `deploy` | -| Каталог установки | `/opt/security-alert-center` | - ---- - -## 1. Базовая настройка ОС +## Быстрый старт (native) ```bash -sudo apt update -sudo apt upgrade -y -sudo timedatectl set-timezone Europe/Moscow # или ваша IANA-зона -timedatectl status -``` - -Опционально — hostname: - -```bash -sudo hostnamectl set-hostname sac-01 -``` - -### 1.1. Firewall (ufw) - -```bash -sudo apt install -y ufw -sudo ufw default deny incoming -sudo ufw default allow outgoing -sudo ufw allow OpenSSH -sudo ufw allow 80/tcp -sudo ufw allow 443/tcp -sudo ufw enable -sudo ufw status verbose -``` - -SSH оставьте только с доверенных подсетей, если политика безопасности требует: - -```bash -# пример: только внутренняя сеть -# sudo ufw allow from 10.0.0.0/8 to any port 22 -``` - ---- - -## 2. Установка Git - -```bash -sudo apt install -y git -git --version -``` - -Клонирование (после доступа к репозиторию): - -```bash -sudo mkdir -p /opt +# см. полный чеклист в native-руководстве +sudo apt update && sudo apt install -y git postgresql nginx python3.12 python3.12-venv sudo git clone https://git.kalinamall.ru/PapaTramp/security-alert-center.git /opt/security-alert-center -sudo chown -R "$USER:$USER" /opt/security-alert-center +# … PostgreSQL, venv, /etc/security-alert-center/sac-api.env, systemd, nginx ``` ---- - -## 3. Установка Docker Engine + Compose plugin - -Официальный репозиторий Docker для Ubuntu 24.04 (noble): - -```bash -sudo apt install -y ca-certificates curl gnupg -sudo install -m 0755 -d /etc/apt/keyrings -curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg -sudo chmod a+r /etc/apt/keyrings/docker.gpg - -echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu noble stable" | \ - sudo tee /etc/apt/sources.list.d/docker.list > /dev/null - -sudo apt update -sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -``` - -Добавить пользователя в группу `docker` (перелогиниться после): - -```bash -sudo usermod -aG docker "$USER" -``` - -Проверка: - -```bash -docker --version -docker compose version -sudo docker run --rm hello-world -``` - ---- - -## 4. Каталоги данных и конфигурации - -```bash -sudo mkdir -p /etc/security-alert-center -sudo mkdir -p /var/lib/sac/postgres -sudo mkdir -p /var/backups/sac -sudo chown -R "$USER:docker" /var/lib/sac -``` - -Права на секреты: - -```bash -sudo chmod 750 /etc/security-alert-center -``` - ---- - -## 5. Конфигурация SAC (.env) - -```bash -cd /opt/security-alert-center/deploy -cp .env.example /etc/security-alert-center/.env -chmod 600 /etc/security-alert-center/.env -nano /etc/security-alert-center/.env -``` - -Обязательно задать (см. комментарии в `.env.example`): - -- `POSTGRES_PASSWORD` — длинный случайный пароль -- `JWT_SECRET` — `openssl rand -hex 32` -- `SAC_PUBLIC_URL` — публичный URL, например `https://sac.kalinin.example` -- `SAC_ADMIN_PASSWORD` — пароль первого admin (только первый запуск) - -Симлинк для compose (удобно): - -```bash -ln -sf /etc/security-alert-center/.env /opt/security-alert-center/deploy/.env -``` - ---- - -## 6. Первый запуск SAC - -```bash -cd /opt/security-alert-center/deploy -docker compose build -docker compose up -d --build -docker compose run --rm migrate -docker compose ps -``` - -Проверка health (пока без TLS — с хоста): - -```bash -curl -sS http://127.0.0.1:8000/health | jq . -``` - -Ожидается JSON с `"status": "ok"` и `"database": "ok"`. - -Тест ingest (подставьте ключ из `.env` — `SAC_BOOTSTRAP_API_KEY` или созданный в UI): - -```bash -curl -sS -X POST http://127.0.0.1:8000/api/v1/events \ - -H "Authorization: Bearer ВАШ_API_KEY" \ - -H "Content-Type: application/json" \ - -d '{ - "schema_version": "1.0", - "event_id": "00000000-0000-4000-8000-000000000001", - "occurred_at": "2026-05-26T12:00:00+03:00", - "source": {"product": "ssh-monitor", "product_version": "test"}, - "host": {"hostname": "test-host", "os_family": "linux"}, - "category": "agent", - "type": "agent.test", - "severity": "info", - "title": "Test", - "summary": "Install check" - }' -``` - ---- - -## 7. Nginx и TLS (production) - -Установка nginx на хосте **или** использование контейнера из `docker compose` (см. `deploy/docker-compose.yml`). - -### 7.1. Certbot (Let's Encrypt), если есть публичный DNS - -```bash -sudo apt install -y nginx certbot python3-certbot-nginx -# после настройки server_name в nginx: -sudo certbot --nginx -d sac.kalinin.example -``` - -### 7.2. Внутренний CA - -Используйте корпоративный сертификат в `deploy/nginx/certs/` и смонтируйте в compose. -Агентам (ssh-monitor / Windows) нужно доверять этому CA. - ---- - -## 8. Автозапуск после перезагрузки - -Docker Compose с `restart: unless-stopped` в `docker-compose.yml` — сервисы поднимутся сами. - -Проверка: - -```bash -sudo reboot -# после входа: -docker compose -f /opt/security-alert-center/deploy/docker-compose.yml ps -``` - ---- - -## 9. Резервное копирование PostgreSQL - -```bash -sudo tee /etc/cron.d/sac-backup <<'EOF' -0 3 * * * root docker compose -f /opt/security-alert-center/deploy/docker-compose.yml exec -T postgres pg_dump -U sac -Fc sac > /var/backups/sac/sac_$(date +\%Y\%m\%d).dump -EOF -``` - -Ротация старых дампов — `logrotate` или скрипт по политике (14 daily). - ---- - -## 10. Обновление SAC - -```bash -cd /opt/security-alert-center -git pull -cd deploy -docker compose build -docker compose up -d -docker compose exec api alembic upgrade head -``` - ---- - -## 11. Чеклист готовности сервера - -- [ ] Ubuntu 24.04, время и timezone верные -- [ ] ufw: 22 (по политике), 80, 443 -- [ ] Docker и compose работают -- [ ] Репозиторий в `/opt/security-alert-center` -- [ ] `/etc/security-alert-center/.env` заполнен, chmod 600 -- [ ] `docker compose up` — все контейнеры healthy -- [ ] `GET /health` — ok -- [ ] Тестовый `POST /api/v1/events` — 202 -- [ ] TLS настроен (prod) -- [ ] cron backup - ---- - -## 12. Устранение неполадок - -| Симптом | Действие | -|---------|----------| -| `database: error` в /health | `docker compose logs postgres api`, проверить `DATABASE_URL` | -| 401 на ingest | неверный API key; см. `SAC_BOOTSTRAP_API_KEY` в .env | -| Нет места на диске | `df -h`, очистка journal/docker: `docker system prune` | -| Порт 8000 занят | изменить mapping в compose или остановить конфликтующий сервис | - ---- - ## См. также -- [deployment.md](deployment.md) — архитектура, порты, эксплуатация -- [agent-integration.md](agent-integration.md) — настройка агентов после поднятия SAC -- [TZ.md](TZ.md) — требования +- [deployment.md](deployment.md) +- [../deploy/README.md](../deploy/README.md) diff --git a/docs/work-plan.md b/docs/work-plan.md index e014e04..b4a8df2 100644 --- a/docs/work-plan.md +++ b/docs/work-plan.md @@ -38,7 +38,7 @@ | 1B.1 | Scaffold backend FastAPI | 🔄 | | 1B.2 | PostgreSQL + Alembic (hosts, events, api_keys) | 🔄 | | 1B.3 | `POST /api/v1/events`, `GET /health` | 🔄 | -| 1B.4 | docker-compose + [install-ubuntu-24.04.md](install-ubuntu-24.04.md) | 🔄 | +| 1B.4 | systemd + nginx + [install-ubuntu-24.04-native.md](install-ubuntu-24.04-native.md) | 🔄 | | 1B.5 | Валидация JSON Schema v1 | ⏳ | **Выход:** сервер Ubuntu принимает события от curl и от агентов в `dual`.