mirror of
https://github.com/jkaninda/mysql-bkup.git
synced 2025-12-07 22:19:42 +01:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4808f093e5 | ||
|
|
c7a03861fe | ||
|
|
36ec63d522 | ||
|
|
0f07de1d83 | ||
|
|
ae55839996 | ||
|
|
a7f7e57a0d | ||
|
|
b2ddaec93b | ||
|
|
b3570d774c |
@@ -5,12 +5,13 @@ It also supports __encrypting__ your backups using GPG.
|
|||||||
The [jkaninda/mysql-bkup](https://hub.docker.com/r/jkaninda/mysql-bkup) Docker image can be deployed on Docker, Docker Swarm and Kubernetes.
|
The [jkaninda/mysql-bkup](https://hub.docker.com/r/jkaninda/mysql-bkup) Docker image can be deployed on Docker, Docker Swarm and Kubernetes.
|
||||||
It handles __recurring__ backups of postgres database on Docker and can be deployed as __CronJob on Kubernetes__ using local, AWS S3 or SSH compatible storage.
|
It handles __recurring__ backups of postgres database on Docker and can be deployed as __CronJob on Kubernetes__ using local, AWS S3 or SSH compatible storage.
|
||||||
|
|
||||||
It also supports __encrypting__ your backups using GPG.
|
It also supports database __encryption__ using GPG.
|
||||||
|
|
||||||
[](https://github.com/jkaninda/mysql-bkup/actions/workflows/release.yml)
|
[](https://github.com/jkaninda/mysql-bkup/actions/workflows/release.yml)
|
||||||
[](https://goreportcard.com/report/github.com/jkaninda/mysql-bkup)
|
[](https://goreportcard.com/report/github.com/jkaninda/mysql-bkup)
|
||||||

|

|
||||||

|

|
||||||
|
<a href="https://ko-fi.com/jkaninda"><img src="https://uploads-ssl.webflow.com/5c14e387dab576fe667689cf/5cbed8a4ae2b88347c06c923_BuyMeACoffee_blue.png" height="20" alt="buy ma a coffee"></a>
|
||||||
|
|
||||||
Successfully tested on:
|
Successfully tested on:
|
||||||
- Docker
|
- Docker
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package cmd /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package cmd /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
10
cmd/root.go
10
cmd/root.go
@@ -1,7 +1,9 @@
|
|||||||
// Package cmd /*
|
// Package cmd /
|
||||||
/*
|
/*****
|
||||||
Copyright © 2024 Jonas Kaninda
|
@author Jonas Kaninda
|
||||||
*/
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
|
// Package cmd /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package cmd
|
package cmd
|
||||||
|
|
||||||
/*
|
|
||||||
Copyright © 2024 Jonas Kaninda
|
|
||||||
*/
|
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ ENV TARGET_DB_NAME="localhost"
|
|||||||
ENV TARGET_DB_USERNAME=""
|
ENV TARGET_DB_USERNAME=""
|
||||||
ENV TARGET_DB_PASSWORD=""
|
ENV TARGET_DB_PASSWORD=""
|
||||||
ARG DEBIAN_FRONTEND=noninteractive
|
ARG DEBIAN_FRONTEND=noninteractive
|
||||||
ENV VERSION="v1.2.4"
|
ENV VERSION="v1.2.5"
|
||||||
ENV BACKUP_CRON_EXPRESSION=""
|
ENV BACKUP_CRON_EXPRESSION=""
|
||||||
ARG WORKDIR="/config"
|
ARG WORKDIR="/config"
|
||||||
ARG BACKUPDIR="/backup"
|
ARG BACKUPDIR="/backup"
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ spec:
|
|||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/sh
|
||||||
- -c
|
- -c
|
||||||
- mysql-bkup backup -s s3 --path /custom_path
|
- backup -s s3 --path /custom_path
|
||||||
env:
|
env:
|
||||||
- name: DB_PORT
|
- name: DB_PORT
|
||||||
value: "3306"
|
value: "3306"
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ spec:
|
|||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/sh
|
||||||
- -c
|
- -c
|
||||||
- mysql-bkup backup -s ssh
|
- backup -s ssh
|
||||||
env:
|
env:
|
||||||
- name: DB_PORT
|
- name: DB_PORT
|
||||||
value: "3306"
|
value: "3306"
|
||||||
|
|||||||
@@ -30,10 +30,7 @@ spec:
|
|||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/sh
|
||||||
- -c
|
- -c
|
||||||
- bkup
|
- backup --storage s3
|
||||||
- backup
|
|
||||||
- --storage
|
|
||||||
- s3
|
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "128Mi"
|
memory: "128Mi"
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ spec:
|
|||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/sh
|
||||||
- -c
|
- -c
|
||||||
- bkup restore -s s3 --path /custom_path -f store_20231219_022941.sql.gz
|
- restore -s s3 --path /custom_path -f store_20231219_022941.sql.gz
|
||||||
env:
|
env:
|
||||||
- name: DB_PORT
|
- name: DB_PORT
|
||||||
value: "3306"
|
value: "3306"
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ spec:
|
|||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/sh
|
||||||
- -c
|
- -c
|
||||||
- bkup restore -s ssh -f store_20231219_022941.sql.gz
|
- restore -s ssh -f store_20231219_022941.sql.gz
|
||||||
env:
|
env:
|
||||||
- name: DB_PORT
|
- name: DB_PORT
|
||||||
value: "3306"
|
value: "3306"
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ nav_order: 1
|
|||||||
|
|
||||||
# About mysql-bkup
|
# About mysql-bkup
|
||||||
{:.no_toc}
|
{:.no_toc}
|
||||||
MySQL Backup is a Docker container image that can be used to backup and restore MySQL database. It supports local storage, AWS S3 or any S3 Alternatives for Object Storage, and SSH remote storage.
|
MySQL Backup is a Docker container image that can be used to backup, restore and migrate MySQL database. It supports local storage, AWS S3 or any S3 Alternatives for Object Storage, and SSH remote storage.
|
||||||
It also supports __encrypting__ your backups using GPG.
|
It also supports __encrypting__ your backups using GPG.
|
||||||
|
|
||||||
We are open to receiving stars, PRs, and issues!
|
We are open to receiving stars, PRs, and issues!
|
||||||
@@ -19,7 +19,8 @@ We are open to receiving stars, PRs, and issues!
|
|||||||
The [jkaninda/mysql-bkup](https://hub.docker.com/r/jkaninda/mysql-bkup) Docker image can be deployed on Docker, Docker Swarm and Kubernetes.
|
The [jkaninda/mysql-bkup](https://hub.docker.com/r/jkaninda/mysql-bkup) Docker image can be deployed on Docker, Docker Swarm and Kubernetes.
|
||||||
It handles __recurring__ backups of postgres database on Docker and can be deployed as __CronJob on Kubernetes__ using local, AWS S3 or SSH compatible storage.
|
It handles __recurring__ backups of postgres database on Docker and can be deployed as __CronJob on Kubernetes__ using local, AWS S3 or SSH compatible storage.
|
||||||
|
|
||||||
It also supports __encrypting__ your backups using GPG.
|
It also supports database __encryption__ using GPG.
|
||||||
|
|
||||||
|
|
||||||
{: .note }
|
{: .note }
|
||||||
Code and documentation for `v1` version on [this branch][v1-branch].
|
Code and documentation for `v1` version on [this branch][v1-branch].
|
||||||
|
|||||||
@@ -62,7 +62,8 @@ Backup, restore and migrate targets, schedule and retention are configured using
|
|||||||
| TARGET_DB_NAME | Optional, required for database migration | Target database name |
|
| TARGET_DB_NAME | Optional, required for database migration | Target database name |
|
||||||
| TARGET_DB_USERNAME | Optional, required for database migration | Target database username |
|
| TARGET_DB_USERNAME | Optional, required for database migration | Target database username |
|
||||||
| TARGET_DB_PASSWORD | Optional, required for database migration | Target database password |
|
| TARGET_DB_PASSWORD | Optional, required for database migration | Target database password |
|
||||||
|
| TG_TOKEN | Optional, required for Telegram notification | Telegram token |
|
||||||
|
| TG_CHAT_ID | Optional, required for Telegram notification | Telegram Chat ID |
|
||||||
---
|
---
|
||||||
## Run in Scheduled mode
|
## Run in Scheduled mode
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ spec:
|
|||||||
command:
|
command:
|
||||||
- /bin/sh
|
- /bin/sh
|
||||||
- -c
|
- -c
|
||||||
- bkup
|
- backup --storage s3
|
||||||
- backup
|
|
||||||
- --storage
|
|
||||||
- s3
|
|
||||||
resources:
|
resources:
|
||||||
limits:
|
limits:
|
||||||
memory: "128Mi"
|
memory: "128Mi"
|
||||||
|
|||||||
13
main.go
13
main.go
@@ -1,12 +1,11 @@
|
|||||||
|
// Package main /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package main
|
package main
|
||||||
|
|
||||||
//main
|
|
||||||
/*****
|
|
||||||
* MySQL Backup & Restore
|
|
||||||
* @author Jonas Kaninda
|
|
||||||
* @license MIT License <https://opensource.org/licenses/MIT>
|
|
||||||
* @link https://github.com/jkaninda/mysql-bkup
|
|
||||||
**/
|
|
||||||
import "github.com/jkaninda/mysql-bkup/cmd"
|
import "github.com/jkaninda/mysql-bkup/cmd"
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
// Package pkg /*
|
// Package pkg /
|
||||||
/*
|
/*****
|
||||||
Copyright © 2024 Jonas Kaninda
|
@author Jonas Kaninda
|
||||||
*/
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -17,7 +19,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func StartBackup(cmd *cobra.Command) {
|
func StartBackup(cmd *cobra.Command) {
|
||||||
_, _ = cmd.Flags().GetString("operation")
|
utils.Welcome()
|
||||||
//Set env
|
//Set env
|
||||||
utils.SetEnv("STORAGE_PATH", storagePath)
|
utils.SetEnv("STORAGE_PATH", storagePath)
|
||||||
utils.GetEnv(cmd, "period", "BACKUP_CRON_EXPRESSION")
|
utils.GetEnv(cmd, "period", "BACKUP_CRON_EXPRESSION")
|
||||||
@@ -193,6 +195,8 @@ func localBackup(db *dbConfig, backupFileName string, disableCompression bool, p
|
|||||||
}
|
}
|
||||||
utils.Info("Backup name is %s", finalFileName)
|
utils.Info("Backup name is %s", finalFileName)
|
||||||
moveToBackup(finalFileName, storagePath)
|
moveToBackup(finalFileName, storagePath)
|
||||||
|
//Send notification
|
||||||
|
utils.NotifySuccess(finalFileName)
|
||||||
//Delete old backup
|
//Delete old backup
|
||||||
if prune {
|
if prune {
|
||||||
deleteOldBackup(backupRetention)
|
deleteOldBackup(backupRetention)
|
||||||
@@ -234,6 +238,8 @@ func s3Backup(db *dbConfig, backupFileName string, disableCompression bool, prun
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
utils.Done("Uploading backup archive to remote storage S3 ... done ")
|
utils.Done("Uploading backup archive to remote storage S3 ... done ")
|
||||||
|
//Send notification
|
||||||
|
utils.NotifySuccess(finalFileName)
|
||||||
//Delete temp
|
//Delete temp
|
||||||
deleteTemp()
|
deleteTemp()
|
||||||
}
|
}
|
||||||
@@ -267,6 +273,8 @@ func sshBackup(db *dbConfig, backupFileName, remotePath string, disableCompressi
|
|||||||
}
|
}
|
||||||
|
|
||||||
utils.Done("Uploading backup archive to remote storage ... done ")
|
utils.Done("Uploading backup archive to remote storage ... done ")
|
||||||
|
//Send notification
|
||||||
|
utils.NotifySuccess(finalFileName)
|
||||||
//Delete temp
|
//Delete temp
|
||||||
deleteTemp()
|
deleteTemp()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package pkg /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package pkg /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package pkg /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package pkg /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -8,6 +14,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func StartMigration(cmd *cobra.Command) {
|
func StartMigration(cmd *cobra.Command) {
|
||||||
|
utils.Welcome()
|
||||||
utils.Info("Starting database migration...")
|
utils.Info("Starting database migration...")
|
||||||
//Get DB config
|
//Get DB config
|
||||||
dbConf = getDbConfig(cmd)
|
dbConf = getDbConfig(cmd)
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package pkg /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -10,7 +16,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func StartRestore(cmd *cobra.Command) {
|
func StartRestore(cmd *cobra.Command) {
|
||||||
|
utils.Welcome()
|
||||||
//Set env
|
//Set env
|
||||||
utils.SetEnv("STORAGE_PATH", storagePath)
|
utils.SetEnv("STORAGE_PATH", storagePath)
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package pkg /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
|
// Package pkg /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
// Package pkg /*
|
|
||||||
/*
|
|
||||||
Copyright © 2024 Jonas Kaninda
|
|
||||||
*/
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/jkaninda/mysql-bkup/utils"
|
"github.com/jkaninda/mysql-bkup/utils"
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package pkg /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package pkg
|
package pkg
|
||||||
|
|
||||||
const cronLogFile = "/var/log/mysql-bkup.log"
|
const cronLogFile = "/var/log/mysql-bkup.log"
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package utils /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
const RestoreExample = "mysql-bkup restore --dbname database --file db_20231219_022941.sql.gz\n" +
|
const RestoreExample = "mysql-bkup restore --dbname database --file db_20231219_022941.sql.gz\n" +
|
||||||
|
|||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package utils /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -49,8 +55,13 @@ func Fatal(msg string, args ...any) {
|
|||||||
formattedMessage := fmt.Sprintf(msg, args...)
|
formattedMessage := fmt.Sprintf(msg, args...)
|
||||||
if len(args) == 0 {
|
if len(args) == 0 {
|
||||||
fmt.Printf("%s ERROR: %s\n", currentTime, msg)
|
fmt.Printf("%s ERROR: %s\n", currentTime, msg)
|
||||||
|
NotifyError(msg)
|
||||||
} else {
|
} else {
|
||||||
fmt.Printf("%s ERROR: %s\n", currentTime, formattedMessage)
|
fmt.Printf("%s ERROR: %s\n", currentTime, formattedMessage)
|
||||||
|
NotifyError(formattedMessage)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
os.Kill.Signal()
|
||||||
}
|
}
|
||||||
|
|||||||
75
utils/notification.go
Normal file
75
utils/notification.go
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
func sendMessage(msg string) {
|
||||||
|
|
||||||
|
Info("Sending notification... ")
|
||||||
|
chatId := os.Getenv("TG_CHAT_ID")
|
||||||
|
body, _ := json.Marshal(map[string]string{
|
||||||
|
"chat_id": chatId,
|
||||||
|
"text": msg,
|
||||||
|
})
|
||||||
|
url := fmt.Sprintf("%s/sendMessage", getTgUrl())
|
||||||
|
// Create an HTTP post request
|
||||||
|
request, err := http.NewRequest("POST", url, bytes.NewBuffer(body))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
request.Header.Add("Content-Type", "application/json")
|
||||||
|
client := &http.Client{}
|
||||||
|
response, err := client.Do(request)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
code := response.StatusCode
|
||||||
|
if code == 200 {
|
||||||
|
Info("Notification has been sent")
|
||||||
|
} else {
|
||||||
|
body, _ := ioutil.ReadAll(response.Body)
|
||||||
|
Error("Message not sent, error: %s", string(body))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
func NotifySuccess(fileName string) {
|
||||||
|
var vars = []string{
|
||||||
|
"TG_TOKEN",
|
||||||
|
"TG_CHAT_ID",
|
||||||
|
}
|
||||||
|
|
||||||
|
//Telegram notification
|
||||||
|
err := CheckEnvVars(vars)
|
||||||
|
if err == nil {
|
||||||
|
message := "PostgreSQL Backup \n" +
|
||||||
|
"Database has been backed up \n" +
|
||||||
|
"Backup name is " + fileName
|
||||||
|
sendMessage(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func NotifyError(error string) {
|
||||||
|
var vars = []string{
|
||||||
|
"TG_TOKEN",
|
||||||
|
"TG_CHAT_ID",
|
||||||
|
}
|
||||||
|
|
||||||
|
//Telegram notification
|
||||||
|
err := CheckEnvVars(vars)
|
||||||
|
if err == nil {
|
||||||
|
message := "PostgreSQL Backup \n" +
|
||||||
|
"An error occurred during database backup \n" +
|
||||||
|
"Error: " + error
|
||||||
|
sendMessage(message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getTgUrl() string {
|
||||||
|
return fmt.Sprintf("https://api.telegram.org/bot%s", os.Getenv("TG_TOKEN"))
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,3 +1,9 @@
|
|||||||
|
// Package utils /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
|
// Package utils /
|
||||||
|
/*****
|
||||||
|
@author Jonas Kaninda
|
||||||
|
@license MIT License <https://opensource.org/licenses/MIT>
|
||||||
|
@Copyright © 2024 Jonas Kaninda
|
||||||
|
**/
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
/*****
|
|
||||||
* MySQL Backup & Restore
|
|
||||||
* @author Jonas Kaninda
|
|
||||||
* @license MIT License <https://opensource.org/licenses/MIT>
|
|
||||||
* @link https://github.com/jkaninda/mysql-bkup
|
|
||||||
**/
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func FileExists(filename string) bool {
|
func FileExists(filename string) bool {
|
||||||
@@ -152,6 +153,13 @@ func CheckEnvVars(vars []string) error {
|
|||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func Welcome() {
|
||||||
|
fmt.Println()
|
||||||
|
fmt.Println("**********************************")
|
||||||
|
fmt.Println(" MySQL Backup ")
|
||||||
|
fmt.Println(" @Copyright © 2024 jkaninda ")
|
||||||
|
fmt.Println("***********************************")
|
||||||
|
}
|
||||||
|
|
||||||
// MakeDir create directory
|
// MakeDir create directory
|
||||||
func MakeDir(dirPath string) error {
|
func MakeDir(dirPath string) error {
|
||||||
@@ -170,3 +178,14 @@ func MakeDirAll(dirPath string) error {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
func GetIntEnv(envName string) int {
|
||||||
|
val := os.Getenv(envName)
|
||||||
|
if val == "" {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
ret, err := strconv.Atoi(val)
|
||||||
|
if err != nil {
|
||||||
|
Error("Error: %v", err)
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user