Apache httpd + mod_dav_svn으로 SVN(HTTP/HTTPS)을 서비스하고, Go로 만든 한국어 웹 관리 UI로 저장소·사용자·그룹·권한을 관리하는 경량 Subversion 서버입니다. 모든 구성 요소가 컨테이너 하나에 들어 있습니다.
cap_drop: ALL로 실행할 수 있습니다| 영역 | 기능 |
|---|---|
| 저장소 | 생성(trunk/branches/tags), 이름 변경, 삭제, 활성/비활성, 검증(svnadmin verify), 백업(dump.gz)·복원 |
| 웹 브라우징 | 디렉터리/파일 보기, 리비전별 보기, 다운로드, 커밋 로그, 변경 파일, diff. 모든 화면에 SVN 권한 적용 |
| 사용자·그룹 | 생성, 수정, 삭제, 비밀번호 변경, 활성/비활성, htpasswd 가져오기(bcrypt / APR1-MD5) |
| 권한 | 저장소·디렉터리 단위 읽기 / 읽기쓰기 / 접근 금지. 저장 후 libsvn으로 실제 적용 결과를 검증 |
| 운영 | 대시보드, 감사 로그, 애플리케이션·Apache 로그, 인증 파일 동기화 검증 |
| 보안 | SVN 무차별 대입 IP 차단(429), 웹 로그인 시도 제한, 다중 CSRF 방어, 엄격한 CSP, 요청 크기 제한 |
docker run -d --name svngo --restart unless-stopped \
-p 80:8080 -p 443:8443 \
-e ADMIN_PASSWORD='Change-Me-123' \
-v svn-repos:/data/repos -v svn-config:/data/config \
-v svn-db:/data/db -v svn-backups:/data/backups \
--read-only \
--tmpfs /run/svngo:size=16m,mode=0750,uid=1000,gid=1000 \
--tmpfs /tmp:size=64m,mode=1777 \
--cap-drop ALL \
isul/svngo:1.0.0
Windows PowerShell에서는 줄 끝의 \ 대신 백틱(`)을 쓰거나 한 줄로 입력합니다.
services:
svngo:
image: isul/svngo:1.0.0
container_name: svngo
restart: unless-stopped
ports:
- "80:8080"
- "443:8443"
environment:
ADMIN_USERNAME: admin
ADMIN_PASSWORD: Change-Me-123 # 최초 실행 시에만 사용됩니다
SVNGO_SERVER_NAME: svn.example.com
TZ: Asia/Seoul
volumes:
- svn-repos:/data/repos
- svn-config:/data/config
- svn-db:/data/db
- svn-backups:/data/backups
read_only: true
tmpfs:
- /run/svngo:size=16m,mode=0750,uid=1000,gid=1000
- /tmp:size=64m,mode=1777
cap_drop:
- ALL
security_opt:
- no-new-privileges:true
stop_grace_period: 30s
volumes:
svn-repos:
svn-config:
svn-db:
svn-backups:
docker compose up -d
docker compose ps # STATUS 가 healthy 이면 준비 완료
| 용도 | URL |
|---|---|
| 웹 관리 UI | http://<서버>/admin/ |
| SVN 저장소 | http://<서버>/svn/<저장소명> |
| 헬스체크 | http://<서버>/admin/healthz |
svn checkout http://<서버>/svn/myrepo/trunk myrepo --username kim
TortoiseSVN에서는 저장소 URL로 http://<서버>/svn/myrepo를 입력합니다.
처음 시작할 때 관리자 계정이 없으면 ADMIN_USERNAME(기본 admin) / ADMIN_PASSWORD로 만듭니다. 비밀번호는 8자 이상이어야 합니다.
ADMIN_PASSWORD를 비워 두면 임의 비밀번호를 만들어 /data/config/initial-admin-password에 저장합니다(로그에는 출력하지 않음).
docker exec svngo cat /data/config/initial-admin-password
비밀번호를 잊었을 때:
echo 'New-Admin-Pass-123' | docker exec -i svngo svngo admin-passwd admin
| 변수 | 기본값 | 설명 |
|---|---|---|
ADMIN_USERNAME | admin | 초기 관리자 ID |
ADMIN_PASSWORD / ADMIN_PASSWORD_FILE | (없음) | 초기 관리자 비밀번호. 파일 경로로도 지정 가능(Docker secret) |
SVNGO_SERVER_NAME | localhost | Apache ServerName |
SVNGO_COOKIE_SECURE | auto | 세션 쿠키 Secure: auto(HTTPS 또는 X-Forwarded-Proto: https) / always / never |
SVNGO_BCRYPT_COST | 8 | SVN 사용자 bcrypt cost(5–14). 높을수록 SVN 요청이 느려집니다 |
SVNGO_SESSION_HOURS | 12 | 웹 세션 유효 시간 |
SVNGO_SVN_MAX_BODY_MB | 1024 | SVN 요청 하나(사실상 파일 하나)의 최대 크기, MB. 0=무제한, 최대 2047 |
SVNGO_SVN_MAX_XML_MB | 64 | SVN XML 요청 최대 크기, MB. 0=무제한 |
SVNGO_TLS_CERT / SVNGO_TLS_KEY | /data/config/tls/server.crt / .key | 두 파일이 있으면 8443에서 HTTPS 활성화 |
TZ | Asia/Seoul | 표시 시간대 |
| 항목 | 설명 |
|---|---|
8080 | HTTP (SVN + 웹 관리 UI) |
8443 | HTTPS (인증서가 있을 때) |
/data/repos | SVN 저장소 |
/data/config | htpasswd, authz(자동 생성), tls/ 인증서 |
/data/db | SQLite DB(사용자·그룹·권한·감사 로그) |
/data/backups | 저장소 백업(.svndump.gz) |
네 볼륨을 함께 보관하면 전체 백업이 됩니다. 바인드 마운트를 쓸 때는 디렉터리 소유자를 uid/gid 1000으로 맞춰 주세요.
tls/server.crt, tls/server.key로 넣고 재시작하면 8443에서 HTTPS가 켜지고 HSTS와 Secure 쿠키가 적용됩니다.http://<컨테이너>:8080으로 전달합니다. X-Forwarded-Proto: https를 보내거나 SVNGO_COOKIE_SECURE=always를 지정하세요./data/repos에 복사하면 시작할 때(또는 시스템 설정 → 저장소 스캔) 자동 등록됩니다. svnadmin dump 파일은 백업 화면에서 업로드해 복원할 수 있습니다.authz 파일은 DB에서 자동 생성되므로 직접 수정하지 마세요.svn://(svnserve)는 지원하지 않고 HTTP/HTTPS만 지원합니다. 인증은 htpasswd(Basic)만 지원합니다.no-new-privileges 때문에 operation not permitted가 나면 해당 security_opt를 제거하세요.| 태그 | 설명 |
|---|---|
1.0.0, latest | linux/amd64 |
구성: Alpine 3.22, Apache 2.4, Subversion 1.14, Go 1.26
Content type
Image
Digest
sha256:817286bf3…
Size
14.6 MB
Last updated
1 day ago
docker pull isul/svngo