Newsgroup: it.comp.os.linux.iniziare
Titolo: Sistema di Backup

Vorrei mettere in piedi un sistema per gestire il backup di una
cartella che contiene un progetto in via di sviluppo. Detta così
è un po' altisonante, in realtà non è niente di chè e devo accedervi
solo io, quindi roba tipo git penso sia del tutto sovradimensionata,
inoltre dovrei impararla e non so se sia quello che mi serve.
Vi spiego:
 
Ho una directory che contiene il progetto.
 
Ogni volta che ci lavoro il suo contenuto viene modificato perchè
vi aggiungo immagini, testo, taglio modifico rivedo ecc.
 
Vorrei creare delle imamgini di backup, anche tipo incrementali
per risparmiare spazio, in modo che mi sia sempre possibile accedere
al backup del tale giorno alla tale ora...
 
Vorrei anche piazzare questi backup in remoto, ma il progetto non
giustifica il pagamento di servizi professionali: di solito ne faccio
una copia su google drive, una su dropbox e una su mega-nz.
 
Volevo fare uno script capace di
 
1. creare una copia della cartella in questione
2. valutare le modifiche rispetto alla prima copia e creare
   una seconda copia "incrementale" se dico bene...
3. stoccare il tutto su uno o più servizi di free remote storage
   oltre che su secondo HDD locale.
4. consigli sul ripristino, esempio cancello per sbaglio tot
   files della cartella... però dall'ultima immagine posso recuperare
   il materiale perso almeno nell'ultima versione backuppata.
5. questioni di spazio e dintorni: quando lavoro al progetto ha
   senso predisporre qualcosa di automatico tipo che faccia il
   backup incrementale ogni tot minuti?
   Lavorando in modo incrementale si avrebbero grandi moli di
   dati da trasferire ogni volta oppure se le modifiche non sono
   pesantissime ha un senso?
 
Grazie!  :)

 Volevo fare uno script capace di
 
Guarda io te lo dico anche se puo' sembrare primordiale. C'e' il
pacchetto rsync, dove c'e' solo il comando UNIX (che si chiama rsync
pure lui).
Fa /esattamente/ -penso- quello che vuoi tu.
E' perfetto e affidabilissimo (e' un comasndo UNIX!), io le cartelle di
backup le metto in hd diverso da quello delle cartelle origine.. dovrei
avere una jella veramente immensa se mi piantano entrambi i dischi nello
stesso momento.
 
Io i backup li faccio cosi' di tutte le cartelle che non voglio perdere
se muore un hd. Non e' incrementale, ma cancella, se occore, e ti fa la
cartella destinazione indistinguibile da quella origine.
Gurdati la manpagina in rete.
Sul remot-storig non ne so nulla ciao
 
-- 
Yoda
 


Se ti puo' interessare ti mando il link al mio script di backup che fa 
quello che ti serve usando rsync:
 
https://www.dropbox.com/s/c01707p5ced45hn/backup.sh?dl=0
 
 
Questo esegue un backup differenziale della mia cartella home e tiene 
traccia dei file rimossi o modificati in una cartella identificata con 
data e ora del backup. In sostanza mantiene aggiornata sul NAS la 
cartella home e salva tutte le modifiche e le edizioni precedenti con 
anche la possibilita' di escludere alcuni file o cartelle non necessarie.
 
angelo
 
 

  --password-file=$PWD"
--/cite--
 
ma dovrebbe essere indifferente scriverci:
OPT="-vlhrti --delete --backup --backup-dir=$LNK --exclude-from=$EXCL \
--password-file=$PWD"
 
da me li prende sempre lo stesso, bash gli da' una riga sola ariciao
 
-- 
Yoda
 

 anche la possibilita' di escludere alcuni file o cartelle non necessarie.
 
Ok, mettiamo che avevi i backup:
 
DAY0
DAY1
DAY2
 
Poniamo che inizi a lavorare su quella cartella corrente e che a metà
del tuo lavoro decidi di fare un backup usando lo script.
 
Quindi si aggiornerà la dir "current" e si creerà una nuova dir:
 
DAY3
 
contenete i files modificati e rimossi durante la corrente sessione di
lavoro.... Se ben ho capito e chiedo conferma... sbaglio?
 
Ora, mettiamo che ti accorgi aver fatto del casino e quindi aver
fatto il backup di una versione pasticciata del progetto...
 
Soluzione:  ripristinare la precedente current sulla base dei files
contenuti in DAY3. Dico bene?
 
E come lo esegui questo ripristino?
 
Grazie mille!
 
 
PS.
Quindi niente appoggio su servizi remoti del tipo di quelli che ho
indicato... 
grazie ancora
 
 

 perche Joe vuole usare poco spazio ciao
 
Grazie del chiarimento, ma poi come eseguo il ripristino?
Se non mantengo le eliminazioni non è alla fine come se facessi
un unica copia della dir corrente?
E se ti accorgi di aver cancellato un file importante e di aver
poi aggiornato il backup? Come lo ripristini il file importante
se non hai una versione precedente del backup (icrementale o totale
che sia)?
Non ti pare?
 
Grazie della risposta e delle osservazioni!

 da me li prende sempre lo stesso, bash gli da' una riga sola ariciao
 
Certo, il commento era per evitare di renderlo inutilizzabile qualora 
nel download si spezzasse la riga.
 
angelo

 grazie ancora
 
:-)
 
angelo

 Non ti pare?
 
Si', ma se e' cosi' allora dovrebbe essere perfetto per te lo script di
Angelo. Io invece NON voglio lo storico, ho smesso da tempo di tenere
roba che non guardero' mai piu' (o quasi!) ciao
 
Ps. Ad esempio pero' per ~/bin ogni tanto do:
$: cp -a bin /backup/bin-28-nov-2017
a parte che poi quel che mi potrebbe servire, prima di cambiarlo, lo
copio in bin/old/ ariciao
 
-- 
Yoda
 

 Ho una directory che contiene il progetto.
 
Usa Git
 
Enrico


Dropbox tiene un mese di modifiche. Se ti basta, i primi 2 GB sono gratis (se ancora non ce l'hai iscriviti con questo link pf: 
https://db.tt/B9DXkd3W
)
 
Ciao Jack


Non so praticamente nulla oqquasi di git,
nel senso che non ne ho confidenza.
 
Quello che mi serve fare è cosa abbastanza basica,
cioè backup di una cartella e possibilità di conservare
vecchie copie (versioni appunto) della stessa.
 
Ora ti chiedo la pappa pronta, eventualmente manda
pure a RTFM... :)
 
Vado a braccio e può darsi che scriva scemenze, come
ho detto non conosco git più di qualche lettura di
anni fà.
Provo a buttare giù le operazioni che mi vengono in
mente per eseguire aggiornare e ripristinare il
backup, mi tradurresti in comandi git?
 
1.
Inizializzazione del tutto: in pratica dico a git
"guarda che la cartella da tenere sottocchio è
/home/joe/progetto"
 
2.
Esegui il primo backup in:
 
/mnt/hdd2/backup/progetto
 
3.
Esegui backup successivi
 
4.
Eventualmente ripristina a versione precedente
 
 
Quello che mi da qualche dubbio è: cosa potrebbe
incasinarsi?
Il mio timore dovuto alla non conoscenza di git è
che in qualche modo non mi sia più possibile ripristinare
il backup, anche ad una versione precedente...
 
Grazie della risposta!
Dove sono contenuti i dati delle varie versioni?
In /mnt/hdd2/backup/progetto ?
O altrove?
 
Perchè pensavo a come eventualmente farne poi
una copia in remoto...
Esistono sistemi di storage remoto gratuito che
supportano git?  (non credo, ma provo a chiedere).

 supportano git?  (non credo, ma provo a chiedere).
 
Github o Bitbucket
 
Enrico

 Github o Bitbucket
 
Però github per repo privati si paga, io cercavo
una cosa gratis.
 
Ok, ho visto anche Gitlab che se ho ben capito ha
una versione free chiamata community edition che
permette la creazione di repo privati.
Ma non vedo i limiti sullo spazio.
 
bitbucket non lo so..devo controllare meglio.

 bitbucket non lo so..devo controllare meglio.
 
Straconsiglio gitlab, puoi mettere repo privati infiniti ;)
Fatti l'account e poi lavori in locale e pushi in remoto come backup.
 
-- 
Tilt
 

 Eh ma non basta mica... :)
 
Manuale ufficiale di git:
https://git-scm.com/book/en/v2
 
 
Forse va oltre i tuoi requisiti, ma una scorsa a tutti i capitoli e
sarai pronto ;)
-- 
Tilt
 


La documentazione non manca, ma io cercavo di sintetizzare
i comandi che mi servono per lo scopo particolare. Anche
per questo ho messo un esempio concreto in modo che chi vuole
dare qualche suggerimento e correggere qualche mio probabile
strafalcione, se conosce git e ne ha dimestichezza può farlo
ad occhi chiusi...
Anche perchè i principali comandi omrai li ho messi io...
Manca solo qualche pezzo.
Vedi l'esempio del comando push che mi ritorna l'errore
riportato.
 
Ho messo tutti i comandi anche per avere un README da consultare
nel caso che mi scordi qualcosa. E spero possa servire anche ad
altri.
 
Grazie comunque del link e del consiglio

 Fatti l'account e poi lavori in locale e pushi in remoto come backup.
 
Ok, sai quanti GB di spazio danno per un account free?

 remote: the work tree to HEAD.
 
creati un altro branch su tutti e due i repo
 
$ git checkout -b work
 
poi sulla dir dove lavori, prima di iniziare a lavorarci, vai su work
 
work $ git checkout work
 
fai le variazioni, fai il commit poi torna sul master e copia
le variazioni fatte sul 'work'
 
work $ git commit -a
work $ git checkout master
work $ git merge work
 
poi invia le variazioni
 
work $ git push origin work
 
e sul backup fai
 
backup $ git merge work
 
poi pusha il master
 
work $ git push
 
-- 
Never try to teach a pig to sing.
It wastes your time and annoys the pig.

 poi pusha il master
 
Quindi sono nella dir di backup e sto lavorando sul
branch master, dico bene?
 
backup:master $ git push
 
Ok, la domandona è?
Perchè tutto ciò?
Cosa abbiamo fatto e perchè è stato necessario?
 
 
E ancora...
Da ora in avanti come dovrei fare per "sparare"
le modifiche e i commit fatti sul repo "remoto"
di backup, lavorando dalla dir ~/mioprogetto?
Cioè da ora in poi:
 
mioprogetto:master $ git push backup
 
mi sincronizza le variazioni del repo di lavoro
~/mioprogetto (ramo master) sul repo remoto
"backup" /mnt/hd/backups/mioprogetto (ramo master)?
 
Spero le domande siano chiare...
Se non si capiscono dimmi pure che cercherò di
spiegarmi meglio...
 
Grazie delle indicazioni e della disponibilità!  :)
 
 

 mioprogetto:master $ git push backup
 
No...
Perchè la directory di backup, che fà la parte del
repo remoto, non è un "bare repo" un repo "spoglio".
Non si può fare il push verso repo del genere perchè
in teoria se ci si lavora in molti sopra e sullo
stesso ramo (diciamo "master") si pssono fare casini.
 
Siccome nel mio caso ci lavoro da solo e quel repo
ha in realtà solo la funzione di stoccaggio dati in
copia di sicurezza, si può fare in modo che il push
funzioni senza errori:
 
cd /mnt/hd/backups/mioprogetto
git config receive.denyCurrentBranch updateInstead
 
cioè dal repo remoto (la dir di backup) configuro
il repo stesso con quell'opzione.
Se poi torno nel repo di lavoro modiffico, aggiungo,
commit e faccio il push:
 
git push backup master
 
allora funziona senza errori.
 
 
Visto che non mi fidavo ho fatto una prova:
 
diff -r ./ /mnt/hd/backups/mioprogetto -c .git
 
E salta fuori che nella dir di lavoro c'è una cartella vuota in più che
non compare invece nella dir di backup...
 
Chissà mai perché???
Avete idee?
 
 
Links utili sulla questione push verso bare repo:
https://stackoverflow.com/questions/11117823/git-push-error-refusing-to-update-checked-out-branch
 
https://stackoverflow.com/questions/804545/what-is-this-git-warning-message-when-pushing-changes-to-a-remote-repository/28262104#28262104
 

 Ok, sai quanti GB di spazio danno per un account free?
 
Non mi ero mai posto il problema, ma cercando ho trovato che c'è un
limite di 10gb per singolo repo:
https://about.gitlab.com/2015/04/08/gitlab-dot-com-storage-limit-raised-to-10gb-per-repo/
 
https://gitlab.com/gitlab-org/gitlab-ce/issues/30297
 
-- 
Tilt
 

 
 
ho letto solo poche repliche al tuo post,
se nessuno lo ha citato, prova rshapshort.
facile da configurare, lavora perfettamente e non perde un colpo.
 
ciao

 remoto come backup.
 
Ok, con gitlab.
Devo essere sincero, non ho letto nulla della doc per il
momento... Ma vedo che propone della roba da installare.
Io credevo di poter sottoscrivere semplicemente un account,
collegarmi via browser al sito e da interfaccia web poi:
clonare da là il "repo" locale (la dir di lavoro) e stop...
Poi per i successivi aggiornamenti, andavo comodamente di
"git push".
 
Che roba è quella da installare?
Grazie mille!  :)

 Che roba è quella da installare?
 
Mah, cosa ti propone?
In realtà dopo che hai fatto l'account puoi legare un repo remoto al tuo
repo locale, per cui poi i push/pull vengono legati a quello, ma fai
tutto da terminale, non c'è bisogno di installare nulla (a parte git,
ovviamente, ma quello ti serve anche per fare commit in locale).
-- 
Tilt
 

 ovviamente, ma quello ti serve anche per fare commit in locale).
 
Ecco mi interessava questo...
Provo a fare la registrazione allora.
 
 
 
PS.
Per il momento il backup locale funge, ma per fare "push"
ho dovuto dare i comandi che ho descritto nei post precedenti.
Inoltre le directories vuote non vengono backuppate...
E nel mio caso invece servono perchè organizzo il progetto
proprio iniziando a creare le varie cartelle che poi riempio
con del materiale mi mandano un po' per volta...
In pratica il "tree" delle sub-directories nella dir principale
rappresenta una sorta di scheletro del progetto stesso.
Ma poco male, basta saperlo... Alla fine me la sono cavata
con un:
 
touch */.ignore-empty-file
 
ripetuto alla bisogna in ogni sottocartella ulteriore...
 
 
PPS.
Vedrò al momento, ma per adesso mi resta un dubbio
su una cosa:
se ora faccio
 
mioprogetto.master_$ git push
 
il repo locale di backup (/mnt/hd/backups/mioprogetto) viene
aggiornato. In pratica esegue il backup sulla dir locale cui
ho assegnato il repo nominato appunto "backup".
Quando avrò anche il repo remoto su gitlab, mettiamo che
lo abbia creato con qualcosa tipo:
 
git remote add backup-remote url/to/gitlab/mioprogetto
 
Ecco, quando eseguo il push da locale c'è il modo per ese-
guirlo con un solo comando in modo che aggiorni tutti e due
i repo remoti, cioè sia la dir di backup locale che quello
realmente remoto su gitlab, ovvero i repo nominati:
- backup
- remote-backup
???
 
Grazie mille ancora! :)

 ???
 
Mi rispondo da solo:
https://stackoverflow.com/questions/14290113/git-pushing-code-to-two-remotes
 
 
L'idea è quella di creare un nuovo "remote" chiamato
in modo auto-esplicativo "all" e puntarvi tutti gli
indirizzi remoti che si vuole col comando:
 
git remote set-url --add --push all git://another/repo.git
git remote set-url --add --push all git://one-morer/repo.git
git remote set-url --add --push all git://a-new-other-one/repo.git
 
In questo modo quando si fà:
 
git push all master
 
dovrebbe aggiornare tutte le copie remote che fanno parte
del repo "all".

 Provo a fare la registrazione allora.
 
Mi rispondo da solo anche qui.
Confermo quanto dicevi: si fa la registrazione e stop.
 
Poi si deve creare un progetto, "blank" nel mio caso perchè lo ho solo
in locale. Il nome io l'ho messo identico a quello locale "mioprogetto",
ma forse non era necessario... non so.
 
(Se fosse stato ad esempio su github o comunque
disponibile dall'esterno con un server git o simili
allora si poteva anche scegliere di clonarlo da
dentro GitLab fornendo l'URL).
 
Nelle informazioni del profilo si dovrebbe mettere lo stesso nome utente
e la stessa email con cui si è creato il progetto git in locale. Ad
esempio io avevo messo una mail locale farlocca per il mio progetto:
 
user.name
: Joe
user.mail: j...@localhost.local
 
Ecco, anche su gitlab bisogna avere le stesse credenziali: l'email
valida serve però in fase di registrazione, quindi ci siregistra
con quella valida e poi si cambia mettendo quella legata al progetto
locale.
 
A questo punto si deve aggiungere la propria chiave ssh pubblica.
 
cd ~/.ssh && ssh-keygen
xclip -sel clip < ~/.ssh/id_rsa.pub
 
Quindi si copia la chiave su gitlab nellìapposita sezione ssh keys.
Ecco sul sito non dovrebbe più servire nulla. Da qui in avanti si
lavora solo dalla shell locale. (il link al nuovo repo remoto vuoto
è reperibile sempre lì da gitlab).
 
A questo punto si crea il nuovo repo remoto da git locale
 
git remote add gitlab \
    g...@gitlab.com:nomeutente-registrato-su-gitlab/mioprogetto.git
 
E si carica tutto quanto su gitlab
 
git push -u gitlab --all
git push -u gitlab --tags
 
Il tutto, l'ho testato ed effettivamente il nuovo repo remoto sembra
ok:
- ho provato a scaricarne il contenuto via web, fa scaricare un
  pacchetto compresso in diversi formati a scelta.
  Spacchettato il tutto e controllato con diff:
 
  diff ~/mioprogetto/ ~/Desktop/mioprogetto-master-..../ -x .git
 
  E non ritorna differenze tra le due cartelle.
  Il peso controllato con:
 
  du -sh ~/mioprogetto/ ~/Desktop/mioprogetto-master-..../ --exclude=.git
 
  Va detto che però in questo modo la cartella scaricata
  contiene quasi la metà della roba perchè in ".git" locale
  ci sono parecchi files che immagino contengano tutti i vari
  commit.
 
- Quindi se si vuole essere sicuri di poter riavere il repo
  locale in caso di catastrofi, con possiblità di ripristino
  a diversi step di commit, allora è meglio fare così:
 
  git clone g...@gitlab.com:nomeutente-registratosu-gitlab/mioprogetto
 
  $ du --exclude=.git -sh ~/mioprogetto/ /tmp/mioprogetto/
  54M     ~/mioprogetto/
  54M     /tmp/mioprogetto/
 
  $ du -sh ~/mioprogetto/ /tmp/mioprogetto/
  106M    ~/mioprogetto/
  105M    /tmp/mioprogetto/
 
 
Qualcosina sembra differire però penso che siano files specifici
di git dovuti al diverso repository... almeno spero.