Skip to content

Commit ff2ee3a

Browse files
feat: bundle XTM One in the default stack
Adds XTM One alongside OpenCTI in the default compose: - New pgsql-copilot service (pgvector/pgvector:pg17) for XTM One's vector store, with dedicated credentials. - New xtm-one + xtm-one-worker services on port 4000, sharing the existing redis and minio. - PLATFORM_REGISTRATION_TOKEN shared secret plumbed into the opencti service (XTM__XTM_ONE_URL / XTM__XTM_ONE_TOKEN) and into XTM One (OPENCTI_* federation env vars). - .env.sample documents the new XTM ONE block. Refs XTM-One-Platform/xtm-one#1011
1 parent 17ebab6 commit ff2ee3a

2 files changed

Lines changed: 116 additions & 1 deletion

File tree

.env.sample

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,31 @@ CONNECTOR_ANALYSIS_ID=4dffd77c-ec11-4abe-bca7-fd997f79fa36
4848
###########################
4949

5050
CONNECTOR_OPENCTI_ID=dd010812-9027-4726-bf7b-4936979955ae
51-
CONNECTOR_MITRE_ID=8307ea1e-9356-408c-a510-2d7f8b28a0e2
51+
CONNECTOR_MITRE_ID=8307ea1e-9356-408c-a510-2d7f8b28a0e2
52+
53+
###########################
54+
# XTM ONE #
55+
###########################
56+
57+
# Shared secret used by OpenCTI and XTM One to authenticate registration.
58+
# Both platforms MUST use the same value.
59+
PLATFORM_REGISTRATION_TOKEN=xtm-default-registration-token
60+
61+
XTM_ONE_HOST=localhost
62+
XTM_ONE_PORT=4000
63+
XTM_ONE_EXTERNAL_SCHEME=http
64+
# Image tag for filigran/xtm-one and filigran/xtm-one-worker (e.g. rolling, 1.x.y)
65+
XTM_ONE_VERSION=rolling
66+
XTM_ONE_ADMIN_EMAIL=admin@filigran.io
67+
XTM_ONE_ADMIN_PASSWORD=ChangeMe
68+
# Long random string (e.g. `openssl rand -hex 32`). Used to sign sessions/tokens.
69+
XTM_ONE_SECRET_KEY=ChangeMeWithGeneratedRandomString
70+
# Credentials for the dedicated pgsql-copilot Postgres instance.
71+
XTM_ONE_POSTGRES_USER=copilot
72+
XTM_ONE_POSTGRES_PASSWORD=ChangeMe
73+
# Optional: bucket name in MinIO (auto-created on first boot)
74+
XTM_ONE_S3_BUCKET=copilot-files
75+
# Optional: enterprise license PEM (leave empty in xtm_one mode)
76+
XTM_ONE_ENTERPRISE_LICENSE=
77+
XTM_ONE_LOG_LEVEL=info
78+
XTM_ONE_LOG_FORMAT=json

docker-compose.yml

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,21 @@ services:
8787
interval: 30s
8888
timeout: 30s
8989
retries: 3
90+
pgsql-copilot:
91+
# Dedicated pgvector-enabled instance for XTM One.
92+
image: pgvector/pgvector:pg17
93+
environment:
94+
POSTGRES_USER: ${XTM_ONE_POSTGRES_USER}
95+
POSTGRES_PASSWORD: ${XTM_ONE_POSTGRES_PASSWORD}
96+
POSTGRES_DB: copilot
97+
volumes:
98+
- pgsqlcopilotdata:/var/lib/postgresql/data
99+
restart: always
100+
healthcheck:
101+
test: [ "CMD", "pg_isready", "-U", "${XTM_ONE_POSTGRES_USER}", "-d", "copilot" ]
102+
interval: 10s
103+
timeout: 5s
104+
retries: 5
90105

91106
###########################
92107
# COMMON #
@@ -149,6 +164,9 @@ services:
149164
- SMTP__PORT=25
150165
- PROVIDERS__LOCAL__STRATEGY=LocalStrategy
151166
- APP__HEALTH_ACCESS_KEY=${OPENCTI_HEALTHCHECK_ACCESS_KEY}
167+
# XTM One
168+
- XTM__XTM_ONE_URL=http://xtm-one:4000
169+
- XTM__XTM_ONE_TOKEN=${PLATFORM_REGISTRATION_TOKEN}
152170
ports:
153171
- "${OPENCTI_PORT}:8080"
154172
depends_on:
@@ -328,9 +346,79 @@ services:
328346
opencti:
329347
condition: service_healthy
330348

349+
###########################
350+
# XTM ONE #
351+
###########################
352+
353+
xtm-one:
354+
image: filigran/xtm-one:${XTM_ONE_VERSION:-rolling}
355+
environment:
356+
- PLATFORM_MODE=xtm_one
357+
- PLATFORM_REGISTRATION_TOKEN=${PLATFORM_REGISTRATION_TOKEN}
358+
- BASE_URL=${XTM_ONE_EXTERNAL_SCHEME}://${XTM_ONE_HOST}:${XTM_ONE_PORT}
359+
- FRONTEND_URL=${XTM_ONE_EXTERNAL_SCHEME}://${XTM_ONE_HOST}:${XTM_ONE_PORT}
360+
- ADMIN_EMAIL=${XTM_ONE_ADMIN_EMAIL}
361+
- ADMIN_PASSWORD=${XTM_ONE_ADMIN_PASSWORD}
362+
- SECRET_KEY=${XTM_ONE_SECRET_KEY}
363+
- DATABASE_URL=postgresql+asyncpg://${XTM_ONE_POSTGRES_USER}:${XTM_ONE_POSTGRES_PASSWORD}@pgsql-copilot:5432/copilot
364+
- REDIS_URL=redis://redis:6379
365+
- S3_ENDPOINT=minio:9000
366+
- S3_ACCESS_KEY=${MINIO_ROOT_USER}
367+
- S3_SECRET_KEY=${MINIO_ROOT_PASSWORD}
368+
- S3_BUCKET=${XTM_ONE_S3_BUCKET:-copilot-files}
369+
- S3_USE_SSL=false
370+
- LOG_LEVEL=${XTM_ONE_LOG_LEVEL:-info}
371+
- LOG_FORMAT=${XTM_ONE_LOG_FORMAT:-json}
372+
- ENTERPRISE_LICENSE=${XTM_ONE_ENTERPRISE_LICENSE:-}
373+
# OpenCTI federation
374+
- OPENCTI_ENABLE=true
375+
- OPENCTI_URL=${OPENCTI_EXTERNAL_SCHEME}://${OPENCTI_HOST}:${OPENCTI_PORT}
376+
- OPENCTI_API_URL=http://opencti:8080
377+
- OPENCTI_TOKEN=${OPENCTI_ADMIN_TOKEN}
378+
ports:
379+
- "${XTM_ONE_PORT}:4000"
380+
depends_on:
381+
pgsql-copilot:
382+
condition: service_healthy
383+
redis:
384+
condition: service_healthy
385+
minio:
386+
condition: service_healthy
387+
restart: always
388+
healthcheck:
389+
test: ["CMD-SHELL", "python -c \"import urllib.request; urllib.request.urlopen('http://localhost:4000/api/health')\""]
390+
interval: 15s
391+
timeout: 10s
392+
retries: 5
393+
start_period: 60s
394+
395+
xtm-one-worker:
396+
image: filigran/xtm-one-worker:${XTM_ONE_VERSION:-rolling}
397+
environment:
398+
- PLATFORM_MODE=xtm_one
399+
- PLATFORM_REGISTRATION_TOKEN=${PLATFORM_REGISTRATION_TOKEN}
400+
- ADMIN_EMAIL=${XTM_ONE_ADMIN_EMAIL}
401+
- ADMIN_PASSWORD=${XTM_ONE_ADMIN_PASSWORD}
402+
- SECRET_KEY=${XTM_ONE_SECRET_KEY}
403+
- DATABASE_URL=postgresql+asyncpg://${XTM_ONE_POSTGRES_USER}:${XTM_ONE_POSTGRES_PASSWORD}@pgsql-copilot:5432/copilot
404+
- REDIS_URL=redis://redis:6379
405+
- S3_ENDPOINT=minio:9000
406+
- S3_ACCESS_KEY=${MINIO_ROOT_USER}
407+
- S3_SECRET_KEY=${MINIO_ROOT_PASSWORD}
408+
- S3_BUCKET=${XTM_ONE_S3_BUCKET:-copilot-files}
409+
- S3_USE_SSL=false
410+
- LOG_LEVEL=${XTM_ONE_LOG_LEVEL:-info}
411+
- LOG_FORMAT=${XTM_ONE_LOG_FORMAT:-json}
412+
- ENTERPRISE_LICENSE=${XTM_ONE_ENTERPRISE_LICENSE:-}
413+
depends_on:
414+
xtm-one:
415+
condition: service_healthy
416+
restart: always
417+
331418
volumes:
332419
esdata:
333420
s3data:
334421
redisdata:
335422
amqpdata:
336423
rsakeys:
424+
pgsqlcopilotdata:

0 commit comments

Comments
 (0)