291 lines
9.3 KiB
Plaintext
291 lines
9.3 KiB
Plaintext
version: 0.1
|
|
type: update
|
|
name: MightyBox WordPress Backup/Restore Addon
|
|
id: mb-backup-manager
|
|
description: Custom Backup and Restore Addon for WordPress using Restic. Supports backing up databases, core files, media files, and full backups with scheduling and retention policies.
|
|
baseUrl: https://deploy-proxy.mightybox.io/addons/mb-backup-manager
|
|
|
|
targetNodes:
|
|
nodeGroup: cp
|
|
|
|
settings:
|
|
main:
|
|
fields:
|
|
- type: radio-fieldset
|
|
name: scheduleType
|
|
hidden: false
|
|
default: '1'
|
|
values:
|
|
- value: 1
|
|
caption: Pre-defined
|
|
showIf:
|
|
1:
|
|
- name: cronTime
|
|
caption: Backup schedule
|
|
type: list
|
|
editable: false
|
|
values:
|
|
- value: 0 * * * *
|
|
caption: "Hourly (at minute 0)"
|
|
- value: 0 0 * * *
|
|
caption: "Daily (at 00:00)"
|
|
- value: 0 0 * * 0
|
|
caption: "Weekly (at 00:00 on Sunday)"
|
|
- value: 0 0 1 * *
|
|
caption: "Monthly (at 00:00 on day 1)"
|
|
default: 0 0 * * *
|
|
- caption: Backup storage
|
|
type: list
|
|
tooltip: "The environment with backup storage to be used for backups creation. Presence of this environment is obligatory."
|
|
name: storageName
|
|
dependsOn: region
|
|
required: true
|
|
- type: spinner
|
|
name: backupCount
|
|
caption: Number of backups
|
|
tooltip: "The number of newest backups to be kept during rotation."
|
|
min: 1
|
|
max: 30
|
|
default: 5
|
|
onBeforeInit: scripts/configOnBeforeInit.js
|
|
|
|
restore:
|
|
fields: []
|
|
onBeforeInit: scripts/multipleRestoreOnBeforeInit.js
|
|
|
|
onBeforeInit: scripts/backupOnBeforeInit.js
|
|
|
|
buttons:
|
|
- caption: Backup All Now
|
|
action: backupallnow
|
|
loadingText: Backing up...
|
|
confirmText: Do you want to initiate the backup process?
|
|
successText: The backup process has been finished successfully.
|
|
|
|
- caption: Restore
|
|
action: restore
|
|
loadingText: Restoring...
|
|
settings: restore
|
|
successText: The backup have been successfully restored.
|
|
title: Restore Backup
|
|
submitButtonText: Restore
|
|
confirmText: You are going to restore from a backup, which will override all your existing data. This action cannot be canceled or reverted. Do you want to proceed?
|
|
|
|
globals:
|
|
scriptSufix: wp-backup
|
|
|
|
onInstall:
|
|
- checkApplication
|
|
- checkAddons
|
|
- installRestic
|
|
- setSchedule
|
|
|
|
onUninstall:
|
|
- callScript: uninstall
|
|
- removeScript
|
|
|
|
onBeforeDelete:
|
|
- callScript: uninstall
|
|
- removeScript
|
|
|
|
onAfterRedeployContainer[cp]:
|
|
- installRestic
|
|
|
|
onAfterClone:
|
|
- script: return {result:0, jps:MANIFEST};
|
|
- install: ${response.jps}
|
|
nodeGroup: ${targetNodes.nodeGroup:cp}
|
|
envName: ${event.response.env.envName}
|
|
settings:
|
|
scheduleType: ${settings.scheduleType}
|
|
storageName: ${settings.storageName}
|
|
cronTime: ${settings.cronTime}
|
|
backupTime: ${settings.backupTime}
|
|
sun: ${settings.sun}
|
|
mon: ${settings.mon}
|
|
tue: ${settings.tue}
|
|
wed: ${settings.wed}
|
|
thu: ${settings.thu}
|
|
fri: ${settings.fri}
|
|
sat: ${settings.sat}
|
|
tz: ${settings.tz}
|
|
backupCount: ${settings.backupCount}
|
|
|
|
onAfterConfirmTransfer: setSchedule
|
|
|
|
actions:
|
|
checkApplication:
|
|
- cmd[${nodes.cp.master.id}]: |-
|
|
[ -f /root/check_app.sh ] && rm -f /root/check_app.sh;
|
|
wget -O /root/check_app.sh ${baseUrl}/scripts/check_app.sh;
|
|
bash /root/check_app.sh;
|
|
user: root
|
|
- if (response.out == "Non-supported"):
|
|
- stopEvent:
|
|
type: warning
|
|
message: Deployed application is not supported by Backup add-on.
|
|
|
|
checkAddons:
|
|
- script: |-
|
|
var onAfterReturn = { setGlobals: {} },
|
|
glbs = onAfterReturn.setGlobals,
|
|
resp = api.marketplace.app.GetAddonList({
|
|
search: {},
|
|
envName: "${env.name}",
|
|
session: session
|
|
});
|
|
if (resp.result != 0) return resp;
|
|
glbs["alreadyInstalled"] = false;
|
|
for (let i = 0, n = resp.apps.length; i < n; i++) {
|
|
if (resp.apps[i].isInstalled) {
|
|
if (resp.apps[i].app_id == 'db-backup') {
|
|
glbs["alreadyInstalled"] = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return { result: 0, onAfterReturn: onAfterReturn };
|
|
- if ('${globals.alreadyInstalled}' == 'true' ):
|
|
- stopEvent:
|
|
type: warning
|
|
message: Database backup add-on is already installed on ${env.name}. Backup addon installation is not possible.
|
|
|
|
installRestic:
|
|
cmd [cp]: |-
|
|
if which dnf; then
|
|
dnf install epel-release
|
|
dnf install restic
|
|
else
|
|
yum-config-manager --add-repo https://copr.fedorainfracloud.org/coprs/copart/restic/repo/epel-7/copart-restic-epel-7.repo
|
|
yum-config-manager --enable copr:copr.fedorainfracloud.org:copart:restic
|
|
yum -y install restic
|
|
yum-config-manager --disable copr:copr.fedorainfracloud.org:copart:restic
|
|
wget -O /etc/logrotate.d/backup-addon ${baseUrl}/scripts/backup-addon;
|
|
fi
|
|
user: root
|
|
|
|
installScript:
|
|
- removeScript
|
|
- getStorageNode
|
|
- script: ${baseUrl}/scripts/create-backup-main-script.js?_r=${fn.random}
|
|
params:
|
|
scriptName: ${env.envName}-${globals.scriptSufix}
|
|
baseUrl: ${baseUrl}
|
|
cronTime: ${this.cronTime}
|
|
backupCount: ${this.backupCount}
|
|
userId: ${env.uid}
|
|
storageNodeId: ${response.storageCtid}
|
|
backupExecNode: ${nodes.cp.master.id}
|
|
storageEnv: ${response.storageEnvShortName}
|
|
|
|
callScript:
|
|
script: |-
|
|
var resp = api.dev.scripting.Eval(appid, session, '${env.envName}-${globals.scriptSufix}', {action:"${this}"});
|
|
if (resp.result === 1702 && "${this}" == "uninstall") {
|
|
return { result: 0, out: "script not found" };
|
|
} else {
|
|
return resp.response || resp;
|
|
}
|
|
|
|
removeScript:
|
|
script: |-
|
|
var resp = api.dev.scripting.GetScript(appid, session, '${env.envName}-${globals.scriptSufix}');
|
|
if (resp.result === 0) {
|
|
var resp = api.dev.scripting.DeleteScript(appid, session, '${env.envName}-${globals.scriptSufix}');
|
|
return resp.response || resp;
|
|
}
|
|
return { result: 0 };
|
|
|
|
backupallnow:
|
|
- callScript: backup
|
|
|
|
restore:
|
|
- cmd[cp]: |-
|
|
echo "${settings.backupedEnvName}" > /root/.backupedenv
|
|
echo "${settings.backupDir}" > /root/.backupid
|
|
user: root
|
|
- callScript: restore
|
|
|
|
configure:
|
|
- setSchedule
|
|
|
|
getStorageNode:
|
|
- script: scripts/getStorageNode.js
|
|
|
|
convert:
|
|
- script: |
|
|
var resp = {result:0, onAfterReturn: {setGlobals:{cron: ""}}}, offset = java.util.TimeZone.getTimeZone("${settings.tz}").getRawOffset(),
|
|
setGlobals = resp.onAfterReturn.setGlobals;
|
|
|
|
var time = "${settings.backupTime}".split(":"),
|
|
d1 = new Date(2020, 1, 10, parseInt(time[0],10), parseInt(time[1],10)),
|
|
d2 = new Date(d1.getTime() - offset),
|
|
dd = d2.getDate() - d1.getDate(),
|
|
days = getDays([${settings.sun:0}, ${settings.mon:0}, ${settings.tue:0}, ${settings.wed:0}, ${settings.thu:0}, ${settings.fri:0}, ${settings.sat:0}], dd);
|
|
|
|
setGlobals.cron = d2.getMinutes() + " " + d2.getHours() + " * * " + days.join(",");
|
|
|
|
|
|
function getDays(settings, dd) {
|
|
var days = [];
|
|
for (var i = 0, n = settings.length; i < n; i++) {
|
|
if (settings[i]) {
|
|
var day = i + dd;
|
|
if (day < 0) day +=7; else if (day > 6) day -=7;
|
|
days.push(day);
|
|
}
|
|
}
|
|
days.sort();
|
|
return days;
|
|
}
|
|
|
|
return resp;
|
|
|
|
setSchedule:
|
|
- setGlobals:
|
|
storageEnv: ${settings.storageName}
|
|
- if ("${settings.scheduleType}" == 2):
|
|
- convert
|
|
- else:
|
|
- setGlobals:
|
|
cron: ${settings.cronTime}
|
|
- installScript:
|
|
cronTime: ${globals.cron}
|
|
backupCount: ${settings.backupCount}
|
|
|
|
backupAllNow:
|
|
- script: ${baseUrl}/scripts/backupAllNow.js
|
|
backupDatabaseOnly:
|
|
- script: ${baseUrl}/scripts/backupDatabaseOnly.js
|
|
backupWordPressCoreOnly:
|
|
- script: ${baseUrl}/scripts/backupWordPressCoreOnly.js
|
|
backupMediaFilesOnly:
|
|
- script: ${baseUrl}/scripts/backupMediaFilesOnly.js
|
|
restoreAllOnSpecific:
|
|
- script: ${baseUrl}/scripts/restoreAllOnSpecific.js
|
|
restoreDatabaseOnly:
|
|
- script: ${baseUrl}/scripts/restoreDatabaseOnly.js
|
|
restoreMediaFilesOnly:
|
|
- script: ${baseUrl}/scripts/restoreMediaFilesOnly.js
|
|
restoreWordPressCoreOnly:
|
|
- script: ${baseUrl}/scripts/restoreWordPressCoreOnly.js
|
|
|
|
menu:
|
|
items:
|
|
- caption: "Backup All Now"
|
|
action: backupAllNow
|
|
- caption: "Backup Database Only"
|
|
action: backupDatabaseOnly
|
|
- caption: "Backup WordPress Core Files Only"
|
|
action: backupWordPressCoreOnly
|
|
- caption: "Backup Media Files Only"
|
|
action: backupMediaFilesOnly
|
|
- caption: "Restore ALL on specific backup"
|
|
action: restoreAllOnSpecific
|
|
- caption: "Restore Database Only (specific backup)"
|
|
action: restoreDatabaseOnly
|
|
- caption: "Restore Media Files Only (specific backup)"
|
|
action: restoreMediaFilesOnly
|
|
- caption: "Restore WordPress Core Files Only (specific backup)"
|
|
action: restoreWordPressCoreOnly
|
|
|