2016년 12월 26일 월요일

GIT Server 만들기

참고자료

1. Git를 설치한다.
git 저장소를 등록하고, git-core를 설치한다.
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get upgrade
$ sudo apt-get update
$ sudo apt-get install git-core
$ git version
2. Git 관리와 저장소 관리를 위한 계정을 생성한다.
$ sudo adduser gitolite
$ sudo adduser git-repo
gitolite 계정은 사용자(user)가 저장소에 접근할때 사용되는 계정이고, git-repo 계정은 저장소를 관리하는 계정이다.

3. gitolite를 설치한다.
$ su - git-repo
$ git clone https://github.com/sitaramc/gitolite.git
$ ./gitolite/install

4. gitolite 계정에서 저장소(git-repo)로 접속하기 위해서 SSH Key를 등록한다.
$ su - gitolite
$ ssh-keygen
$ scp ~/.ssh/id_rsa.pub git-repo@localhost:/home/git-repo/gitolite.pub
$ ...
$ su - git-repo
$ ./gitolite/src/gitolite setup -pk ./gitolite.pub
즉, 저장소(git-repo)를 관리하는 계정으로 gitolite를 등록했기 때문에 이제부터 저장소에 관한 모든 동작은 "gitolite"에서 진행한다.
당연히, git-repo관리를 위한 Tool(gitolite-admin)을 받아온다. 참고로, 저장소(git-repo)관리도 git를 사용하기 때문에 git 사용을 위해서 email과 name을 등록한다.
$ su - gitolite
$ git clone git-repo@localhost:gitolite-admin.git
$ git config --global user.email "gitolite@mymail.com"
$ git config --global user.name "gitolite"

5. 사용자 계정을 생성하고, "testing.git"를 clone하고, 수정해서 push하고, 다시 clone하는 과정을 실행해 본다.
새로운 사용자에 대해서 git를 사용하기 위해서는 email과 name을 등록해야 한다.
$ sudo useradd user1
$ su - user1
$ git config --global user.email "user1@myemail.com"
$ git config --global user.name "user1"
$ git config --list
사용자의 SSH Key를 생성하고, public key를 gitolite에 등록한다.
$ su - user1
$ ssh-keygen
$ scp ~/.ssh/id_rsa.pub gitolite@localhost:/home/gitolite/gitolite-admin/keydir/user1.pub
$ ...
$ su - gitolite
$ cd gitolite-admin
$ git add keydir/user1.pub
$ git commit -a -m "add user user1"
$ git push

// 사용자를 삭제하는 경우
$ git rm keydir/user1.pub
$ git commit -a -m "remove user1"
$ git push
사용자(user1) 계정에서 "testing.git"를 "clone"한다.
$ su - user1
$ git clone git-repo@localhost:testing.git
testing.git가 비어있기 때문에 "warning: You appear to have cloned an empty repository." 경고문이 발생한다.
"testing"폴더에서 새로운 파일을 생성하고, Git 저장소에 push한다.
$ su - user1
$ cd testing
$ vi file.txt
$ git status
$ git add file.txt
$ git status
$ git commit -a -m "create file"
여기까지는 git의 local에 대한 설정이다. 즉, 원격 저장소와는 관계가 없다.
"user1" 계정의 git에 의해서만 관리되고 있다.
이제 현재 상태를 원격 저장소에 적용해 보자!
$ su - user1
$ cd testing
$ git push origin master
"user1" 계정의 다른 폴더에서 "testing.git"를 가져오고, "file.txt"가 존재하는지 확인한다.
$ su - user1
$ mkdir temp
$ cd temp
$ git clone git-repo@localhost:testing.git
$ cd testing
$ ls -al
6. Windows PC에서 "SourceTree"를 사용해서 저장소에 접속해 본다.
"SourceTree"설치와 SSH Key 생성은 "개발환경" Blogger에서 "Git 사용하기"를 참조한다.
새로 생성된 SSH Key의 public key를 Git Server에 등록하자!
$ su - gitolite
$ cd ~/gitolite-admin/keydir
$ vi SourceTree_user1.pub
"PuTTY Key Generator"에서 public key를 복사한다.

Git Server의 "gitolite"계정으로 접속해서 "gitolite-admin\keydir"폴더에 "SourceTree_user1.pub"파일에 붙여넣기 한다.

$ su - gitolite
$ cd ~/gitolite-admin/keydir
$ git add SourceTree_user1.pub
$ git commit -a -m "add user SourceTree_user1"
$ git push

아래와 같이 SourceTree에 SSH private.key를 등록한다.("도구" ->"옵션")

"복제/생성" 버튼을 클릭하고, "소스 경로"를 기술한다.
git-repo@192.168.152.130:testing.git

"저장소 종류"에 "Git 저장소 입니다"로 표시되면 정상동작을 나타낸다.
"클론"버튼을 클릭한다.


앞서 Ubuntu에서 작업한 이력이 그대로 보여진다.
참고로, 위의 과정중에 vmware 네트워크 설정과 도서관 공유 네트워크로 인해서 여러 설정이 변경되었고, SourceTree에서 RAM 상주 프로그램 때문에 고생했다.

7. GitWeb 설치 및 사용.
Web을 통해서 저장소의 내용을 파악하기 위해서 GitWeb을 설치한다.
$ sudo apt-get install gitweb
기본적으로 Ubuntu에서 아파치(apache2) 서버가 설치되어 있으므로, 아파치(apache2) 서버를 따로 설치할 필요는 없다.
단, gitweb에서는 cgi를 사용하므로, 아파치 서버에서 CGI를 사용하도록 enable해야 한다.
$ sudo a2enmod cgi
GitWeb에 저장소의 위치를 등록하기 위해서 "/etc/gitweb.conf"파일에 "$projectroot"와 "$projects_list"변수를 설정한다.
$ sudo vi /etc/gitweb.conf
  -> $projectroot = "/home/git-repo/repositories/";
  -> $projects_list = "/home/git-repo/projects.list";
  -> $projects_list = $projectroot" --> projects.list가 update되지 않는다.
gitweb에서 조회하게 되는 사용자/디렉토리에 권한을 부여한다.
$ sudo usermod -a -G git-repo www-data
$ sudo chmod g+r /home/git-repo/projects.list -> sudo chmod 666 /home/git-repo/projects.list
$ sudo chmod -R g+rwx /home/git-repo/repositories -> sudo chmod -R 755 /home/git-repo/repositories

$ sudo vi /home/git-repo/.gitolite.rc
  -> UMASK            =>  0027,
아파치(apache2) 서버를 다시 실행한다.
$ sudo service apache2 restart

windows PC에서 GitWeb(http://ubuntu_IP/gitweb)으로 접속한다.

"404 - No projects found"가 보이는 것은 "/home/git-repo/repositories"폴더에 대한 접속 권한이 없기 때문이다. 간단히 "git-repo"계정으로 접속해서 "repositories"폴더의 권한을 "755"로 설정하면 해결된다.
앞서 "usermod"명령으로 "git-repo" 그룹에 "www-data" 계정을 추가하였기 때문에 gitweb에서 접속할때 "git-repo" 그룹의 권한을 gitweb에서도 가진다. 따라서 "projects.list"와 "repositories"폴더의 권한을 "gitweb"에서도 동일하게 가진다.

위와 같이 "testing.git" project가 보여진다.

8. 저장소에 새로운 사용자와 Project 추가하는 방법.
새로운 사용자 "kwangho9" 계정을 생성하고, SSH public key를 관리자("gitolite")에게 전달한다. 향후 git를 사용하기 위해서 "email"과 "name"을 등록해야 한다.
$ sudo adduser kwangho9
  -> enter 'kwangho9' new password
$ su - kwangho9
$ ssh-keygen
$ scp .ssh/id_rsa.pub gitolite@localhost:/home/gitolite/gitolite-admin/keydir/kwangho9.pub
  -> enter 'gitolite' password
$ git config --global user.email "kwangho9@gmail.com"
$ git config --global user.name "kwangho9"
"gitolite"계정에서 새로운 사용자의 public key를 등록한다.
$ su - gitolite
$ git add ./gitolite-admin/keydir/kwangho9.pub
$ git commit -a -m "add new user 'kwangho9'"
$ git push
"kwangho9"계정에 대한 "project1"이라는 저장소(git)를 생성하자!(git project는 "gitolite"계정에서 처리한다.)
$ su - gitolite
$ vi ./gitolite-admin/conf/gitolite.conf
  -> repo   kwangho9/project1
  ->        RW+     = kwangho9
$ git commit -a -m "user2 new repository create"
$ git push

// 저장소 삭제는 conf/gitolite.conf를 수정해서 적용할 수 있지만, 완전히 지우지는 못한다. 
// 따라서, console 명령으로 직접 지워야 한다.
$ sudo rm -fr /home/git-repo/repositories/project3.git
참고로, 모든 저장소는 GitWeb으로 공유되지는 않습니다. 공개를 원하지 않는 저장소도 있기 때문에 기본적으로 공개하지 않습니다. 저장소에 "git-daemon-export-ok"파일이 존재하면 공개되고, 그외에는 공개되지 않습니다.
일반적으로 저장소 설정에서 사용자가 "@all"로 기술되면 공개됩니다.
$ su - gitolite
$ cd ./gitolite-admin/
$ vi conf/gitolite.conf
  -> repo    user1/project1
  ->         RW+    = @all
$ git commit -a -m "create repository 'user1/project1'"
$ git push
$ su - git-repo
$ ls ./repositories/user1/project1
  -> git-daemon-export-ok 파일이 존재한다.
$ cat ./projects.list
  -> user1/project1 폴더가 등록된다.
gitweb에 보여지지만, 사용자만 write권한을 갖기 위해서는 아래와 같이 설정한다.
$ su - gitolite
$ cd ./gitolite-admin/
$ vi conf/gitolite.conf
  -> repo    user1/project1
  ->         R      = @all
  ->         RW+    = user1
$ git commit -a -m "create repository 'user1/project1'"
$ git push
사용자(user1)은 저장소(project1)에 대해서 모든 권한을 가지고, 저장소(project1)은 gitweb을 통해서 공개된다.
Gitolite 권한 설정에 대해서는 "Gitolite 권한 설정"을 참조하기 바란다.

생성된 Project를 클론해보자!
$ su - kwangho9
$ git clone git-repo@localhost:user2/project1.git

결론적으로 사용자 등록을 하고, 사용자의 SSH public key와 project name을 관리자("gitolite")에게 전달한다. 저장소 관리자("gitolite")는 project name을 "./gitolite-admin/conf/gitolite.conf"에 등록하고, public key를 등록한다.
관리자("gitolite")에서 진행하는 일은 아래와 같다.
$ su - gitolite
$ vi ./gitolite-admin/conf/gitolite.conf
  -> repo   kwangho9/project1
  ->        RW+     = kwangho9
$ git add ./gitolite-admin/keydir/kwangho9.pub
$ git commit -a -m "add new user and project create"
$ git push
기존 사용자가 project만 추가되는 경우에는 관리자("gitolite")에게 project name만 보내주면 된다.
$ su - gitolite
$ vi ./gitolite-admin/conf/gitolite.conf
  -> repo   kwangho9/new_project
  ->        R       = @all
  ->        RW+     = kwangho9
$ git commit -a -m "add new project create"
$ git push
"gitolite.conf"를 수정한 후에 "git push"를 적용하면, projects.list가 초기화 된다.


gitweb에서 폴더별로 암호를 지정해서 사용자만 확인 가능하도록 해야 한다.

sourcetree에서는 SSH key를 1개만 등록이 가능한데, 여러개의 SSH key를 사용한다면 어떻게 해야 하는가?
참조

9. htpasswd를 이용한 GitWeb 보안.
참조1
참조2

10. Windows에서 Project 생성 및 준비 사항

11.

END

2016년 12월 17일 토요일

설치된 어플(프로그램) 목록 보기.

Ubuntu에서는 Terminal로 어플(프로그램)을 설치하면, Text 기반의 어플은 Terminal에서 바로 실행할 수 있지만, GUI 기반의 어플은 찾기가 어렵다.
아래에 설명되는 인디케이터(Indicator)는 설치된 프로그램 목록을 보여준다.

먼저 저장소를 추가해 준다.
$ sudo apt-add-repository ppa:diesch/testing

ClassicMenu Indicator를 설치한다.
$ sudo apt-get install classicmenu-indicator

설치중에 Error가 발생한다면, "$ sudo apt-get update"를 실행하고, 다시 설치한다.
설치가 완료되면, Ubuntu PC를 "Reboot"한다.

화면의 우측 상단에  목록(List)버튼이 추가되어 있다.
이 버튼을 클릭하면 설치된 어플을 모두 확인할 수 있다.

ssh server 설치 및 사용

Ubuntu가 설치되면, 가장 먼저 SSH Server를 설치해야만 한다.
Ubuntu의 모든 동작은 Terminal 접속을 통해서 진행되기 때문에 SSH Server가 필요한다.
Ubuntu에서 Terminal를 실행한다.
대부분의 경우 Ubuntu에는 SSH Client만 설치되어있고, Server는 설치되어 있지않다.
SSH Server를 설치하기 위해서 아래와 같이 실행한다.
"sudo apt-get install openssh-server"를 실행한다.

설치가 완료되면, SSH Server를 실행하기 위해서 "sudo /etc/init.d/ssh restart"를 실행한다.

현재 Ubuntu의 IP Address를 확인하기 위해서 "ifconfig"를 실행한다.

Windows PC에서 "Putty"를 설치한다.
PuTTY는 SSH를 지원하는 Terminal 프로그램이다.(PuTTY만 download받지 말고, putty-0.67-installer.msi 를 받아서 설치하자)
클릭 몇번으로 간단히 설치된다.
이제 PuTTY를 실행해서 Ubuntu에 접속해 보자!

"Host Name or IP address"항목에는 앞서 Ubuntu의 IP address를 넣는다.
대부분 Telnet접속은 22번 Port를 사용하므로, "Port"항목은 그대로 둔다.
"Open"을 클릭한다.

사용자 ID와 PW를 입력하면 Telnet이 연결된다. 접속 할때 마다 항상 ID와 PW를 입력하는것은 보안상 좋을지 모르지만, 나처럼 머리 나쁜사람은 Key를 생성해서 ID와 PW입력 없이 사용하기를 좋아한다.
먼저 SSH Key를 생성하기 위해서 "puttygen.exe"를 실행한다.


"Generate"버튼을 클릭하고, Key항목에 마우스를 움직이면 Key가 생성된다.


윗부분에 보여지는 것이 공개키(Public key)이고, 이부분은 향후 SSH Key를 등록할때 복사해서 "붙여넣기"로 등록한다.
"Save private key"버튼을 클릭해서 사설키(private key)를 PC에 저장한다.
"Save public key"버튼을 클릭해서 SSH server에 공개키를 등록한다.

Ubuntu에 SSH Public key를 등록하자!
(참고, https://www.linode.com/docs/security/use-public-key-authentication-with-ssh )
사용자 계정의 Home 폴더에 ".ssh"폴더를 생성하고, authorized_keys 파일을 생성한다.

공개키(public key)를 복사한다.

"~/.ssh/authorized_keys" 파일에 "붙여넣기" 한다.

"PuTTY.exe"를 실행하고, SSH Private key를 등록한다.
"PuTTY Configuration"의 "Connection" -> "Data"에서 "Auto-login username에 Ubuntu 사용자 계정을 입력한다.

"Connection" -> "SSH" -> "Auth"에서 "Private key file for authentication:"항목에 앞서 저장한 사설키(Private key)를 등록한다.

"Section"에서 "Host Name(or IP address)"와 "Port"를 기술하고, Section을 저장한다.

"Open"버튼을 클릭하면, 이제 ID와 PW를 물어보지 않고, 바로 접속된다.

이후로 Ubuntu에 접속할때문 앞서 저장한 Section(vmware_ubuntu_ssh)을 클릭하면 된다.

Samba 설치 및 사용법

Ubuntu를 설치한 후에는 반드시 "sudo apt-get upgrade"와 "sudo apt-get update"를 실행해서 모든 Library와 Application을 업그레이드하자!
  1. 삼바(Samba) 서버 설치.
    "$ sudo apt-get install samba" 삼바(Samba)어플을 설치한다.
    $ sudo apt-get install samba

    "$ sudo apt-get install smbfs" 삼바(Samba) File System을 설치한다.
    $ sudo apt-get install smbfs

    "$ sudo apt-get install system-config-samba" 삼바(Samba) GUI Tool을 설치한다.
    $ sudo apt-get install system-config-samba
  2. 삼바(Samba) 서버 설정.
    "/etc/samba/smb.conf" 파일을 수정한다.
    Ubuntu와 Windows OS간의 문자셋 설정을 위해서 아래와 같이 3줄을 "[global]" 프로퍼티에 추가한다.
    $ sudo vi /etc/samba/smb.conf
      [global]
      unix charset = cp949
      dos charset = UTF8
      display charset = UTF8

    $ sudo vi /etc/samba/smb.conf
      [khjung]
      comment = welcome to user
      path = /home/user/samba
      guest ok = no
      read only = no
      ; writable = yes
      create mask = 0644
      directory mask = 0755
    사용자 프로퍼티를 생성하고, 아래와 같이 기본적인 내용을 작성한다.

    즉, 삼바(Samba) 폴더와 권한을 설정하고, 삼바(Samba) 폴더를 생성한다.
    $ mkdir ~/samba
    $ mkdir ~/samba
  3. 삼바(Samba) 계정 설정.
    삼바(Samba) 계정을 생성하고, 삼바(Samba) 서버를 재시작한다.
    $ sudo smbpasswd -a khjung
      -> Enter password
    $ sudo /etc/init.d/samba restart
  4. 삼바(Samba) 사용하기.
    Windows PC에서 "탐색기"를 실행하고, "네트워크"를 클릭해서 공유된 PC가 있는지 확인한다.

    Ubuntu PC를 더블 클릭하면, 사용자 이름과 암호를 물어본다.

    앞서 Ubuntu에서 등록한 삼바(Samba) 계정과 암호를 입력한다.


    폴더에 파일과 폴더를 생성해 본다.

vmware로 Ubuntu 설치하기.

vmware를 실행해서 Ubuntu 가상 머신을 설치해 보자!







"Finish"버튼을 클릭하면, 자동으로 Ubuntu설치가 진행된다.
이후로는 자동으로 진행되기 때문에 잠깐 나가서 놀아도 된다.



설치가 완료되면, 자동으로 Reboot된다.

vmware에 Ubuntu 설치 완료.