포스트

회사 운영 환경을 집에 재현한 이유 — 로컬 SVN 서버 구축기

회사 운영 환경을 집에 재현한 이유 — 로컬 SVN 서버 구축기

배경

운영 환경에서 테스트하지 않고도 검증하려면 동일한 환경이 필요하다.

이 글은 회사 SVN 서버 구성을 집 미니PC에 그대로 재현한 과정이다.

운영에 영향 없이 설정 변경을 먼저 검증하고, 검증된 내용만 운영에 반영하기 위해 구축했다.

로컬 PC는 Windows 11이지만 WSL을 설치해둬서, 클라이언트 쪽도 리눅스 환경으로 통일해 놓았다. 서버·클라이언트 모두 리눅스 기반으로 맞춘 덕분에 OS 차이로 헤맬 일이 없었다.

구축 과정에서 예상치 못한 DNS 오류가 먼저 터졌고, 방화벽 정리까지 한 번에 진행했다.


1단계 — apt update가 안 된다

첫 번째 벽은 패키지 설치 전에 나왔다.

1
sudo 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 설정 문제였다.

1
cat /etc/resolv.conf
1
nameserver 127.0.0.53

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 로 번호 확인 후 큰 번호부터 삭제:

1
sudo ufw delete [번호]

작은 번호부터 삭제하면 번호가 당겨져서 의도와 다른 규칙이 삭제될 수 있다. 반드시 큰 번호부터 삭제해야 한다.


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.8ping google.com 두 개를 같이 테스트하면 바로 구분된다.

svnserve 루트 경로 설정이 접속 URL을 결정한다는 것도 처음엔 헷갈렸다. -r /svn/repos로 잡으면 svn://IP/myproject이고, -r /svn/repos/myproject로 잡으면 svn://IP다.

ufw 중복 규칙은 신경 안 쓰면 계속 쌓인다. IP 대역 규칙이 있으면 개별 IP 규칙은 중복이니까, ufw status numbered로 주기적으로 확인하는 습관이 필요하다.

결국 오류가 터지는 타이밍은 항상 뭔가를 설치하기 전이다. DNS가 안 되면 패키지도 못 받으니까, 기본부터 확인하자.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.