wp-performance-cluster/manifest.yml

237 lines
7.9 KiB
YAML
Executable File

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]: |-
ADMIN_PASSWORD=`pwgen 10 1`
jem passwd set -p $ADMIN_PASSWORD #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$ADMIN_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 "<?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?