docker production

feature/docker
Dmitriy Shesterkin 9 years ago
parent 98043000e1
commit 579ae7514e
  1. 3
      .gitignore
  2. 5
      Dockerfile
  3. 2
      conf/env
  4. 2
      conf/env.local
  5. 2
      conf/env.stage
  6. 2
      conf/env.template
  7. 20
      conf/nginx_vds.conf
  8. 3
      docker-compose.yml
  9. 7
      src/customer/forms.py
  10. 25
      src/docs/views/base_views.py
  11. 1
      src/dokumentor/settings/common.py
  12. 3
      src/dokumentor/settings/local.py
  13. 9
      src/dokumentor/settings/production.py
  14. 5
      src/dokumentor/settings/stage.py

3
.gitignore vendored

@ -17,10 +17,9 @@ yandex_money.log
/static/ /static/
/src/dokumentor/media/ /src/dokumentor/media/
/tmp/ /tmp/
/conf/env.local
/data/ /data/
/public/ /public/
conf/env
!local.py !local.py
!parts !parts
!.gitkeep !.gitkeep

@ -1,8 +1,9 @@
FROM python:3.6 FROM python:3.6
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
COPY requirements /opt/app/requirements COPY requirements /opt/app/requirements
RUN apt-get update && \ RUN apt-get update -y && \
apt-get -y install ghostscript libfreetype6-dev nginx supervisor make && \ apt-get upgrade -y && \
apt-get -y install ghostscript libfreetype6-dev python3-dev nginx supervisor make && \
apt-get clean && \ apt-get clean && \
rm -rf /var/lib/apt/lists/* && \ rm -rf /var/lib/apt/lists/* && \

@ -2,6 +2,8 @@ DJANGO_SETTINGS_MODULE='dokumentor.settings.local'
DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION' DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION'
SSL=False
DJANGO_DB='postgres://dokumentor:dokumentor@localhost:5432/dokumentor' DJANGO_DB='postgres://dokumentor:dokumentor@localhost:5432/dokumentor'
DJANGO_DB_sqlite3='sqlite:////Users/mitri4/Projects/dokumentor/db.sqlite3' DJANGO_DB_sqlite3='sqlite:////Users/mitri4/Projects/dokumentor/db.sqlite3'

@ -2,6 +2,8 @@ DJANGO_SETTINGS_MODULE='dokumentor.settings.local'
DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION' DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION'
SSL=False
DJANGO_DB='postgres://dokumentor:dokumentor@localhost:5432/dokumentor' DJANGO_DB='postgres://dokumentor:dokumentor@localhost:5432/dokumentor'
DJANGO_DB_sqlite3='sqlite:////Users/mitri4/Projects/dokumentor/db.sqlite3' DJANGO_DB_sqlite3='sqlite:////Users/mitri4/Projects/dokumentor/db.sqlite3'

@ -1,5 +1,7 @@
DJANGO_SETTINGS_MODULE=dokumentor.settings.stage DJANGO_SETTINGS_MODULE=dokumentor.settings.stage
SSL=False
DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION' DJANGO_SECRET='CHANGE_ME_IN_PRODUCTION'
DJANGO_DB='postgres://dokumentor:dokumentor@db:5432/dokumentor' DJANGO_DB='postgres://dokumentor:dokumentor@db:5432/dokumentor'

@ -16,4 +16,4 @@ CELERY_BROKER_URL='amqp://guest:guest@localhost:5672//'
CELERY_RESULT_BACKEND='amqp://guest:guest@localhost:5672//' CELERY_RESULT_BACKEND='amqp://guest:guest@localhost:5672//'
CALLBACK_EMAIL_SENDER='' CALLBACK_EMAIL_SENDER=''
CALLBACK_MANAGERS_EMAILS=[] CALLBACK_MANAGERS_EMAILS=()

@ -0,0 +1,20 @@
upstream onpoint-dev {
server localhost:32768;
}
server {
client_max_body_size 175M;
listen 0.0.0.0:80;
server_name www.dev.dokumentor.mitri4.pro dev.dokumentor.mitri4.pro;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://onpoint-dev/;
proxy_redirect off;
}
}

@ -6,7 +6,8 @@ services:
volumes: volumes:
- ./:/opt/app - ./:/opt/app
ports: ports:
- "80:80" - "32768:80"
- "8000:8000"
env_file: conf/env.stage env_file: conf/env.stage
environment: environment:
- REDIS_URL=redis://redis:6379/1 - REDIS_URL=redis://redis:6379/1

@ -8,7 +8,9 @@ from yandex_money.forms import PaymentForm
from commons.forms import MyBaseModelForm, set_field_error from commons.forms import MyBaseModelForm, set_field_error
from customer import consts, models from customer import consts, models
from django.forms.utils import ErrorList
from django.forms.forms import NON_FIELD_ERRORS
FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ', 2621440) # default 2.5Mb FILE_UPLOAD_MAX_MEMORY_SIZE = getattr(settings, 'FILE_UPLOAD_MAX_MEMORY_SIZE ', 2621440) # default 2.5Mb
@ -238,15 +240,14 @@ class ClientForm(forms.ModelForm):
self.fields['okpo'].widget.attrs.update(_numeric(self.fields['okpo'])) self.fields['okpo'].widget.attrs.update(_numeric(self.fields['okpo']))
def clean(self): def clean(self):
if self.instance:
if self.instance.inn:
return self.cleaned_data return self.cleaned_data
inn = self.cleaned_data.get('inn') inn = self.cleaned_data.get('inn')
partner_exists = models.Client.objects.filter(inn=inn, company=self.request.user.profile) partner_exists = models.Client.objects.filter(inn=inn, company=self.request.user.profile)
if partner_exists: if partner_exists:
if 'inn' not in self._errors: if 'inn' not in self._errors:
from django.forms.util import ErrorList
from django.forms.forms import NON_FIELD_ERRORS
error = 'Контрагент с ИНН {} уже существует'.format(inn) error = 'Контрагент с ИНН {} уже существует'.format(inn)
self._errors['inn'] = ErrorList() self._errors['inn'] = ErrorList()
self._errors['inn'].append(error) self._errors['inn'].append(error)

@ -12,7 +12,7 @@ from django.contrib import messages
from django.db import DatabaseError from django.db import DatabaseError
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponseServerError, HttpResponseBadRequest, HttpResponse from django.http import HttpResponseBadRequest, HttpResponse
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views.decorators.http import require_POST from django.views.decorators.http import require_POST
from django.views.decorators.csrf import csrf_protect from django.views.decorators.csrf import csrf_protect
@ -21,7 +21,6 @@ from django.forms.models import inlineformset_factory, model_to_dict
from django.template.loader import render_to_string from django.template.loader import render_to_string
from django.core.mail import EmailMessage from django.core.mail import EmailMessage
from django.utils.encoding import smart_str from django.utils.encoding import smart_str
from django.conf import settings
from commons.utils import dthandler from commons.utils import dthandler
from commons.paginator import pagination, save_per_page_value from commons.paginator import pagination, save_per_page_value
@ -33,11 +32,10 @@ from customer.forms import ClientsListForm, ClientForm
from docs.as_xls import render_xls_to_string from docs.as_xls import render_xls_to_string
from docs.forms import EmailForm, InvoicesListForm from docs.forms import EmailForm, InvoicesListForm
from docs import filters
from customer.decorators import license_required from customer.decorators import license_required
from customer.utils import raise_if_no_profile from customer.utils import raise_if_no_profile
from django.conf import settings from django.conf import settings
import traceback
DEBUG = getattr(settings, 'DEBUG', False) DEBUG = getattr(settings, 'DEBUG', False)
@ -47,6 +45,8 @@ MEDIA_URL = getattr(settings, 'MEDIA_URL', '')
ORDER_VAR = 'o' ORDER_VAR = 'o'
ORDER_TYPE_VAR = 'ot' ORDER_TYPE_VAR = 'ot'
# GHOSTSCRIPTCMD = 'gs'
GHOSTSCRIPTCMD = '/usr/bin/gs'
class Ordering(object): class Ordering(object):
@ -409,7 +409,9 @@ class BaseViews(object):
f.write(pdf) f.write(pdf)
f.close() f.close()
args = ["gs", print(filename)
args = [GHOSTSCRIPTCMD,
"-q", "-q",
"-dNOPAUSE", "-dBATCH", "-dSAFER", "-dNOPAUSE", "-dBATCH", "-dSAFER",
"-sDEVICE=png16m", "-sDEVICE=png16m",
@ -418,10 +420,19 @@ class BaseViews(object):
"-f", filename "-f", filename
] ]
try: try:
print("Running command:\n%s" % ' '.join(args))
p = s.Popen(args=args, stdout=s.PIPE, stderr=s.PIPE) p = s.Popen(args=args, stdout=s.PIPE, stderr=s.PIPE)
p.wait() p.wait()
except OSError: except OSError as e:
sys.exit("Error executing Ghostscript. Is it in your PATH?") sys.exit("{}\nError executing Ghostscript {}. "
"Is it in your PATH?".format(e, GHOSTSCRIPTCMD))
except:
print("Error while running Ghostscript subprocess. Traceback:")
print("Traceback:\n%s" % traceback.format_exc())
os.remove(filename) os.remove(filename)
filename = '%s.pdf' % self.get_filename(*args, **kwargs) filename = '%s.pdf' % self.get_filename(*args, **kwargs)
imgs = glob.glob(os.path.join(tmp_dir, '*.png')) imgs = glob.glob(os.path.join(tmp_dir, '*.png'))

@ -20,6 +20,7 @@ SECRET_KEY = e.get('DJANGO_SECRET')
DEBUG = False DEBUG = False
SSL = e.get('SSL', default=False)
# Hosts/domain names that are valid for this site; required if DEBUG is False # Hosts/domain names that are valid for this site; required if DEBUG is False
# See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts # See https://docs.djangoproject.com/en/1.5/ref/settings/#allowed-hosts

@ -2,13 +2,14 @@
import dj_database_url import dj_database_url
from dokumentor.settings.base import * from dokumentor.settings.common import *
def custom_show_toolbar(self): def custom_show_toolbar(self):
return True return True
DEBUG = True DEBUG = True
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
if DEBUG: if DEBUG:
INSTALLED_APPS.append('debug_toolbar') INSTALLED_APPS.append('debug_toolbar')

@ -2,9 +2,10 @@
import dj_database_url import dj_database_url
from dokumentor.settings.base import * from dokumentor.settings.common import *
DEBUG = False DEBUG = False
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
ADMINS = [] ADMINS = []
@ -16,6 +17,12 @@ DATABASES = {
'default': dj_database_url.parse(e.get('DJANGO_DB')), 'default': dj_database_url.parse(e.get('DJANGO_DB')),
} }
if SSL:
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
DEFAULT_FROM_EMAIL = e.get('DJANGO_FROM_EMAIL') DEFAULT_FROM_EMAIL = e.get('DJANGO_FROM_EMAIL')
SERVER_EMAIL = DEFAULT_FROM_EMAIL SERVER_EMAIL = DEFAULT_FROM_EMAIL
EMAIL_HOST = e.get('DJANGO_EMAIL_HOST') EMAIL_HOST = e.get('DJANGO_EMAIL_HOST')

@ -2,9 +2,10 @@
import dj_database_url import dj_database_url
from dokumentor.settings.base import * from dokumentor.settings.common import *
DEBUG = False DEBUG = False
TEMPLATES[0]['OPTIONS']['debug'] = DEBUG
ADMINS = [ ADMINS = [
('Dmitriy Shesterkin', 'mitri4@bk.ru'), ('Dmitriy Shesterkin', 'mitri4@bk.ru'),
@ -13,7 +14,7 @@ ADMINS = [
MANAGERS = ADMINS MANAGERS = ADMINS
ALLOWED_HOSTS = ['dokumentor.mitri4.pro'] ALLOWED_HOSTS = ['dokumentor.mitri4.pro', '127.0.0.1', 'dev.dokumentor.mitri4.pro']
DATABASES = { DATABASES = {
'default': dj_database_url.parse(e.get('DJANGO_DB')), 'default': dj_database_url.parse(e.get('DJANGO_DB')),

Loading…
Cancel
Save