필자는 데이터 손실과 같은 사고를 대비하여 자동 백업용 서버를 마련하기 위해, SVN을 설치했다.
먼저, 백업용 서버 Backup Computer (이하 Bac_com 이라 지칭) 에 Linux기반 OS를 준비했다.
개발용 서버 Developing Computer (이하 Dev_com 이라 지칭) 에 Linux기반의 CentOS7을 준비했다.
두 PC의 svn 서버 사용 용도가 다를뿐, svn 설치 과정 자체는 동일하다. 아래 설치과정대로 진행하며, 백업을 위한 추가 과정에서 부연설명하겠다.
두 서버 모두 Linux Command 환경에서 SVN구축이 진행되었음을 참고바란다.
Window 환경에서 Docker를 이용해 SVN구축이 가능하며 필자 역시 테스트 용도로 구축해 보았다. Docker 관련 문서 참고 바람.
subversion(이하 svn)이 설치되어 있는지 식별하고, 설치되어 있다면 svn --version
또는 rpm -qa | grep subversion
명령을 통해 버전을 확인하고, 설치되어 있지 않다면 아래 yum
명령을 통해 subversion을 설치해준다.
# 1-1. svn 설치 유무 확인
$ svn
--- svn: command not found 혹은 사용법은 'svn help'를 통해 볼 수 있습니다.
$ rpm -qa | grep subversion
--- 내용 無 혹은 subversion-1.7.14-16.el7.x86_64 subversion-libs-1.7.14-16.el7.x86_64
# 1-2. svn 설치
$ yum -y install subversion
svn 설치가 완료되면, 이제 저장소를 만들어 설정값을 입력할 차례다. 원하는 디렉토리를 선택하고 svn 저장소를 생성한다. 저장소가 생성되면 svn서버로서 기능할 수 있게되며 생성된 저장소 내부에 저장소의 정보와 설정을 위한 데이터가 생성된다.
# 저장소 생성
$ svnadmin create --fs-type fsfs 저장소명
--- ex) $ svnadmin create --fs-type fsfs /home/svn/repos
--- 저장소 내부에 conf, db, hooks, locks 등의 디렉토리 및 파일이 생성된다.
참고) 저장소 삭제
$ rm -rf 저장소명
--- 저장소 또는 프로젝트를 삭제해주면 된다.
저장소를 생성한 뒤, 사용을 위해서 설정을 해줄 필요가 있다.
# 3-1. 사용자 접근 권한
$ cp /저장소/conf/svnserve.conf /저장소/conf/svnserve.conf.save
--- svnserve.conf 원본 copy
$ vi svnserve.conf
----------
[general]
#익명 접근의 권한 부여 : none(권한 없음), write(쓰기), read(읽기)
anon-access = none
#인증 접근의 권한은 write 읽기/쓰기
auth-access = write
#사용자 패스워드 저장 파일 위치
password-db = passwd
#프로젝트 명칭
realm = 프로젝트 명
#인증 접근의 권한 설정 파일 위치
authz-db = authz
----------
프로젝트 명을 저장소와 다르게 할 경우 해당 프로젝트를 기준으로 관리하게 된다.
# 3-2. 계정 설정
$ cp /저장소/conf/passwd /저장소/conf/passwd.save
--- passwd 원본 copy
$ vi passwd
----------
[users]
# 아이디 = 패스워드
user1 = password1
user2 = password2
----------
--- group 계정 설정은 다른 문서 참조.
# 3-3. 계정 권한 설정
$ cp /저장소/conf/authz /저장소/conf/authz.save
--- authz 원본 copy
$ vi authz
----------
[/]
user1 = rw
user2 = rw
----------
--- r:read, w:write
svn 사용을 위한 사전작업이 완료되었다. 이제 svn 서버를 시작해 svn을 이용해보자.
# 4-1. svnserve 시작
$ svnserve -d -r 저장소or프로젝트 --listen-port 포트번호
--- 해당 포트번호로 지정한 저장소 또는 프로젝트 svn 실행
# 4-2. snvserve 및 포트 확인
$ netstat -anp | grep svnserve
--- svnserve가 사용하는 포트와 PID(Process ID)를 확인한다.
$ ps -ef | grep svnserve | grep -v grep
--- svnserve에 대한 정보(디렉토리 위치, 포트, PID 등)를 알 수 있다.
# 4-3. svnserve 중지
$ kill PID
--- 중지할 svnserve의 PID를 이용한다.
$ fuser -k -n tcp 포트번호
--- 특정포트를 사용하는 프로세스 죽이기.
# 4-4. 저장소 확인
$ svn info svn://localhost/저장소
--- 저장소 정보 확인
$ svn list svn://localhost/저장소
--- 저장소 내 디렉토리 목록 확인
svn 서버를 시작하면 localhost 접근이 가능할 것이다. 그러나 기본적으로 사용 포트의 외부 접근이 잠겨있기 때문에, 다른 서버에서(필자의 경우, Bac_com)에서 대상 서버(필자의 경우, Dev_com)로 접근이 불가능하다. 이를 위해 방화벽(firewall)을 수정해 특정 포트에 대한 외부 접근을 허용해 주어야 한다.
# 5-1. 방화벽 확인
$ firewall-cmd --zone=public --list-all
--- 방화벽이 열려있는 포트 확인
publick (active)
target: default
icmp-block-inversion: no
interfaces: enp3s0f0
sources:
services: ssh dhcpv6-client
ports: 3306/tcp 3690/tcp 8080/tcp 3307/tcp
protocols:
...
--- port 목록에 포트번호가 존재하는지 확인
# 5-2. 특정 포트 방화벽 오픈(외부 접근 허용) 및 리로드
$ firewall-cmd --permanent --zone=public --add-port=3695/tcp
--- 3695 포트 tcp 방식으로 방화벽 열기(외부 접근 허용)
success
$ firewall-cmd --permanent --zone=public --remove-port=3695/tcp
--- 3695 포트 방화벽 닫기
$ firewall-cmd --reload
--- 방화벽을 리로드해주어야 설정 변경이 적용된다. 단순히 포트를 껏다 켜서는 적용되지 않는다!
success
$ firewall-cmd --zone=public --list-all
--- 방화벽이 열려있는 포트 확인
publick (active)
target: default
icmp-block-inversion: no
interfaces: enp3s0f0
sources:
services: ssh dhcpv6-client
ports: 3306/tcp 3690/tcp 8080/tcp 3307/tcp 3695/tcp
protocols:
...
...
--- port 목록에 3695/tcp가 추가된 것을 확인할 수 있다.
방화벽 설정시, CentOS7 이전 버전은 iptables 명령어를 사용한다.
방법1. command
# 방화벽 설정 정보 확인
$ iptables -nL
# port 설정 조회
# -L: 규칙 출력, -v: 자세히
$ iptables -L -v
# port 열기
# -i: 새로운 규칙 추가, -p: 패킷의 프로토콜을 명시, -j: 규칙에 해당되는 패킷을 어떻게 처리할지 결정
$ iptables 옵션
# TCP inbound Port 열기
# 외부 ==>> 내부 (Inbound) TCP 포트 12345를 1번 방화벽 규칙으로 추가
$ iptables -I INPUT 1 -p tcp --dport 12345 -j ACCEPT
# (포트 설정 확인 후) 변경 사항 저장 및 재시작
service iptables save
service iptables restart
방법2. 파일 수정
vi /etc/sysconfig/iptables
# 추가
-A INPUT -m state --state NEW -m tcp -p tcp --dport 12345 -j ACCEPT
앞서 4.
에서 우리는 svnserve를 개별 조작하는 방법을 사용했다. 좀 더 간편한 방법으로 svnserve 전체를 시작하고 중지하는 등의 조작 명령어가 존재한다. 아래기타 명령어
에서 추가로 언급될 부분으로 service svnserve start
가 있다. 이를 위해선 svnserve의 root위치가 지정되어 있어야 한다. 아래 설정을 살펴보자.
$ vi /etc/sysconfig/svnserve
--- svnserve를 설정해주어야 service svnserve start/stop/restart 명령을 사용할 수 있다.
# 저장소 최상위 폴더를 /home/svn으로 하고 3695포트를 사용하도록 함
----------
OPTIONS="--threads --root /home/svn --listen-port 3695"
----------
svn의 root위치를 지정하는 것은 하나의 디렉토리 안에서 여러 프로젝트를 관리하는 경우에는 유용할 수 있다. 그러나, 각 저장소 혹은 프로젝트가 서로 다른 디렉토리에 존재할 경우에는 root위치를 지정하는 것이 무의미하다. 또한 service svnserve start/stop/restart 명령은 생성된 svn 모두를 한꺼번에 조작하는 명령으로서 다수의 svn을 사용하는 경우, svn의 개별적 통제가 불가능하다.
그러므로 필자는 svn을 개별 지정해서 실행하고 정지하는 방법을 주로 사용한다.
# 네트워크 정보 확인 (network statistics)
$ netstat [옵션]
# -a: 모든 연결에 대해 확인, -c: 실행 명령을 초단위로 재실행(default 1 sec), -l: listening 중인 포트만 확인, -t: TCP연결 포트 확인, -u: UDP 연결 포트를 확인, -n: 주소 혹은 포트 번호 확인, -p: PID/프로그램 이름 확인, -o: 연결 여부 및 시간, -r: 라우팅 테이블 확인
# 서비스 중인 포트에 연결된 사용자 확인
# 3690, 3695포트에 연결된 사용자 목록
$ netstat -anop | grep -a "3690\|3695"
# 3690, 3695포트에 연결된 사용자 수 (wc -l 은 조회된 리스트의 라인 수를 구하는 옵션)
$ netstat -anop | grep -a "3690\|3695" | wc -l
# XXXX와 OOOO 사용자 접속 종료
$ kill -9 XXXX OOOO
# 서비스 기동 확인
$ systemctl list-unit-files | grep svn
svnserve.service disabled
# 서비스 기동
$ systemctl enable svnserve.service
# svn 서비스 시작/중지/재시작
$ service svnserve start/stop/restart
# svn 서비스 시작/재시작/중지/상태
$ systemctl start/restart/stop/status svnserve.service
# svn 모든 서비스 종료
$ killall svnserver
# 재부팅시 svnserve 서비스 자동시작
$chkconfig --list svnserve
$chkconfig svnserve on
$chkconfig --list svnserve
ref) https://goddaehee.tistory.com/81
ref) https://blog.naver.com/sumni10/222177345482