본문 바로가기

프로그래밍

[INSTALL] 나도 Trac을 써보자! Apache-2.2.2/SVN-1.3.1/Trac-0.9.5/FastCGI (4) - subversion설치 및 연동

[INSTALL] 나도 Trac을 써보자! Apache-2.2.2/SVN-1.3.1/Trac-0.9.5/FastCGI (4) - subversion설치 및 연동
이 글에 있는 내용.

   - 2. subversion의 설치
   - 3. subversion의 설정 및 사용
   - 4. subversion과 apache 의 연동.

2. subversion의 설치

    subversion 1.3.1 은 apache 2.0.55 이상의 버전에 의존성이 걸려있다.

    /etc/portage/profile/package.provided 파일에

        dev-libs/apr-0.9.7
        dev-libs/apr-util-0.9.7
        net-www/apache-2.0.55-r1
        dev-libs/apr-1.2.7
        dev-libs/apr-util-1.2.7

    를 추가해 준다.

    또한 1.3.1 버전은 ~x86 상태 이므로 /etc/portage/package.keywords 파일에

        =dev-util/subversion-1.3.1 ~x86

[출처] http://classpath.egloos.com/2026809
    를 추가해 준다.

    emerge -Dpv subversion 은 다음과 같다. 

    [ebuild  N    ] dev-util/subversion-1.3.1  USE="apache2 berkdb emacs nls perl python ruby zlib -bash-completion -java -minimal -nowebdav"

    apache2, berkdb 는 꼭 USE 플래그상에 존재하도록 해준다.

    emerge subversion

    rc-update add subversion default

3. subversion의 설정 및 사용
    (1) 그룹 및 계정 생성
        groupadd svnusers

    (2) 저장소의 root 경로를 결정한다.

        기본 설치시 /var/svn 을 가르키도록 되어있다. var 파티션은 4 Gb 정도의 여유랑이 있긴 하지만, 남아도는 /data 파티션을 사용할 것이다.

        /data/svn 디렉터리를 생성한다.
        /data/svn 디렉터리의 권한을 775 로 변경
        svnadmin create /data/svn/newface 를 실행하여 저장소를 생성한다.

        chown -R root:svnusers /data/svn/newface
        chmod -R g+w /data/svn/newface

        file:// 와 같은 형태로 접속할 것이면 위의 방법까지면 된다. 그 이외의 방법으로 접속하려면 아래의 작업을 추가로 수행한다.

        svn:// 로 접속시 

            /data/svn/newface/conf 디렉터리의 svnserve.conf 파일을 편집한다. 시간여유가 나거든 모든 주석을 다 읽어보고.. 아니라면.. 다음만 남긴다.

            [general]
            anon-access = none
            auth-access = write
            password-db = passwd

            권한은 none, read, write 가 있는데 첫라인은 익명 사용자의 권한, 둘째 라인은 인증된 사용자의 권한, 세번째 줄은 사용자 인증을 위한 사용자 id/password 가 들어있는 파일명이다.

            다음으로 passwd 파일을 편집한다.

            [users]
            testuser = asdf1234

            형식은 사용자ID=비밀번호 형태이다.

    (3) 자동 기동 방법으로는 데몬으로 실행하는 방법과 xinetd 로 실행하는 방법이 있다.

        * 만약 file:// 혹은 svn+ssh:// 으로만 접속할 경우 2-1 이나 2-2 가 필요 없다.
   
        - 데몬으로 실행 할 경우 (root 계정으로 작업)

            당연히 /etc/init.d 에 svnserve 라고 기동 스크립트가 복사 되며, rc-update add svnserve default 로 부팅시 자동 기동되도록 할 수 있다. svnserve 에서 중요한 부분은 start 부분이다. 참고로 ${..} 변수는 /etc/conf.d/svnserve 에 정의 되어있다.

             start-stop-daemon --start --quiet --background --make-pidfile
                --pidfile /var/run/svnserve.pid --exec /usr/bin/svnserve
                --chuid ${SVNSERVE_USER:-apache}:${SVNSERVE_GROUP:-apache} --
                --foreground --daemon ${SVNSERVE_OPTS:---root=/data/svn}

            이중 subversion 과 직접 적인 관련이 있거나 영향을 주는 부분은 다음과 같다.

            --exec subversion 의 실행파일을 지정한다. 물론 디폴트로 그냥 사용한다.
            --chuid Change  to  this  username/uid before starting the process 라고 start-stop-daemon 의 man 페이지에 나온다.                         ${SVNSERVE_USER:-apache}:${SVNSERVE_GROUP:-apache} 사용자와 그룹을 지정한다. ${A:-B} 는 A가 설정되어있지 않다면 B 란 뜻이다. SVNSERVE_USER 와 SVNSERVE_GROUP 은 /etc/conf.d/svnserve 에 정의 되어있다.
            --foreground When used together with -d, this option causes svnserve to stay in the foreground. This option is mainly useful for debugging. 라고 man page 에...
            --daemon Causes svnserve to run in daemon mode.  svnserve backgrounds itself and accepts and serves TCP/IP connections on  the  svn port (3690, by default). 라고 man page 에...
             ${SVNSERVE_OPTS:---root=/data/svn} subversion 으로 직접 전달 되는 인자 부분이다. 저장소의 루트를 지정한다. 역시나 ${A:-B} 는 A가 설정되어있지 않다면 B 란 뜻이다.
            * /etc/init.d 에서 실행하거나 커맨드라인에서 실행할 경우 따로 옵션을 명기하지 않는 한 /etc/conf.d/svnserve 파일을 읽는다.

            /etc/conf.d/svnserve 파일에 있는 내용 중 SVNSERVE_GROUP 을 SVNSERVE_GROUP="svnusers" 로 변경해준다.

            /etc/init.d/svnserve start 로 서브버전을 시작한다.( 물론 rc-update 로 등록 했을경우 다음 부팅시부터 자동 시작이다 )

        - xinet 으로 실행되게 할 경우 (root 계정으로 작업)

            /etc/xinetd.d/svnserve 를 편집한다.

            service svn
            {
                socket_type     = stream
                wait            = no
                user            = root
                group           = svnusers
                umask           = 002
                protocol        = tcp
                log_on_failure += USERID HOST
                port            = 3690
                server          = /usr/bin/svnserve
                server_args     = -i --root=/data/svn
                disable         = no
            }

            이중.. 데몬으로 실행과 비교해서
                user 와 group 은 --chuid
                server 는 --exec
                server_args 는 ${SVNSERVE_OPTS:---root=/data/svn/} 와 같다고 보면 된다.
       
            /etc/init.d/xinetd restart 로 xinet 을 재 시작한다.

    이 후 subversion 메뉴얼에 따라 사용하면 된다.

    완료 되었다면, svn 명령이나 subverion 클라이언트 프로그램을 이용해 svn://localhost/newface 로 접속해보자.

4. subversion과 apache의 연동 (이경우에 subversion 이 데몬이나 xinet 로 기동될 필요가 없다)

    (1) apache 사용자를 subversion그룹에 추가한다.

        gwpass -a apache subversion

    (2) 설정파일 수정
        /etc/conf.d/apache2 의 APACHE_OPTS 에 -D SVN -D SVN_AUTHZ -D DAV -D DAV_FS 를 추가한다.
        /etc/apache2/conf/httpd.conf 파일에

        # SVN
        include /etc/apache2/modules.d/47_mod_dav_svn.conf

        를 추가한다. emerge 로 설치되는 패키지들은 module 설정과 관련된 파일들을 /etc/apache2/module.d 에 설치한다. subversion 도 이 디렉터리에 47_mod_dav_svn.conf 이란 파일을 생성한다. 읽어들일 수 있도록 설정해주자.

        /etc/apache2/modules.d/47_mod_dav_svn.conf 파일을 다음과 같이 수정한다.

        <IfDefine SVN>
            <IfModule !mod_dav_svn.c>
                LoadModule dav_svn_module       modules/mod_dav_svn.so
            </IfModule>
            <Location /svn/newface>
                DAV svn
                SVNPath /data/svn/newface
                AddDefaultCharset utf-8
                #AuthType Basic
                #AuthName "Subversion repository"
                #AuthUserFile /var/svn/conf/svnusers
                #Require valid-user
            </Location>

            <IfDefine SVN_AUTHZ>
                <IfModule !mod_authz_svn.c>
                    LoadModule authz_svn_module     modules/mod_authz_svn.so
                </IfModule>
            </IfDefine>
        </IfDefine>

        * 역시나 권한 관련한 문제는 나중에 한꺼번에 다룬다.
        * SVNPath 가 실제 svn repository 가 있는 경로이고, Location 부분은 http 접근시 컨텍스트 경로이다.

    (3) 재기동 및 확인

        아파치를 재 기동한다. /etc/init.d/apahce2 reload (중지된 상태라면 start)

        http://localhost/svn/newface

        아무 에러 없이, 저장소의 파일들이 보여지면 OK!