Выложу свой метод выкладки и организации проекта, недавно решил попробовать tornado веб сервер, поэтому в конфигах использую его.
Хост:
- дистр: debian
- собранный из исходников питон лежит тут: /home/web/python
- кэш для загружаемых пакетов тут: /home/web/downloads, там же складываются пакеты, которых нет на PyPi (tornado например)
- репозиторий: /var/hg/vmagamedov - стандартный джанговский проект, в корне лежит settings.py
- проекты лежат в домашней директории юзера “web”, т.е. /home/web/magamedov.com/
Структура проекта до запуска buildout:
bin/
server.template
manage.template
etc/
local_settings.py
src/
var/
log/
run/
buildout.cfg
bootstrap.py
Собираем проект:
python bootstrap.py
bin/buildout
Что добавилось после запуска buildout и запуска сервера (bin/server start):
bin/
python
buildout
server # скрипт для запуска и останова сервера
manage # джанговский manage.py с правильным окружением
develop-eggs/ # new
eggs/ # new
etc/ # не изменилось
parts/ # new
src/
vmagamedov # new
var/
log/
access.log # логи сюда пишет nginx
error.log
run/
server.pid # new
Файл buildout.cfg
[buildout]
newest = false
download-cache = /home/web/downloads
parts =
python
install
update
manage
server
[python]
recipe = zc.recipe.egg
interpreter = python
find-links = ${buildout:download-cache}
extra-paths =
${buildout:directory}/etc
${buildout:directory}/src/vmagamedov
eggs =
django
python-openid
tornado
python-daemon
[install]
recipe = collective.recipe.cmd
on_install = true
cmds =
hg clone /var/hg/vmagamedov ${buildout:directory}/src/vmagamedov
[update]
recipe = collective.recipe.cmd
on_update = true
cmds =
cd ${buildout:directory}/src/vmagamedov
hg pull
hg update
[manage]
recipe = buildout_script
template = ${buildout:directory}/bin/manage.template
PYTHON = ${buildout:directory}/bin/${python:interpreter}
SETTINGS = settings
[server]
recipe = buildout_script
template = ${buildout:directory}/bin/server.template
PORT = 8000
PIDFILE = ${buildout:directory}/var/run/server.pid
PYTHON = ${manage:PYTHON}
SETTINGS = ${manage:SETTINGS}
Файл server.template
#!%(PYTHON)s
from __future__ import with_statement
import os
import sys
import signal
from daemon import DaemonContext
from daemon.pidlockfile import PIDLockFile
from tornado.ioloop import IOLoop
from tornado.httpserver import HTTPServer
from tornado.wsgi import WSGIContainer
PORT = %(PORT)s
PIDFILE = '%(PIDFILE)s'
def start():
from django.core.management import setup_environ
import %(SETTINGS)s
setup_environ(%(SETTINGS)s)
#
from django.core.handlers.wsgi import WSGIHandler
from django.core.servers.basehttp import AdminMediaHandler
#
wsgi_app = AdminMediaHandler(WSGIHandler())
container = WSGIContainer(wsgi_app)
#
context = DaemonContext(pidfile=PIDLockFile(PIDFILE))
context.signal_map = {
signal.SIGTERM: lambda signum, frame: IOLoop.instance().stop(),
}
with context:
http_server = HTTPServer(container)
http_server.listen(PORT)
IOLoop.instance().start()
def stop():
if os.path.exists(PIDFILE):
try:
pid = int(open(PIDFILE, 'r').read())
except Exception:
print 'Error: wrong PIDFILE'
else:
os.kill(pid, signal.SIGTERM)
else:
print 'Error: PIDFILE not found'
if __name__ == '__main__':
if 'start' in sys.argv:
start()
elif 'stop' in sys.argv:
stop()
Файл manage.template
#!%(PYTHON)s
from django.core.management import execute_manager
import %(SETTINGS)s
if __name__ == "__main__":
execute_manager(%(SETTINGS)s)
Скачать:
http://magamedov.com/pub/buildout.cfghttp://magamedov.com/pub/server.templatehttp://magamedov.com/pub/manage.templateЭто конечно не конец, но меня пока устраивает.