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/.Вы сможете перемещаться по каталогу резервного копирования, чтобы загрузить файлы дампа.