Skip to content
Snippets Groups Projects
gen-docker.js 6.47 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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++;
    
    Alexey Lunin's avatar
    Alexey Lunin committed
      const natsMonitoringPort = 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
    
    Alexey Lunin's avatar
    Alexey Lunin committed
          - '${natsMonitoringPort}: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);