Mysqldump через HTTP-запрос с Golang

Итак, впредыдущем постея объяснил, как можно создавать резервные копии всех баз данных на сервере, каждый в своем собственном файле дампа.Давайте перейдем на следующий уровень и сделаем программу Golang, которая позволит нам запустить процесс дампа с помощью HTTP-запроса.

Предполагая, что у вас уже установлен Go на сервере резервного копирования, сначала создайте каталог проекта в домашней папке.Скопируйте сценарий дампа mysqlотсюдаи сохраните его как dump.sh в папке проекта.ИзменитеROOTDIR="/backup/mysql/"внутри dump.sh, чтобы отразить текущий каталог проекта.

Мы создадим скрипт Golang с двумя функциями.Один запустит сценарий резервного копирования, когда будет выполнен конкретный запрос HTTP.Другой отправит HTTP-вызов за проверку подлинности, поэтому только пользователи с учетными данными смогут сделать запрос на резервное копирование.

http-db-backup.go

Go

package main

import (
    "encoding/base64"
    "fmt"
    "log"
    "net/http"
    "os"
    "os/exec"
    "strings"
)

var username = os.Getenv("DB_BACKUP_USER")
var password = os.Getenv("DB_BACKUP_PASSWORD")

func BasicAuth(w http.ResponseWriter, r *http.Request, user, pass string) bool {
    s := strings.SplitN(r.Header.Get("Authorization"), " ", 2)
    if len(s) != 2 {
        return false
    }
    b, err := base64.StdEncoding.DecodeString(s[1])
    if err != nil {
        return false
    }
    pair := strings.SplitN(string(b), ":", 2)
    if len(pair) != 2 {
        return false
    }
    return pair[0] == string(user) && pair[1] == string(pass)
}
func handler(w http.ResponseWriter, r *http.Request) {
    if BasicAuth(w, r, username, password) {
        cmd := exec.Command("bash", "dump.sh")
        stdout, err := cmd.Output()
        if err != nil {
            log.Fatal(err)
        }
        fmt.Fprintf(w, string(stdout))
        return
    }
    w.Header().Set("WWW-Authenticate", `Basic realm="Protected Page!!! "`)
    w.WriteHeader(401)
    w.Write([]byte("401 Unauthorized\n"))
}

func main() {
    http.HandleFunc("/backup", handler)
    http.ListenAndServe(":8080", nil)
}

Это используетDB_BACKUP_USERиDB_BACKUP_PASSWORDчто вам придется устанавливать в качестве переменных среды.Просто добавьте это в свой~/.bashrcфайл

~/.bashrc

Shell

export DB_BACKUP_USER="hello"
export DB_BACKUP_PASSWORD="password"

Теперьsource ~/.bashrcзагрузите их.

Создайте исполняемый файл,go build http-db-backup.goгде http-db-backup.go - это имя вашего файла Go.Теперь вам нужно запустить исполняемый файл с помощью sudo, но при сохранении

среды:sudo -E ./http-db-backup

Теперь, если вы откроете свой браузер и откройте http://111.222.333.444:8080/backup (где 111.222.333.444 - ваш IP-адрес вашей резервной машины), процесс резервного копирования запустится, и вы получите вывод dump.sh в своем браузере при завершении резервного копирования.

Кроме того, мы можем добавить еще одну функцию, чтобы перечислить каталог в браузере, чтобы вы могли загрузить необходимую резервную копию или резервные копии.

func lister(w http.ResponseWriter, r *http.Request) {
    if BasicAuth(w, r, username, password) {
        http.FileServer(http.Dir(".")).ServeHTTP(w, r)
        return
    }
    w.Header().Set("WWW-Authenticate", `Basic realm="Protected Page!!! "`)
    w.WriteHeader(401)
    w.Write([]byte("401 Unauthorized\n"))
}

Все, что вам нужно сделать, это добавитьhttp.HandleFunc("/", lister)к себеmain()и перейти к http://111.222.333.444:8080/.Вы сможете перемещаться по каталогу резервного копирования, чтобы загрузить файлы дампа.

results matching ""

    No results matching ""