GIT Server on Ubuntu

일단 들이대~·2024년 8월 26일

팀 내에 전용 리눅스 서버를 설치하고, Samba로 파일 공유 설정하고, SSH설정 해주고 이러고 쓰고 있는데... 갑자기 GIT 을 쓸 일이 생겼네.

Github는 어떻게 이용해 보겠는데, 리눅스에 GIT Server 구축하는 건 왠지 잘 모르겠다고 생각해서, 한두번 검색해 본 다음 몇년간 쳐다도 안 보다가, 다시 보려니 왠지 복잡한 건... 으음...

인터넷으로 무언가를 검색하면, 정보가 잘 나오면 다행인데 항상 정보가 오래되어서 내용이 현재와 다르거나, 뭔가 한두개씩 빠지는 건 어쩔수 없는건가부다. 그래서 다들 자신들만의 정보를 남기기 위해 블로그를 하는 것이겠지...

구축 순서를 보면 대략 아래와 같아 보인다.

  1. 리눅스 서버 설치
  2. 사용자 추가
  3. Samba(삼바) 서비스 추가
  4. SSH(Secure SHell) 서비스 추가

* Git 서버 - 서버 설정하기

출처 - Git / 나 보기 편하게 정리함

Ubuntu같은 표준 Linux 배포판을 사용한다고 가정한다.
사용자들은 아마도 authorized_keys 파일로 인증할 것이다.

ssh-copy-id 명령은 여기에서 설명하는 SSH 공개키를 복사하고 설치하는 작업을 자동화해 주는 도구이다.

먼저 git 계정을 만들고 사용자 홈 디렉토리에 .ssh 디렉토리를 만든다:

$ sudo adduser git
$ su git
$ cd
$ mkdir .ssh && chmod 700 .ssh
$ touch .ssh/authorized_keys && chmod 600 .ssh/authorized_keys

authorized_keys 파일에 SSH 공개키를 추가해야 사용자가 접근할 수 있다. 추가하기 전에 이미 알고 있는 사람의 공개키를 받아서 가지고 있다고 가정한다. 공개키가 어떻게 생겼는지 다시 한번 확인하자.

$ cat /tmp/id_rsa.john.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCB007n/ww+ouN4gSLKssMxXnBOvf9LGt4L
ojG6rs6hPB09j9R/T17/x4lhJA0F3FR1rP6kYBRsWj2aThGw6HXLm9/5zytK6Ztg3RPKK+4k
Yjh6541NYsnEAZuXz0jTTyAUfrtU3Z5E003C4oxOj6H0rfIF1kKI9MAQLMdpGW1GYEIgS9Ez
Sdfd8AcCIicTDWbqLAcU4UpkaX8KyGlLwsNuuGztobF8m72ALC/nLF6JLtPofwFBlgc+myiv
O7TCUSBdLQlgMVOFq1I2uPWQOkOWQAHukEOmfjy2jctxSDBQ220ymjaNsHT4kgtZg2AYYgPq
dAv8JggJICUvax2T9va5 gsg-keypair

.ssh 디렉토리에 있는 authorized_keys 파일에 추가한다:

$ cat /tmp/id_rsa.john.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.josie.pub >> ~/.ssh/authorized_keys
$ cat /tmp/id_rsa.jessica.pub >> ~/.ssh/authorized_keys

--bare 옵션을 주고 git init 를 실행해서 워킹 디렉토리가 없는 빈 저장소를 하나 만든다.

$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare
Initialized empty Git repository in /srv/git/project.git/

--bare 옵션에 --shared 옵션까지 주면 여러 사용자가 공유하는 저장소를 만들 수 있다고 한다.

$ cd /srv/git
$ mkdir project.git
$ cd project.git
$ git init --bare --shared
Initialized empty Git repository in /srv/git/project.git/

이제 John, Josie, Jessica는 이 저장소를 리모트 저장소로 등록하고 나서 (각자의 계정으로) 브랜치를 Push 할 수 있다.

차이가 뭐냐면 ssh://git@gitserver/path/to/repo
하나로 여러 명이 같이 쓰느냐

John은 : ssh://john@gitserver/path/to/repo
Josie는 : ssh://josie@gitserver/path/to/repo
Jessica는 : ssh://jessica@gitserver/path/to/repo

처럼 각 사용자가 개별 접근 권한을 갖느냐라고 하는데, 이게 실제로 git 계정 하나로 돌려 써도 상관은 없다고(작성자가 다르게 들어간다고) 하더만...

프로젝트마다 적어도 한 명은 서버에 접속해서 Bare 저장소를 만들어야 한다.

git 계정과 저장소를 만든 서버의 호스트 이름이 gitserver 라고 하자.
만약 이 서버가 내부망에 있고 gitserver 가 그 서버를 가리키도록 DNS에 설정하면 아래와 같은 명령을 사용할 수 있다(MyGitProject 프로젝트가 이미 있다고 가정한다).

* John의 컴퓨터(리눅스)에서

$ cd myproject
$ git init
$ git add .
$ git commit -m 'initial commit'
$ git remote add origin git@gitserver:/srv/git/project.git
$ git push origin master

이제 이 프로젝트를 Clone 하고 나서 수정하고 Push 할 수 있다.
테스트용 폴더를 하나 생성해서 작업 해 보자

$ git clone git@gitserver:/srv/git/project.git
$ cd project
$ vim README
$ git commit -am 'fix for the README file'
$ git push origin master

<추가 정보>

# GIT 리포지터리에 ssh 프로토콜로 접근하기
$ git clone ssh://git@gitserver:/srv/git/project.git

# GIT 리포지터리에 ssh 프로토콜로 접근하기 - 포트번호 300번
$ git clone ssh://git@gitserver:300/srv/git/project.git

이 개발자들은 서버에 git 계정으로 로그인할 수 있다. 이를 막으려면 passwd 파일에서 로그인 셸을 바꿔야한다.
단순히 로그인 셸을 git-shell 로 바꾸기만 하면 git 계정으로는 git 만 사용할 수 있다. 이 로그인 셸은 서버의 다른 부분은 건들 수 없도록 돼있다. git-shell 을 사용자의 로그인 셸로 지정해야 한다. /etc/shells 에 git-shell 를 추가한다. 아래를 보자.

# 이미 `git-shell` 이 등록돼 있는지 확인
$ cat /etc/shells

# git-shell 실행파일이 설치돼 있는지 확인
$ which git-shell

# 바로 위 명령으로 확인한 git-shell 실행파일의 절대경로를 추가
# chsh <계정이름> -s <shell> 명령어를 이용해서 특정 계정의 셸을 바꿀 수 있다.
$ sudo vim /etc/shells

# git-shell 경로를 입력, 보통 /usr/bin/git-shell 임
# 이제 git 계정으로 Push 와 Pull 할 수 있지만 서버의 셸은 가질 수 없다.
# 로그인하려고 하면 아래와 같이 로그인 불가능 메시지만 보게 될 것이다.

$ sudo chsh git  
$ ssh git@gitserver
fatal: Interactive git shell is not enabled.
hint: ~/git-shell-commands should exist and have read and execute access.
Connection to gitserver closed.

이제 Git은 제대로 동작하면서 개발자들이 셸을 얻지 못하게 되었다.

위의 출력에서 볼 수 있듯이 git 계정의 홈 디렉토리에 git-shell-commands 디렉토리를 만들어 git-shell 의 동작을 조금 바꿀 수 있다.
예를 들면 서버에서 사용할 수 있는 Git 명령어를 제한할 수 있다.
또 명령어를 실행했을 때 나오는 메시지도 변경 할 수 있다.
git help shell 명령어를 실행하면 Git 셸을 꾸미는 데에 필요한 정보를 얻을 수 있다.

단!! 이렇게 하면 git 계정으로 git에 저장소도 못 만드니, 다른 (관리자로 사용하는 계정의)사용자를 git 그룹에 추가해준다.


  1. 사용자 설정
  2. Git 리포지토리(저장소) 초기화
  3. Git 서버에 연결

요 순서로 내용을 채워넣자.

profile
밥벌이를 위한 처절한 몸부림

0개의 댓글