type: update jpsVersion: 1.0 name: MightyBox WordPress Backup/Restore Addon id: mb-backup-manager targetEditions: any 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.mightybox.io/addons/mb-backup-manager targetNodes: nodeType: - nginxphp - litespeedphp - lemp - llsmp 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 Now action: backup 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 - getStorageCtid - 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 }; backup: - callScript: backup restore: - cmd[cp]: |- echo "${settings.backupedEnvName}" > /root/.backupedenv echo "${settings.backupDir}" > /root/.backupid user: root - callScript: restore configure: - setSchedule getStorageCtid: - script: scripts/getStorageCtid.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