rein's world

django 기반 웹 사이트 배포 방법?

django 기반의 웹 사이트를 배포해야 하는데, 타겟 머신이 확정되지 않은 상태에서도 설치할 파일들은 저장할 수 있어야하고 + 설치 시기도 적당히 제어할 수 있어야 하는 상황.

일단 다음과 같은 가정으로 설치하게 했다:

  1. (Dev) django app은 데비안 패키지(.deb)로 묶는다
  2. (Deploy) .deb은 chroot-jailed sftp에 전송
  3. (Deploy) 올린 애를 apt 저장소 형식으로 내보냄
  4. (Service front-end) 이걸 자동으로 받거나, 원격 스크립트, 혹은 로컬에서 직접 설치
  5. (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 기반이어야 함)
  • apache: 맘 편하게 gunicorn + nginx reverse proxy 같은 고전적인 조합을 생각하는 중
  • .deb 전송 방식으로 sftp1: shell 권한을 주기 곤란해서 고른 것인데, 그냥 HTTP PUT 으로 넣는게 더 나을지도?

django 기반의 사이트를 배포해 보신 분들의 의견을 구합니다. 아는 게 없는 동네라 뭔가 엄한 -_- 조합을 만들었다 싶기도 하고.

혹은 다른 WSGI 프레임웍을 썼을 때 좀 더 배포가 편했다거나 — flask나 cherrypy만 써도 이보다 간단할 것 같은데… — 하는 경험 있으면 들려주세요. 흑흑 상식적인(?) 방법은 fabric이나 puppet으로 배포하는 쪽인 거 같긴하지만; (혹은 chef?)


  1. chroot jail이라 upload 디렉터리만 보이는 정도로. ↩︎