Repository Git server

Condividi:

Installiamo un repository git su un server locale con accesso ssh ed http su un server in una intranet per condividere i progetti tra sviluppatori. Abbiamo bisogno di un server con ssh configurato, su cui installeremo git ed apache2. Il server è identificato sulla rete con il nome git-projects.

Configurazione di GIT

Per prima cosa installiamo git sul server:

Creiamo l’utente git e la sua homedir che conterrà il repository con tutti i progetti all’interno di /opt/git

Ora prendiamo il controllo del nuovo utente e creiamo la cartella .ssh in cui inseriamo un file authorized_keys vuoto dove inseriremo le chiavi ssh pubbliche di tutti gli utenti che dovranno accedere al repository

Copia delle chiavi pubbliche

Per ogni utente che dovrà avere accesso al repository, dobbiamo copiare il contenuto della chiave pubblica ssh contenuta nel file .ssh/id_rsa.pub nel file .ssh/authorized_keys che abbiamo appena creato. Possiamo farlo in qualunque modo purchè vengano preservati owner e diritti di accesso, ad esempio

Verifichiamo che tutti gli utenti riescano a collegarsi in ssh al server sull’ utenza git

Disabilitiamo l’accesso alla login dell’utente git

Dopo aver verificato che l’utenza è accessibile in ssh, possiamo disabilitarne la login modificandone la shell predefinita che al momento per poter effettuare i test è stata impostata su /bin/bash

Se ora proviamo ad accedere in ssh otteniamo un messaggio di errore

Da questo momento in poi dovremo lavorare nella cartella /opt/git come root impostando di volta in volta l’ownership delle cartelle e dei file che creeremo

Creazione di un progetto vuoto

Ora che abbiamo l’ambiente git configurato, possiamo creare tutti i progetti che ci servono all’interno del repository. Ogni progetto non è nient’altro che un “bare repository” ovvero un progetto privo della cartella di lavoro che conterrà soltanto i file normalmente presenti nella cartella .git

Ora che abbiamo creato lo spazio in cui memorizzare i file del progetto1 possiamo clonarlo in locale oppure popolarlo con un progetto esistente

Cloniamo in locale il progetto vuoto

Cloniamo in locale il progetto1 e popoliamo con alcuni file, eseguiamo la commit e pushiamo le modifiche

Se ora entriamo nella cartella /opt/git/progetto1 vediamo che il commit appena pushato è stato ricevuto

Popoliamo il progetto con uno locale esistente

In alternativa possiamo popolare progetto1 con i file provenienti da un progetto creato in locale. In questo caso dopo aver creato il progetto in locale dobbiamo dire dove si trova il repository remoto

Accesso anonimo tramite http

Possiamo dare la possibilità di clonare il nostro progetto in modalità anonima quindi senza bisogno di caricare la chiave pubblica ssh nel file dell’utente git. Quesra modalità è molto comoda nel caso di progetti opensource pubblici.

Andremo quindi ad installare in server apache impostando l’utente www-data nel gruppo git ed impostando la DOcumentRoot su /op/git nel virtualhost

Installiamo apache

Creiamo il file virtualhost

Abilitiamo il nuovo sito

Diamo all’utente www-data la possibilità di accedere ai file del gruppo git

Ora attiviamo il gancio post-update in tutti i progetti a cui vogliamo dare l’accesso anonimo via http, nel nostro caso progetto1

Normalmente hooks/post-update.sample ha già i diritti di esecuzione, se non dovesse averli assicuriamoci di fornire questi diritti sul file hooks/post-update. Questo script viene eseguito dopo una modifica del progetto, ad esempio tramite una push che in questo caso può avvenire solo via ssh. Lo script esegue il comando git update-server-info ma fino a che non effettuaremo una push sul progetto non potremo clonare o effettuare pull via http. In alternativa possiamo eseguire il comando all’interno della cartella come root ( o come git se non ne abbiamo disabilitato la login)

Lo script crea due file, se lo abbiamo eseguito come root per ragioni di pulizia diamo a questi file l’ownership all’ utente git

Ora possiamo clonare il progetto1 tramite protocollo http

Abilitazione del protocollo https

Creiamo un certificato self signed che installiamo su apache per permettere l’accesso anonimo in https

Abilitiamo il modulo ssl di apache

Creiamo un virtual host per il sito https che è una copia di quello http con l’aggiunta delle direttive con i certificati

Abilitiamo il nuovo sito

E riavviamo apache

Se tentassimo di clonare il progetto in questo momento otterremmo un errore

Poichè il certificato non è firmato da una CA git si rifiuta di utilizzare il protocollo https, però possiamo dirgli di ignorare il check e proseguire clonando il progetto

Se avessimo creato un repository pubblico su internet con un dominio ed un certificato ssl firmato da una CA, ovviamente non sarebbe necessario configurare git pèer non effettuare il check di autenticità