Monthly Archives: March 2007

svnsync: creare un repository di backup con svnsync

A partire dalla release 1.4, Subversion ha reso disponibile il supporto per il mirroring dei repository.
In questo post, descrivo un setup molto utile a chi pone particolare attenzione alla sicurezza e desidera avere un repository

svn con diritti di lettura/scrittura in DMZ, accessibile ad esempio solo dalla propria rete interna o tramite VPN,

e un repository di sola lettura su una macchina remota, accessibile da Internet.
Host master: server svn principale in DMZ, i developer ci accedono solo tramite svn+ssh

Host slave: server svn di backup accessibile da chiunque, i developer non hanno accesso in scrittura, ci si accede anche tramite protocolli insicuri (svnserve, http).

Configurazione di “master”

Aggiungete un account “svnuser” e acquisite i suoi privilegi:

Inizializzate il repository che ospiterà il vostro progetto con:

Importate i sorgenti esistenti del progetto con:

Create una chiave ssh per l’utente “svnuser” con:

Alla richiesta della passphrase, premete invio due volte, lasciandola quindi vuota.
Create il file ~svnuser/.ssh/authorized_keys con il seguente contenuto:

dove joe, tommy e bob sono gli username degli sviluppatori, “ssh-rsa AAAA….” sono le loro rispettivi chiavi pubbliche ssh.
Verificate che ~svnuser/.ssh e authorized_keys abbiano i permessi corretti:

Configurazione di “slave”:

Aggiungete un utente dedicato: svnsync
Create il repository:

e configurate un hook per i revprop change, ovvero create il file /var/lib/svn/myproject/hooks/pre-revprop-change con il seguente contenuto:

Assicuratevi che abbia i permessi di esecuzione con:

Copiate il contenuto del file ~svnuser/.ssh/id_rsa.pub presente su “Master” all’interno del file ~svnsync/.ssh/authorized_keys su “Slave”.

Assicuratevi che i permessi su Slave siano corretti:

Eseguire la prima sincronizzazione

Ora potete inizializzare la sincronizzazione. Entrate su “Master” come utente “svnuser” e lanciate:

Se avete seguito le istruzioni attentamente, otterrete come risposta:

A questo punto potete eseguire la prima sincronizzazione manualmente con:

A seconda delle dimensioni del vostro repository e della velocità di connessione di Master e Slave, la prima sincronizzazione potrebbe impiegare da pochi minuti a qualche ora.
Una volta completata, sempre su Master, create il file /var/lib/svn/myproject/hooks/post-commit con il seguente contenuto:

e anche il file /var/lib/svn/myproject/hooks/post-revprop-change contenente:

Assicuratevi che abbiano i permessi di esecuzione:

Conclusione

Il setup presentato presenta vantaggi sia dal punto di vista della sicurezza che della ridondanza.
La sincronizzazione dei dati avviene tramite ssh, quindi ne garantisce l’integrità.
L’accesso al server “Master” è ristretto al minimo indispensabile.
Volendo garantire la disponibilità del repository svn pubblico, è possibile realizzare N mirror del medesimo repository, ripetendo la procedura descritta per “Slave” su più host e aggiungendo una riga per ognuno di essi in post-commit e post-revprop-change su “Master”.

Concludo con un suggerimento: se volete che il server vi invii una e-mail con il diff dei sorgenti ogni volta che viene effettuato un commit, aggiungete la seguente riga a post-commit su “Master”:

Dove noreply@master.localdomain è l’indirizzo del mittente e joe@email.com l’indirizzo del destinatario.

Il percorso di commit-email.pl varia a seconda della vostra distribuzione. Un find / -name commit-email.pl vi aiuterà a localizzarlo.

Se volete potete contattarmi.

Share