jpsType: install
jpsVersion: '1.4'
id: openmage-cluster
homepage: https://github.com/proxiblue/openmage-cluster/tree/main
description:
  text: Auto-scalable and highly-available OpenMage eCommerce cluster with out-of-box
    auto-scaling, even load and traffic distribution, master-master data replication,
    page caching and user session storage on certified Jelastic dockerized stack templates.
  short: Auto-scalable and highly-available OpenMage cluster with load balancing, data
    replication, content caching and user session storage.
categories:
- apps/clusters
- apps/e-commerce
logo: https://raw.githubusercontent.com/ProxiBlue/openmage-cluster/main/images/57708.png
name: Auto-Scalable OpenMage Cluster

globals:
  PATH: https://raw.githubusercontent.com/ProxiBlue/openmage-cluster/main/
  MAGE_ROOT: "/var/www/webroot/ROOT"
  DB_USER: jelastic-${fn.random}
  DB_PASS: "${fn.password(20)}"
  DB_NAME: openmage
  RD_PASS: "${fn.password(10)}"
  ADMIN_PASSWD: "${fn.password(20)}"
  ROOT_PASSWD: "${fn.password(20)}"
  NGINX_PASSWD: "${fn.password(20)}"
  ADMIN_URL: admin_${fn.random}
  MG_ADMIN_USER: admin-${fn.random}

settings:
  prepopulate: https://raw.githubusercontent.com/ProxiBlue/openmage-cluster/main/settings/populate.txt
  fields:
  - caption: "Select Locale"
    type: list
    required: true
    name: LOCALE
  - caption: "Select Timezone"
    type: list
    required: true
    name: TIMEZONE
  - caption: "Select Currency"
    type: list
    required: true
    name: CURRENCY
  - caption: Skip Install Let's Encrypt SSL with Auto-Renewal?
    type: checkbox
    name: le_addon
    value: true
    tooltip: "Advanced integration with Let's Encrypt certificate authority that simplifies and automates the process of issuing, configuring and renewing trusted SSL certificates."
  - caption: Install Sample Data?
    type: checkbox
    name: SAMPLE_DATA
    value: true
  - caption: "PHP Version"
    type: list
    values:
        1.18.0-php-7.4.16 : 7.4
    required: true
    name: PHP_VERSION
    value: 1.18.0-php-7.4.16

success:
    text: |
        # Environment details.

        ## store this information!!!!

        * URL: https://${env.domain}
        * Admin panel URL: https://${env.domain}/${globals.ADMIN_URL}
        * Admin user: ${globals.MG_ADMIN_USER}
        * Admin password: ${globals.ADMIN_PASSWD}
        * ROOT Password on Web Nodes: ${globals.ROOT_PASSWD}
        * NGINX Password on web nodes: ${globals.NGINX_PASSWD}
        * DB USER: ${globals.DB_USER}
        * DB_NAME: openmage
        * DB_PASS: ${globals.DB_PASS}
        * RD_PASS: ${globals.RD_PASS}

        To add a custom domain name for your Magento Cluster installation, follow the steps described
        in our documentation: http://docs.jelastic.com/custom-domains

ssl: false
skipNodeEmails: true
nodes:
- nodeType: nginxphp-dockerized
  tag: ${settings.PHP_VERSION}
  count: 2
  cloudlets: 16
  nodeGroup: cp
  volumeMounts:
    "/var/www/webroot/ROOT":
      readOnly: false
      sourcePath: "/data"
      sourceNodeGroup: storage
  displayName: AppServer
  env:
    PHPFPM_MAX_CHILDREN: 3

- nodeType: mariadb-dockerized
  tag: 10.3.22
  count: 2
  cloudlets: 8
  nodeGroup: sqldb
  displayName: Database
  env:
    ON_ENV_INSTALL: ""
- nodeType: storage
  cloudlets: 8
  nodeGroup: storage
  displayName: Storage
- nodeType: varnish-dockerized
  tag: 5.2.1
  cloudlets: 8
  nodeGroup: bl
  displayName: Balancer
- nodeType: redis
  count: 2
  cloudlets: 8
  nodeGroup: nosqldb

onAfterScaleOut[nodeGroup:cp]:
  forEach(event.response.nodes):
    cmd [${@i.id}]: sudo service nginx reload
    setNodeDisplayName [${@i.id}]: AppServer

onAfterScaleOut[nodeGroup:bl]:
  forEach(event.response.nodes):
    setNodeDisplayName [${@i.id}]: Load balancer

onInstall:
- setExtIpEnabled:
    - enabled: true
      nodeGroup: bl
- setGlobals:
        protocol: https
- log: Auto Scaling Triggers
- script: https://raw.githubusercontent.com/ProxiBlue/openmage-cluster/main/scripts/addTriggers.js
  params: 
    nodeGroup: cp
    resourceType: CPU
    scaleUpValue: 70
    scaleUpLimit: 10
    scaleUpLoadPeriod: 1
    scaleDownValue: 20
    scaleDownLimit: 2
    scaleDownLoadPeriod: 10
    cleanOldTriggers: true

- log: Set Display Name
  setNodeDisplayName [cp]: AppServer
  setNodeDisplayName [bl]: Load balancer
  setNodeDisplayName[${nodes.nosqldb.first.id}]: Session Storage
  setNodeDisplayName[${nodes.nosqldb.last.id}]: Cache Storage

- log: Load balancer Setup
- setupBL:
    filter: bl
- if ('${settings.le_addon:true}' == 'false'):
    - install:
        jps: https://github.com/jelastic-jps/lets-encrypt/blob/stage/manifest.jps
        envName: ${env.envName}
        nodeGroup: bl
        skipEmail: true
        settings:
          customDomains: ""
- log: Envs Setup for CP layer
- setEnvs:
    filter: cp

- log: DB Cluster Setup
- installJps:
    jps: https://raw.githubusercontent.com/jelastic-jps/mysql-cluster/master/scripts/ms-mm-configuration.jps
    settings:
      path: "https://raw.githubusercontent.com/jelastic-jps/mysql-cluster/master"
      db_user: "${globals.DB_USER}"
      db_pass: "${globals.DB_PASS}"
      scheme: "slave"
      custom_conf: "${globals.PATH}/configs/mysql/db.cnf"
    nodeGroup: sqldb

- log: setup storage
- cmd[storage]:
  - mkdir -p /data/
  - chown 700:700 -Rh /data/
- log: Root Commands
- forEach(nodes.cp):
    cmd[${@i.id}]:
      - yum install composer
      - composer self-update --1
      - echo ${globals.NGINX_PASSWD}| passwd --stdin nginx &>> /var/log/run.log
      - echo ${globals.ROOT_PASSWD}| passwd --stdin root &>> /var/log/run.log
      - wget -q --no-verbose --no-check-certificate https://files.magerun.net/n98-magerun.phar -O /usr/bin/n98-magerun &>> /var/log/run.log
      - chmod +x /usr/bin/n98-magerun
      - curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" &>> /var/log/run.log
      - unzip awscliv2.zip &>> /var/log/run.log
      - ./aws/install &>> /var/log/run.log
    user: root
- composerOpenMage
- cmd[storage]: wget ${globals.PATH}/configs/openmage/local.xml.template -O /data/app/etc/local.xml.template
- setupRDConnect:
    config: /data/app/etc/local.xml.template
- setupCP
- if ('${settings.SAMPLE_DATA:false}' == 'true'):
    - cmd[${nodes.cp.first.id}]:
        - wget ${globals.PATH}/sampledata/compressed-magento-sample-data-1.9.1.0.tgz -O /tmp/compressed-magento-sample-data-1.9.1.0.tgz
- cmd[${nodes.cp.first.id}]:
    - wget ${globals.PATH}/configs/varnish/varnish-probe.php -O ${globals.MAGE_ROOT}/health_check.php
    - wget ${globals.PATH}/scripts/setupOpenMage.sh -O /tmp/setup.sh
    - bash -x /tmp/setup.sh ${globals.DB_USER} ${globals.DB_PASS} DB_MASTER ${globals.DB_NAME} ${globals.ADMIN_PASSWD} ${globals.MAGE_ROOT} ${env.url} ${user.email} "${globals.ADMIN_URL}" ${globals.MG_ADMIN_USER} ${settings.LOCALE} ${settings.TIMEZONE} ${settings.CURRENCY} ${env.envName} ${settings.le_addon:false} ${settings.SAMPLE_DATA:false} &>> /var/log/run.log

actions:
  composerOpenMage:
  - log: OpenMage Setup
  - cmd[${nodes.cp.first.id}]:
    - cd /tmp
    - curl -O ${globals.PATH}scripts/composerOpenMage.sh
    - bash -x /tmp/composerOpenMage.sh ${globals.PATH} ${globals.MAGE_ROOT} &>> /var/log/run.log

  setupCP:
  - log: App Servers Setup
  - cmd[cp]: |-
      wget ${globals.PATH}/configs/nginx/site-default-openmage.conf -O /etc/nginx/conf.d/site-default.conf
      wget ${globals.PATH}/configs/nginx/nginx.conf -O /etc/nginx/nginx.conf
      wget ${globals.PATH}/configs/php/extensions.ini -O /etc/php.d/extensions.ini
      echo "client_max_body_size 20M;" >>/etc/nginx/conf.d/client_max_body_size.conf
      sudo /etc/init.d/nginx restart &>> /var/log/run.log
  setEnvs:
  - forEach(i:nodes.sqldb):
    - if (${@i.ismaster}):
        cmd [${this.filter}]: 
          echo ${@i.intIP} DB_MASTER >> /etc/hosts
        user: root
    - if (!${@i.ismaster}):
        cmd [${this.filter}]: 
          echo ${@i.intIP} DB_SLAVE >> /etc/hosts
        user: root
  - cmd [${this.filter}]: 
      - echo ${nodes.nosqldb.first.intIP} RDS >> /etc/hosts
      - echo ${nodes.nosqldb.last.intIP} RDC >> /etc/hosts
    user: root

  setupBL:
  - cmd[bl]:
      - wget ${globals.PATH}/scripts/varnish/jem_overrides/varnish_balancer.lib -O /var/lib/jelastic/overrides/varnish_balancer.lib
      - wget ${globals.PATH}/configs/varnish/default.vcl -O /etc/varnish/default.vcl
    user: root
  - forEach(nodes.cp):
      cmd[${this.filter}]:
        - jem balancer addCommonHost -h ${@i.intIP}
        - sudo service varnish reload &>> /var/log/run.log
      user: root

  setupRDConnect:
    - setupRDconfig:
        id: ${nodes.nosqldb.first.id}
        passtype: RD_SESSION_PASS
        config: ${this.config}

    - setupRDconfig:
        id: ${nodes.nosqldb.last.id}
        passtype: RD_CACHE_PASS
        config: ${this.config}

  setupRDconfig:
    script: |
      var resp = jelastic.env.control.ExecCmdById(getParam('TARGET_APPID'), session, nodeid, toJSON([{ "command": "cat /etc/redis.conf | tail -1 | awk '{print $2}'"}]), false, "root");
      var passwd = resp.responses[0].out;
      resp = {result: 0, onAfterReturn: []};
      resp = jelastic.env.control.ExecCmdByGroup('${env.envName}', session, "storage", toJSON([{ "command": 'sed -ri \"s/${this.passtype}/' + passwd + '/g\" ${this.config}' }]), false, false, "root");
      return resp;
    nodeid: ${this.id}