자유게시판

git을 활용한 쉬운설치 모듈 아이디어

2024.10.23 13:08
224
1

갑자기 아이디어가 번쩍하고 떠올라서 작성해봅니다 ㅎ

 

예전에 쉬운설치 모듈을 바닥부터 만들려고 시도해본적이 있었는데, 파일 다운로드부터 퍼미션 확인 후 안전하게 패치하기까지 체크해야할것이 너무 많고 만들 부분도 너무 많더라고요

특히나 노가다성 업무를 싫어하다보니 삽도 제대로 못뜨고 놓아버린 전적이 있습니다..

 

그러다 갑자기 git 프로토콜을 그대로 활용해보면 어떨까 싶어서 아이디어를 조금 구체화해봤습니다.

 

 

활용하고자 하는 라이브러리

https://github.com/czproject/git-php

 

 

최초설치

1. 모듈의 관리자 페이지에서 github URL과 credential(옵션)을 입력

2. 최신 태그의 디렉토리 root에서 INSTALLATION.json 파일을 불러옴. (object를 통해 remote에서 특정 파일만 불러올 수 있는거로 아는데, 불가능하다면 임시디렉토리에 clone을 통해 전체를 불러오지 않을까 싶네요)

2-1. INSTALLATION.json 파일에는 라이믹스 루트 기준으로 어디에 설치를 해야하는지 디렉토리가 나와있음. (ex. /modules/mysource)

2-2. 만약 파일이 없을경우 유저가 설치 위치를 수동입력 해줘야함.

3. 설치 위치의 디렉토리 존재여부, 기존 파일 존재여부, 퍼미션을 확인함

4. 문제없다면 git clone을 통해 복제

5. 향후 업데이트를 위해 github URL과 credential, 설치 위치를 DB에 저장

 

 

업데이트

1. 모듈의 관리자페이지에서 설치 위치를 입력함. (ex. 업데이트할 모듈의 설치 위치 /modules/mysource)

2. git fetch를 통해 데이터 최신화 (태그 로딩)

2-1. 설치된 항목의 태그와 최신 항목의 태그가 동일하다면 최신버전

3. git diff를 통해 데이터 변질 확인

3-1. 만약 변동이 확인된다면 stash & pop이 가능한지 확인하고, 불가능하다면 에러 출력 => 어떻게 구현해야할지 감이 안와서 고민중입니다

3-2. diff 항목을 출력하고, 이를 최신본에 적용할지 혹은 버릴지를 프론트에서 확인

4. git pull로 최신화 (데이터가 변동되었다면 stash pop)

 

 

다만 우려되는점은 호스팅환경에서 git 명령어를 사용할 수 있을지와 php가 git 명령어를 실행할 수 있을지가 되겠네요.

보안 문제로 막혀있거나 국내 호스팅환경의 멋진 환경설정으로 인해 먹통이 되거나..

 

 

git 프로토콜로 다운로드와 패치만 해결할 수 있다면, 이론상으로는 서버가 필요없기 때문에 많은 개발자분들이 이용할 수 있지 않을까 싶네요

다들 모듈을 설치해서 커스텀하시는 분들도 꽤 있으신데, 이 또한 어느정도 커버할 수 있을것이고요

 

 

대부분의 라이믹스 사용자들이 git을 사용할 수 있는 환경을 가지고 있다면 시도해볼까 싶은데 보안상 문제는 없을지, 호스팅 환경에서는 잘 동작할지, 놓친 부분이 있지는 않을지 우려되어서 고민이 됩니다.

 

이 아이디어에 대해서 개발자분들의 의견이나 아이디어를 얻고싶습니다!

리버스 Lv. 7

댓글 5

  • 2024.10.23 15:36 #1842515

    개인적으로, 아니면 회사 등 통제된 환경에서 사용한다면 괜찮을 것 같은데
    불특정 다수에게 뿌리자니 역시나 두 가지가 걸립니다.

    첫째는 말씀하신 대로 exec으로 git을 호출할 수 있어야 한다는 점이고
    (링크된 라이브러리도 결국 git 저장소를 직접 조작하는 것이 아니고 exec을 쓰는 거죠?)

    둘째는 fetch→diff→stash→pop 과정에서 에러날 가능성이 무척 높다는 점입니다.
    (내가 아쉬워서 수정한 부분은 다른 사람도 아쉬울 가능성이 높으니, 충돌할 확률이 상당히 높습니다.)

    사실 두 번째가 더 어려운 문제이고, 솔직히 불필요한 복잡성이라고 생각됩니다.
    어떤 프로그램이라도 쉬운설치나 자동 업데이트 등의 툴을 사용하면
    순정 소스로 덮어씌워지는 것이 당연하게 받아들여지는 점을 오히려 적극 활용하면 좋겠습니다.
    수정한 것이 하나라도 있다면 git reset --hard 부터 한 번 해놓고 들어가는 거죠. ㅎㅎ

     

    라이믹스 매뉴얼에서도 git stash 사용을 권장하고 있는데, 실제로 여러 사이트의 사례를 보니

    stash만으로는 충돌 해결하기가 어려운 상황을 종종 발견하고 있습니다.

    한두 줄 수정하는 정도가 아니라면 아예 branch를 따로 만들고

    수정할 때마다 정식으로 커밋하는 것을 추천합니다.

     

    가장 중요한 것은 업데이트 도중 소스에 <<<< HEAD 이런 내용이 박혀 버리는 불상사를 막는 것입니다.

    이렇게 git 업데이트 실패한 상태를 해결하지 못하고 그대로 두면 사이트 먹통 되니까요.

    퍼미션과 관련해서는 git을 사용하든 안 하든 마찬가지로 주의해야 할 점이 많습니다.
    PHP에서 exec으로 git을 호출한다면 어느 계정 권한으로 git이 실행될까요?
    당연히 PHP를 실행하는 계정 권한이겠죠.
    카페24처럼 mod_ruid나 suexec을 적절히 활용하는 업체를 제외하면 퍼미션 문제가 생길 수밖에 없어요.
    그런데 어차피 퍼미션을 체크해야 하고, 수정된 파일도 그냥 덮어씌운다면
    zip 파일을 다운받아서 업데이트하는 것과 별 차이가 없게 됩니다. ㅡ.ㅡ

    XE 쉬운설치 모듈의 가장 큰 문제였다고 생각하는 부분도 위와 비슷합니다.
    XE는 퍼미션이 확보되지 않은 상태, safe_mode가 켜져 있는 상태 등
    열악한 호스팅 환경에서 어떻게든 작동하도록 하려고 너무 무리한 시도를 했습니다.
    차라리 "퍼미션 확보 안 된 서버에서는 사용 못 함!"이라고 과감하게 선언했다면
    나머지 환경에서는 훨씬 안정적으로 잘 돌아갔을 겁니다.
    아, 물론 변태같은 tar 디코더도 그냥 "ZipArchive 필수!" 한 마디로 대체했어야 하고요.

    지원 안 되는 호스팅은 불매운동해야죠.

  • 2024.10.24 11:05 #1842620
    자세한 의견 감사합니다.

    우선 git을 활용하면 굳이 모듈을 사용하지 않더라도 전문가는 쉘을 통해 clone이나 pull을 사용하여 모듈을 관리할 수 있을것 같다는 희망이 보이더라고요
    zip은 직접 다운로드 받아서 모듈 폴더에 업로드해야하고, 변경사항이 일괄 초기화된다는 점때문에 업데이트가 꺼려지는 요인이 되는 것 같습니다.
    그러나 git은 지식만 있다면 버전관리가 가능하고, 개발자의 커밋 메세지등을 보면서 의도를 파악할 수 있는 부가적인 장점도 존재하겠네요

    그리고 말씀해주신 stash건은 많은 수정이 있을경우 필연적으로 master와 충돌하는 케이스가 있겠네요.
    말씀하신것처럼 업데이트시에 모든 변경사항을 초기화하는 방식으로 구현하는게 복잡도도 낮고 빠르게 개발이 가능할 것 같습니다.
    업데이트는 tag를 기준으로 진행하기 때문에, 아마 hard reset 이후 해당 tag로 checkout 하는 방식으로 구현할것 같습니다.

    마지막으로 퍼미션이 제일 곤란한 문제이긴 한데..
    php에서 git 실행이 가능한 환경만 지원하도록 하면 모듈 실행자체는 문제가 없겠지요
    다만 역시나 문제는 모듈 다운로드 후 설치시에 퍼미션이네요..

    솔직히 퍼미션쪽은 자신이 없어서 우선은 php의 퍼미션을 그대로 활용하고자 합니다.
    예를들어 sociallogin 모듈을 설치한다고 하면
    1. /modules 폴더에 writable한지 체크 (sociallogin 폴더가 없다는 가정하에) -> 이건 소유자가 user겠죠
    2. /modules/sociallogin 폴더를 만들고 git pull -> sociallogin 폴더와 그 하위요소들은 모두 소유자가 www-data겠죠
    이렇게 설치가 진행되고, 업데이트시에도 퍼미션은 실행주체가 동일하기때문에 변경사항은 없을 것 같습니다.
    업데이트시에는 우선 대상 폴더의 모든 파일을 검사해서 rw가 가능한지 체크하고, 문제가 발견되면 오류를 출력하도록 하려고 합니다.

    만약에 /modules 폴더에 쓸 수 없다면 설치 자체가 진행되지 않을 것이고, 쓸 수 있다면 설치 후 실행까지 문제 없으리라 예상됩니다.
    이런 케이스일때 고려해야할 사항이나 문제가 될 만한 요지가 있을까요?
  • 2024.10.24 12:26 #1842633
    네, 쉬운설치라기보다는 전문가를 위한 고급설치 같은 느낌입니다.

    PHP 권한과 SSH 계정(파일 및 폴더) 소유자가 동일하다고 가정하면 편리합니다.
    각 계정의 권한으로 실행되는 PHP-FPM pool이 있다는 거죠.
    절대 다수의 해외 호스팅과 일부 국내 호스팅(카페24)은 이미 이런 시스템으로 운영되고 있고,
    가상서버라면 운영자 마음대로일 테니, 조건에 맞추라고 하면 그만입니다.

    아랫분이 말씀하신 설치 경로 지정 문제는
    git 프로젝트 내에서 충분히 선언할 수 있다고 생각됩니다.
    예를 들어 { type: module, name: reverse } 라면 설치 경로는 당연히 ./modules/reverse겠죠.
    어차피 대부분의 자료는 경로를 임의로 바꾸면 아예 돌아가지도 않으니까요.
  • 2024.10.23 23:00 #1842556
    1. 최초설치시 절차가 너무 복잡합니다. 선택하는 자료 타입에 따라 어디에 설치되는지 알아서 지정되고 설치되는 폴더명만 변경 가능하게 하면(기본값 저장소명) 충분합니다. 오히려 자료에게 설치폴더 지정 권한을 주면 루트 폴더나 타 자료가 설치된 폴더 등 엉뚱한 경로를 지정해 문제를 일으킬 소지가 다분합니다. 이게 가능하려면 지금 XE 쉬운설치 다운로드 서버처럼 중앙 서버에 리스트로 만들어 관리해야 합니다.

    2. 업데이트시 문제점은 윗 댓글에 자세히 있으니 생략합니다.

    개인적으로는 exec으로 git 실행이 가능한 환경 한정으로 git으로 설치나 pull 정도만 알아서 해주고 변경사항이나 브랜치 관리 등은 알아서 유저가 하게 두는게 맞다고 봅니다.

    git으로 설치하고 별도로 수정하는건 수정한 본인이 알아서 브랜치를 별도로 만들건 해서 관리해야죠. 코어에서 대신 관리해주다간 윗댓에도 있듯이 XE 쉬운설치 꼴 나는겁니다.
  • 2024.10.24 11:22 #1842624
    검토의견 감사합니다.

    1. 자료에게 설치 위치를 지정할 권한을 준 것은, 유저는 git 레포지토리만 넣으면 모듈에서 자동으로 해석해서 쉽게 설치할 수 있도록 하고자 함이였습니다.
    나중에는 설치 위치만이 아니라 모듈 이름, 설명, 대표 이미지 URL 등의 값을 넣을 수 있도록 할 생각이였습니다.
    패키지 하나하나가 설치 마법사같은 존재가 되겠네요.

    물론 레포지토리에 있는 모든 값을 신뢰할 수는 없기때문에, 기본값만 세팅하고 실제 설치하는 유저가 값을 일일히 수정할 수 있도록 기능은 제공할 예정이였습니다.
    다만 여러가지 가능성을 따져보다보니 git을 활용하여 설치정보 항목만 불러오기는 조금 어려울 것 같아서, 우선은 해당 기능 없이 유저가 모든 값을 입력하도록 하고, 다운로드 서버와 같은 기능을 추후에 로드맵으로 잡아보려고 합니다.


    2. 너무 많은 기능을 제공할경우 문제가 될 수도 있을것 같네요.
    말씀하신것처럼 최초 clone, 그리고 업데이트시에 pull 기능만 제공하고, 커밋된 항목에 수정사항이 있다면, 모든 수정사항을 hard reset한다는 조건 하에 제공하고자 합니다.
    어디까지나 순정상태로 사용하는 것을 보장해야지, 수정이 들어가는 순간부터는 git을 활용하여 직접 관리하지 않는 이상 자동 업데이트를 진행하는건 리스크가 있어보입니다.


    그리고 이 모듈은 아마 모든 기능을 오픈소스로 개발하게 될 것 같습니다.
    언제 개발에 삽을 뜰지는 모르겠으나, 만들고 나면 많은 개발자분들이 활용해주셨으면 좋겠네요 ㅎㅎ