라이믹스 (사실상 PHP)의 특성상 리얼서버와 테스트 서버를 분리하기가 참 곤란합니다

 

소규모 사이트나 커뮤니티 같이 오류가 나도 중요하지 않은 서비스면 그냥 리얼서버 하나에 다 몰아넣고 해도 괜찮지만,

 

운영중에 버그가 나면 안된다거나, 클라이언트들에게 공개가 되면 안되는 기능같은걸 만들때는 테스트서버가 필연적으로 필요하죠

 

 

그래서 그냥 리얼서버를 덤프떠서 별도의 사이트(테스트 서버)를 하나 만들고, 도메인, DB만 변경한 후에 테스트 서버 변경사항 -> 리얼서버 배포하도록 야매 파이프라인(?)을 짜봤습니다.

 

 

> sync.sh (배포 스크립트)

#!/bin/bash

rsync -avz /var/www/test-server/public /var/www/real-server\
    --exclude files/

 

 

이렇게 하면 DB는 서로 다른곳을 바라보고 있으니 서로 데이터가 겹치는 오류도 없고

 

테스트 서버에서 기능 개발하고, 위의 스크립트만 실행하면 자동으로 리얼서버에 복제가 되니 요구조건은 다 맞춘거죠

 

 

스크린샷 2023-04-23 오후 8.46.56.png.jpg

예시) 좌측 리얼서버, 우측 테스트 서버

 

테스트 서버에서 작업 다 하고, sync.sh 명령어를 실행하면 리얼 서버에도 동일하게 적용됩니다.

 

 

추가로 서버 내부 로직은 도메인에 따라 개발/리얼서버 분기를 하도록 설정해두면 "테스트 서버에만 작동하는 코드!" 같은것도 구현이 가능합니다

 

스크린샷 2023-04-23 오후 8.50.16.png.jpg

도메인에따라 dev/real을 리턴해주는 간단한 코드를 짜고

 

스크린샷 2023-04-23 오후 8.51.17.png.jpg

아래와 같이 dev일 경우에만 코드 실행 같은 활용도 가능하네요

 

이상 팁 끝!

리버스

profile
모듈 제작하는 현역 대학생 리버스입니다!

== 판매중인 모듈 ==
미션] https://xetown.com/thirdparties/1511787
길드] https://xetown.com/thirdparties/1387146
  • profile

    git을 사용하는 방법도 있습니다. github이나 개인서버에 비공개 저장소를 만들어 놓고, 테스트 서버에서 push한 후 실서버에서 pull하는 것이지요. 잘못 수정했더라도 rsync와 달리 언제든지 원하는 상태로 롤백할 수 있다는 장점이 있지만, 모듈마다 저장소가 따로 있다면 좀 귀찮아집니다. ㅎㅎ

    조금 더 고급 스킬을 동원한다면 github의 webhook을 사용해서, 특정 브랜치에 push하면 자동으로 실서버에 적용되도록 할 수도 있습니다. 평소에는 테스트 서버에서 develop 브랜치에서 작업하다가 슬슬 실서버에 올려도 되겠다 싶으면 master로 merge하는 거예요. 마치 AWS의 Elastic Beanstalk을 사용하는 것 같은데, AWS에서 인스턴스를 통째로 갈아치우는 것보다 git pull이 훨씬 빠르기 때문에 자주 커밋하는 스타일이라면 이 쪽이 더 편리해요.

  • profile profile
    모듈별로 git을 따로 관리하고 있어서.. 곤란하네요 XD

    github action으로 CI/CD를 구축해도 괜찮긴 한데, 아직 그정도의 리소스를 투자하기에는 귀찮기도 하고,,
    서버 하나에서 개발과 리얼 두개를 돌리고 있기 때문에 굳이 복잡한거 없이 파일 옮기는 식으로도 구현 가능할거 같아 이렇게 해봤습니다

    나중에 크게 성공해서(?) 서버 분리를 하게 된다면 그때 제대로된 파이프라인을 만들어봐야겠네요 :D

    +) 풍문으로 들은건데 git submodule을 활용해서도 여러 레포를 하나에 합칠 수 있던거 같던데, 이거로 한번에 배포하는것도 괜찮아보이네요
  • profile profile

    네, 각 모듈의 저장소가 분리되어 있는 곳에서는 submodule을 사용하면 CI/CD 구축하기 좀더 편리해집니다. 모듈 개발자가 아니라 그냥 구매해서 쓰는 사이트라면 모노레포로 운영하는 것이 더 쉽지만요.

    아니면 그냥 webhook 요청받아 처리하는 스크립트에서 push가 일어난 저장소 => git pull을 실행할 경로를 매칭하여 적당히 처리하도록 할 수도 있지요. 더 저렴하고 더 야매스러운 방법은 항상 있습니다. ㅋㅋㅋㅋ