Docker Setup
Running Containers
Section titled “Running Containers”The system runs 42 Docker containers:
Database Layer
Section titled “Database Layer”| Container | Image | Port | Purpose |
|---|---|---|---|
magic_pim_postgres_dev | postgres:16-alpine | 5432 | Shared PostgreSQL (all 43 DBs) |
mysql | mysql | 3306 | Portal docs, workflow data |
Per-Tenant (11 tenant stacks)
Section titled “Per-Tenant (11 tenant stacks)”Standard tenants have 3 containers each (backend, storefront, redis). Two tenants run without a storefront.
| Container Pattern | Port Pattern | Purpose |
|---|---|---|
magic_{tenant}_redis_dev | 63XX | Redis cache |
magic_{tenant}_backend_dev | 40XX (API), 70XX (PIM) | Medusa backend |
magic_{tenant}_storefront_dev | 100XX | Next.js storefront |
Tenants with full stack (8): development, demo, default, brinxx, bovisales, desluis, jodasign, logohorloge
Tenants without storefront (2):
| Tenant | Backend | Redis | Note |
|---|---|---|---|
magic_spranz | 4091 | 6391 | Storefront port configured but no container running |
master_magic | 4059 | 6390 | Backend + Redis only, no storefront |
PIM Services
Section titled “PIM Services”| Container | Port | Purpose |
|---|---|---|
magic_pim_backend_dev | 4002, 7992 | PIM backend + API |
magic_pim_redis_dev | 6380 | PIM cache |
N8N Workflow Automation
Section titled “N8N Workflow Automation”| Container | Port | Purpose |
|---|---|---|
magic_n8n | 8090 | N8N workflow automation (primary) |
magic_n8n_2 | 8091 | N8N instance 2 |
magic_n8n_3 | 8092 | N8N instance 3 |
NextCloud & OnlyOffice
Section titled “NextCloud & OnlyOffice”| Container | Port | Purpose |
|---|---|---|
nextcloud_app | 8580 | NextCloud document storage |
nextcloud_db | 3306 (internal) | NextCloud dedicated database |
onlyoffice_docs | 8581 | OnlyOffice document editor |
Other Services
Section titled “Other Services”| Container | Port | Purpose |
|---|---|---|
rembg-service | 5050 | Background removal AI |
preflight-service | 5051 | Image preflight validation |
omada-controller | — (no external ports) | TP-Link Omada network controller |
Docker Compose Files
Section titled “Docker Compose Files”Each service has its own docker-compose.yml:
/mnt/data/magic_pim/docker-compose.yml/mnt/data/magic_omniverse/magic_commerce/magic_development/docker-compose.yml/mnt/data/magic_omniverse/magic_commerce/magic_brinxx/docker-compose.yml/mnt/data/magic_omniverse/magic_commerce/magic_default/docker-compose.yml/mnt/data/magic_omniverse/magic_commerce/magic_spranz/docker-compose.yml/mnt/data/magic_omniverse/magic_commerce/master_magic/docker-compose.yml... (one per tenant)/mnt/data/magic_omniverse/magic_n8n/docker-compose.yml/mnt/data/magic_omniverse/magic_docs/docker-compose.ymlMulti-Stage Build (Backend)
Section titled “Multi-Stage Build (Backend)”# Stage 1: DependenciesFROM node:22-alpine AS depsRUN npm install --legacy-peer-deps
# Stage 2: BuildFROM node:22-alpine AS builderRUN npm run build # Builds admin panel
# Stage 3: ProductionFROM node:22-alpine AS runnerRUN apk add --no-cache git # For dev projectsUSER medusa:nodejsENTRYPOINT ["sh", "-c", "npx medusa db:migrate && npx medusa start"]Build argument MEDUSA_BACKEND_URL is set per-tenant.
Network Architecture
Section titled “Network Architecture”Each tenant has an isolated Docker bridge network:
magic_{tenant}_network_dev├── redis├── backend└── storefront (not present for spranz, master_magic)Networks are isolated — no cross-tenant communication at the Docker level. All inter-service communication happens through:
- Nginx reverse proxy (external traffic)
host.docker.internal(database access)
Volume Strategy
Section titled “Volume Strategy”Shared (Read-Only)
Section titled “Shared (Read-Only)”- /mnt/data/pim_data:/mnt/data/pim_data:ro # Product images- /mnt/data/magic_pim/backend/uploads:/app/uploads:ro # PIM uploadsShared (Read-Write)
Section titled “Shared (Read-Write)”- /mnt/data/magic_omniverse:/mnt/data/magic_omniverse # Code accessPer-Service
Section titled “Per-Service”- postgres_data:/var/lib/postgresql/data # DB data on NVMeHealth Checks
Section titled “Health Checks”PostgreSQL
Section titled “PostgreSQL”test: ["CMD-SHELL", "pg_isready -U postgres"]interval: 10s, timeout: 5s, retries: 5test: ["CMD", "redis-cli", "ping"]interval: 10s, timeout: 5s, retries: 5Common Commands
Section titled “Common Commands”# Check all containersdocker ps --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" | grep magic_
# View logsdocker logs magic_brinxx_backend_dev --tail=50 -f
# Rebuild a tenantcd /mnt/data/magic_omniverse/magic_commerce/magic_brinxxdocker compose build backend --no-cachedocker compose up -d backend
# Inspect networkdocker network ls | grep magicdocker network inspect magic_brinxx_network_dev
# Check disk usagedf -h /mnt/datadocker system df