Linux: Subversion (SVN) Server

SUBVERSION (znany jako SVN) – system kontroli wersji na licencji Open Source rozwijany przez Apache Software Fundation. Powstał w 2000 roku przez firmę CollabNet.

potrafi porównywać pliki Worda.
Subversion (znany również jako SVN) – system kontroli wersji, który powstał w celu zastąpienia CVS. Z założenia SVN jest w większości przypadków funkcjonalnie zgodny ze swoim poprzednikiem, z kompatybilności zrezygnowano tam, gdzie było to niezbędne do wprowadzenia nowych rozwiązań. SVN jest wolnym i otwartym oprogramowaniem na licencji Apache.
METODY DOSTĘPU file:/// direct repository access (on local disk)
http:// Access via WebDAV protocol to Subversion-aware Apache 2 web server
https:// Same as http://, but with SSL encryption
svn:// Access via custom protocol to an svnserve server
svn+ssh:// Same as svn://, but through an SSH tunnel

WebDAV (ang. Web-based Distributed Authoring and Versioning) – rozszerzenie protokołu HTTP 1.1 o metody COPY, LOCK, MKCOL, MOVE, PROPPATCH, UNLOCK. Pozwala na zarządzanie i kontrolę wersji plików na serwerze WWW. Implementacja WebDAV na serwerze WWW Apache odbywa się poprzez rozszerzenie mod_dav.

SSH – architektura klient-serwer w której transfer danych jest szyfrowany

Specyfikacja HTTP/1.1 pozwala na jednym adresie IP uruchamiać dowolną ilość serwisów dla różnych domen. Serwer nasłuchuje na wskazanym IP ale informacje o tym jaki serwis wyświetlić, są zależne właśnie od vhostów. Dla każdego serwisu będziesz więc potrzebować odrębnego vhosta.

PLIKI
Subversion do autoryzacji używa dav_svn.

/etc/apache2/dav_svn.passwd – zawiera użytkowników i hasłą do WebDAV SVN
/etc/apache2/dav_svn.acl – ścieżka do pliku z definicją uprawnień dostępu dla użytkowników i grup SVN
/etc/apache2/mods-available/dav_svn.conf – konfiguracja repozytoriów svn, które uzywa pliku /etc/apache2/dav_svn_passwd do autoryzacji

/etc/apache2/ports.conf – nasłuchiwanie Apache na portach
/etc/apache2/sites-available – katalog vhostów zwanych „wirtualkami” – odpowiadają za obsługę konkretnej domeny lub grupy domen
/etc/apache2/sites-available/default – wyświeta stronę domyślną, gdy domena, którą internauta wpisał do przeglądarki, a która kieruje na adres IP serwera, nie ma przyporządkowanej konkretnej virtualki.

INSTALACJA I KONFIGURACJA
Wszystkie polecenia wykonujemy jako root (w Ubuntu dla sudo usera wystarczy komedę poprzedzić słowem sudo i podać hasło, łatwiej jednak zalogować się na roota poprzez sudo -i oraz hasło z konta sudo user)!!!

1. Instalacja pakietów:
Do działania programu będziemy potrzebowali serwer Apache 2, który zapewnia uwierzytelnianie oraz umożliwia przeglądanie zasobów przez interfejs WWW.
Możemy też używać Subversion bez zainstalowanego Apache 2. W takim wypadku będziemy korzystać z autonomicznego serwera svnserve, działającego jako usługa inetd lub jako demon, z prostym uwierzytelnianiem (jest też możliwość skorzystania również z tunelu SSH).

apt-get update

apt-get install apache2 // potwierdz T (Tak)
apt-get install libapache2-svn
apt-get install subversion
apt-get install subversion-tools

2. Sprawdź czy mod_dav i mod_dav_svn jest dostępny. Moduł WebDAV dla Apache (‚Web-based Distributed Authoring and Versioning’) – to rozszerzenie protokołu HTTP umożliwia tworzenie, kopiowanie, przenoszenie, i usuwanie źródła i zbiorów na zdalnym serwerze.
a2enmod dav
a2enmod dav_svn

odpowiedź systemu:
Module dav already enabled
Module dav_svn already enabled

3. Tworzymy katalog, w którym znajdować się będą nasze repozytoria SVN.
mkdir /var/svn // komenda mkdir tworzy katalog

4. Nadajemy uprawnienia katalogowi svn. Aby uwierzytelnianie przez Apache 2 zadziałało, właścicielem katalogu z repozytoriami Subversion powinien być właściciel procesu Apache 2. W Debianie jest to domyślnie użytkownik www-data.
chown -R www-data:www-data /var/svn // komenda chown zmienia właściciela katalogu/pliku
chmod -R 770 /var/svn // komenda chmod zmienia prawa dostępu dla odpowiedniej grupy właścieciel|grupa|pozostali
// 770 oznacza pozwól na r+w+x (czytaj, zapisz, wykonaj) dla grupy właściciel i grupa, dla pozostałych zabroń wszystko

5. Tworzymy nasze piersze repozytorium testowe o nazwie test:
svnadmin create /var/svn/test
chown -R www-data:www-data /var/svn/test

— aby usunąć repozytorium:
rm -r /var/svn/test // komenda rm -r oznacza usuń katalog test ze wszystkimi podkatalogami i plikami

5. Edytujemy plik dav_svn.conf (komentujemy obsługę SSL)
vim /etc/apache2/mods-available/dav_svn.conf // vim jest edytorem tekstu (insert tryb edycji, Esc tryb komend, :wq oznacza zapisz i wyjdź)

<Location /test> #nazwa musi być taka jak nazwa katalogu docelowego SVNPath
DAV svn #moduł svn_dav
SVNPath /var/svn/test #ścieżka do katalogu repozytorium o nazwie test
AuthType Basic #używamy metody HTTP Basic Authentication
AuthName „Repozytorium” #tekst pojawiający się w okienku logowania do svn
AuthUserFile /etc/apache2/dav_svn.passwd #plik z zaszyfrowanymi hasłami użytkowników SVN
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
#SSLRequireSSL #obsługa SSL
</Location>

INFO: Jeżeli Require valid-user będzie w <LimitExcept>…</LimitExcept> to wszyscy użytkownicy będą mógli zobaczyć repozytorium ale tylko określeni będą mogli zapisywać.

6. Restartujemy apache:
/etc/init.d/apache2 restart

Odpowiedź systemu:
Restarting web server: apache2 … waiting .

7. Utwórz konta dla użytkowników SVN (pojawi się monit o hasło użytkownika)

Każdy użytkownik musi być najpierw dodany programem htpasswd, aby móc korzystać z repozytorium SVN.
htpasswd -c /etc/apache2/dav_svn.passwd user1 // parametr -c tworzy plik dav_svn.passwd

htpasswd /etc/apache2/dav_svn.passwd user2 // kolejnych użytkowników tworzymy już bez parametru -c tworzącego plik dav_svn.passwd
htpasswd /etc/apache2/dav_svn.passwd user3

Odpowiedź systemu:
New password: // podajemy hasło
Re-type new password: // powtarzamy hasło
Adding password for user1

— zmiana hasła użytkownika:
htpasswd /etc/apache2/dav_svn.passwd user1

8. Testujemy nasze pierwsze repozytorium test
svn co http://localhost/test // pamiętaj wpisz http://

Obszar uwierzytelniania: <http://localhost:80> Repozytorium
Hasło ‚root’:
Obszar uwierzytelniania: <http://localhost:80> Repozytorium
Użytkownik: user1
Hasło ‚user1’:

odpowiedź systemu:
Pobrano wersję 0.

9. Włączamy obsługę SSL
apt-get install openssl ssl-cert

10. Generate a certificate (pamiętaj, aby wypełnić odpowiednie pola)
http://blog.bestnet.pl/?p=202
openssl req $@ -new -x509 -days 365 -nodes -out /etc/apache2/apache.pem -keyout /etc/apache2/apache.pem

i wpisujemy
Nazwa kraju (2 litery kodu): PL
Nazwa stanu lub prowincji (pełna nazwa): mazowieckie
Nazwa lokalizacji (np. miasto): Warszawa
Nazwa organizacji (np. firma): BESTNET
Nazwa jednostki organizacyjnej (np. sekcja): Nazwa wspólna: bestnet.pl
Adres e-mail: info@bestnet.pl

11. Zmień zezwolenia certyfikatu
chmod 600 /etc/apache2/apache.pem

12. Dodaj nasłuchiwanie na porcie 443 (SSL) do /etc/apache2/ports.conf:
vim /etc/apache2/ports.conf
<IfModule mod_ssl.c>
Listen 443
</IfModule>

13. Plik /etc/apache2/sites-available/default
vim /etc/apache2/sites-available/default

Zmienna <VirtualHost> na <VirtualHost *.80>

i dodaj na końcu pliku po </VirtualHost>

<VirtualHost *.443>
ServerAdmin webmaster@localhost
SSLEngine on
SSLCertificateFile /etc/apache2/apache.pem
</VirtualHost>

14. Odkomentuj SSL wymagane w /etc/apache2/mods-available/dav_svn.conf

<Location /test>
DAV svn // moduł svn_dav
SVNPath /var/svn/test // ścieżka do katalogu repozytorium o nazwie test
AuthType Basic // używamy metody HTTP Basic Authentication
AuthName „Repozytorium” // tekst pojawiający się w okienku logowania do svn
AuthUserFile /etc/apache2/dav_svn.passwd // lokalizacja pliku z zaszyfrowanymi hasłami użytkowników SVN
Require valid-user
SSLRequireSSL // obsługa
</Location>

15. Upewnij się, że moduł ssl jest załadowany
a2enmod ssl

odpowiedź systemu:
Module ssl already enabled

16.Przeładuj konfiguracje Apache
/etc/init.d/apache2 restart

17. Przetestuj połączenie szyfrowane HTTPS używając przeglądarki (jeżeli test przebieg prawidłowo znaczy, że SSL działa)
https://localhost/test // pamiętaj wpisz https://

18. Dodajmy zezwolenia dostępu do SVN dla użytkowników
vim /etc/apache2/dav_svn.authz

Wstawimy do pliku

[groups]
admin = user1,user2,user3
developers = user1,user2,user3

[/]
@admin = rw
@developers = r

[test:/]
@admin = rw
@developers = rw

[/] – repozytorium nadrzędne. Tylko użytkownicy grupy @admin będą mogli dodawać nowe repozytoria.

19. Dodaj to do pliku /etc/apache2/mods-available/dav_svn.conf, by dav_svn.authz kontrolowało dostęp do svn
vim /etc/apache2/mods-available/dav_svn.conf
<Location /test>
DAV svn // moduł svn_dav
SVNPath /var/svn/test // ścieżka do katalogu repozytorium o nazwie test
AuthType Basic // używamy metody HTTP Basic Authentication
AuthName „Repozytorium” // tekst pojawiający się w okienku logowania do svn
AuthUserFile /etc/apache2/dav_svn.passwd // lokalizacja pliku z zaszyfrowanymi hasłami użytkowników SVN
Require valid-user

SSLRequireSSL // obsługa
AuthzSVNAccessFile /etc/apache2/dav_svn.authz // ścieżka do pliku z definicją uprawnień dostępu dla użytkowników i grup SVN
</Location>

20. Przeładuj Apache
/etc/init.d/apache2 restart

21. Sprawdzenie czy działa login i haslo do SVN:
svn list https://localhost/test –username user1 // pamiętaj wpisz https://

— Problemy ———————————————————-

Problem: svn: ‚test’ is already a working copy for a diffrent URL

Rozwiązanie: najczęściej zachowane ustawienia przy zmianie z http na https, usuń w katalogu test katalog .svn, # cd /root/test, sprawdź czy jest katalog .svn komendą # ls -la, usuń zawartość # rm -r .svn

Problem: svn nie pyta o haslo użytkownika

Rozwiązanie: jeżeli już wprowadziłeś login i hasło to, aby pojawił się znowu monit musisz usunąć katalog .subversion # rm -r /root/.subversion

Problem: svn: Serwer wysłał nieoczekiwaną wartość powrotną (405 Method Not Allowed) w odpowiedzi na żądanie PROPFIND dla /test

Rozwiązanie: sprawdź nazwę <Location /test> w pliku /etc/apache2/mods-available/dav_svn.conf a następnie /etc/init.d/apache2 restart

Problem: svn: Serwer wysłał nieoczekiwaną wartość powrotną (403 Forbidden) w odpowiedzi na żądanie OPTIONS dla http://localhost/bestnet

Rozwiązanie: sprawdź

Problem: Pyta o login i haslo ale zwraca komunikat svn: Could not open the requested SVN filesystem

Rozwiązanie: Sprawdź nazwę SVNPath /var/svn/test w pliku /etc/apache2/mods-available/dav_svn.conf a następnie /etc/init.d/apache2 restart
Sprawdź czy ścieżka /var/svn ma prawa 770 i www-data:www-data

Problem: Podczas restartowania apache otrzymujesz komunikat
Restarting web server: apache2[Thu Oct 07 21:48:57 2010] [warn] _default_ VirtualHost overlap on port 443, the first has precedence

… waiting [Thu Oct 07 21:48:58 2010] [warn] _default_ VirtualHost overlap on port 443, the first has precedence

Rozwiązanie: Zahaszuj w pliku /etc/apache2/sites-available/default
vim /etc/apache2/sites-available/default

1. <VirtualHost *.443>
2. ServerAdmin webmaster@localhost
3. SSLEngine on
4. SSLCertificateFile /etc/apache2/apache.pem
5. </VirtualHost>

Problem: sqlite: database disk image is malformed
Rozwiazanie:
1) usuna ukryty katalog .svn
2) klikamy prawym na katalog svn checkout i wyeksportowac bezposrednio do tego katalogu
3) na pytanie „Katalog nie jest pusty. Cz nadpisac?”, Potwierdzic, że TAK

ŹRÓDŁO:
http://www.howtoforge.com/installing-subversion-and-configuring-access-through-different-protocols-on-ubuntu-11.10
http://www.howtoforge.com/how-to-set-up-an-ssl-vhost-under-apache2-on-ubuntu-9.10-debian-lenny
http://jakilinux.org/aplikacje/subversion-dla-kazdego/

Redirect http to https
http://wiki.apache.org/httpd/RedirectSSL

Satisfy Any or Satisfy All
http://wiki.apache.org/httpd/BypassAuthenticationOrAuthorizationRequirements