inital project layout
This commit is contained in:
commit
3c5ce29f67
11 changed files with 325 additions and 0 deletions
9
.bzrignore
Normal file
9
.bzrignore
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
bin
|
||||||
|
include
|
||||||
|
lib
|
||||||
|
src
|
||||||
|
build
|
||||||
|
dev.sqlite
|
||||||
|
secret.txt
|
||||||
|
local_settings.py
|
||||||
|
pip-log.txt
|
23
README
Normal file
23
README
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
oxbrowser
|
||||||
|
|
||||||
|
Get:
|
||||||
|
bzr branch PUBLIC_URL oxbrowser
|
||||||
|
cd oxbrowser
|
||||||
|
virtualenv .
|
||||||
|
pip -E . install -r requirements.txt
|
||||||
|
|
||||||
|
Develop:
|
||||||
|
create oxbrowser/local_settings.py
|
||||||
|
|
||||||
|
cd oxbrowser
|
||||||
|
python manage.py shell
|
||||||
|
|
||||||
|
python manage.py runserver
|
||||||
|
|
||||||
|
Deploy:
|
||||||
|
create oxbrowser/local_settings.py
|
||||||
|
|
||||||
|
create /etc/nginx/sites-availavle/sitename.conf
|
||||||
|
|
||||||
|
create /etc/init/oxbrowser.conf
|
||||||
|
|
20
etc/init/oxbrowser.conf
Normal file
20
etc/init/oxbrowser.conf
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# oxbrowser gunicorn daemon
|
||||||
|
#
|
||||||
|
|
||||||
|
description "oxbrowser daemon"
|
||||||
|
|
||||||
|
start on runlevel [2345]
|
||||||
|
stop on runlevel [!2345]
|
||||||
|
kill timeout 5
|
||||||
|
respawn
|
||||||
|
|
||||||
|
env VENV=/srv/oxbrowser
|
||||||
|
env USER=oxbrowser
|
||||||
|
env HOME=/home/oxbrowser
|
||||||
|
|
||||||
|
script
|
||||||
|
test -e /var/log/oxbrowser || (mkdir -p /var/log/oxbrowser && chown $USER:$USER /var/log/oxbrowser)
|
||||||
|
test -e /var/run/oxbrowser || (mkdir -p /var/run/oxbrowser && chown $USER:$USER /var/run/oxbrowser)
|
||||||
|
cd $VENV/oxbrowser
|
||||||
|
exec /usr/bin/sudo -u $USER $VENV/bin/gunicorn_django --bind unix:/var/run/oxbrowser/gunicorn.sock --timeout 90 --log-level info --log-file /var/log/oxbrowser/oxbrowser.log --workers 5 $VENV/oxbrowser/settings.py
|
||||||
|
end script
|
52
etc/nginx/sites-available/oxbrowser.conf
Normal file
52
etc/nginx/sites-available/oxbrowser.conf
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
upstream gunicorn_oxbrowser {
|
||||||
|
server unix:///var/run/oxbrowser/gunicorn.sock fail_timeout=0;
|
||||||
|
}
|
||||||
|
server {
|
||||||
|
listen 80 default;
|
||||||
|
#server_name pandora.example.com;
|
||||||
|
|
||||||
|
access_log /var/log/nginx/oxbrowser.access.log;
|
||||||
|
error_log /var/log/nginx/oxbrowser.error.log;
|
||||||
|
|
||||||
|
location /admin/media {
|
||||||
|
root /srv/oxbrowser/src/django/django/contrib;
|
||||||
|
autoindex on;
|
||||||
|
}
|
||||||
|
location /favicon.ico {
|
||||||
|
root /srv/oxbrowser/static;
|
||||||
|
}
|
||||||
|
|
||||||
|
location /static/ {
|
||||||
|
root /srv/oxbrowser;
|
||||||
|
autoindex on;
|
||||||
|
}
|
||||||
|
location /data/ {
|
||||||
|
internal;
|
||||||
|
root /srv/oxbrowser;
|
||||||
|
}
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header Host $http_host;
|
||||||
|
proxy_redirect off;
|
||||||
|
proxy_read_timeout 90; #should be in sync with gunicorn timeout
|
||||||
|
proxy_connect_timeout 90; #should be in sync with gunicorn timeout
|
||||||
|
if (!-f $request_filename) {
|
||||||
|
proxy_pass http://gunicorn_oxbrowser;
|
||||||
|
#proxy_pass http://127.0.0.1:XXXX;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
client_max_body_size 32m;
|
||||||
|
}
|
||||||
|
|
||||||
|
error_page 404 /404.html;
|
||||||
|
location /404.html {
|
||||||
|
root /srv/oxbrowser/static;
|
||||||
|
}
|
||||||
|
|
||||||
|
# redirect server error pages to the static page /50x.html
|
||||||
|
error_page 500 502 503 504 /50x.html;
|
||||||
|
location /50x.html {
|
||||||
|
root /srv/oxbrowser/static;
|
||||||
|
}
|
||||||
|
}
|
47
fabfile.py
vendored
Normal file
47
fabfile.py
vendored
Normal file
|
@ -0,0 +1,47 @@
|
||||||
|
#this is a fabfile, use it with fab from http://fabfile.org/
|
||||||
|
#
|
||||||
|
# initial setup:
|
||||||
|
# fab production setup
|
||||||
|
#
|
||||||
|
# deploy changes:
|
||||||
|
# fab production deploy
|
||||||
|
#
|
||||||
|
|
||||||
|
from os.path import join
|
||||||
|
from fabric.api import run, local, sudo, put, env
|
||||||
|
|
||||||
|
env.project_name = 'oxbrowser'
|
||||||
|
|
||||||
|
def production():
|
||||||
|
env.hosts = ['%(project_name)s@r-w-x.org'%env, ]
|
||||||
|
env.project_root = '/srv/%(project_name)s'%env
|
||||||
|
|
||||||
|
def bzr_push():
|
||||||
|
local('bzr push bzr+ssh://%(project_name)s@%(host)s%(project_root)s'%env)
|
||||||
|
|
||||||
|
def bzr_update():
|
||||||
|
run('cd %(project_root)s;bzr update'%env)
|
||||||
|
|
||||||
|
def virtual_run(cmd, *a, **kw):
|
||||||
|
cmd = 'cd %s; source bin/activate; %s' % (env.project_root, cmd)
|
||||||
|
run(cmd, *a, **kw)
|
||||||
|
|
||||||
|
def update_requirements():
|
||||||
|
run('pip -E %(project_root)s install -r %(project_root)s/requirements.txt'%env)
|
||||||
|
|
||||||
|
def setup():
|
||||||
|
"""
|
||||||
|
Setup a fresh virtualenv
|
||||||
|
"""
|
||||||
|
local('bzr push --use-existing-dir bzr+ssh://%(project_name)s@%(host)s%(project_root)s'%env)
|
||||||
|
run('cd %(project_root)s; test -e .bzr/checkout || bzr checkout'%env)
|
||||||
|
run('virtualenv %(project_root)s'%env)
|
||||||
|
put(join('settings', '%(host)s.py'%env), join(env.project_root, env.project_name, 'local_settings.py'))
|
||||||
|
update_requirements()
|
||||||
|
|
||||||
|
def deploy():
|
||||||
|
bzr_push()
|
||||||
|
bzr_update()
|
||||||
|
virtual_run('python %(project_root)s/%(project_name)s/manage.py syncdb;python %(project_root)s/%(project_name)s/manage.py migrate'%env)
|
||||||
|
run('sudo %(project_root)s/reload.sh'%env)
|
||||||
|
|
0
oxbrowser/__init__.py
Normal file
0
oxbrowser/__init__.py
Normal file
22
oxbrowser/manage.py
Executable file
22
oxbrowser/manage.py
Executable file
|
@ -0,0 +1,22 @@
|
||||||
|
#!/usr/bin/env python
|
||||||
|
import os
|
||||||
|
|
||||||
|
root_dir = os.path.normpath(os.path.abspath(os.path.dirname(__file__)))
|
||||||
|
os.chdir(root_dir)
|
||||||
|
|
||||||
|
#using virtualenv's activate_this.py to reorder sys.path
|
||||||
|
activate_this = os.path.join(root_dir, '..', 'bin', 'activate_this.py')
|
||||||
|
if os.path.exists(activate_this):
|
||||||
|
execfile(activate_this, dict(__file__=activate_this))
|
||||||
|
|
||||||
|
|
||||||
|
from django.core.management import execute_manager
|
||||||
|
try:
|
||||||
|
import settings # Assumed to be in the same directory.
|
||||||
|
except ImportError:
|
||||||
|
import sys
|
||||||
|
sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
execute_manager(settings)
|
129
oxbrowser/settings.py
Normal file
129
oxbrowser/settings.py
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# vi:si:et:sw=4:sts=4:ts=4
|
||||||
|
# Django settings for oxbrowser project.
|
||||||
|
import os
|
||||||
|
from os.path import join
|
||||||
|
|
||||||
|
SITENAME = 'oxbrowser'
|
||||||
|
|
||||||
|
PROJECT_ROOT = os.path.normpath(os.path.dirname(__file__))
|
||||||
|
|
||||||
|
DEBUG = True
|
||||||
|
TEMPLATE_DEBUG = DEBUG
|
||||||
|
JSON_DEBUG = False
|
||||||
|
|
||||||
|
XSENDFILE = False
|
||||||
|
|
||||||
|
ADMINS = (
|
||||||
|
('j', 'j@mailb.org'),
|
||||||
|
)
|
||||||
|
|
||||||
|
DEFAULT_FROM_EMAIL='j@mailb.org'
|
||||||
|
|
||||||
|
MANAGERS = ADMINS
|
||||||
|
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.sqlite3',
|
||||||
|
'NAME': 'dev.sqlite',
|
||||||
|
'USER': '',
|
||||||
|
'PASSWORD': '',
|
||||||
|
'HOST': '',
|
||||||
|
'PORT': ''
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
|
||||||
|
|
||||||
|
# Local time zone for this installation. Choices can be found here:
|
||||||
|
# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
|
||||||
|
# although not all choices may be available on all operating systems.
|
||||||
|
# If running in a Windows environment this must be set to the same as your
|
||||||
|
# system time zone.
|
||||||
|
TIME_ZONE = 'Europe/Berlin'
|
||||||
|
#TIME_ZONE = 'Asia/Kolkata'
|
||||||
|
|
||||||
|
# Language code for this installation. All choices can be found here:
|
||||||
|
# http://www.i18nguy.com/unicode/language-identifiers.html
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
SITE_ID = 1
|
||||||
|
|
||||||
|
# If you set this to False, Django will make some optimizations so as not
|
||||||
|
# to load the internationalization machinery.
|
||||||
|
USE_I18N = True
|
||||||
|
APPEND_SLASH = False
|
||||||
|
|
||||||
|
# Absolute path to the directory that holds media.
|
||||||
|
# Example: "/home/media/media.lawrence.com/"
|
||||||
|
MEDIA_ROOT = join(PROJECT_ROOT, 'media')
|
||||||
|
STATIC_ROOT = join(PROJECT_ROOT, 'static')
|
||||||
|
|
||||||
|
|
||||||
|
# URL that handles the media served from MEDIA_ROOT. Make sure to use a
|
||||||
|
# trailing slash if there is a path component (optional in other cases).
|
||||||
|
# Examples: "http://media.lawrence.com", "http://example.com/media/"
|
||||||
|
MEDIA_URL = '/media/'
|
||||||
|
|
||||||
|
STATIC_URL = '/static/'
|
||||||
|
|
||||||
|
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
|
||||||
|
# trailing slash.
|
||||||
|
# Examples: "http://foo.com/media/", "/media/".
|
||||||
|
ADMIN_MEDIA_PREFIX = '/admin/media/'
|
||||||
|
|
||||||
|
# List of callables that know how to import templates from various sources.
|
||||||
|
TEMPLATE_LOADERS = (
|
||||||
|
'django.template.loaders.filesystem.load_template_source',
|
||||||
|
'django.template.loaders.app_directories.load_template_source',
|
||||||
|
'django.template.loaders.eggs.load_template_source',
|
||||||
|
)
|
||||||
|
|
||||||
|
MIDDLEWARE_CLASSES = (
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'ox.django.middleware.ExceptionMiddleware',
|
||||||
|
)
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'oxbrowser.urls'
|
||||||
|
|
||||||
|
TEMPLATE_DIRS = (
|
||||||
|
join(PROJECT_ROOT, 'templates'),
|
||||||
|
)
|
||||||
|
|
||||||
|
INSTALLED_APPS = (
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.sites',
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.humanize',
|
||||||
|
'django_extensions',
|
||||||
|
#'south',
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#overwrite default settings with local settings
|
||||||
|
try:
|
||||||
|
from local_settings import *
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
# Make this unique, creates random key first at first time.
|
||||||
|
try:
|
||||||
|
SECRET_KEY
|
||||||
|
except NameError:
|
||||||
|
SECRET_FILE = os.path.join(PROJECT_ROOT, 'secret.txt')
|
||||||
|
try:
|
||||||
|
SECRET_KEY = open(SECRET_FILE).read().strip()
|
||||||
|
except IOError:
|
||||||
|
try:
|
||||||
|
from random import choice
|
||||||
|
SECRET_KEY = ''.join([choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)])
|
||||||
|
secret = file(SECRET_FILE, 'w')
|
||||||
|
secret.write(SECRET_KEY)
|
||||||
|
secret.close()
|
||||||
|
except IOError:
|
||||||
|
Exception('Please create a %s file with random characters to generate your secret key!' % SECRET_FILE)
|
17
oxbrowser/urls.py
Normal file
17
oxbrowser/urls.py
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
from django.conf.urls.defaults import patterns, include, url
|
||||||
|
|
||||||
|
# Uncomment the next two lines to enable the admin:
|
||||||
|
# from django.contrib import admin
|
||||||
|
# admin.autodiscover()
|
||||||
|
|
||||||
|
urlpatterns = patterns('',
|
||||||
|
# Examples:
|
||||||
|
# url(r'^$', 'oxbrowser.views.home', name='home'),
|
||||||
|
# url(r'^oxbrowser/', include('oxbrowser.foo.urls')),
|
||||||
|
|
||||||
|
# Uncomment the admin/doc line below to enable admin documentation:
|
||||||
|
# url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
|
||||||
|
|
||||||
|
# Uncomment the next line to enable the admin:
|
||||||
|
# url(r'^admin/', include(admin.site.urls)),
|
||||||
|
)
|
1
reload.sh
Executable file
1
reload.sh
Executable file
|
@ -0,0 +1 @@
|
||||||
|
kill -HUP `cat /var/run/oxbrowser.pid`
|
5
requirements.txt
Normal file
5
requirements.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
-e svn+http://code.djangoproject.com/svn/django/branches/releases/1.3.X#egg=django
|
||||||
|
-e bzr+http://code.0xdb.org/python-ox/#egg=python-ox
|
||||||
|
South
|
||||||
|
gunicorn
|
||||||
|
-e git://github.com/bit/django-extensions.git#egg=django_extensions
|
Loading…
Reference in a new issue