Git mint backup

A git jó. Ebben sokan egyetértünk, a legtöbben azonban megállnak a forráskódoknál, én nem.

Miért ne lehetne a git-el egy fájlrendszer backup-ot csinálni? Csak a változásokat tárolja, helyigénye minimális, testreszabhatósága jó. Kezdjünk hát neki!
Amiket le fogunk menteni: weboldalak, etc mappa, mysql adatbázisok.

  1. Szolgáltató

  2. Bitbucket - Végtelen privát repo és tárhely, web API, kell ennél több?

  3. Dinamikus repo létrehozás

  4. Nálam a weboldalak a következő struktúrában vannak létrehozva: /var/www/domain/host/htdocs/aldomain. Szeretem, ha a dolgok automatikusak, így kellett egy script, ami magától létre tud hozni repokat, ha van új oldal a fájlrendszeren.
    /usr/bin/bitbucket: (Egy új repo létrehozása)
    #!/bin/bash
    curl -k -X POST --user $USER:$PASS \
    "https://bitbucket.org/api/1.0/repositories" -d "name=$NAME&is_private=true"

    /usr/bin/backup: (/1/Új oldalak megkeresése, és feltöltése, régiek frissítése) (bitbucket_user és bitbucket_jelszo értelemszerűen kicserélendő)
    #/bin/bash
    msg=`date`
    DIR=`pwd`
    cd /var/www
    for DOMAIN in *
    do
    DDIR="/var/www/${DOMAIN}"
    echo $DDIR
    if [ -d $DDIR ]
    then
    cd $DDIR
    for HOST in *
    do
    HDIR="${DDIR}/${HOST}"
    if [ -d $HDIR ]
    then
    echo $HDIR
    cd $HDIR
    if [ -d "${HDIR}/htdocs" ]; then
    cd "${HDIR}/htdocs/"
    if [ -d ".git" ]; then
    git add .
    git commit -a -m "$msg"
    git push origin master
    else
    USER=bitbucket_user PASS=bitbucket_jelszo NAME=${HOST}.${DOMAIN} /usr/bin/bitbucket
    if [ $? -eq 0 ]; then
    git init
    echo '.git' > .gitignore
    git add .
    git commit -a -m "Initial commit"
    git checkout -b master
    git remote add origin ssh://bitbucket.org/bitbucket_user/${HOST}.${DOMAIN}
    git config branch.master.remote origin
    git config branch.master.merge refs/heads/master
    git push -u origin master
    fi
    fi
    fi
    fi
    done
    fi
    done

    Ez már egy kicsit hosszabb, de nem bonyolult. Végigmegyünk a mappákon, ha van már bennük git repo, akkor csak feltoljuk a változásokat, ha nincs, akkor létrehozunk egyet a bitbucket-hez kapcsolva.

  5. Fájlrendszer

  6. Ha csak a weboldalakat szeretnénk lementeni, ezzel kész is vagyunk, ám ha a fájlrendszer néhány elemét, is, akkor kell egy kis módosítás a fájl végére:
    /usr/bin/backup: (/2/Fájlrendszer)
    cd /
    git add mysql
    git add etc
    git commit -a -m "$msg"
    git push origin master

    Mielőtt még elkezdenénk örülni, természetesen létre is kell hozni azt a "gyökér" git-et.
    Tehát terminálban:
    cd /
    git init
    git add etc
    echo '.git' > .gitignore
    git commit -a -m "Initial commit"
    git checkout -b master
    USER=bitbucket_user PASS=bitbucket_jelszo NAME=server /usr/bin/bitbucket
    git remote add origin ssh://bitbucket.org/bitbucket_user/server
    git config branch.master.remote origin
    git config branch.master.merge refs/heads/master
    git push -u origin master

    Valamint hátra van még a mysql backupok elkészítése:
    Ehhez én a webmin beépített napi mentés funkcióját használom. Amire figyelni kell:
    1. Ne tömörítsd! Így tényleg csak a változásokat kell feltölteni, tehát az első feltöltés után gyorsabb lesz, mert nem kell egy teljesen új bináris állományt feltölteni, valamint weben is böngészhető lesz a kód.
    2. A /mysql mappába mentsd az sql fájlokat. (Vagy írd át a scriptet)

  7. Időzítés

  8. Ne felejtsd el cron-ban beállítani egy neked megfelelő időzítéssel a /usr/bin/backup futtatását!

Hozzászólások

Most lehet hülyeséget írok, de a git csak a változásokat menti el. Ez szöveges fájloknál igaz, de bináris adatoknál (pl sql adatbázisok) ott a teljes egészet, ami eléggé hízlalja a .git könyvtárat.
---------------------------
Oszt jónapot!

A git pont hogy nem a változásokat menti el, hanem mindig a teljes fájlt. Minden állapot teljes fájl formájában tárolódik, a diffeket on-demand számolja ki. Ettől még működni fog, amit elgondoltál, mivel igen hatékonyan tömörít.