Codeigniter deploy with forge & git push

PHP 프로젝트를 위한 깔끔한 배포 방법이 생겼다! 라라벨팀에서 제공하는 forge.laravel.com이다!

라라벨도 좋은 툴이지만, 처음 접했던 프레임웍이 코드이그나이터라서 그런지, 아직까지 많은 프로젝트를 코드이그나이터로 다루고 있다. 기존의 방법은 PHP에서 쉘스크립트 명령어를 써서, webhook과 git clone 명령어를 조합해서 하기에 먼가 굉장히 야매(?)의 냄새가 강하다.

forge는 라라벨이라는 최근 뜨고 있는(사실 뜬지 한참된) PHP 프레임웍을 개발한 팀에서 하는 배포서비스이다. 간단하게 소개하면 github과 연동하여 푸쉬가 일어났을 때 지정된 서버에서 clone 받는 동시에 npm, composer 등 몇 가지 작업을 자동으로 할 수 있고, 서버 설정 및 관리를 웹에서 할 수 있게 해주는 툴이다.

하여 코드이그나이터 프로젝트를 forge.laravel.com을 이용하여 배포해보기로 한다. 라라벨팀에서 만들었지만 CakePHP나 Symphony등 그냥 PHP 프로젝트는 다 되는 것 같다(관대한 라라벨). 월 만 얼마를 내면 무한대의 PHP 프로젝트 등록과 관리가 가능하다(라라벨은 망해도 forge는 안 망했으면 좋겠다).

위풍당당한 forge 랜딩페이지. 맞아. PHP 서버 돌릴려면 설정할 것도 많고 짜증나지! 출처 : forge.laravel.com

CI3 저장소 생성

먼저 CI3를 로컬에 셋팅을 해보자. 다른건 건드릴 필요가 없고, www 폴더 생성후에 root의 index.phpwww 에 옮겨주고, 해당 파일내의 applicationsystem 경로에 ../ 만 붙여줘서 상대경로를 바로잡아주면 된다. public 폴더에 어플리케이션 코드를 넣는 것은 좋지 않으므로 기본적인 작업을 해주는 것이고, 또 forge에서도 public 폴더를 별도로 지정해줘야하기 때문이다.

www폴더를 만들었고 index.php를 옮겨주었다. forge에서는 이 www만 접근 가능하도록 설정할 것이다.
반가운 CI3의 웰컴화면, 나중에 원격에서 이 화면이 뜨면 더욱 반가울 것이다.

그리고 private 저장소 생성이 가능한 bitbucket.com 에서 저장소를 생성하고, 이 소스들을 올려두도록 한다. 향후에 push를 할 때마다 forge에서 자동으로 새로 배포할 수 있으려면 원격 저장소가 있어야한다. 저장소 만드는 방법은 구글에 엄청 많으니 생략한다.

만들어진 원격저장소, 이따가 forge랑 이거랑 연결할 것이다.

AWS EC2 인스턴스 생성

forge는 배포를 위한 툴이고 직접 스토리지 서비스를 운영하지는 않는다(난 그래서 더 좋다). 전세계 리전이 깔려있는 아마존 EC2를 이용해서 작업을 진행하면 된다. EC2+Forge에 관한 자세한 방법들은 Laravel Forge — Hosting on AWS을 참고하면 된다. 인스턴스 생성에 관한 방법도 구글에 엄청 많이 있으니 자세한 것은 생략한다.

인스턴스 생성하기로 간 다음에 Ubuntu 16.04 LTS 버전을 선택한다.
일단 기본 설정, 그리고 기본 설정, 그리고 기본 Serucity Group(All Traffics)로 생성이 완료되었다.

생성이 완료되었으면 좌측 사이드바에서 Elastic IP를 하나 할당해주자. forge에서는 IP기반으로 작업을 진행하기에 고정아이피를 하나 설정해주어야 한다.

Forge 서버 생성과 연결

정확히 말하면 서버 생성이라기보다 관리상 있는 개념에 가깝다. 특정 서버를 관리하는 레코드를 하나 생성하겠다는 말 같은 것이다. 알아볼 수 있게 이름을 지정두고 생성한다.

서버 생성화면. PHP Version은 7.0으로해도 상관없을 것 같긴하지만, CI3가 그 버전에 최적화되어 있지는 않으니 안정적으로 5.6을 선택해본다.

Create Server를 누르면 스크립트를 내보낸다. SSH로 EC2에 로그인해서 실행하는 스크립트인데, php, hhvm, (선택한 경우) DB서버까지 다 알아서 설치를 해주는 스크립트이다. 그리고 웹상에서 forge에 명령을 내리면 그것을 받아다가 실행하고 상태보고를 해주는 에이전트도 깔아준다.

쉘스크립트 실행은 관리자 권한으로 하여야하므로 위 스크립트를 EC2 터미널에서 바로 복붙하지말고, bash forge.sh 앞에 sudo 를 붙여주고 실행하면 된다.

wget -O forge.sh https://forge.laravel.com/servers/111156/vps?forge_token=ZHj6a9aICcx6...yP3rasUz016g; sudo bash forge.sh
대략 5분~10분 정도 지가 알아서 다운로드 & 설치 & 설정이 이루어진다.
forge에서 해당 서버를 선택하면 이렇게 대기상태로 나오고 있다.
가만히 기다리고 있으면, 연결이 완료되고 하위로 사이트를 생성할 수 있는 화면으로 전환된다. 거의 다 왔다!

Bitbucket 연결

forge에서 서버가 생성되면 기본적으로 default 라는 사이트가 하나 추가되어 있는데, 이를 수정해도 되고 무시하고 새로 생성해도 된다. SSL 연결을 고려하는 경우에는 실제 domain으로 사이트를 하나 추가해주는 것이 좋을 것이다. 여기에서는 그냥 default 를 바로 이용해보자. 하단 목록에서 manage 를 눌러도 되고 상단 네비에서 Sites 에서 선택을 해도 된다.

Apps탭에서 Git Repository를 선택하면 아래와 같이 접근할 수 있는 SSH Keys를 해당 사이트에서 먼저 등록하라고 나온다. github의 경우에는 자동으로 연동되어 있지만 bitbucket은 수동으로 해주어야한다.

bitbucket 계정페이지에서 추가하여야할 SSH key.
계정페이지로 가서 SSH Keys 탭을 열고 Label은 대충 써주고, Key에 붙여넣어주면 된다.

다시 forge로 돌아와서 원격 저장소에 대한 정보들을 입력해주고 마무리를 한다. 서버상에서 composer를 돌리려는 경우에는 install Composer Dependencies 를 체크해주면 되는데, 나같은 경우에는 로컬에서 다 설치하고 넘길 것이라 해체를 했다. 체크한 경우 프로젝트 루트에 composer.json 이 없는 경우 에러가 난다.

원격저장소 연결 마무리 작업

Install Repository를 누르면 작업중 상태로 되고, 완료가 되면 아래와 같은 화면이 나온다.

나중에 저기에서 Deploy Now만 누르면 원격저장소의 소스가 배포된다.

여기까지하면 Deploy Now 를 눌렀을 때 bitbucket에서 가져와서 서버에 업데이트하는 것까지는 되지만, 저장소 업데이트가 되었을 때 자동으로 Deploy Now 가 되지는 않는다. webhook을 이용해서 업뎃과 동시에 저 버튼이 눌려지도록 하나 더 설정한다.

사이트 Apps탭에서 webhook용 토큰주소가 제공되어 있다.
다시;; bitbucket으로 가서 webhook 설청해준다. 복사시 토큰 이외에 잡문자가 섞이므로 유의해서 붙여넣자.

이제 전체적인 연결은 모두 끝이났다.

실 서버에 접속하기 전에… 현재의 이 사이트 설정은 forge 서버생성시 자동으로 생성된 것이라 public 폴더가 /public 으로 되어 있다. 아까 CI3 생성시 www 로 했으므로 /www 로 변경을 해주어야 제대로 뜬다(처음부터 /public 으로 할 껄 그랬나;;)

바꺼준다.
뜬다. 끝난 것 같다.

Envoyer와의 관계

forge는 직접적인 서버관리와 배포를 관리한다면, 형제인 envoyer는 무중단 배포와 상태 모니터링에 무게를 둔 서비스다. 라라벨의 경우에 모든 템플릿을 캐싱하므로 forge만을 이용하는 경우 순간적으로 사이트 오류가 발생할 수 있지만, 코드이그나이터는 템플릿 따로 안 써서 forge만으로 거의 무중단에 가깝게 배포가 가능하다. 물론 그러기 위해서는 npm bundling이나 composer install를 서버가 아닌 개발서버측에서 미리 다 github쪽으로 보내두도록 해놔야한다.