diff --git a/compose/gen-docker.js b/compose/gen-docker.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac7fad6950b5dbc62d8fcabbd151b7781af23f1c
--- /dev/null
+++ b/compose/gen-docker.js
@@ -0,0 +1,237 @@
+const fs = require('fs');
+
+// print process.argv
+const [IDUNION_KEY, IDUNION_BASIC_USER, IDUNION_BASIC_PASS] = process.argv.slice(2);
+
+let startPort = 8000;
+
+function makeid(length) {
+  let result = '';
+  const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
+  const charactersLength = characters.length;
+  let counter = 0;
+  while (counter < length) {
+    result += characters.charAt(Math.floor(Math.random() * charactersLength));
+    counter += 1;
+  }
+  return result;
+}
+
+const generateAgent = (agentNum) => {
+  const agentHttpPort = startPort++;
+  const agentWsPort = startPort++;
+  const agentName = agentNum < 10 ? '0' + agentNum : agentNum;
+  const genericName = 'agent' + agentName;
+  const agentPort = startPort++;
+  const tcpPort = startPort++;
+  const connectionManagerPort = startPort++;
+  const attestationManagerPort = startPort++;
+  const proofManagerPort = startPort++;
+
+  const envContent = `LEDGERS=IDUNION
+IDUNION_KEY=${IDUNION_KEY}
+IDUNION_BASIC_USER=${IDUNION_BASIC_USER}
+IDUNION_BASIC_PASS=${IDUNION_BASIC_PASS}
+
+AGENT_PEER_URL=http://new.didgram.pro:${agentHttpPort},ws://new.didgram.pro:${agentWsPort}
+AGENT_NAME=DEV_AGENT_${agentName} # this should be changed to company name
+AGENT_KEY=DEV_AGENT_${agentName} #example random string
+AGENT_DID_SEED=${makeid(32)} #did private key seed min length 32
+AGENT_DB_HOST=pg_db:5432
+AGENT_DB_USER=postgres
+AGENT_DB_PASS=postgres
+AGENT_PORT=${agentPort}
+AGENT_CONSUMER_NAME=agent_${agentName}
+AGENT_IS_REST=false
+AGENT_MAX_MESSAGES=10
+AGENT_RETE_LIMIT=5
+
+NATS_SERVERS=broker-${genericName}:4222
+NATS_STREAM_NAME=ssi_${genericName}_stream
+NATS_SUBJECTS="connections.*,proofs.*,credentials.*,credentials.definition.*,credentials.offer.*,schemas.*,messages.*"
+
+GATEWAY_HTTP_PORT=${agentPort}
+GATEWAY_TCP_PORT=${tcpPort}
+GATEWAY_SOCKET_EVENT_NAME=message
+GATEWAY_MESSAGE_PATTERN=webhook
+GATEWAY_HOST=gateway-${genericName}
+
+CONNECTION_SERVICE_TCP_PORT=${connectionManagerPort}
+CONNECTION_SERVICE_HOST=cm-${genericName}
+
+ATTESTATION_SERVICE_TCP_PORT=${attestationManagerPort}
+ATTESTATION_SERVICE_HOST=am-${genericName}
+
+PROOF_SERVICE_TCP_PORT=${proofManagerPort}
+PROOF_SERVICE_HOST=pm-${genericName}
+`;
+
+  const dockerContent = `
+#===================== ${genericName} =========================#
+  gateway-${genericName}:
+    profiles:
+      - ${genericName}
+    container_name: gw-${genericName}
+    image: node:18.16.0
+    volumes:
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist/apps/gateway:/app/
+    working_dir: /app
+    command: node main.js
+    ports:
+      - "${agentPort}:${agentPort}"
+      - "${tcpPort}:${tcpPort}"
+    env_file:
+      - ./env/${genericName}.env
+    depends_on:
+      builder:
+        condition: service_completed_successfully
+      cm-${genericName}:
+        condition: service_started
+
+  agent-${genericName}:
+    profiles:
+      - ${genericName}
+    container_name: agent-${genericName}
+    image: node:18.16.0
+    volumes:
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist/apps/agent:/app/
+    working_dir: /app
+    command: node main.js
+    ports:
+      - "${agentHttpPort}:${agentHttpPort}"
+      - "${agentWsPort}:${agentWsPort}"
+    env_file:
+      - ./env/${genericName}.env
+    depends_on:
+      builder:
+        condition: service_completed_successfully
+      cm-${genericName}:
+        condition: service_started
+
+  cm-${genericName}:
+    container_name: cm-${genericName}
+    image: node:18.16.0
+    volumes:
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist/apps/connection-manager:/app/
+    working_dir: /app
+    command: node main.js
+    profiles:
+       - ${genericName}
+    env_file:
+      - ./env/${genericName}.env
+    ports:
+      - "${connectionManagerPort}"
+    depends_on:
+      builder:
+        condition: service_completed_successfully
+      broker-${genericName}:
+        condition: service_started
+
+  am-${genericName}:
+    container_name: am-${genericName}
+    image: node:18.16.0
+    volumes:
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist/apps/attestation-manager:/app/
+    working_dir: /app
+    command: node main.js
+    profiles:
+      - ${genericName}
+    env_file:
+      - ./env/${genericName}.env
+    ports:
+      - "${attestationManagerPort}"
+    depends_on:
+      builder:
+        condition: service_completed_successfully
+      broker-${genericName}:
+        condition: service_started
+
+
+  pm-${genericName}:
+    container_name: pm-${genericName}
+    image: node:18.16.0
+    volumes:
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist/apps/proof-manager:/app/
+    working_dir: /app
+    command: node main.js
+    profiles:
+      - ${genericName}
+    env_file:
+      - ./env/${genericName}.env
+    ports:
+      - "${proofManagerPort}"
+    depends_on:
+      builder:
+        condition: service_completed_successfully
+      broker-${genericName}:
+        condition: service_started
+
+  broker-${genericName}:
+    profiles:
+      - ${genericName}
+    command: ["-js", "-sd", "/data", "-m","8222", "-D"]
+    container_name: broker-${genericName}
+    image: 'nats:latest'
+    ports:
+      - '4222' #Nats server port
+      - '8222:8222' #Nats server Monitoring port
+    volumes:
+      - ./data/${genericName}/nats/:/data/
+`;
+  return { envContent, dockerContent, genericName };
+}
+
+// generate agents
+const dockerServices = [];
+for (let i = 0; i < 10; i++) {
+  const { envContent, dockerContent, genericName } = generateAgent(i);
+  dockerServices.push(dockerContent);
+  fs.writeFileSync(`./env/${genericName}.env`, envContent);
+}
+
+const dockerContent = `version: '3.8'
+
+services:
+${dockerServices.join('\n')}
+
+  #===================== INFRA =========================#
+  builder:
+    privileged: true
+    image: node:18.16.0-buster-slim
+    volumes:
+      - ./../yarn.lock:/app/yarn.lock
+      - ./../package.json:/app/package.json
+      - ./../apps:/app/apps
+      - ./../libs:/app/libs
+      - ./../nx.json:/app/nx.json
+      - ./../tsconfig.base.json:/app/tsconfig.base.json
+      - ./data/node_modules:/app/node_modules
+      - ./data/dist:/app/dist
+    working_dir: /app
+    command:
+      - sh
+      - -c
+      - |
+        whoami
+        apt update -y && apt install python3 git make build-essential -y
+        yarn install
+        yarn build:all
+        exit 0
+
+  pg_db:
+    image: 'postgres:latest'
+    ports:
+      - '5433:5432'
+    environment:
+      POSTGRES_USER: postgres
+      POSTGRES_PASSWORD: postgres
+    volumes:
+      - ./data/db/:/var/lib/postgresql/data/
+`;
+
+fs.writeFileSync(`./docker-compose-gen.yml`, dockerContent);