Windows로 Kallithea 구동

15082 단어 GitMercurial
예전에 Windows의 RhodeCode글을 썼는데 너무 낡아서 지금 오류가 백출하고 최근에 다시 설정할 기회가 생겨서 절차를 다시 정리했습니다.

RhodeCode 및 Kallithea


RhodeCode와 Kallithea는 Giit/Mercurial 두 종류의 GiitHub 쓰기를 지원하는 응용 프로그램입니다.
GiitHub Issues에는 상당한 기능이 없지만, 그 외에도 Pull Request, 온라인 리뷰, Gist 등 대체로 동일한 기능이 있다.
RhodeCode는 GPLv3에서 개발됐으나 2.0에서 RhodeCode Enterprise로, 조건에 따라 유상으로 바뀌었다.
RhodeCode Fork 대신 GPLv3 아래에서 개발을 계속하는 것은 Kallithea다.
이번에는 이 Kallithea 설정을 진행하겠습니다.

전제조건 따위

  • 방문자는 25명가량이다.
  • 기존 환경을 최대한 오염시키고 싶지 않다.
  • 창고에 있는 파일은 UTF8 및 shift-jis가 섞여 있어요.
  • 현재 일본어 통행증은 없지만 일본어 통행증도 문제가 없기를 바랍니다.
  • 모든 고객은 Windows입니다.
  • 외부 액세스는 Apache에서 리버스 프록시를 설정합니다.
  • Apache 측 인증
  • Windows 서비스화.
  • 환경 준비


    안타깝게도 파이썬 3에 대응하지 않아 파이썬 2.7(2015.4 현재 최신 2.7.9)을 설치했다.
    또한 확장 모듈을 구축하기 위해 미리 설치Microsoft Visual C++ Compiler for Python 2.7한다.
    Kallithea는virtualenv 환경에 설치하고 싶어서virtualenv도 설치했습니다.
    console
    > pip install virtualenv
    

    가상 환경 만들기 및 설치


    이런 방식으로 디렉터리를 적당히 만듭니다.
    C:\Kallithea
    ├ HOME           ・・・config、dbなどを配置するディレクトリ
    ├ kallithea.sys  ・・・Pythonのモジュール類をインストールするディレクトリ(virtualenv)
    └ repos          ・・・Git/Mercurialのリポジトリを配置するディレクトリ
    
    Kallithea용 virtualenv를 만들고 활성화합니다.
    console
    > cd C:\Kallithea\kallithea.sys
    > virtualenv .
    > Script\activate
    
    pip install kallithea에서 기본적으로 필요한 모듈을 모두 설치합니다.
    RhodeCode 1.x에 추가 설치chardet를 하지 않으면non-ascii 파일이 잘 보이지 않지만 아직 확인되지 않았기 때문에 그것도 넣습니다.
    또한 유지보수에 사용되는 상호작용 케이스ipython를 이동하기 위해서도 필요하다.
    console
    > pip install kallithea chardet ipython
    
    Lib\site-packages\sitecustomize.py를 만들고 필요한 환경 변수를 설정합니다.
    sitecustomize.py
    import os
    os.environ["HOME"] = 'C:/Kallithea/HOME'
    os.environ["HGENCODING"] = 'cp932'
    os.environ["PYTHON_EGG_CACHE"] = 'C:/Kallithea/.egg-cache'
    

    Kallithea 인스턴스 만들기


    HOME으로 이동하여 paster make-configpaster setup-db에 Kallithea 인스턴스를 만듭니다.
    console
    > cd C:\Kallithea\HOME
    > paster make-config Kallithea kallithea.ini
    > paster setup-db kallithea.ini
    Are you sure to destroy old database ? [y/n] y
    
    Enter a valid absolute path to store repositories. All repositories in that path
    will be added automatically: C:\Kallithea\repos
    
    Specify admin username: iwata
    
    Specify admin password (min 6 chars): ****
    
    Confirm password: ****
    
    Specify admin email: [email protected]
    
    이 단계에서 실행paster serve kallithea.ini하고 브라우저에서 방문http://localhost:5000하면 이렇게 이동하는 것을 확인할 수 있습니다.

    IE가 올바르게 표시되지 않으면 내부 웹 사이트와 호환되도록 설정을 닫으십시오.

    Windows 서비스 사용


    여기.pywin 32의 설치 프로그램, easy 다운로드설치를 설치합니다.
    httpserver는cherrrypy의 물건을 사용하고pip로 설치합니다.
    console
    > easy_install py2in32-xxx.xxx-py2.7.exe
    > pip install cherrypy
    
    이런 시나리오를 준비했습니다.
    service.py
    import os
    import win32serviceutil
    import cherrypy
    
    def make_kallithea_app():
        from paste.deploy import loadapp
        return loadapp("config:kallithea.ini", 
                       relative_to=os.path.dirname(__file__))
    
    class KallitheaService(win32serviceutil.ServiceFramework):
        _svc_name_ = "Kallithea"
        _svc_display_name_ = "Kallithea service"
        _svc_description_ = "Kallithea service"
    
        def SvcDoRun(self):
            cherrypy.config.update({'service.socket_port': 5000})
            cherrypy.tree.graft(make_kallithea_app(), '/')
            cherrypy.engine.start()
            cherrypy.engine.block()
    
        def SvcStop(self):
            cherrypy.engine.exit()
    
    if __name__ == '__main__':
        win32serviceutil.HandleCommandLine(KallitheaService)
    
    이런 느낌으로.
    console
    > python service.py install
    

    역방향 에이전트 및 인증


    앞에서 Apache 인증을 받고 Kallithea의 리버스 프록시로 설정합니다.
    이 일대 RhodeCode 1.엑스 때랑 완전 다른 건데.

    Kallithea 측면 설정하기


    Admin->Authentication부터 먼저 kallithea.lib.auth_modules.auth_containerenabed,save로 만듭니다.
    그나저나 이런 GUI는 현재 상태가 enabled라는 뜻인가요? 클릭하면 enabled가 된다는 뜻인지 알기 어려워요.

    그리고 컨테이너 Authentication 플러그인을 설정하는 패널이 추가되었으므로 Enabled에서 다시 한 번 확인하고 저장합니다.

    인증 설정은 WEB를 통해 할 수 있어 편리하지만, 잘못 설정하면'통조림 속 통조림'상태가 될 수 있으니 주의해야 한다.

    Apache 측면 설정


    Apache에서도 인증 및 Proxy 설정을 적절히 수행합니다.Rewrite의 REMOTEUSER 값을 X-Forwarded-User로 설정하고 요청을 전송합니다.
    이어 머리에 X-UA-Compotible = "IE = Edge"를 추가하면 "스와프 디스플레이로 내부 사이트를 표시"설정된 ON/OFF와 상관없이 IE로 표시할 수 있다.
    httpd.conf
    <Location /kallithea>
        SetEnvIf X-Url-Scheme https HTTPS=1
    
        ProxyPass           http://127.0.0.1:5000
        ProxyPassReverse    http://127.0.0.1:5000
    
        AuthType Digest
        AuthName "Login to Kallithea"
        AuthDigestProvider file
        AuthUserFile /path/to/digest/file
        BrowserMatch "MSIE|Chrome" AuthDigestEnableQueryStringHack=On
        Require valid-user
    
        RequestHeader unset X-Forwarded-User
        RewriteEngine On
        RewriteCond %{LA-U:REMOTE_USER} (.+)
        RewriteRule .* - [E=RU:%1]
        RequestHeader set X-Forwarded-User %{RU}e
    
        Header set X-UA-Compatible: IE=Edge
    </Location>
    

    사용자 로그인


    그러면 RhodeCode 1.x에서는 아파치(또는 다른 용기)로 인증하면 RhodeCode 쪽에서 사용자를 만들어야 하는데, 지금은 아파치 쪽에서 인증할 때 사용자가 자동으로 등록한다.
    반대로 Kallithea 측에서 사용자를 만들면 용기 옆에 같은 이름의 계정이 있어도 용기 인증을 할 수 없습니다.(컨테이너에서 인증한 후 다시 Kallithea 로그인 화면에서 인증 요청)
    그래서

  • 액세스http://localhost/kallithea(컨테이너 인증됨), Admin 권한을 부여하려는 사용자 ID로 Apache
  • 에 로그인

  • 방문http://localhost:5000(Kallithea 인증이 됨), setup-db에서 제작된 Admin 사용자로 로그인하여 현재 제작된 사용자에게 Admin 권한을 부여
  • 이런 절차에 따라 컨테이너 인증을 할 수 있는 Admin 사용자를 만들면 된다.
    여기까지 설치 완료.

    난감한 말씀


    인증된 설정이 잘못되면 곤란하다고.
    이런 상황에서 상호작용 케이스에서 데이터를 복구할 필요가 있다.(아마. 다른 방법이 있을 거야.)
    ishell 명령은 ipython 기반의 상호작용 케이스를 시작할 수 있습니다
    console
    > paster ishell kallithea.ini
    
    인증 설정을 기본값으로 재설정하려면 이 스크립트를 실행하십시오.
    ishell
    for k, v in (('auth_plugins', u'kallithea.lib.auth_modules.auth_internal'),
                 ('auth_internal_enabled', False)):
        Session().add(Setting.create_or_update(k, v))
    Session().commit()
    
    또한 지정된 사용자에게 Admin 권한을 부여합니다.
    ishell
    u = User.get_by_username('iwata')
    u.admin = True
    Session().add(u)
    Session().commit()
    
    Kallithea에 등록된 사용자가 컨테이너 인증을 받을 수 있도록 변경
    ishell
    u = User.get_by_username('iwata')
    u.extern_type = u'container'
    u.extern_name = u'iwata'
    Session().add(u)
    Session().commit()
    
    각양각색당연히 At your own risk.

    좋은 웹페이지 즐겨찾기