Sign inSign up

isul/svngo

By isul

•Updated 1 day ago

경량 SVN 서버: Apache mod_dav_svn + Go 웹 관리 UI, 단일 컨테이너

Image
0

47

isul/svngo repository overview

⁠SvnGo

Apache httpd + mod_dav_svn으로 SVN(HTTP/HTTPS)을 서비스하고, Go로 만든 한국어 웹 관리 UI로 저장소·사용자·그룹·권한을 관리하는 경량 Subversion 서버입니다. 모든 구성 요소가 컨테이너 하나에 들어 있습니다.

  • 이미지 약 36MB, 유휴 메모리 약 12MB(Apache 포함)
  • 저장소·사용자·권한을 바꿔도 Apache 재시작이 필요 없습니다
  • non-root(uid 1000), 읽기 전용 루트 파일시스템, cap_drop: ALL로 실행할 수 있습니다
  • 외부 DB 불필요(SQLite 내장)

⁠주요 기능

영역기능
저장소생성(trunk/branches/tags), 이름 변경, 삭제, 활성/비활성, 검증(svnadmin verify), 백업(dump.gz)·복원
웹 브라우징디렉터리/파일 보기, 리비전별 보기, 다운로드, 커밋 로그, 변경 파일, diff. 모든 화면에 SVN 권한 적용
사용자·그룹생성, 수정, 삭제, 비밀번호 변경, 활성/비활성, htpasswd 가져오기(bcrypt / APR1-MD5)
권한저장소·디렉터리 단위 읽기 / 읽기쓰기 / 접근 금지. 저장 후 libsvn으로 실제 적용 결과를 검증
운영대시보드, 감사 로그, 애플리케이션·Apache 로그, 인증 파일 동기화 검증
보안SVN 무차별 대입 IP 차단(429), 웹 로그인 시도 제한, 다중 CSRF 방어, 엄격한 CSP, 요청 크기 제한

⁠빠른 시작

⁠docker run
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에서는 줄 끝의 \ 대신 백틱(`)을 쓰거나 한 줄로 입력합니다.

⁠docker compose
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
웹 관리 UIhttp://<서버>/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_USERNAMEadmin초기 관리자 ID
ADMIN_PASSWORD / ADMIN_PASSWORD_FILE(없음)초기 관리자 비밀번호. 파일 경로로도 지정 가능(Docker secret)
SVNGO_SERVER_NAMElocalhostApache ServerName
SVNGO_COOKIE_SECUREauto세션 쿠키 Secure: auto(HTTPS 또는 X-Forwarded-Proto: https) / always / never
SVNGO_BCRYPT_COST8SVN 사용자 bcrypt cost(5–14). 높을수록 SVN 요청이 느려집니다
SVNGO_SESSION_HOURS12웹 세션 유효 시간
SVNGO_SVN_MAX_BODY_MB1024SVN 요청 하나(사실상 파일 하나)의 최대 크기, MB. 0=무제한, 최대 2047
SVNGO_SVN_MAX_XML_MB64SVN XML 요청 최대 크기, MB. 0=무제한
SVNGO_TLS_CERT / SVNGO_TLS_KEY/data/config/tls/server.crt / .key두 파일이 있으면 8443에서 HTTPS 활성화
TZAsia/Seoul표시 시간대

⁠포트와 볼륨

항목설명
8080HTTP (SVN + 웹 관리 UI)
8443HTTPS (인증서가 있을 때)
/data/reposSVN 저장소
/data/confightpasswd, authz(자동 생성), tls/ 인증서
/data/dbSQLite DB(사용자·그룹·권한·감사 로그)
/data/backups저장소 백업(.svndump.gz)

네 볼륨을 함께 보관하면 전체 백업이 됩니다. 바인드 마운트를 쓸 때는 디렉터리 소유자를 uid/gid 1000으로 맞춰 주세요.

⁠HTTPS

  • 컨테이너에서 직접: PEM 인증서와 키를 config 볼륨의 tls/server.crt, tls/server.key로 넣고 재시작하면 8443에서 HTTPS가 켜지고 HSTS와 Secure 쿠키가 적용됩니다.
  • 리버스 프록시: Nginx, Traefik, Caddy 등에서 TLS를 종료하고 http://<컨테이너>:8080으로 전달합니다. X-Forwarded-Proto: https를 보내거나 SVNGO_COOKIE_SECURE=always를 지정하세요.

⁠기존 SVN 서버에서 이전

  1. 저장소 디렉터리를 /data/repos에 복사하면 시작할 때(또는 시스템 설정 → 저장소 스캔) 자동 등록됩니다. svnadmin dump 파일은 백업 화면에서 업로드해 복원할 수 있습니다.
  2. 기존 htpasswd는 사용자 → htpasswd 가져오기로 옮깁니다(bcrypt, APR1-MD5 지원).
  3. 그룹과 권한은 웹 UI에서 다시 설정합니다. authz 파일은 DB에서 자동 생성되므로 직접 수정하지 마세요.

⁠참고

  • svn://(svnserve)는 지원하지 않고 HTTP/HTTPS만 지원합니다. 인증은 htpasswd(Basic)만 지원합니다.
  • SVN 로그인 차단은 IP 기준입니다. 모든 클라이언트가 같은 IP로 보이는 환경(일부 Docker Desktop, 프록시 뒤)에서는 시스템 설정에서 허용 횟수를 높이거나 0으로 꺼 주세요.
  • 일부 Linux 호스트(AppArmor, snap Docker)에서 no-new-privileges 때문에 operation not permitted가 나면 해당 security_opt를 제거하세요.

⁠태그

태그설명
1.0.0, latestlinux/amd64

구성: Alpine 3.22, Apache 2.4, Subversion 1.14, Go 1.26

Tag summary

Content type

Image

Digest

sha256:817286bf3…

Size

14.6 MB

Last updated

1 day ago

docker pull isul/svngo