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);