CloudTAK — вебнативний наступник застарілого TAK Server на Java: застосунок на Node.js, що надає доступ до екосистеми ATAK та WinTAK з будь-якого браузера без встановлення клієнтської Java чи складного управління keystore. Якщо застарілий TAK Server був масивним Java EE-застосунком, створеним для стаціонарних дата-центрів, то CloudTAK є контейнерним, REST-нативним і може бути розгорнутий на одній хмарній ВМ менш ніж за годину. Цей посібник охоплює повний шлях від чистого сервера до захищеної, готової до бойового застосування TAK-інфраструктури — включно з інтеграцією ШІ-копілота TAKpilot від Corvus Intelligence.

Що таке CloudTAK і чим він відрізняється від застарілого TAK Server

Застарілий TAK Server (також відомий як FreeTAKServer у спільноті) був побудований як Java EE-застосунок, що надавав федерацію CoT через TCP/TLS та обмежений REST API, доданий пізніше. Для роботи з ним потрібна Java 11 або новіша, Java keystore (.jks) для управління сертифікатами та або Tomcat-контейнер, або окремий JAR. Тільки підготовка сертифікатів — генерація CA, серверного сертифіката і сертифікатів для кожного клієнта з наступним імпортом у правильний keystore — зазвичай займає в оператора-початківця кілька годин і є частою причиною збоїв при розгортанні.

CloudTAK обирає інший архітектурний підхід. Сервер написаний на TypeScript/Node.js, зберігає дані в PostgreSQL із просторовим розширенням PostGIS і надає всі можливості через REST API з документацією OpenAPI. Веб-інтерфейс є повноцінним TAK-клієнтом — оператори без пристроїв Android із підтримкою ATAK можуть переглядати тактичну картину та взаємодіяти з нею з будь-якого браузера. Управління TLS-сертифікатами використовує стандартні PEM-файли замість Java keystores, що забезпечує сумісність із Let's Encrypt та стандартними PKI-інструментами.

Функціональні відмінності, що мають значення на практиці:

  • Вебнативний TAK-клієнт — оператори на ноутбуках, передових командних пунктах та робочих станціях SOC мають доступ до картини без встановлення ATAK або WinTAK.
  • Пріоритет REST API — прийом CoT, управління пакетами даних, адміністрування користувачів і налаштування федерації реалізовані через API, що дозволяє автоматизацію та інтеграцію із зовнішніми системами.
  • Контейнерне розгортання — один файл Docker Compose запускає повний стек; не потрібна Java-рантайм, Tomcat чи keystore-конфігурація.
  • Повна сумісність із ATAK/WinTAK — існуючі клієнти ATAK і WinTAK підключаються до CloudTAK так само, як до застарілого TAK Server, на порту 8089 TCP/TLS. Змін на стороні клієнта не потрібно.

Передумови: інфраструктура, домени та порти

Перш ніж розгортати CloudTAK, переконайтеся, що виконані такі передумови.

Вимоги до сервера

Мінімальне розгортання, що підтримує до 100 одночасних клієнтів ATAK, потребує:

  • 2 vCPU, 4 ГБ ОЗП, 20 ГБ SSD (ОС + контейнери + база даних)
  • Ubuntu 22.04 LTS або RHEL 9 (протестовані дистрибутиви)
  • Docker Engine 24+ та Docker Compose v2
  • Статична публічна IP-адреса або DNS A-запис, що вказує на сервер

Для 500+ одночасних клієнтів або середовищ з інтенсивним потоком CoT (UAV-канали, рої дронів із частотою звітування 1 Гц) збільшіть до 4–8 vCPU та 8–16 ГБ ОЗП. При масштабуванні вузьким місцем стає I/O PostgreSQL — використовуйте NVMe SSD або керований сервіс бази даних замість спільного сховища.

Вимоги до портів

Відкрийте наступні порти у групі безпеки хмари або брандмауері хоста для вхідного трафіку з діапазонів IP клієнтів:

Порт Протокол Призначення
8089 TCP/TLS CoT-потік — підключення клієнтів ATAK та WinTAK
8443 HTTPS Веб-інтерфейс, REST API, WebSocket-канали
8446 HTTPS TAK-канали даних та розповсюдження пакетів місій
9000 TCP/TLS Федерація з іншими екземплярами TAK-сервера (якщо використовується)

TLS-сертифікат

Отримайте TLS-сертифікат для імені хоста, до якого підключатимуться клієнти ATAK, перед початком розгортання. Варіанти:

  • Let's Encrypt — безкоштовно, автоматичне оновлення через certbot; підходить для розгортань із доступом до інтернету та резольованим доменом.
  • PKI організації — видайте від внутрішнього CA, якщо працюєте в закритій мережі або потрібне прив'язування сертифіката до конкретного кореневого вузла довіри.
  • Комерційний CA — стандартний DV- або OV-сертифікат, якщо Let's Encrypt недоступний у середовищі розгортання.

Помістіть ланцюжок сертифікатів (fullchain.pem) та приватний ключ (privkey.pem) до /opt/cloudtak/ssl/ перш ніж продовжувати.

Покрокове розгортання Docker Compose

Створіть структуру директорій та файл Compose:

mkdir -p /opt/cloudtak/{ssl,data,logs}
cd /opt/cloudtak

# Скопіюйте TLS-сертифікат та ключ
cp /etc/letsencrypt/live/tak.yourdomain.com/fullchain.pem ssl/
cp /etc/letsencrypt/live/tak.yourdomain.com/privkey.pem ssl/

Створіть /opt/cloudtak/.env із змінними середовища:

# /opt/cloudtak/.env
CLOUDTAK_DOMAIN=tak.yourdomain.com
CLOUDTAK_VERSION=latest

# PostgreSQL
POSTGRES_DB=cloudtak
POSTGRES_USER=cloudtak
POSTGRES_PASSWORD=change_this_strong_password_32chars

# TLS
SSL_CERT_PATH=/ssl/fullchain.pem
SSL_KEY_PATH=/ssl/privkey.pem

# Безпека
CLOUDTAK_ADMIN_PASSWORD=change_this_admin_password
CLOUDTAK_JWT_SECRET=generate_64_char_random_string_here
CLOUDTAK_MTLS=false          # Встановіть true після видачі клієнтських сертифікатів
CLOUDTAK_AUDIT_LOG=true

# Продуктивність
DB_POOL_MAX=20
CLOUDTAK_COT_RATE_LIMIT=100  # Макс. CoT-подій/сек на клієнта
COT_RETENTION_HOURS=72       # Зберігати треки 72 години

Створіть /opt/cloudtak/docker-compose.yml:

version: '3.9'

services:
  postgres:
    image: postgis/postgis:15-3.3
    container_name: cloudtak-postgres
    restart: unless-stopped
    environment:
      POSTGRES_DB: ${POSTGRES_DB}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
    volumes:
      - ./data/postgres:/var/lib/postgresql/data
    networks:
      - cloudtak-internal
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
      interval: 10s
      timeout: 5s
      retries: 5

  cloudtak:
    image: ghcr.io/tak-ps/cloudtak:${CLOUDTAK_VERSION}
    container_name: cloudtak
    restart: unless-stopped
    depends_on:
      postgres:
        condition: service_healthy
    ports:
      - "8089:8089"   # CoT-потік (клієнти ATAK/WinTAK)
      - "8443:8443"   # HTTPS веб-інтерфейс + REST API
      - "8446:8446"   # TAK-канали + пакети місій
    environment:
      DATABASE_URL: postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres:5432/${POSTGRES_DB}
      DOMAIN: ${CLOUDTAK_DOMAIN}
      SSL_CERT: ${SSL_CERT_PATH}
      SSL_KEY: ${SSL_KEY_PATH}
      ADMIN_PASSWORD: ${CLOUDTAK_ADMIN_PASSWORD}
      JWT_SECRET: ${CLOUDTAK_JWT_SECRET}
      MTLS: ${CLOUDTAK_MTLS}
      AUDIT_LOG: ${CLOUDTAK_AUDIT_LOG}
      DB_POOL_MAX: ${DB_POOL_MAX}
      COT_RATE_LIMIT: ${CLOUDTAK_COT_RATE_LIMIT}
      COT_RETENTION_HOURS: ${COT_RETENTION_HOURS}
    volumes:
      - ./ssl:/ssl:ro
      - ./data/cloudtak:/data
      - ./logs:/var/log/cloudtak
    networks:
      - cloudtak-internal
      - cloudtak-external

networks:
  cloudtak-internal:
    driver: bridge
    internal: true
  cloudtak-external:
    driver: bridge

Запустіть стек:

cd /opt/cloudtak
docker compose up -d

# Стежте за логами запуску — CloudTAK ініціалізує схему бази даних при першому старті
docker compose logs -f cloudtak

Після успішного запуску у логах має з'явитися CloudTAK listening on :8089 (CoT), :8443 (HTTPS), :8446 (feeds). Перейдіть до https://tak.yourdomain.com:8443/admin та увійдіть із паролем адміністратора з файлу .env.

Конфігурація: пакети даних, користувачі та федерація

Генерація клієнтських пакетів даних

Клієнти ATAK та WinTAK підключаються до CloudTAK шляхом імпорту пакету даних — файлу .zip, що попередньо налаштовує адресу сервера, порт, TLS-сертифікат і облікові дані. Створюйте пакети через UI адміністратора: Адміністратор → З'єднання → Створити пакет, або через REST API:

# Створення пакету даних для нового користувача
curl -s -X POST https://tak.yourdomain.com:8443/api/package/generate \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "username": "operator01",
    "callsign": "ALPHA-1",
    "team": "Red",
    "role": "Team Member"
  }' \
  -o operator01-connection.zip

Завантажте .zip на пристрій ATAK (через USB, імпортер пакетів ATAK або MDM). ATAK обробить пакет і автоматично встановить TCP/TLS-підключення до порту 8089.

Управління користувачами

CloudTAK підтримує три режими автентифікації, які можна налаштовувати незалежно:

  • Локальні облікові записи — керуються через API адміністратора. Підходять для невеликих розгортань або ізольованих мереж без наявного каталогового сервісу.
  • LDAP / Active Directory — налаштовується через змінні середовища LDAP_URL, LDAP_BIND_DN та LDAP_BASE_DN. Користувачі автентифікуються з наявними обліковими даними домену.
  • На основі сертифікатів (mTLS) — кожен клієнтський пристрій має унікальний клієнтський сертифікат, підписаний CA розгортання. Встановіть CLOUDTAK_MTLS=true та вкажіть CA_CERT_PATH. Це кращий режим для бойових середовищ.

Федеративні зв'язки

Федерація дозволяє двом екземплярам CloudTAK (або CloudTAK та застарілому TAK Server) обмінюватись потоками CoT-подій у двох напрямках. Налаштуйте федерацію через REST API:

curl -s -X POST https://tak.yourdomain.com:8443/api/federation \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "HQ-TAK-Server",
    "address": "tak.hq.example.mil",
    "port": 9000,
    "protocol": "tls",
    "ca_cert": "/ssl/hq-ca.pem",
    "bidirectional": true
  }'

Федеративні події передаються в обох напрямках: підрозділи на віддаленому сервері відображаються на карті CloudTAK і навпаки. Федерація використовує взаємний TLS — обміняйтеся сертифікатами CA з адміністратором віддаленого сервера перед налаштуванням зв'язку.

Захист: прив'язування TLS, брандмауер, автентифікація та аудит-логування

Примітка щодо оперативної безпеки: Екземпляр CloudTAK зі стандартними обліковими даними, самопідписаним сертифікатом та відкритими портами є серйозною розвідувальною вразливістю. Кожне розгортання CloudTAK, що обслуговує бойові підрозділи, має пройти описані нижче кроки захисту перед підключенням польових пристроїв.

Прив'язування TLS-сертифіката

Прив'язування сертифіката обмежує клієнтів прийняттям лише сертифікатів від конкретного CA, запобігаючи атакам типу «людина посередині», що підставляють інший дійсний сертифікат. Для CloudTAK прив'язування реалізується на рівні клієнта: при генерації пакетів клієнтських даних включіть відбиток CA-сертифіката, щоб ATAK відхиляв підключення з сертифікатами від будь-якого іншого CA. У генераторі пакетів даних встановіть "pin_ca": true — це вбудовує відбиток CA у профіль підключення ATAK.

Правила брандмауера

Обмежте вхідний доступ лише до діапазонів IP, яким легітимно потрібний доступ до кожного порту:

# Приклад правил iptables — адаптуйте діапазони IP під своє розгортання
# Дозволити CoT (8089) лише з відомих діапазонів IP пристроїв ATAK
iptables -A INPUT -p tcp --dport 8089 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 8089 -j DROP

# Дозволити HTTPS (8443) з підмереж оперативного персоналу
iptables -A INPUT -p tcp --dport 8443 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 8443 -s 192.168.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 8443 -j DROP

# Дозволити канали (8446) лише з пристроїв ATAK
iptables -A INPUT -p tcp --dport 8446 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 8446 -j DROP

# Федерація (9000) лише з відомих однорангових TAK-серверів
iptables -A INPUT -p tcp --dport 9000 -s 198.51.100.0/32 -j ACCEPT
iptables -A INPUT -p tcp --dport 9000 -j DROP

# Зберегти правила
iptables-save > /etc/iptables/rules.v4

Аудит-логування

При CLOUDTAK_AUDIT_LOG=true CloudTAK записує структуровані JSON-події аудиту до /var/log/cloudtak/audit.log. Кожен запис фіксує: мітку часу, IP клієнта, ім'я користувача (або CN сертифіката для mTLS), тип події (auth, connection, cot_ingest, package_download) та результат (success/failure). Надсилайте ці логи до SIEM через Filebeat або Fluentd — збої автентифікації та несподівані джерела підключень мають генерувати сповіщення.

Інтеграція ШІ-копілота TAKpilot

TAKpilot — ШІ-копілот Corvus Intelligence для тактичних операцій на основі TAK. Він працює як мікросервіс Node.js поряд із CloudTAK, підписується на потік CoT-подій через WebSocket API CloudTAK, виконує ШІ-інференцію (аналіз загрозливих патернів, оцінка паттернів поведінки, оптимізація маршрутів, кореляція SIGINT) та публікує результати назад як CoT-події, що відображаються на всіх підключених клієнтах ATAK/WinTAK та у веб-інтерфейсі CloudTAK.

Додавання TAKpilot до стека Docker Compose

Додайте таке визначення сервісу до наявного docker-compose.yml у розділі services::

  takpilot:
    image: ghcr.io/corvus-intelligence/takpilot:latest
    container_name: takpilot
    restart: unless-stopped
    depends_on:
      - cloudtak
    environment:
      # Підключення до CloudTAK
      CLOUDTAK_API_URL: https://cloudtak:8443
      CLOUDTAK_WS_URL: wss://cloudtak:8443/api/events
      CLOUDTAK_API_TOKEN: ${TAKPILOT_CLOUDTAK_TOKEN}

      # API-ключ TAKpilot (видається Corvus Intelligence)
      TAKPILOT_API_KEY: ${TAKPILOT_API_KEY}

      # Конфігурація ШІ-інференції
      TAKPILOT_THREAT_DETECTION: "true"
      TAKPILOT_PATTERN_OF_LIFE: "true"
      TAKPILOT_ROUTE_OPTIMIZATION: "true"
      TAKPILOT_SIGINT_CORRELATION: "false"   # Увімкніть при підключенні SIGINT-каналу

      # Вивід: публікація результатів ШІ як CoT-подій назад до CloudTAK
      TAKPILOT_COT_OUTPUT: "true"
      TAKPILOT_COT_CALLSIGN_PREFIX: "AI-"
    networks:
      - cloudtak-internal

Додайте дві нові змінні до файлу .env:

# TAKpilot (отримайте API-ключ на https://corvusintell.com/takpilot/)
TAKPILOT_API_KEY=your_takpilot_api_key_here
TAKPILOT_CLOUDTAK_TOKEN=generate_via_cloudtak_admin_api

Згенеруйте TAKPILOT_CLOUDTAK_TOKEN через API адміністратора CloudTAK:

curl -s -X POST https://tak.yourdomain.com:8443/api/token \
  -H "Authorization: Bearer $ADMIN_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "takpilot-service",
    "scopes": ["cot:read", "cot:write", "events:subscribe"]
  }' | jq -r '.token'

Перезапустіть стек командою docker compose up -d. TAKpilot підключиться до WebSocket-каналу CloudTAK і почне публікувати CoT-події на основі ШІ протягом секунд. Результати ШІ з'являються на карті ATAK з префіксом позивного AI-, відрізняючи їх від треків, наданих із місця подій.

Налаштування продуктивності: підключення, збереження треків та обмеження швидкості

Стандартна конфігурація CloudTAK є консервативною і підходить для тестування. Бойові розгортання потребують налаштування трьох основних параметрів.

Пул підключень до бази даних

Кожен одночасний клієнт ATAK, що генерує CoT-події, використовує підключення до бази даних для збереження треків. Стандартне DB_POOL_MAX=10 швидко вичерпується під навантаженням. Орієнтовно встановіть DB_POOL_MAX рівним 20–30% від очікуваної кількості одночасних клієнтів, але не менше 20. Також збільшіть власне значення max_connections PostgreSQL відповідно — додайте монтування тому із власним postgresql.conf:

# Доповнення /opt/cloudtak/data/postgresql.conf
max_connections = 200
shared_buffers = 512MB
effective_cache_size = 1536MB
work_mem = 4MB
maintenance_work_mem = 64MB

Обмеження швидкості CoT

CLOUDTAK_COT_RATE_LIMIT обмежує кількість CoT-подій на секунду, що приймаються від одного клієнта. Стандартне значення — 100 подій/сек, що достатньо для піхотних підрозділів та наземних транспортних засобів, але може бути недостатнім для UAV-навантажень, що публікують відеометадані з високою частотою. Збільшіть до 500–1000 для інтеграції UAV або налаштуйте обмеження швидкості для окремих клієнтів через API адміністратора, надаючи UAV-каналам вищі ліміти без підвищення глобального порога.

Збереження треків

COT_RETENTION_HOURS контролює, як довго історичні треки зберігаються в базі даних PostgreSQL. Стандартні 72 години є розумними для більшості операцій. Для тривалих операцій спостереження або вимог до криміналістичного відтворення збільшіть до 168 (7 днів) або 720 (30 днів) — але стежте за використанням дискового простору, оскільки насичене розгортання може генерувати кілька гігабайтів даних треків на день. Використовуйте CLOUDTAK_TRACK_ARCHIVE=true для експорту старих треків до S3-сумісного об'єктного сховища перед видаленням.

Поширені проблеми та усунення несправностей

Клієнт ATAK негайно показує «Connection Failed». Перевірте, що порт 8089 відкритий у брандмауері/групі безпеки: nc -zv tak.yourdomain.com 8089. Якщо підключення відхилено — порт заблоковано. Якщо час очікування вичерпано — сервіс не слухає: перевірте docker compose ps, що контейнер CloudTAK запущено, та docker compose logs cloudtak | grep 8089, що слухач запустився.

TLS-сертифікат відхилено ATAK. ATAK перевіряє відповідність CN або Subject Alternative Name (SAN) серверного сертифіката імені хоста у профілі підключення. Поширена помилка — генерація сертифіката для tak.yourdomain.com, але підключення через IP-адресу, або навпаки. Перевірте SAN командою: openssl x509 -in ssl/fullchain.pem -text | grep -A1 "Subject Alternative".

Вичерпання пулу підключень до бази даних (помилка: "remaining connection slots reserved"). Збільшіть DB_POOL_MAX у файлі .env та збільшіть max_connections у postgresql.conf. Перезапустіть обидва сервіси. Моніторте командою: docker exec cloudtak-postgres psql -U cloudtak -c "SELECT count(*) FROM pg_stat_activity;".

CoT-події відображаються на сервері, але не у клієнтів ATAK. Це майже завжди проблема розсинхронізації годинника. CoT-події несуть поріг мітки часу stale — якщо годинник сервера більш ніж на 5 хвилин випереджає клієнтський, події відкидаються як застарілі. Переконайтеся, що NTP налаштований як на сервері, так і на клієнтських пристроях: timedatectl status на сервері та перевірте налаштування синхронізації часу Android на клієнтських пристроях.

TAKpilot не публікує ШІ-події. Перевірте логи TAKpilot: docker compose logs takpilot. Поширені причини: недійсний API-ключ (зверніться до підтримки Corvus Intelligence), неправильно налаштований CLOUDTAK_API_URL (переконайтеся, що використовується ім'я сервісу контейнера cloudtak, а не зовнішнє ім'я хоста, оскільки обидва контейнери знаходяться в одній мережі Docker) або недостатні обсяги токена (токен повинен мати область cot:write).

Висока використання пам'яті через кілька днів. Накопичення треків у пам'яті є найпоширенішою причиною. Переконайтеся, що COT_RETENTION_HOURS встановлено в розумне значення та що завдання очищення PostgreSQL виконується. Перевірте статус завдання очищення через API адміністратора CloudTAK: GET /api/admin/jobs. Якщо завдання очищення не виконувалось, запустіть його вручну: POST /api/admin/jobs/cleanup.