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.