배경
운영 환경에서 테스트하지 않고도 검증하려면 동일한 환경이 필요하다.
이 글은 회사 SVN 서버 구성을 집 미니PC에 그대로 재현한 과정이다.
운영에 영향 없이 설정 변경을 먼저 검증하고, 검증된 내용만 운영에 반영하기 위해 구축했다.
로컬 PC는 Windows 11이지만 WSL을 설치해둬서, 클라이언트 쪽도 리눅스 환경으로 통일해 놓았다. 서버·클라이언트 모두 리눅스 기반으로 맞춘 덕분에 OS 차이로 헤맬 일이 없었다.
구축 과정에서 예상치 못한 DNS 오류가 먼저 터졌고, 방화벽 정리까지 한 번에 진행했다.
1단계 — apt update가 안 된다
첫 번째 벽은 패키지 설치 전에 나왔다.
1
2
| Temporary failure resolving 'kr.archive.ubuntu.com'
Temporary failure resolving 'security.ubuntu.com'
|
원인 파악
1
2
| ping -c 3 8.8.8.8 # 성공
ping -c 3 google.com # 실패
|
8.8.8.8 IP 핑은 되는데 도메인 핑이 안 됐다. DNS 설정 문제였다.
systemd-resolved가 DNS 요청을 받고 있는데 upstream DNS가 설정되지 않은 상태였다.
해결
1
| sudo vi /etc/systemd/resolved.conf
|
1
2
3
| [Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=8.8.4.4
|
1
| sudo systemctl restart systemd-resolved
|
이후 apt update 정상 동작 확인.
2단계 — SVN 설치 및 저장소 생성
1
2
3
| sudo apt install subversion -y
svn --version | head -1
# svn, version 1.14.1 (r1886195)
|
저장소 생성
1
2
3
| sudo mkdir -p /svn/repos
sudo svnadmin create /svn/repos/myproject
sudo chown -R www-data:www-data /svn/repos
|
3단계 — 계정 및 권한 설정
passwd 파일
1
| sudo vi /svn/repos/myproject/conf/passwd
|
1
2
3
| [users]
root = admin_pass
devuser = dev_pass
|
authz 파일
1
| sudo vi /svn/repos/myproject/conf/authz
|
1
2
3
4
5
6
| [groups]
dev = devuser, root
[/]
@dev = rw
* =
|
svnserve.conf 파일
주석 처리된 항목들을 해제하고 값 입력:
1
| sudo vi /svn/repos/myproject/conf/svnserve.conf
|
1
2
3
4
5
6
| [general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = myproject
|
4단계 — svnserve 데몬 등록
수동 실행 대신 systemd 서비스로 등록해서 재부팅 시 자동 시작되도록 설정했다.
1
| sudo vi /etc/systemd/system/svnserve.service
|
1
2
3
4
5
6
7
8
9
10
| [Unit]
Description=Subversion SVN Server
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/svnserve -d -r /svn/repos/myproject
[Install]
WantedBy=multi-user.target
|
1
2
3
4
| sudo systemctl daemon-reload
sudo systemctl enable svnserve
sudo systemctl start svnserve
sudo systemctl status svnserve
|
1
2
| ● svnserve.service - Subversion SVN Server
Active: active (running)
|
-r /svn/repos/myproject 로 루트를 저장소 바로 아래로 지정하면 svn://서버IP 만으로 바로 접근 가능하다. /svn/repos 로 지정하면 svn://서버IP/myproject 형태로 접근해야 한다.
5단계 — 방화벽 설정
특정 IP 대역만 3690 포트 허용:
1
2
3
| sudo ufw allow from 203.0.113.10 to any port 3690 proto tcp
sudo ufw allow from 203.0.113.20 to any port 3690 proto tcp
sudo ufw allow from 192.168.50.0/24 to any port 3690 proto tcp
|
외부 IP 2개는 모든 포트 허용:
1
2
| sudo ufw allow from 203.0.113.20
sudo ufw allow from 203.0.113.10
|
중복 규칙 정리
192.168.50.0/24 범위 규칙이 이미 있어서 개별 IP 규칙이 중복됐다. sudo ufw status numbered 로 번호 확인 후 큰 번호부터 삭제:
작은 번호부터 삭제하면 번호가 당겨져서 의도와 다른 규칙이 삭제될 수 있다. 반드시 큰 번호부터 삭제해야 한다.
6단계 — 접속 테스트
1
| svn list svn://localhost --username root --password admin_pass
|
출력이 없으면 정상이다. 저장소가 비어있는 것이지 오류가 아니다.
기존 프로젝트 업로드 (import)
1
2
3
4
| svn import /home/user/workspace/myproject/DEV_MY_PROJECT \
svn://localhost/DEV_MY_PROJECT \
--username root --password admin_pass \
-m "DEV_MY_PROJECT 초기 업로드"
|
7단계 — WSL 클라이언트에서 checkout
WSL에서 Windows 경로 접근 시 /mnt/ 경로를 사용해야 한다:
1
2
| # Windows E:\workspace\... 접근 방법
cd /mnt/e/workspace/my\ project/temp
|
공백이 포함된 폴더명은 \ 로 이스케이프 처리해야 한다.
SVN 클라이언트 설치:
1
| sudo apt install subversion -y
|
저장소 checkout:
1
| svn checkout svn://서버IP --username root --password admin_pass
|
마무리
DNS 오류는 네트워크 자체 문제인지 DNS 설정 문제인지 먼저 구분해야 한다. ping 8.8.8.8과 ping google.com 두 개를 같이 테스트하면 바로 구분된다.
svnserve 루트 경로 설정이 접속 URL을 결정한다는 것도 처음엔 헷갈렸다. -r /svn/repos로 잡으면 svn://IP/myproject이고, -r /svn/repos/myproject로 잡으면 svn://IP다.
ufw 중복 규칙은 신경 안 쓰면 계속 쌓인다. IP 대역 규칙이 있으면 개별 IP 규칙은 중복이니까, ufw status numbered로 주기적으로 확인하는 습관이 필요하다.
결국 오류가 터지는 타이밍은 항상 뭔가를 설치하기 전이다. DNS가 안 되면 패키지도 못 받으니까, 기본부터 확인하자.