[技術] FreeBSD上安裝Apache + subversion + LDAP(AD Server)

Written on 9:59 上午 by Yu Lai

最近公司的svn server一整個狂當機,於是決定換一台電腦當Server,
除了repository的轉移外,也把OS從XP換到FreeBSD。

以下是安裝的一些過程。

1. 安裝FreeBSD
這個安裝就不寫了,有興趣的人可以參考 FreeBSD Handbook。

2. 安裝Apache
使用ports安裝,由於我們需要透過LDAP來認證使用者,
所以在安裝時記得把LDAP和AUTHNZ_LDAP選項勾選起來,
而在Apache安裝的過程中,會先安裝apr1套件,
此時也記得把LDAP選項勾選起來。

# cd /usr/ports/www/apache22
# make WITH_LDAP_MODULES=yes all install clean


3. 安裝Subversion
# cd /usr/ports/devel/subversion
# make -DWITH_SVNSERVE_WRAPPER -DWITH_MOD_DAV_SVN -DWITH_APACHE2_APR install clean


4. 設定Apache
先確認/usr/local/etc/apache22/httpd.conf裡有以下內容。
LoadModule dav_module libexec/apache22/mod_dav.so
LoadModule dav_svn_module libexec/apache22/mod_dav_svn.so
LoadModule authz_svn_module libexec/apache22/mod_authz_svn.so
LoadModule ldap_module libexec/apache22/mod_ldap.so
LoadModule authnz_ldap_module libexec/apache22/mod_authnz_ldap.so


接著編輯/usr/local/etc/apache22/Includes/svn.conf。
 <Location /svn>
DAV svn
SVNParentPath /svn_repos
SVNListParentPath on

# our access control policy
#AuthzSVNAccessFile /svn_repos/svn-access-file

AuthType Basic
AuthName "Subversion repository"

# Make LDAP the authentication mechanism
AuthBasicProvider ldap

# Make LDAP authentication is final
AuthzLDAPAuthoritative on
AuthLDAPBindDN "CN=svn,CN=Users,DC=blahblah,DC=com"
AuthLDAPBindPassword "xxxxxxxx"
AuthLDAPURL "ldap://ldap-server/CN=Users,DC=blahblah,DC=com?sAMAccountName?sub?(objectClass=*)"
Require valid-user
</Location>


接著編輯/etc/rc.conf,把apache22_enable="YES"加入。最後啟動apache。
# /usr/local/etc/rc.d/apache22 start


5. 建立SVN Repository目錄
# mkdir -p /svn_repos
# chown -R www /svn_repos


6. 轉移SVN Repository
首先在windows下使用舊版的svnadmin將repository db檔dump出來。
D:\SVN>svnadmin dump repos > repos.dump

接著將repos.dump丟到FreeBSD下,再使用新版的svnadmin將dump檔load回去。
# svnadmin create repos
# svnadmin load repos < repos.dump


若repository很多的話,可以透過以下的perl script幫忙。
# cat > load.pl
foreach (@ARGV) {
s/.dump//;
print "Loading $_ repository.\n";
system "svnadmin create $_";
system "svnadmin load $_ < $_.dump";
}
^D
# perl load.pl *.dump


7. 建立定期備份的crontab
這裡我使用了crontab+perl script來進行每周日的早上4點進行備份的動作,
備份檔保留60天,超過的備份檔會被移除。
# mkdir -p /svn_backup
# cat > /svn_backup/backup.pl
#!/usr/bin/perl

# Get date information
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$year += 1900;
$Month += 1;
$file_name = sprintf "/svn_backup/svn-%04d%02d%02d.tgz", $year, $mon, $mday;

# Do backup
system "/usr/local/etc/rc.d/apache22 stop"; # Stop apache
chdir "/svn_repos/";
system "tar zcvf $file_name *";
system "/usr/local/etc/rc.d/apache22 start"; # Start apache

# Remove old backup file
chdir "/svn_backup/";
@tgz_files = glob "*.tgz";
foreach $file (@tgz_files) {
unlink $file if -M $file > 60;
}
^D
# chmod +x /svn_backup/backup.pl
# crontab -e
0 4 * * 0 /svn_backup/backup.pl