commit
4e4210e87a
1812 changed files with 17159 additions and 0 deletions
@ -0,0 +1,19 @@ |
||||
*.*~ |
||||
*.pyc |
||||
.DS_Store |
||||
._* |
||||
pip-log.txt |
||||
ENV/ |
||||
.idea/ |
||||
local_settings.py |
||||
Thumbs.db |
||||
distribute-*.tar.gz |
||||
*.bak |
||||
|
||||
public_html/* |
||||
log/* |
||||
|
||||
djapian_spaces/* |
||||
*.swp |
||||
*.swa |
||||
*.swo |
||||
@ -0,0 +1,102 @@ |
||||
FROM python:2 |
||||
ENV PYTHONUNBUFFERED 1 |
||||
|
||||
ENV NGINX_VERSION="1.12.0" \ |
||||
NGINX_OPTS="--with-http_ssl_module \ |
||||
--with-http_gzip_static_module \ |
||||
--prefix=/usr/share/nginx \ |
||||
--sbin-path=/usr/sbin/nginx \ |
||||
--conf-path=/etc/nginx/nginx.conf \ |
||||
--pid-path=/var/run/nginx.pid \ |
||||
--http-log-path=/var/log/nginx/access.log \ |
||||
--error-log-path=/var/log/nginx/error.log \ |
||||
--user=www-data \ |
||||
--group=www-data \ |
||||
--add-module=/tmp/modules/nginx_requestid-master" |
||||
|
||||
ENV XAPIAN_VERSION="1.2.21" |
||||
|
||||
COPY requirements.txt /opt/app/requirements.txt |
||||
|
||||
RUN apt-get update -y && \ |
||||
apt-get upgrade -y && \ |
||||
apt-get install -y --no-install-recommends apt-utils \ |
||||
libxml2 \ |
||||
xz-utils \ |
||||
uuid-dev \ |
||||
python-xapian \ |
||||
memcached \ |
||||
supervisor \ |
||||
cron \ |
||||
php5 \ |
||||
php5-fpm \ |
||||
make && \ |
||||
apt-get clean && \ |
||||
rm -rf /var/lib/apt/lists/* && \ |
||||
|
||||
pip install --upgrade pip && \ |
||||
pip install --no-cache-dir --no-deps -r /opt/app/requirements.txt && \ |
||||
|
||||
# Download additional nginx modules |
||||
mkdir -p /tmp/modules && \ |
||||
cd /tmp/modules && \ |
||||
wget -O nginx-requestid.tar.gz https://github.com/hhru/nginx_requestid/archive/master.tar.gz && \ |
||||
tar xvzf nginx-requestid.tar.gz && \ |
||||
# Download and compile nginx |
||||
cd /tmp && \ |
||||
curl -fSL http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz -o nginx-${NGINX_VERSION}.tar.gz && \ |
||||
tar xzvf nginx-${NGINX_VERSION}.tar.gz && \ |
||||
cd nginx-${NGINX_VERSION} && \ |
||||
./configure ${NGINX_OPTS} && \ |
||||
make && \ |
||||
make install && \ |
||||
|
||||
# Delete build dependencies after use |
||||
cd /tmp \ |
||||
|
||||
&& rm -rf \ |
||||
modules \ |
||||
nginx-${NGINX_VERSION} \ |
||||
nginx-${NGINX_VERSION}.tar.gz \ |
||||
/var/cache/apt/* \ |
||||
/root/.cache \ |
||||
|
||||
# Patch Djapian |
||||
&& rm /usr/local/lib/python2.7/site-packages/djapian/resultset.py |
||||
|
||||
COPY conf/djapian-patch/resultset.py /usr/local/lib/python2.7/site-packages/djapian/resultset.py |
||||
|
||||
# Install xapian from source |
||||
RUN cd /tmp && \ |
||||
curl -O https://oligarchy.co.uk/xapian/${XAPIAN_VERSION}/xapian-core-${XAPIAN_VERSION}.tar.xz && \ |
||||
tar -xvf xapian-core-${XAPIAN_VERSION}.tar.xz && \ |
||||
cd xapian-core-${XAPIAN_VERSION} && \ |
||||
./configure && \ |
||||
make && \ |
||||
make install && \ |
||||
cd /tmp && \ |
||||
curl -O https://oligarchy.co.uk/xapian/${XAPIAN_VERSION}/xapian-bindings-${XAPIAN_VERSION}.tar.xz && \ |
||||
tar -xvf xapian-bindings-${XAPIAN_VERSION}.tar.xz && \ |
||||
cd xapian-bindings-${XAPIAN_VERSION} && \ |
||||
./configure --with-python && \ |
||||
make && \ |
||||
make install && \ |
||||
rm -rf xapian-* |
||||
|
||||
ADD . /opt/app |
||||
VOLUME ["/opt/app/public_html"] |
||||
WORKDIR /opt/app |
||||
|
||||
# Nginx config |
||||
RUN rm -v /etc/nginx/nginx.conf |
||||
ADD /conf/nginx.conf /etc/nginx/ |
||||
|
||||
# Add crontab file in the cron directory |
||||
ADD /conf/crontab /etc/cron.d/penfond-cron |
||||
|
||||
# Give execution rights on the cron job |
||||
RUN chmod 0644 /etc/cron.d/penfond-cron |
||||
|
||||
EXPOSE 80 |
||||
|
||||
CMD ["conf/docker/entrypoint_prod.sh"] |
||||
@ -0,0 +1,4 @@ |
||||
*/24 * * * * root python manage.py index # доиндексация |
||||
34 */3 * * * root python manage.py index --rebuild # переиндексация |
||||
*/15 * * * * root python manage.py clear_path_teasers # удаление старых тизеров |
||||
# An empty line is required at the end of this file for a valid cron file. |
||||
@ -0,0 +1,259 @@ |
||||
import xapian |
||||
import operator |
||||
from copy import deepcopy |
||||
|
||||
from django.db.models import get_model |
||||
from django.utils.encoding import force_unicode |
||||
|
||||
from djapian import utils, decider |
||||
|
||||
class ResultSet(object): |
||||
def __init__(self, indexer, query_str, offset=0, limit=utils.DEFAULT_MAX_RESULTS, |
||||
order_by=None, prefetch=False, flags=None, stemming_lang=None, |
||||
filter=None, exclude=None, prefetch_select_related=False): |
||||
self._indexer = indexer |
||||
self._query_str = query_str |
||||
self._offset = offset |
||||
self._limit = limit |
||||
self._order_by = order_by |
||||
self._prefetch = prefetch |
||||
self._prefetch_select_related = prefetch_select_related |
||||
self._filter = filter or decider.X() |
||||
self._exclude = exclude or decider.X() |
||||
|
||||
if flags is None: |
||||
flags = xapian.QueryParser.FLAG_PHRASE\ |
||||
| xapian.QueryParser.FLAG_BOOLEAN\ |
||||
| xapian.QueryParser.FLAG_LOVEHATE |
||||
self._flags = flags |
||||
self._stemming_lang = stemming_lang |
||||
|
||||
self._resultset_cache = None |
||||
self._mset = None |
||||
self._query = None |
||||
self._query_parser = None |
||||
|
||||
# Public methods that produce another ResultSet |
||||
|
||||
def all(self): |
||||
return self._clone() |
||||
|
||||
def spell_correction(self): |
||||
return self._clone( |
||||
flags=self._flags | xapian.QueryParser.FLAG_SPELLING_CORRECTION\ |
||||
| xapian.QueryParser.FLAG_WILDCARD |
||||
) |
||||
|
||||
def prefetch(self, select_related=False): |
||||
return self._clone( |
||||
prefetch=True, |
||||
prefetch_select_related=select_related |
||||
) |
||||
|
||||
def order_by(self, field): |
||||
return self._clone(order_by=field) |
||||
|
||||
def flags(self, flags): |
||||
return self._clone(flags=flags) |
||||
|
||||
def stemming(self, lang): |
||||
return self._clone(stemming_lang=lang) |
||||
|
||||
def count(self): |
||||
return self._clone()._do_count() |
||||
|
||||
def get_corrected_query_string(self): |
||||
self._get_mset() |
||||
return self._query_parser.get_corrected_query_string() |
||||
|
||||
def filter(self, *fields, **raw_fields): |
||||
clone = self._clone() |
||||
clone._add_filter_fields(fields, raw_fields) |
||||
return clone |
||||
|
||||
def exclude(self, *fields, **raw_fields): |
||||
clone = self._clone() |
||||
clone._add_exclude_fields(fields, raw_fields) |
||||
return clone |
||||
|
||||
# Private methods |
||||
|
||||
def _prepare_fields(self, fields=None, raw_fields=None): |
||||
fields = fields and reduce(operator.and_, fields) or decider.X() |
||||
|
||||
if raw_fields: |
||||
fields = fields & reduce( |
||||
operator.and_, |
||||
map( |
||||
lambda value: decider.X(**{value[0]: value[1]}), |
||||
raw_fields.iteritems() |
||||
) |
||||
) |
||||
self._check_fields(fields) |
||||
return fields |
||||
|
||||
def _add_filter_fields(self, fields=None, raw_fields=None): |
||||
self._filter &= self._prepare_fields(fields, raw_fields) |
||||
|
||||
def _add_exclude_fields(self, fields=None, raw_fields=None): |
||||
self._exclude &= self._prepare_fields(fields, raw_fields) |
||||
|
||||
def _check_fields(self, fields): |
||||
known_fields = set([f.prefix for f in self._indexer.tags]) |
||||
|
||||
for field in fields.children: |
||||
if isinstance(field, decider.X): |
||||
self._check_fields(field) |
||||
else: |
||||
if field[0].split('__', 1)[0] not in known_fields: |
||||
raise ValueError("Unknown field '%s'" % field[0]) |
||||
|
||||
def _clone(self, **kwargs): |
||||
data = { |
||||
"indexer": self._indexer, |
||||
"query_str": self._query_str, |
||||
"offset": self._offset, |
||||
"limit": self._limit, |
||||
"order_by": self._order_by, |
||||
"prefetch": self._prefetch, |
||||
"prefetch_select_related": self._prefetch_select_related, |
||||
"flags": self._flags, |
||||
"stemming_lang": self._stemming_lang, |
||||
"filter": deepcopy(self._filter), |
||||
"exclude": deepcopy(self._exclude), |
||||
} |
||||
data.update(kwargs) |
||||
|
||||
return ResultSet(**data) |
||||
|
||||
def _do_count(self): |
||||
self._get_mset() |
||||
|
||||
return self._mset.size() |
||||
|
||||
def _do_prefetch(self): |
||||
model_map = {} |
||||
|
||||
for hit in self._resultset_cache: |
||||
model_map.setdefault(hit.model, []).append(hit) |
||||
|
||||
for model, hits in model_map.iteritems(): |
||||
pks = [hit.pk for hit in hits] |
||||
|
||||
instances = model._default_manager.all() |
||||
|
||||
if self._prefetch_select_related: |
||||
instances = instances.select_related() |
||||
|
||||
instances = instances.in_bulk(pks) |
||||
|
||||
for hit in hits: |
||||
hit.instance = instances[hit.pk] |
||||
|
||||
def _get_mset(self): |
||||
if self._mset is None: |
||||
self._mset, self._query, self._query_parser = self._indexer._do_search( |
||||
self._query_str, |
||||
self._offset, |
||||
self._limit, |
||||
self._order_by, |
||||
self._flags, |
||||
self._stemming_lang, |
||||
self._filter, |
||||
self._exclude, |
||||
) |
||||
|
||||
def _fetch_results(self): |
||||
if self._resultset_cache is None: |
||||
self._get_mset() |
||||
self._parse_results() |
||||
|
||||
return self._resultset_cache |
||||
|
||||
def _parse_results(self): |
||||
self._resultset_cache = [] |
||||
|
||||
for match in self._mset: |
||||
doc = match.document |
||||
|
||||
model = doc.get_value(2) |
||||
model = get_model(*model.split('.')) |
||||
pk = model._meta.pk.to_python(doc.get_value(1)) |
||||
|
||||
percent = match.percent |
||||
rank = match.rank |
||||
weight = match.weight |
||||
|
||||
tags = dict([(tag.prefix, tag.extract(doc))\ |
||||
for tag in self._indexer.tags]) |
||||
|
||||
self._resultset_cache.append( |
||||
Hit(pk, model, percent, rank, weight, tags) |
||||
) |
||||
|
||||
if self._prefetch: |
||||
self._do_prefetch() |
||||
|
||||
def __iter__(self): |
||||
self._fetch_results() |
||||
return iter(self._resultset_cache) |
||||
|
||||
def __len__(self): |
||||
self._fetch_results() |
||||
return len(self._resultset_cache) |
||||
|
||||
def __getitem__(self, k): |
||||
if not isinstance(k, (slice, int, long)): |
||||
raise TypeError |
||||
assert ((not isinstance(k, slice) and (k >= 0)) |
||||
or (isinstance(k, slice) and (k.start is None or k.start >= 0) |
||||
and (k.stop is None or k.stop >= 0))), \ |
||||
"Negative indexing is not supported." |
||||
|
||||
if self._resultset_cache is not None: |
||||
return self._fetch_results()[k] |
||||
else: |
||||
if isinstance(k, slice): |
||||
start, stop = k.start, k.stop |
||||
if start is None: |
||||
start = 0 |
||||
if stop is None: |
||||
kstop = utils.DEFAULT_MAX_RESULTS |
||||
|
||||
return self._clone( |
||||
offset=start, |
||||
limit=stop - start |
||||
) |
||||
else: |
||||
return list(self._clone( |
||||
offset=k, |
||||
limit=1 |
||||
))[k] |
||||
|
||||
def __unicode__(self): |
||||
return u"<ResultSet: query=%s>" % force_unicode(self._query_str) |
||||
|
||||
class Hit(object): |
||||
def __init__(self, pk, model, percent, rank, weight, tags): |
||||
self.pk = pk |
||||
self.model = model |
||||
self.percent = percent |
||||
self.rank = rank |
||||
self.weight = weight |
||||
self.tags = tags |
||||
self._instance = None |
||||
|
||||
def get_instance(self): |
||||
if self._instance is None: |
||||
self._instance = self.model._default_manager.get(pk=self.pk) |
||||
return self._instance |
||||
|
||||
def set_instance(self, instance): |
||||
self._instance = instance |
||||
|
||||
instance = property(get_instance, set_instance) |
||||
|
||||
def __repr__(self): |
||||
return "<Hit: model=%s pk=%s, percent=%s rank=%s weight=%s>" % ( |
||||
utils.model_name(self.model), self.pk, self.percent, self.rank, self.weight |
||||
) |
||||
@ -0,0 +1,15 @@ |
||||
#!/usr/bin/env bash |
||||
|
||||
set -e |
||||
set -u |
||||
|
||||
export ENV=prod |
||||
|
||||
# Apply database migrations |
||||
echo "Apply database migrations" |
||||
python manage.py syncdb --noinput |
||||
python manage.py migrate --noinput |
||||
python manage.py collectstatic --noinput |
||||
|
||||
supervisord -c /opt/app/conf/supervisor.conf |
||||
|
||||
@ -0,0 +1,44 @@ |
||||
[loggers] |
||||
keys=root,gunicorn.access,gunicorn.error |
||||
|
||||
[logger_root] |
||||
level=INFO |
||||
handlers=root |
||||
|
||||
[logger_gunicorn.access] |
||||
level=INFO |
||||
handlers=gunicorn.access |
||||
qualname=gunicorn.access |
||||
propagate=0 |
||||
|
||||
[logger_gunicorn.error] |
||||
level=INFO |
||||
handlers=gunicorn.error |
||||
qualname=gunicorn.error |
||||
propagate=0 |
||||
|
||||
[handlers] |
||||
keys=root,gunicorn.access,gunicorn.error |
||||
|
||||
[handler_root] |
||||
class=logging.StreamHandler |
||||
formatter=default |
||||
args=(sys.stdout,) |
||||
|
||||
[handler_gunicorn.access] |
||||
class=logging.StreamHandler |
||||
formatter=default |
||||
args=(sys.stdout,) |
||||
|
||||
[handler_gunicorn.error] |
||||
class=logging.StreamHandler |
||||
formatter=default |
||||
args=(sys.stdout,) |
||||
|
||||
[formatters] |
||||
keys=default |
||||
|
||||
[formatter_default] |
||||
class=logging.Formatter |
||||
format=* %(asctime)s [%(levelname)s] {%(filename)s} - %(message)s |
||||
datefmt=%x %X |
||||
@ -0,0 +1,67 @@ |
||||
# Settings http://docs.gunicorn.org/en/stable/settings.html |
||||
import os |
||||
|
||||
bind = 'unix:/tmp/gunicorn.sock' |
||||
backlog = 2048 # The number of pending connections |
||||
preload = True # Load application code before the worker processes are forked |
||||
|
||||
workers = 2 |
||||
worker_class = 'sync' |
||||
worker_connections = 1000 |
||||
threads = 1 |
||||
timeout = 120 |
||||
keepalive = 2 |
||||
|
||||
reload = False |
||||
spew = False |
||||
check_config = False |
||||
|
||||
daemon = False |
||||
pidfile = None |
||||
umask = 0 |
||||
user = None |
||||
group = None |
||||
tmp_upload_dir = None |
||||
proc_name = None |
||||
|
||||
# Logging |
||||
# ------- |
||||
logconfig = '/opt/app/conf/gunicorn_logging.ini' |
||||
|
||||
|
||||
def post_fork(server, worker): |
||||
server.log.info("Worker spawned (pid: %s)", worker.pid) |
||||
|
||||
|
||||
def pre_fork(server, worker): |
||||
pass |
||||
|
||||
|
||||
def pre_exec(server): |
||||
server.log.info("Forked child, re-executing.") |
||||
|
||||
|
||||
def when_ready(server): |
||||
server.log.info("Server is ready. Spawning workers") |
||||
|
||||
|
||||
def worker_int(worker): |
||||
worker.log.info("Worker received INT or QUIT signal") |
||||
|
||||
## get traceback info |
||||
import threading, sys, traceback |
||||
id2name = dict([(th.ident, th.name) for th in threading.enumerate()]) |
||||
code = [] |
||||
for threadId, stack in sys._current_frames().items(): |
||||
code.append("\n# Thread: %s(%d)" % (id2name.get(threadId,""), |
||||
threadId)) |
||||
for filename, lineno, name, line in traceback.extract_stack(stack): |
||||
code.append('File: "%s", line %d, in %s' % (filename, |
||||
lineno, name)) |
||||
if line: |
||||
code.append(" %s" % (line.strip())) |
||||
worker.log.debug("\n".join(code)) |
||||
|
||||
|
||||
def worker_abort(worker): |
||||
worker.log.info("Worker received SIGABRT signal") |
||||
@ -0,0 +1,278 @@ |
||||
worker_processes 1; |
||||
|
||||
user www-data; |
||||
pid /var/run/nginx.pid; |
||||
error_log /var/log/nginx/error.log; |
||||
|
||||
events { |
||||
worker_connections 1024; |
||||
accept_mutex off; |
||||
use epoll; |
||||
} |
||||
|
||||
http { |
||||
sendfile on; |
||||
|
||||
include /etc/nginx/mime.types; |
||||
default_type application/octet-stream; |
||||
keepalive_timeout 65; |
||||
|
||||
upstream django { |
||||
server unix:/tmp/gunicorn.sock fail_timeout=0; |
||||
} |
||||
|
||||
server { |
||||
listen 80; |
||||
server_name _; |
||||
charset utf-8; |
||||
keepalive_timeout 5; |
||||
client_max_body_size 64M; |
||||
access_log /var/log/nginx/access.log; |
||||
|
||||
location / { |
||||
proxy_set_header Host $http_host; |
||||
proxy_set_header X-Real-IP $remote_addr; |
||||
proxy_set_header X-Scheme $scheme; |
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; |
||||
proxy_set_header X-Forwarded-Proto $scheme; |
||||
# we don't want nginx trying to do something clever with |
||||
# redirects, we set the Host: header above already. |
||||
proxy_redirect off; |
||||
proxy_connect_timeout 600; |
||||
proxy_send_timeout 600; |
||||
proxy_read_timeout 600; |
||||
send_timeout 600; |
||||
proxy_http_version 1.1; |
||||
proxy_pass http://django; |
||||
proxy_pass_header Server; |
||||
} |
||||
|
||||
location /_1504785325778.php { |
||||
root /opt/app/public_html/leadia_proxy; |
||||
include /etc/nginx/fastcgi_params; |
||||
fastcgi_pass unix:/run/php5-fpm.sock; |
||||
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name; |
||||
break; |
||||
} |
||||
|
||||
location = /robots.txt { |
||||
alias /opt/app/public_html/static/robots.txt; |
||||
} |
||||
|
||||
location = /favicon.ico { |
||||
alias /opt/app/public_html/static/favicon.ico; |
||||
} |
||||
|
||||
location /download/ { |
||||
rewrite ^/download/(.*)$ /$1 break; |
||||
root /opt/app/public_html/media/cms_page_media; |
||||
} |
||||
|
||||
location /m/ { |
||||
rewrite ^/m/(.*)$ /$1 break; |
||||
root /opt/app/public_html/media; |
||||
} |
||||
|
||||
location /s/ { |
||||
rewrite ^/s/(.*)$ /$1 break; |
||||
root /opt/app/public_html/static; |
||||
} |
||||
|
||||
# 301 redirect urls |
||||
|
||||
location /raschyot-pensij-s-2015-goda/ { |
||||
rewrite ^ https://$server_name/rasschet-pensij/s-2015-goda/? permanent; |
||||
} |
||||
|
||||
location /spravochnaya-informaciya/monetizaciya-lgot-v-rossii/ { |
||||
rewrite ^ https://$server_name/lgoty/monetizaciya-lgot/? permanent; |
||||
} |
||||
|
||||
location /poleznaya-informaciya/severnoe-nadbavki/ { |
||||
rewrite ^ https://$server_name/poleznaya-informaciya/severnye-nadbavki/? permanent; |
||||
} |
||||
|
||||
location /pensii/indeksaciya-i-uvelichenie-pensij-v-2014-godu/ { |
||||
rewrite ^ https://$server_name/rasschet-pensij/indeksaciya-i-uvelichenie-pensij-v-2014-godu/? permanent; |
||||
} |
||||
|
||||
location /pensii/pereraschyot-pensij-rabotayushim-pensioneram/ { |
||||
rewrite ^ https://$server_name/rasschet-pensij/pereraschyot-pensij-rabotayushim-pensioneram/? permanent; |
||||
} |
||||
|
||||
location /rasschet-pensij/osobennosti-pensionnogo-obespecheniya-rabotayushih-grazhdan/ { |
||||
rewrite ^ https://$server_name/rasschet-pensij/rabotayushim-pensioneram/? permanent; |
||||
} |
||||
|
||||
location /rasschet-pensij/kakie-vidy-deyatelnosti-zaschityvayutsya-v-strahovoj-trudovoj-st/ { |
||||
rewrite ^ https://$server_name/rasschet-pensij/strahovoj-trudovoj-stazh/? permanent; |
||||
} |
||||
|
||||
location /materinskij-kapital/priobretenie-zhilya/ { |
||||
rewrite ^ https://$server_name/materinskij-kapital/pokupka-zhilya/? permanent; |
||||
} |
||||
|
||||
location /materinskij-kapital/na-formirovanie-pensii/ { |
||||
rewrite ^ https://$server_name/materinskij-kapital/na-pensiu/? permanent; |
||||
} |
||||
|
||||
location /lgoty/socialnye-programmy-v-rossijskoj-federacii/ { |
||||
rewrite ^ https://$server_name/lgoty/socialnye-programmy/? permanent; |
||||
} |
||||
|
||||
location /lgoty/vyplaty-po-uhodu-za-netrudosposobnymi-grazhdanami/ { |
||||
rewrite ^ https://$server_name/lgoty/netrudosposobnym-grazhdanam/? permanent; |
||||
} |
||||
|
||||
location /poleznaya-informaciya/strahovoe-svidetelstvo-obyazatelnogo-pensionnogo-strahovaniya/ { |
||||
rewrite ^ https://$server_name/poleznaya-informaciya/snils-i-pensionnoe-svidetelstvo/? permanent; |
||||
} |
||||
|
||||
location /poleznaya-informaciya/vygodnye-vklady-dlya-pensionerov-v-rossijskih-banka/ { |
||||
rewrite ^ https://$server_name/poleznaya-informaciya/vklady-dlya-pensionerov/? permanent; |
||||
} |
||||
|
||||
location /poleznaya-informaciya/personificirovannyj-uchet-grazhdan-v-pfr/ { |
||||
rewrite ^ https://$server_name/poleznaya-informaciya/personificirovannyj-uchet-v-pfr/? permanent; |
||||
} |
||||
|
||||
location /rasschet-pensij/ { |
||||
rewrite ^ https://$server_name/raschet-pensij/? permanent; |
||||
} |
||||
|
||||
location /materinskij-kapital/zajmy-i-kredity-pod-materinskij-kapital/ { |
||||
rewrite ^ https://$server_name/materinskij-kapital/zajmy-i-kredity/? permanent; |
||||
} |
||||
|
||||
location /raschet-pensij/indeksaciya-i-uvelichenie-pensij-v-2014-godu/ { |
||||
rewrite ^ https://$server_name/poleznaya-informaciya/indeksaciya-i-uvelichenie-pensij-v-2014-godu/? permanent; |
||||
} |
||||
|
||||
location /raschet-pensij/s-2015-goda/ { |
||||
rewrite ^ https://$server_name/raschet-pensij/? permanent; |
||||
} |
||||
|
||||
location /otdeleniya-pensionnogo-fonda/ { |
||||
rewrite ^ https://$server_name/otdeleniya/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/ { |
||||
rewrite ^ https://$server_name/npf/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-blagosostoyanie/ { |
||||
rewrite ^ https://$server_name/npf/blagosostoyanie/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-gazfond/ { |
||||
rewrite ^ https://$server_name/npf/gazfond/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-elektroenergetiki/ { |
||||
rewrite ^ https://$server_name/npf/elektroenergetiki/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-lukojl-garant/ { |
||||
rewrite ^ https://$server_name/npf/lukojl-garant/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-promagrofond/ { |
||||
rewrite ^ https://$server_name/npf/promagrofond/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/npf-neftegarant/ { |
||||
rewrite ^ https://$server_name/npf/neftegarant/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-sberbanka/ { |
||||
rewrite ^ https://$server_name/npf/sberbank/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-almaznaya-osen/ { |
||||
rewrite ^ https://$server_name/npf/almaznaya-osen/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-telekom-soyuz/ { |
||||
rewrite ^ https://$server_name/npf/telekom-soyuz/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/npf-evropejskij-pensionnyj-fond/ { |
||||
rewrite ^ https://$server_name/npf/evropejskij/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-stalfond/ { |
||||
rewrite ^ https://$server_name/npf/stalfond/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-vtb/ { |
||||
rewrite ^ https://$server_name/npf/vtb/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-kit-finans/ { |
||||
rewrite ^ https://$server_name/npf/kit-finans/? permanent; |
||||
} |
||||
|
||||
location /negosudarstvennye-pensionnye-fondy/negosudarstvennyj-pensionnyj-fond-metallurgov/ { |
||||
rewrite ^ https://$server_name/npf/metallurgov/? permanent; |
||||
} |
||||
|
||||
location /materinskij-kapital/kak-obnalichit/ { |
||||
rewrite ^ https://$server_name/materinskij-kapital/? permanent; |
||||
} |
||||
|
||||
location /poleznaya-informaciya/snils-i-pensionnoe-svidetelstvo/ { |
||||
rewrite ^ https://$server_name/poleznaya-informaciya/snils/? permanent; |
||||
} |
||||
|
||||
location /raschet-pensij/strahovoj-trudovoj-stazh/ { |
||||
rewrite ^ https://$server_name/raschet-pensij/strahovoj-stazh/? permanent; |
||||
} |
||||
|
||||
location /poleznaya-informaciya/ustanovlenie-pfv/ { |
||||
rewrite ^ https://$server_name/raschet-pensij/fiksirovannaya-vyplata/? permanent; |
||||
} |
||||
|
||||
location /poleznaya-informaciya/pereezd-pensionerov-severa/ { |
||||
rewrite ^ https://$server_name/lgoty/pereezd-pensionerov-severa/? permanent; |
||||
} |
||||
|
||||
location /otdeleniya/moskovskaya-oblast/schyolkovo/ { |
||||
rewrite ^ https://$server_name/otdeleniya/moskovskaya-oblast/schelkovo/? permanent; |
||||
} |
||||
|
||||
location /otdeleniya/altajskij-kraj/krasnoschekovo/ { |
||||
rewrite ^ https://$server_name/otdeleniya/altajskij-kraj/krasnoschyokovo/? permanent; |
||||
} |
||||
|
||||
location /otdeleniya/zabajkalskij-kraj/nova-chara/ { |
||||
rewrite ^ https://$server_name/otdeleniya/zabajkalskij-kraj/novaya-chara/? permanent; |
||||
} |
||||
|
||||
location /otdeleniya/omskaya-oblast/znamenka/ { |
||||
rewrite ^ https://$server_name/otdeleniya/omskaya-oblast/znamenskoe/? permanent; |
||||
} |
||||
|
||||
location /otdeleniya/omskaya-oblast/lyubino/ { |
||||
rewrite ^ https://$server_name/otdeleniya/omskaya-oblast/lyubinskij/? permanent; |
||||
} |
||||
|
||||
# redirect whole subpath to single url |
||||
|
||||
location ~ ^/otdeleniya/evrejskaya-ao/(.*) { |
||||
rewrite ^/otdeleniya/evrejskaya-ao/(.*) https://$server_name/otdeleniya/evrejskaya-avtonomnaya-oblast/? permanent; |
||||
} |
||||
|
||||
location ~ ^/otdeleniya/chukotskij-ao/(.*) { |
||||
rewrite ^/otdeleniya/chukotskij-ao/(.*) https://$server_name/otdeleniya/chukotskij-avtonomnyj-okrug/? permanent; |
||||
} |
||||
|
||||
location ~ ^/otdeleniya/kabardino-balkariya/(.*) { |
||||
rewrite ^/otdeleniya/kabardino-balkariya/(.*) https://$server_name/otdeleniya/kabardino-balkarskaya-respublika/? permanent; |
||||
} |
||||
|
||||
location ~ ^/otdeleniya/yamalo-neneckij-ao/(.*) { |
||||
rewrite ^/otdeleniya/yamalo-neneckij-ao/(.*) https://$server_name/otdeleniya/yamalo-neneckij-avtonomnyj-okrug/? permanent; |
||||
} |
||||
|
||||
} |
||||
} |
||||
@ -0,0 +1,20 @@ |
||||
upstream pensfond { |
||||
server localhost:32770; |
||||
} |
||||
|
||||
server { |
||||
client_max_body_size 175M; |
||||
listen 0.0.0.0:80; |
||||
server_name p-fond.ru www.p-fond.ru; |
||||
|
||||
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://pensfond/; |
||||
proxy_redirect off; |
||||
} |
||||
|
||||
} |
||||
@ -0,0 +1,29 @@ |
||||
upstream pensfond { |
||||
server localhost:32770; |
||||
} |
||||
|
||||
server { |
||||
listen 80; |
||||
server_name p-fond.ru www.p-fond.ru; |
||||
return 301 https://$sqerver_name$request_uri; |
||||
} |
||||
|
||||
server { |
||||
client_max_body_size 175M; |
||||
listen 0.0.0.0:443 ssl; |
||||
server_name p-fond.ru www.p-fond.ru; |
||||
|
||||
ssl_certificate /opt/apps/pensfond/conf/ssl-keys/pensfond.org.crt; |
||||
ssl_certificate_key /opt/apps/pensfond/conf/ssl-keys/pensfond.org.key; |
||||
add_header Strict-Transport-Security 'max-age=604800'; |
||||
|
||||
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://mirmebeli/; |
||||
proxy_redirect off; |
||||
} |
||||
} |
||||
@ -0,0 +1,40 @@ |
||||
[supervisord] |
||||
logfile=/var/log/supervisord.log |
||||
loglevel=debug |
||||
directory=/opt/app |
||||
pidfile=/tmp/supervisord.pid |
||||
nodaemon=true |
||||
minfds=65535 |
||||
minprocs=200 |
||||
environment=PATH="/opt/app" |
||||
user=root |
||||
|
||||
[program:nginx] |
||||
command=/usr/sbin/nginx "-g" "daemon off;" |
||||
priority=1 |
||||
autorestart=true |
||||
stdout_events_enabled=true |
||||
stderr_events_enabled=true |
||||
|
||||
[program:gunicorn] |
||||
command=gunicorn project.wsgi:application -c /opt/app/conf/gunicorn_prod.py |
||||
directory=/opt/app |
||||
priority=2 |
||||
stdout_logfile=/var/log/gunicorn.log |
||||
redirect_stderr=true |
||||
stdout_events_enabled=true |
||||
stderr_events_enabled=true |
||||
autorestart=true |
||||
|
||||
[program:cron] |
||||
directory = /etc/cron.d/ |
||||
command = /usr/sbin/cron -f |
||||
autorestart = true |
||||
|
||||
stdout_logfile=/dev/stdout |
||||
stdout_logfile_maxbytes=0 |
||||
redirect_stderr=true |
||||
|
||||
; RQ requires the TERM signal to perform a warm shutdown. If RQ does not die |
||||
; within 10 seconds, supervisor will forcefully kill it |
||||
stopsignal=TERM |
||||
@ -0,0 +1 @@ |
||||
9.6 |
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue