2023-10-06 03:11:32 +00:00
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
2023-10-06 03:40:56 +00:00
baseUrl : https://deploy.mightybox.io/kits/wp-performance-cluster/raw/branch/main
2023-10-06 03:11:32 +00:00
onBeforeInit : /scripts/beforeInit.js?_r=${fn.random}
onBeforeInstall : /scripts/beforeInstall.js?_r=${fn.random}
skipNodeEmails : true
nodes : definedInOnBeforeInstall
2023-10-06 03:22:50 +00:00
settings :
fields :
- type : displayfield
hideLabel : true
hidden : true
name : bl_count
value : 1
markup :
2023-10-06 03:11:32 +00:00
# - 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 :
- 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 :
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 "<?php http_response_code(500); ?>" > /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?