type: install jpsVersion: '1.7.2' name: WordPress Performance Cluster id: wp-performance-cluster categories: - apps/clusters - apps/content-management description: #text: WordPress Cluster Kit with highly available Load Balancer and Shared Storage with GlusterFS, database clustering, and scaling mode to create an optimal environment for highly-loaded projects. The package provides integrated autoscaling and high availability for development and production environments. Clustered topology ensures effective handling of heavy workload. #short: WordPress Cluster with built-in kit v2 for choosing optimal servers, database clustering type, scaling mode and a set of advanced features for highly-loaded projects logo: /images/wp-cluster-kit.svg baseUrl: https://deploy.mightybox.io/kits/wp-performance-cluster/raw/branch/main onBeforeInit: /scripts/beforeInit.js?_r=${fn.random} onBeforeInstall: /scripts/beforeInstall.js?_r=${fn.random} skipNodeEmails: true nodes: definedInOnBeforeInstall settings: fields: - type: displayfield hideLabel: true hidden: true name: bl_count value: 1 markup: # - caption: Number of App servers # - caption: Scalable app servers limit # - caption: App server base vCPU # - caption: App server scalable vCPU # - caption: PHP Version # - caption: Email credentials # type: checkbox # name: ls-addon # value: true # disabled: false # tooltip: "If this option is enabled, environment details (including WP admin logins) will be emailed to you upon successful deployment." # - caption: Database type (single or clustered) # relay & OCP # s3 offloading mixins: - /scripts/common.yml globals: PATH: ${baseUrl} DB_USER: ${settings.DB_USER:user-[fn.random]} DB_PASS: ${settings.DB_PASS:[fn.password(10)]} DB_HOST: sqldb PROTOCOL: https WP_ADMIN_PASS: ${settings.WP_ADMIN_PASS:[fn.password(10)]} LS_ADMIN_PASS: ${settings.LS_ADMIN_PASS:[fn.password(10)]} onInstall: - setupDB - addLimits #- addMetadata - setDomain # why is this necessary? - initLEsettings #- if (${settings.is_trigger:true}): setTriggers - optimization - setupCacheSync - storageHealthCheck - storageMount: NFS4 - setPassword - getRedisPswd - installWordpress #- if ('${settings.mu-addon:false}' == 'true'): configureMultisite - script: | var actions = []; actions.push({ jps: "https://github.com/jelastic-jps/lets-encrypt/blob/master/manifest.jps?_r=${fn.random}", nodeGroup: "bl", skipEmail: "true", settings: { customDomains: "${globals.DOMAIN}", fallbackToX1: "true", withExtIp: "${globals.isExtIP}" } }); return { result: 0, onAfterReturn: { install: actions } }; - setupLEdomain - install: - jps: /scripts/cacheClean.jps?_r=${fn.random} - jps: /scripts/addons.jps?_r=${fn.random} - jps: /scripts/events.jps?_r=${fn.random} #instant login, root access, and other addons - return: type: success message: /success/text/success.md?_r=${fn.random} email: /success/email/success.md?_r=${fn.random} actions: setupDB: - cmd[sqldb]: |- #jem passwd set -p wow #use if need to reset DB password USER=${DB_USER} PASSWORD=${DB_PASS} MYSQL=`which mysql` cmd="CREATE USER '$USER'@'localhost' IDENTIFIED BY '$PASSWORD'; CREATE USER '$USER'@'%' IDENTIFIED BY '$PASSWORD'; GRANT ALL PRIVILEGES ON *.* TO '$USER'@'localhost' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO '$USER'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;" $MYSQL -uroot -p${nodes.sqldb.password} --execute="$cmd" user: root addLimits: #what does this do? - env.control.ApplyNodeGroupData [*]: data: isRequired: true # addMetadata: # script: | # var metadata = { project: "${settings.project:default}", projectScope: "${settings.projectScope:production}" }; # return api.env.control.ApplyEnvProperty ? # api.env.control.ApplyEnvProperty('${env.name}', session, metadata) : # api.env.control.ApplyNodeGroupData('${env.name}', session, 'cp', metadata); setDomain: - script: /scripts/idna.js domains: ${env.domain} - setGlobals: DOMAIN: ${response.domains} # setTriggers: # - log: Auto Scaling Triggers # - script: /scripts/addTriggers.js # nodeGroup: cp # resourceType: CPU # loadGrowth: 'slow' # cleanOldTriggers: true # scaleDownLimit: ${nodes.cp.length} initLEsettings: # I don't think we need to check this. Just set to true. # - script: | # return { # result:0, # extIP: Boolean(jelastic.billing.account.GetQuotas('environment.externalip.enabled').array[0].value) # } # - setGlobals: # isExtIP: ${response.extIP} - setGlobals: isExtIP: true - cmd[cp, bl]: |- [ ! -d /var/lib/jelastic/keys/letsencrypt ] && mkdir -p /var/lib/jelastic/keys/letsencrypt; echo "webroot=false" > /var/lib/jelastic/keys/letsencrypt/settings-custom; echo "webrootPath=/var/www/webroot/ROOT" >> /var/lib/jelastic/keys/letsencrypt/settings-custom; echo "test=false" >> /var/lib/jelastic/keys/letsencrypt/settings-custom; echo "withExtIp=${globals.isExtIP}" >> /var/lib/jelastic/keys/letsencrypt/settings-custom; user: root setupLEdomain: - cmd[${nodes.bl.master.id}]: source /opt/letsencrypt/settings && echo $domain - cmd[${nodes.cp.master.id}]: bash ~/bin/setupWP.sh --url https://${response.out}; optimization: - log: Load Balancers and App servers optimization - install: - jps: https://raw.githubusercontent.com/jelastic/templates/master/config_v2.jps?_r=${fn.random} settings: targetGroup: bl targetNodes: bl optimization: wordpress - jps: https://raw.githubusercontent.com/jelastic/templates/master/config_v2.jps?_r=${fn.random} settings: targetGroup: cp targetNodes: cp optimization: wordpress - cmd[cp, bl]: if test -f /usr/local/sbin/optimization.sh; then bash /usr/local/sbin/optimization.sh &>> /var/log/run.log; fi setPassword: - cmd[cp, bl]: jem passwd set -p ${globals.LS_ADMIN_PASS} user: root storageMount: - log: Mount Storage - api: - method: jelastic.environment.file.AddMountPointByGroup params: nodeGroup: cp sourceNodeId: ${nodes.storage.master.id} sourcePath: /data path: /var/www/webroot/ROOT sourceAddressType: NODE_GROUP protocol: ${this} storageHealthCheck: - cmd[cp]: |- echo "" > /var/www/webroot/ROOT/index.php #configureMultisite: # - install: /addons/multisite.jps getRedisPswd: - cmd[nosqldb]: cat /etc/redis.conf | tail -1 | awk '{print $2}'; - setGlobals: REDIS_PSWD: ${response.out} installWordpress: - install: /scripts/installWP.jps settings: db_host: ${globals.DB_HOST} db_user: ${globals.DB_USER} db_pass: ${globals.DB_PASS} redis_host: nosqldb redis_port: 6379 redis_user: admin redis_pswd: ${globals.REDIS_PSWD} wp_admin_pass: ${globals.WP_ADMIN_PASS} wp_title: "Hello World" wp_url: ${globals.PROTOCOL}://${globals.DOMAIN}/ version_wordpress: ${globals.version_wordpress} setupCacheSync: - if (/litespeed/.test("${nodes.bl.nodeType}")): - install: /scripts/setupHA4LB.jps?_r=${fn.random} updateTriggers: if (!${event.params.auto:true}): - log: update scaling trigger - script: /scripts/updateTriggers.js count: ${nodes.cp.length} # other stuff - basic BB optimizations should be applied here # use WP redis cache plugin instead of litespeed redis cache # Use https://plugintests.com/plugins/wporg/litespeed-cache/tips to disable ls cache page?