django 기반의 웹 사이트를 배포해야 하는데, 타겟 머신이 확정되지 않은 상태에서도 설치할 파일들은 저장할 수 있어야하고 + 설치 시기도 적당히 제어할 수 있어야 하는 상황.
일단 다음과 같은 가정으로 설치하게 했다:
- (Dev) django app은 데비안 패키지(.deb)로 묶는다
- (Deploy) .deb은 chroot-jailed sftp에 전송
- (Deploy) 올린 애를 apt 저장소 형식으로 내보냄
- (Service front-end) 이걸 자동으로 받거나, 원격 스크립트, 혹은 로컬에서 직접 설치
- (Service front-end) 설치 작업 자체는 .deb의 postinst 를 이용한다:
- 사이트 실제 코드는 .deb으로 포장된 python package 형식으로 설치
- 사이트에서 읽을 일부 스태틱 데이터도 이 .deb에 포함.
- 매우 간단한 wsgi application 정의하는 파일과 django 설정 파일을 특정 디렉터리에 복사하고
- 기본 설정 파일(=django가 읽을 settings module)을 서버 정보를 이용해서 sed로 수정
- static file 들은 적당한 mount 지점에 가도록 symlink 추가
- 처음에 설치한 디렉터리를 이용해서 띄우는 설정을 /etc/apache/available에 추가하고 apache 재시작
…를 하는 상황.
근데 바꿀 수 있는 부분이 대략 이렇다:
- django: 하지만 python 기반 (뭐 wsgi 기반의…) 이어야 함. ((Go로 만들고 싶은 생각이 약간 있긴 하지만 그건 근 미래에는 힘들 듯))
- apache: 맘 편하게 gunicorn + nginx reverse proxy 같은 고전적인 조합을 생각하는 중
- .deb 전송 방식으로 sftp ((chroot jail이라 upload 디렉터리만 보이는 정도로)) : shell 권한을 주기 곤란해서 고른 것인데, 그냥 http put 으로 넣는게 더 나을지도?
django 기반의 사이트를 배포해 보신 분들의 의견을 구합니다. 아는 게 없는 동네라 뭔가 엄한 -_- 조합을 만들었다 싶기도 하고.
혹은 다른 WSGI 프레임웍을 썼을 때 좀 더 배포가 편했다거나 — flask나 cherrypy만 써도 이보다 간단할 것 같은데… — 하는 경험 있으면 들려주세요. 흑흑
상식적인(?) 방법은 fabric이나 puppet으로 배포하는 쪽인 거 같긴하지만; (혹은 chef?)
저는 rsync + 쉘 스크립트 조합을 썼는데(http://goo.gl/ETjKW), @hongminhee 님이 사용하셨던 distutil + fabric 조합이 훨씬 좋아보입니다. http://docs.python.org/distutils/
예전에 올리셨던 그 글이군요 :)
git 서버에 직접 접근 못하게 구성했으니 홍민희 님의 distutil + fabric 조합글, 혹은 홍민희 님이 트위터에서 링크한 http://hynek.me/articles/python-app-deployment-with-native-packages/ 를 이용해서 정리해봐야겠습니다.
앞으로도 많은 조언 부탁드립니다 (…)