mirror of
https://github.com/jkaninda/mysql-bkup.git
synced 2026-01-24 13:29:04 +01:00
Compare commits
7 Commits
3e8bfabc44
...
v1.2.26
| Author | SHA1 | Date | |
|---|---|---|---|
| e5ba397bb4 | |||
| b7b09ad6fd | |||
| fff0b55722 | |||
| a06872834f | |||
|
|
393168c6c5 | ||
| 5b9ec8a224 | |||
| 0df14f37b4 |
@@ -10,7 +10,7 @@ RUN go mod download
|
|||||||
# Build
|
# Build
|
||||||
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-X 'github.com/jkaninda/mysql-bkup/utils.Version=${appVersion}'" -o /app/mysql-bkup
|
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-X 'github.com/jkaninda/mysql-bkup/utils.Version=${appVersion}'" -o /app/mysql-bkup
|
||||||
|
|
||||||
FROM alpine:3.21.0
|
FROM alpine:3.21.2
|
||||||
ENV TZ=UTC
|
ENV TZ=UTC
|
||||||
ARG WORKDIR="/config"
|
ARG WORKDIR="/config"
|
||||||
ARG BACKUPDIR="/backup"
|
ARG BACKUPDIR="/backup"
|
||||||
|
|||||||
1
go.mod
1
go.mod
@@ -26,7 +26,6 @@ require (
|
|||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
||||||
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
github.com/inconshreveable/mousetrap v1.1.0 // indirect
|
||||||
github.com/jkaninda/go-utils v0.0.0-20250122060806-26119182077a // indirect
|
|
||||||
github.com/jlaffaye/ftp v0.2.0 // indirect
|
github.com/jlaffaye/ftp v0.2.0 // indirect
|
||||||
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
github.com/jmespath/go-jmespath v0.4.0 // indirect
|
||||||
github.com/pkg/errors v0.9.1 // indirect
|
github.com/pkg/errors v0.9.1 // indirect
|
||||||
|
|||||||
4
go.sum
4
go.sum
@@ -43,10 +43,6 @@ github.com/jkaninda/encryptor v0.0.0-20241111100652-926393c9437e h1:jtFKZHt/PLGQ
|
|||||||
github.com/jkaninda/encryptor v0.0.0-20241111100652-926393c9437e/go.mod h1:Y1EXpPWQ9PNd7y7E6ez3xgnzZc8fuDWXwX/1/dXNCE4=
|
github.com/jkaninda/encryptor v0.0.0-20241111100652-926393c9437e/go.mod h1:Y1EXpPWQ9PNd7y7E6ez3xgnzZc8fuDWXwX/1/dXNCE4=
|
||||||
github.com/jkaninda/go-storage v0.1.3 h1:lEpHVgFLKSvjsi/6tAek96Y07za3vxmsXF2/+jiCMZU=
|
github.com/jkaninda/go-storage v0.1.3 h1:lEpHVgFLKSvjsi/6tAek96Y07za3vxmsXF2/+jiCMZU=
|
||||||
github.com/jkaninda/go-storage v0.1.3/go.mod h1:zVRnLprBk/9AUz2+za6Y03MgoNYrqKLy3edVtjqMaps=
|
github.com/jkaninda/go-storage v0.1.3/go.mod h1:zVRnLprBk/9AUz2+za6Y03MgoNYrqKLy3edVtjqMaps=
|
||||||
github.com/jkaninda/go-utils v0.0.0-20250122054739-d330fecee150 h1:AgcKk58P/Z+u4DBE2MTyZ6kCweA89YUpX7TuttHS3oQ=
|
|
||||||
github.com/jkaninda/go-utils v0.0.0-20250122054739-d330fecee150/go.mod h1:pf0/U6k4JbxlablM2G4eSTZdQ2LFshfAsCK5Q8qNfGo=
|
|
||||||
github.com/jkaninda/go-utils v0.0.0-20250122060806-26119182077a h1:ZTpKujQGhEF266RWkD2cXnCsafk3R2+sGtfbzCQSs1s=
|
|
||||||
github.com/jkaninda/go-utils v0.0.0-20250122060806-26119182077a/go.mod h1:pf0/U6k4JbxlablM2G4eSTZdQ2LFshfAsCK5Q8qNfGo=
|
|
||||||
github.com/jlaffaye/ftp v0.2.0 h1:lXNvW7cBu7R/68bknOX3MrRIIqZ61zELs1P2RAiA3lg=
|
github.com/jlaffaye/ftp v0.2.0 h1:lXNvW7cBu7R/68bknOX3MrRIIqZ61zELs1P2RAiA3lg=
|
||||||
github.com/jlaffaye/ftp v0.2.0/go.mod h1:is2Ds5qkhceAPy2xD6RLI6hmp/qysSoymZ+Z2uTnspI=
|
github.com/jlaffaye/ftp v0.2.0/go.mod h1:is2Ds5qkhceAPy2xD6RLI6hmp/qysSoymZ+Z2uTnspI=
|
||||||
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ package pkg
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/jkaninda/go-storage/pkg/azure"
|
"github.com/jkaninda/go-storage/pkg/azure"
|
||||||
goutils "github.com/jkaninda/go-utils"
|
|
||||||
"github.com/jkaninda/mysql-bkup/utils"
|
"github.com/jkaninda/mysql-bkup/utils"
|
||||||
|
|
||||||
"os"
|
"os"
|
||||||
@@ -37,6 +36,7 @@ import (
|
|||||||
|
|
||||||
func azureBackup(db *dbConfig, config *BackupConfig) {
|
func azureBackup(db *dbConfig, config *BackupConfig) {
|
||||||
utils.Info("Backup database to Azure Blob Storage")
|
utils.Info("Backup database to Azure Blob Storage")
|
||||||
|
startTime = time.Now().Format(utils.TimeFormat())
|
||||||
|
|
||||||
// Backup database
|
// Backup database
|
||||||
BackupDatabase(db, config.backupFileName, disableCompression)
|
BackupDatabase(db, config.backupFileName, disableCompression)
|
||||||
@@ -87,8 +87,6 @@ func azureBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
utils.Info("Backup size: %s", utils.ConvertBytes(uint64(backupSize)))
|
utils.Info("Backup size: %s", utils.ConvertBytes(uint64(backupSize)))
|
||||||
utils.Info("Uploading backup archive to Azure Blob storage ... done ")
|
utils.Info("Uploading backup archive to Azure Blob storage ... done ")
|
||||||
|
|
||||||
duration := goutils.FormatDuration(time.Since(startTime), 0)
|
|
||||||
|
|
||||||
// Send notification
|
// Send notification
|
||||||
utils.NotifySuccess(&utils.NotificationData{
|
utils.NotifySuccess(&utils.NotificationData{
|
||||||
File: finalFileName,
|
File: finalFileName,
|
||||||
@@ -96,11 +94,12 @@ func azureBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
Database: db.dbName,
|
Database: db.dbName,
|
||||||
Storage: config.storage,
|
Storage: config.storage,
|
||||||
BackupLocation: filepath.Join(config.remotePath, finalFileName),
|
BackupLocation: filepath.Join(config.remotePath, finalFileName),
|
||||||
Duration: duration,
|
StartTime: startTime,
|
||||||
|
EndTime: time.Now().Format(utils.TimeFormat()),
|
||||||
})
|
})
|
||||||
// Delete temp
|
// Delete temp
|
||||||
deleteTemp()
|
deleteTemp()
|
||||||
utils.Info("Backup successfully completed in %s", duration)
|
utils.Info("Backup completed successfully")
|
||||||
}
|
}
|
||||||
func azureRestore(db *dbConfig, conf *RestoreConfig) {
|
func azureRestore(db *dbConfig, conf *RestoreConfig) {
|
||||||
utils.Info("Restore database from Azure Blob storage")
|
utils.Info("Restore database from Azure Blob storage")
|
||||||
|
|||||||
@@ -29,7 +29,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/jkaninda/encryptor"
|
"github.com/jkaninda/encryptor"
|
||||||
"github.com/jkaninda/go-storage/pkg/local"
|
"github.com/jkaninda/go-storage/pkg/local"
|
||||||
goutils "github.com/jkaninda/go-utils"
|
|
||||||
"github.com/jkaninda/mysql-bkup/utils"
|
"github.com/jkaninda/mysql-bkup/utils"
|
||||||
"github.com/robfig/cron/v3"
|
"github.com/robfig/cron/v3"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
@@ -108,7 +107,6 @@ func multiBackupTask(databases []Database, bkConfig *BackupConfig) {
|
|||||||
// BackupTask backups database
|
// BackupTask backups database
|
||||||
func BackupTask(db *dbConfig, config *BackupConfig) {
|
func BackupTask(db *dbConfig, config *BackupConfig) {
|
||||||
utils.Info("Starting backup task...")
|
utils.Info("Starting backup task...")
|
||||||
startTime = time.Now()
|
|
||||||
// Generate file name
|
// Generate file name
|
||||||
backupFileName := fmt.Sprintf("%s_%s.sql.gz", db.dbName, time.Now().Format("20060102_150405"))
|
backupFileName := fmt.Sprintf("%s_%s.sql.gz", db.dbName, time.Now().Format("20060102_150405"))
|
||||||
if config.disableCompression {
|
if config.disableCompression {
|
||||||
@@ -120,7 +118,7 @@ func BackupTask(db *dbConfig, config *BackupConfig) {
|
|||||||
localBackup(db, config)
|
localBackup(db, config)
|
||||||
case "s3", "S3":
|
case "s3", "S3":
|
||||||
s3Backup(db, config)
|
s3Backup(db, config)
|
||||||
case "ssh", "SSH", "remote", "sftp":
|
case "ssh", "SSH", "remote":
|
||||||
sshBackup(db, config)
|
sshBackup(db, config)
|
||||||
case "ftp", "FTP":
|
case "ftp", "FTP":
|
||||||
ftpBackup(db, config)
|
ftpBackup(db, config)
|
||||||
@@ -258,6 +256,7 @@ func BackupDatabase(db *dbConfig, backupFileName string, disableCompression bool
|
|||||||
}
|
}
|
||||||
func localBackup(db *dbConfig, config *BackupConfig) {
|
func localBackup(db *dbConfig, config *BackupConfig) {
|
||||||
utils.Info("Backup database to local storage")
|
utils.Info("Backup database to local storage")
|
||||||
|
startTime = time.Now().Format(utils.TimeFormat())
|
||||||
BackupDatabase(db, config.backupFileName, disableCompression)
|
BackupDatabase(db, config.backupFileName, disableCompression)
|
||||||
finalFileName := config.backupFileName
|
finalFileName := config.backupFileName
|
||||||
if config.encryption {
|
if config.encryption {
|
||||||
@@ -280,8 +279,6 @@ func localBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
utils.Info("Backup name is %s", finalFileName)
|
utils.Info("Backup name is %s", finalFileName)
|
||||||
utils.Info("Backup size: %s", utils.ConvertBytes(uint64(backupSize)))
|
utils.Info("Backup size: %s", utils.ConvertBytes(uint64(backupSize)))
|
||||||
utils.Info("Backup saved in %s", filepath.Join(storagePath, finalFileName))
|
utils.Info("Backup saved in %s", filepath.Join(storagePath, finalFileName))
|
||||||
duration := goutils.FormatDuration(time.Since(startTime), 0)
|
|
||||||
|
|
||||||
// Send notification
|
// Send notification
|
||||||
utils.NotifySuccess(&utils.NotificationData{
|
utils.NotifySuccess(&utils.NotificationData{
|
||||||
File: finalFileName,
|
File: finalFileName,
|
||||||
@@ -289,7 +286,8 @@ func localBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
Database: db.dbName,
|
Database: db.dbName,
|
||||||
Storage: config.storage,
|
Storage: config.storage,
|
||||||
BackupLocation: filepath.Join(storagePath, finalFileName),
|
BackupLocation: filepath.Join(storagePath, finalFileName),
|
||||||
Duration: duration,
|
StartTime: startTime,
|
||||||
|
EndTime: time.Now().Format(utils.TimeFormat()),
|
||||||
})
|
})
|
||||||
// Delete old backup
|
// Delete old backup
|
||||||
if config.prune {
|
if config.prune {
|
||||||
@@ -301,7 +299,7 @@ func localBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
}
|
}
|
||||||
// Delete temp
|
// Delete temp
|
||||||
deleteTemp()
|
deleteTemp()
|
||||||
utils.Info("Backup successfully completed in %s", duration)
|
utils.Info("Backup completed successfully")
|
||||||
}
|
}
|
||||||
|
|
||||||
func encryptBackup(config *BackupConfig) {
|
func encryptBackup(config *BackupConfig) {
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"github.com/jkaninda/go-storage/pkg/ftp"
|
"github.com/jkaninda/go-storage/pkg/ftp"
|
||||||
"github.com/jkaninda/go-storage/pkg/ssh"
|
"github.com/jkaninda/go-storage/pkg/ssh"
|
||||||
goutils "github.com/jkaninda/go-utils"
|
|
||||||
"github.com/jkaninda/mysql-bkup/utils"
|
"github.com/jkaninda/mysql-bkup/utils"
|
||||||
|
|
||||||
"os"
|
"os"
|
||||||
@@ -38,6 +37,7 @@ import (
|
|||||||
|
|
||||||
func sshBackup(db *dbConfig, config *BackupConfig) {
|
func sshBackup(db *dbConfig, config *BackupConfig) {
|
||||||
utils.Info("Backup database to Remote server")
|
utils.Info("Backup database to Remote server")
|
||||||
|
startTime = time.Now().Format(utils.TimeFormat())
|
||||||
// Backup database
|
// Backup database
|
||||||
BackupDatabase(db, config.backupFileName, disableCompression)
|
BackupDatabase(db, config.backupFileName, disableCompression)
|
||||||
finalFileName := config.backupFileName
|
finalFileName := config.backupFileName
|
||||||
@@ -91,8 +91,6 @@ func sshBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
|
|
||||||
}
|
}
|
||||||
utils.Info("Uploading backup archive to remote storage ... done ")
|
utils.Info("Uploading backup archive to remote storage ... done ")
|
||||||
duration := goutils.FormatDuration(time.Since(startTime), 0)
|
|
||||||
|
|
||||||
// Send notification
|
// Send notification
|
||||||
utils.NotifySuccess(&utils.NotificationData{
|
utils.NotifySuccess(&utils.NotificationData{
|
||||||
File: finalFileName,
|
File: finalFileName,
|
||||||
@@ -100,11 +98,12 @@ func sshBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
Database: db.dbName,
|
Database: db.dbName,
|
||||||
Storage: config.storage,
|
Storage: config.storage,
|
||||||
BackupLocation: filepath.Join(config.remotePath, finalFileName),
|
BackupLocation: filepath.Join(config.remotePath, finalFileName),
|
||||||
Duration: duration,
|
StartTime: startTime,
|
||||||
|
EndTime: time.Now().Format(utils.TimeFormat()),
|
||||||
})
|
})
|
||||||
// Delete temp
|
// Delete temp
|
||||||
deleteTemp()
|
deleteTemp()
|
||||||
utils.Info("Backup successfully completed in %s", duration)
|
utils.Info("Backup completed successfully")
|
||||||
|
|
||||||
}
|
}
|
||||||
func remoteRestore(db *dbConfig, conf *RestoreConfig) {
|
func remoteRestore(db *dbConfig, conf *RestoreConfig) {
|
||||||
@@ -154,6 +153,7 @@ func ftpRestore(db *dbConfig, conf *RestoreConfig) {
|
|||||||
}
|
}
|
||||||
func ftpBackup(db *dbConfig, config *BackupConfig) {
|
func ftpBackup(db *dbConfig, config *BackupConfig) {
|
||||||
utils.Info("Backup database to the remote FTP server")
|
utils.Info("Backup database to the remote FTP server")
|
||||||
|
startTime = time.Now().Format(utils.TimeFormat())
|
||||||
|
|
||||||
// Backup database
|
// Backup database
|
||||||
BackupDatabase(db, config.backupFileName, disableCompression)
|
BackupDatabase(db, config.backupFileName, disableCompression)
|
||||||
@@ -203,7 +203,6 @@ func ftpBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
utils.Info("Backup name is %s", finalFileName)
|
utils.Info("Backup name is %s", finalFileName)
|
||||||
utils.Info("Backup size: %s", utils.ConvertBytes(uint64(backupSize)))
|
utils.Info("Backup size: %s", utils.ConvertBytes(uint64(backupSize)))
|
||||||
utils.Info("Uploading backup archive to the remote FTP server ... done ")
|
utils.Info("Uploading backup archive to the remote FTP server ... done ")
|
||||||
duration := goutils.FormatDuration(time.Since(startTime), 0)
|
|
||||||
|
|
||||||
// Send notification
|
// Send notification
|
||||||
utils.NotifySuccess(&utils.NotificationData{
|
utils.NotifySuccess(&utils.NotificationData{
|
||||||
@@ -212,9 +211,10 @@ func ftpBackup(db *dbConfig, config *BackupConfig) {
|
|||||||
Database: db.dbName,
|
Database: db.dbName,
|
||||||
Storage: config.storage,
|
Storage: config.storage,
|
||||||
BackupLocation: filepath.Join(config.remotePath, finalFileName),
|
BackupLocation: filepath.Join(config.remotePath, finalFileName),
|
||||||
Duration: duration,
|
StartTime: startTime,
|
||||||
|
EndTime: time.Now().Format(utils.TimeFormat()),
|
||||||
})
|
})
|
||||||
// Delete temp
|
// Delete temp
|
||||||
deleteTemp()
|
deleteTemp()
|
||||||
utils.Info("Backup successfully completed in %s", duration)
|
utils.Info("Backup completed successfully")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ package pkg
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/jkaninda/go-storage/pkg/s3"
|
"github.com/jkaninda/go-storage/pkg/s3"
|
||||||
goutils "github.com/jkaninda/go-utils"
|
|
||||||
"github.com/jkaninda/mysql-bkup/utils"
|
"github.com/jkaninda/mysql-bkup/utils"
|
||||||
|
|
||||||
"os"
|
"os"
|
||||||
@@ -38,6 +37,7 @@ import (
|
|||||||
func s3Backup(db *dbConfig, config *BackupConfig) {
|
func s3Backup(db *dbConfig, config *BackupConfig) {
|
||||||
|
|
||||||
utils.Info("Backup database to s3 storage")
|
utils.Info("Backup database to s3 storage")
|
||||||
|
startTime = time.Now().Format(utils.TimeFormat())
|
||||||
// Backup database
|
// Backup database
|
||||||
BackupDatabase(db, config.backupFileName, disableCompression)
|
BackupDatabase(db, config.backupFileName, disableCompression)
|
||||||
finalFileName := config.backupFileName
|
finalFileName := config.backupFileName
|
||||||
@@ -91,7 +91,6 @@ func s3Backup(db *dbConfig, config *BackupConfig) {
|
|||||||
}
|
}
|
||||||
utils.Info("Backup saved in %s", filepath.Join(config.remotePath, finalFileName))
|
utils.Info("Backup saved in %s", filepath.Join(config.remotePath, finalFileName))
|
||||||
utils.Info("Uploading backup archive to remote storage S3 ... done ")
|
utils.Info("Uploading backup archive to remote storage S3 ... done ")
|
||||||
duration := goutils.FormatDuration(time.Since(startTime), 0)
|
|
||||||
// Send notification
|
// Send notification
|
||||||
utils.NotifySuccess(&utils.NotificationData{
|
utils.NotifySuccess(&utils.NotificationData{
|
||||||
File: finalFileName,
|
File: finalFileName,
|
||||||
@@ -99,11 +98,12 @@ func s3Backup(db *dbConfig, config *BackupConfig) {
|
|||||||
Database: db.dbName,
|
Database: db.dbName,
|
||||||
Storage: config.storage,
|
Storage: config.storage,
|
||||||
BackupLocation: filepath.Join(config.remotePath, finalFileName),
|
BackupLocation: filepath.Join(config.remotePath, finalFileName),
|
||||||
Duration: duration,
|
StartTime: startTime,
|
||||||
|
EndTime: time.Now().Format(utils.TimeFormat()),
|
||||||
})
|
})
|
||||||
// Delete temp
|
// Delete temp
|
||||||
deleteTemp()
|
deleteTemp()
|
||||||
utils.Info("Backup successfully completed in %s", duration)
|
utils.Info("Backup completed successfully")
|
||||||
|
|
||||||
}
|
}
|
||||||
func s3Restore(db *dbConfig, conf *RestoreConfig) {
|
func s3Restore(db *dbConfig, conf *RestoreConfig) {
|
||||||
|
|||||||
@@ -24,8 +24,6 @@ SOFTWARE.
|
|||||||
|
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
const tmpPath = "/tmp/backup"
|
const tmpPath = "/tmp/backup"
|
||||||
const gpgHome = "/config/gnupg"
|
const gpgHome = "/config/gnupg"
|
||||||
const gpgExtension = "gpg"
|
const gpgExtension = "gpg"
|
||||||
@@ -41,7 +39,7 @@ var (
|
|||||||
encryption = false
|
encryption = false
|
||||||
usingKey = false
|
usingKey = false
|
||||||
backupSize int64 = 0
|
backupSize int64 = 0
|
||||||
startTime = time.Now()
|
startTime string
|
||||||
)
|
)
|
||||||
|
|
||||||
// dbHVars Required environment variables for database
|
// dbHVars Required environment variables for database
|
||||||
|
|||||||
@@ -52,7 +52,8 @@
|
|||||||
<h3>Backup Details:</h3>
|
<h3>Backup Details:</h3>
|
||||||
<ul>
|
<ul>
|
||||||
<li><strong>Database Name:</strong> {{.Database}}</li>
|
<li><strong>Database Name:</strong> {{.Database}}</li>
|
||||||
<li><strong>Backup Duration:</strong> {{.Duration}}</li>
|
<li><strong>Backup Start Time:</strong> {{.StartTime}}</li>
|
||||||
|
<li><strong>Backup End Time:</strong> {{.EndTime}}</li>
|
||||||
<li><strong>Backup Storage:</strong> {{.Storage}}</li>
|
<li><strong>Backup Storage:</strong> {{.Storage}}</li>
|
||||||
<li><strong>Backup Location:</strong> {{.BackupLocation}}</li>
|
<li><strong>Backup Location:</strong> {{.BackupLocation}}</li>
|
||||||
<li><strong>Backup Size:</strong> {{.BackupSize}}</li>
|
<li><strong>Backup Size:</strong> {{.BackupSize}}</li>
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ Please find the details below:
|
|||||||
|
|
||||||
Backup Details:
|
Backup Details:
|
||||||
- Database Name: {{.Database}}
|
- Database Name: {{.Database}}
|
||||||
- Backup Duration: {{.Duration}}
|
- Backup Start Time: {{.StartTime}}
|
||||||
|
- Backup EndTime: {{.EndTime}}
|
||||||
- Backup Storage: {{.Storage}}
|
- Backup Storage: {{.Storage}}
|
||||||
- Backup Location: {{.BackupLocation}}
|
- Backup Location: {{.BackupLocation}}
|
||||||
- Backup Size: {{.BackupSize}}
|
- Backup Size: {{.BackupSize}}
|
||||||
|
|||||||
@@ -39,7 +39,8 @@ type NotificationData struct {
|
|||||||
File string
|
File string
|
||||||
BackupSize string
|
BackupSize string
|
||||||
Database string
|
Database string
|
||||||
Duration string
|
StartTime string
|
||||||
|
EndTime string
|
||||||
Storage string
|
Storage string
|
||||||
BackupLocation string
|
BackupLocation string
|
||||||
BackupReference string
|
BackupReference string
|
||||||
|
|||||||
Reference in New Issue
Block a user