Repository navigation
Expand file tree
/
Copy pathdocker-compose.yml
More file actions
182 lines (173 loc) · 6 KB
/
Copy pathdocker-compose.yml
File metadata and controls
182 lines (173 loc) · 6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
services:
# ── PostgreSQL + PostGIS + TimescaleDB (Core Database) ──────────
# Purpose: Persistent storage for satellite catalogs, telemetry metrics, and RBAC auth.
orbita-db:
build:
context: ./docker
dockerfile: db.Dockerfile
container_name: orbita-postgres
environment:
POSTGRES_DB: orbita_registry
POSTGRES_USER: orbita_admin
POSTGRES_PASSWORD: orbita_secret_2026
ports:
- "5434:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
- ./backend/db-sql:/docker-entrypoint-initdb.d
networks:
- orbita-network
healthcheck:
test: ["CMD-SHELL", "pg_isready -U orbita_admin -d orbita_registry"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
# ── Redis (In-Memory Cache) ─────────────────────────────────────
# Purpose: Fast data retrieval (caching API responses) and WebSocket pub/sub.
orbita-redis:
image: redis:7-alpine
container_name: orbita-redis
ports:
- "6380:6379"
volumes:
- redis_data:/data
networks:
- orbita-network
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
# ── RabbitMQ (Message Broker for Celery) ────────────────────────
# Purpose: Handles task queues, routing jobs between the API and Celery workers.
orbita-rabbitmq:
image: rabbitmq:3-management-alpine
container_name: orbita-rabbitmq
ports:
- "5672:5672"
- "15672:15672"
networks:
- orbita-network
healthcheck:
test: ["CMD", "rabbitmq-diagnostics", "check_port_connectivity"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
# ── Celery Worker (Background Task Executor) ────────────────────
# Purpose: Executes long-running tasks asynchronously (e.g., SGP4 propagation, Kessler sims, AI Agents).
orbita-worker:
build:
context: ./backend
dockerfile: Dockerfile
container_name: orbita-worker
command: celery -A app.workers.celery_app worker -l info -c 4
env_file:
- ./backend/.env
environment:
DATABASE_URL: postgresql+asyncpg://orbita_admin:orbita_secret_2026@orbita-db:5432/orbita_registry
DATABASE_URL_SYNC: postgresql+psycopg2://orbita_admin:orbita_secret_2026@orbita-db:5432/orbita_registry
REDIS_URL: redis://orbita-redis:6379/0
CELERY_BROKER_URL: amqp://guest:guest@orbita-rabbitmq:5672//
ENVIRONMENT: development
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
depends_on:
orbita-db:
condition: service_healthy
orbita-redis:
condition: service_healthy
orbita-rabbitmq:
condition: service_healthy
networks:
- orbita-network
restart: unless-stopped
# ── Celery Beat (Periodic Task Scheduler) ───────────────────────
# Purpose: Triggers recurring jobs (e.g., fetch TLEs every 30m, Conjunction Scan every 1h).
orbita-beat:
build:
context: ./backend
dockerfile: Dockerfile
container_name: orbita-beat
command: celery -A app.workers.celery_app beat -l info
env_file:
- ./backend/.env
environment:
DATABASE_URL: postgresql+asyncpg://orbita_admin:orbita_secret_2026@orbita-db:5432/orbita_registry
DATABASE_URL_SYNC: postgresql+psycopg2://orbita_admin:orbita_secret_2026@orbita-db:5432/orbita_registry
REDIS_URL: redis://orbita-redis:6379/0
CELERY_BROKER_URL: amqp://guest:guest@orbita-rabbitmq:5672//
ENVIRONMENT: development
depends_on:
- orbita-worker
networks:
- orbita-network
restart: unless-stopped
# ── pgAdmin (database management UI) ───────────────────────────
orbita-pgadmin:
image: dpage/pgadmin4:latest
container_name: orbita-pgadmin
environment:
PGADMIN_DEFAULT_EMAIL: admin@orbita.dev
PGADMIN_DEFAULT_PASSWORD: admin123
ports:
- "8081:80"
networks:
- orbita-network
depends_on:
orbita-db:
condition: service_healthy
restart: unless-stopped
# ── FastAPI Backend (Core API Services) ─────────────────────────
# Purpose: Handles REST requests, WebSocket streams, and triggers background Celery tasks.
orbita-api:
build:
context: ./backend
dockerfile: Dockerfile
container_name: orbita-api
ports:
- "8000:8000"
volumes:
- ./backend:/app
env_file:
- ./backend/.env
environment:
DATABASE_URL: postgresql+asyncpg://orbita_admin:orbita_secret_2026@orbita-db:5432/orbita_registry
DATABASE_URL_SYNC: postgresql+psycopg2://orbita_admin:orbita_secret_2026@orbita-db:5432/orbita_registry
REDIS_URL: redis://orbita-redis:6379/0
CELERY_BROKER_URL: amqp://guest:guest@orbita-rabbitmq:5672//
ENVIRONMENT: development
OPENAI_API_KEY: ${OPENAI_API_KEY:-}
ANTHROPIC_API_KEY: ${ANTHROPIC_API_KEY:-}
depends_on:
orbita-db:
condition: service_healthy
orbita-redis:
condition: service_healthy
orbita-rabbitmq:
condition: service_healthy
networks:
- orbita-network
restart: unless-stopped
# ── React/Vite Frontend (Web Dashboard) ─────────────────────────
# Purpose: Serves the compiled React app using Nginx. Acts as a reverse proxy to route /api to FastAPI.
orbita-frontend:
build:
context: ./frontend
dockerfile: Dockerfile
container_name: orbita-frontend
ports:
- "8085:80"
depends_on:
- orbita-api
networks:
- orbita-network
restart: unless-stopped
networks:
orbita-network:
driver: bridge
volumes:
postgres_data:
redis_data: