From ab0572caee8616fe668be8adcb6e481a7a0a9477 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 21 Aug 2017 10:58:20 +0300 Subject: [PATCH 01/14] Update install.md --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index c4ff50e..7be3d5b 100644 --- a/docs/install.md +++ b/docs/install.md @@ -2,7 +2,7 @@ Работа предполагается на python3. Я предпочитаю запускать wsgi сервер на связке uWSGI + Nginx, так что ставить будем соответствующие пакеты. -#####На Fedora25 нужные пакеты можно установить так: +##### На Fedora25 нужные пакеты можно установить так: Для начала подготовим систему, очистим и обновим пакеты. Процесс обновления долгий, так что можно пойти заварить себе чай :) ``` From ecd5179f7bed4c0d7186667030b17f82efde0447 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Mon, 21 Aug 2017 10:59:35 +0300 Subject: [PATCH 02/14] Update install.md --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index 7be3d5b..772cd4c 100644 --- a/docs/install.md +++ b/docs/install.md @@ -121,4 +121,4 @@ __Настоятельно рекомендую заглянуть внутрь # systemctl start djing_telebot.service ``` Перед включением юнита *djing_telebot.service* создайте Telegram бота и впишите в файл *djing/settings.py* в переменную *TELEGRAM_BOT_TOKEN* токен вашего бота. -С помощью этого бота вы будете получать различные сообщения из биллинга. Подробнее в инструкции к [модулю оповещений](./docs/bot.md). +С помощью этого бота вы будете получать различные сообщения из биллинга. Подробнее в инструкции к [модулю оповещений](./bot.md). From 4382c9e949ba81369ca8603a15dfdc74ebe3673d Mon Sep 17 00:00:00 2001 From: bashmak Date: Mon, 21 Aug 2017 18:56:57 +0300 Subject: [PATCH 03/14] =?UTF-8?q?=D0=95=D1=81=D0=BB=D0=B8=20=D0=BD=D0=B5?= =?UTF-8?q?=20=D0=BF=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D0=BB=D0=B8=20snmp=20?= =?UTF-8?q?=D0=BF=D0=B0=D1=80=D0=BE=D0=BB=D1=8C=20=D1=82=D0=BE=20=D0=BF?= =?UTF-8?q?=D1=83=D1=81=D1=82=D0=BE=D0=B5=20=D0=B7=D0=BD=D0=B0=D1=87=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devapp/views.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/devapp/views.py b/devapp/views.py index 46bab38..115a744 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -103,7 +103,7 @@ def dev(request, grp, devid=0): 'mac_addr': request.GET.get('mac'), 'comment': request.GET.get('c'), 'ip_address': request.GET.get('ip'), - 'man_passw': DEFAULT_SNMP_PASSWORD + 'man_passw': DEFAULT_SNMP_PASSWORD or '' }) else: frm = DeviceForm(instance=devinst) From 345f77fe216f21d818679f0a6df0b14c0a084a9b Mon Sep 17 00:00:00 2001 From: bashmak Date: Mon, 21 Aug 2017 18:57:38 +0300 Subject: [PATCH 04/14] =?UTF-8?q?=D0=97=D0=B0=D0=B2=D0=B8=D1=81=D0=B8?= =?UTF-8?q?=D0=BC=D0=BE=D1=81=D1=82=D1=8C=20mysql=20=D0=B2=D0=B5=D1=80?= =?UTF-8?q?=D0=BD=D1=83=D0=BB=20=D0=BD=D0=B0=20=D1=80=D0=B5=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=B5=D0=BD=D0=B4=D1=83=D0=B5=D0=BC=D1=83=D1=8E=20django?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- requirements.txt | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index c68afe4..7d485d0 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,11 +1,16 @@ Django==1.9 Pillow telepot + # for mac address field netaddr + # for testing required xmltodict xmltodict -PyMySQL + +# Django recommended mysql client +mysqlclient + easysnmp rq pid From 3a73b2e17305ec63ad67ff3198e53b6737aa668e Mon Sep 17 00:00:00 2001 From: bashmak Date: Mon, 21 Aug 2017 18:58:07 +0300 Subject: [PATCH 05/14] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ats.md | 0 docs/install.md | 190 +++++++++++++++++++++++++++++++++--------------- 2 files changed, 131 insertions(+), 59 deletions(-) create mode 100644 docs/ats.md diff --git a/docs/ats.md b/docs/ats.md new file mode 100644 index 0000000..e69de29 diff --git a/docs/install.md b/docs/install.md index 772cd4c..0d879f4 100644 --- a/docs/install.md +++ b/docs/install.md @@ -12,7 +12,7 @@ Затем установим зависимости ``` -# dnf -y install python3 python3-devel python3-pip python3-pillow mariadb uwsgi nginx redis net-snmp net-snmp-libs net-snmp-utils net-snmp-devel net-snmp-python git redhat-rpm-config +# dnf -y install python3 python3-devel python3-pip python3-pillow mariadb mariadb-devel uwsgi nginx uwsgi-plugin-python3 redis net-snmp net-snmp-libs net-snmp-utils net-snmp-devel net-snmp-python git redhat-rpm-config ``` Условимся что путь к папке с проектом находится по адресу: */var/www/djing*. @@ -27,83 +27,155 @@ Скопируем конфиги из примеров в реальные: ``` -cd /var/www/djing -cp djing/settings_example.py djing/settings.py -cp agent/settings.py.example agent/settings.py +$ cd /var/www/djing +# cp djing/settings_example.py djing/settings.py +# cp agent/settings.py.example agent/settings.py ``` Затем отредактируйте конфиги для своих нужд. Для удобства я создаю пользователя и группу http:http, и всё что связано с web-сервером запускаю от имени http. ``` -groupadd -r http -useradd -l -M -r -d /dev/null -g http -s /sbin/nologin http -chown -R http:http /var/www -chown -R http:http /etc/nginx -chown -R http:http /etc/uwsgi.* +# groupadd -r http +# useradd -l -M -r -d /dev/null -g http -s /sbin/nologin http +# chown -R http:http /var/www +# chown -R http:http /etc/nginx +# chown -R http:http /etc/uwsgi.* +# chown -R http:http /run/uwsgi/ ``` ### Настройка WEB Сервера Конфиг Nginx на моём рабочем сервере выглядит так: +```nginx +user http; +worker_processes auto; +pid /run/nginx.pid; +events { + worker_connections 1024; +} +http { + sendfile on; + upstream djing { server unix:///run/uwsgi/djing.sock; } + + server { + listen 80; + server_name <ваш-домен>.com; + root /var/www/djing; + charset utf-8; + + # укажите где лежит ваш раздел с медиа для сайта + location /media { + alias /var/www/djing/media; + } - user http; - worker_processes auto; - pid /run/nginx.pid; - events { - worker_connections 1024; - } - http { - sendfile on; - upstream djing { server unix:///run/uwsgi/djing.sock; } - - server { - listen 80; - server_name <ваш-домен>.com; - root /var/www/djing; - charset utf-8; - - # укажите где лежит ваш раздел с медиа для сайта - location /media { - alias /var/www/djing/media; - } - - # местоположение статики - location /static { - alias /var/www/djing/static; - } - - # тут надо указать путь куда у вас установился Django + путь к статике админки - # путь к Django тут: /usr/lib/python3.5/site-packages/django - # путь к статике соответственно: contrib/admin/static/admin - location /static/admin { - alias /usr/lib/python3.5/site-packages/django/contrib/admin/static/admin; - } - - # на корневом url / реагируем с помощью сокета проекта - # у нас он называется "djing": upstream djing { server ... - location / { - uwsgi_pass djing; - include uwsgi_params; - } + # местоположение статики + location /static { + alias /var/www/djing/static; + } + + # тут надо указать путь куда у вас установился Django + путь к статике админки + # путь к Django тут: /usr/lib/python3.5/site-packages/django + # путь к статике соответственно: contrib/admin/static/admin + location /static/admin { + alias /usr/lib/python3.5/site-packages/django/contrib/admin/static/admin; + } + + # на корневом url / реагируем с помощью сокета проекта + # у нас он называется "djing": upstream djing { server ... + location / { + uwsgi_pass djing; + include uwsgi_params; } } +} +``` Это минимальный конфиг Nginx для работы. Проверте файл /run/uwsgi/djing.sock на доступность пользователю http для чтения. Далее настраиваем uWSGI. Мой конфиг для uWSGI в режиме emperor: +> /etc/uwsgi.ini +```ini +[uwsgi] +uid = http +gid = http +pidfile = /run/uwsgi/uwsgi.pid +emperor = /etc/uwsgi.d +stats = /run/uwsgi/stats.sock +chmod-socket = 660 +emperor-tyrant = true +cap = setgid,setuid +``` + +Зададим конфиг для *uwsgi vassal*: +> /etc/uwsgi.d/djing.ini +``` +[uwsgi] +chdir=/var/www/djing/ +module=djing.wsgi +master=True +processes=8 +;socket=/run/uwsgi/djing.sock +http-socket=:8000 +chmod-socket=664 +pidfile=/run/uwsgi/django-master.pid +vacuum=True +plugin=python3 +``` + +Перед пробой запуска отключим все ограничения фаервола: +> \# systemctl stop firewalld + +Попробуем запустить *uwsgi* и djing без Nginx: +> \# sudo uwsgi --gid http --uid http /etc/uwsgi.d/djing.ini + +пробуем зайти в биллинг с браузера на <адрес сервера>:8000. + +Для того чтоб uwsgi применял к своим файлам пользователя http надо подредактировать системный юнит uwsgi, у меня он имеет такой путь: +> /usr/lib/systemd/system/uwsgi.service - [uwsgi] - uid = http - gid = http - pidfile = /run/uwsgi/uwsgi.pid - emperor = /etc/uwsgi.d - stats = /run/uwsgi/stats.sock - chmod-socket = 660 - emperor-tyrant = true - cap = setgid,setuid +В нём надо чтоб chown менял пользователя не на uwsgi, а на http: +> ExecStartPre=/bin/chown -r http:http /run/uwsgi -У меня конфиг лежит по адресу /etc/uwsgi.ini +Теперь, если всё прошло успешно, поменяйте в конфиге *uwsgi vassal* сокет с http на unix socket: +Раскомментируйте это: +> socket=/run/uwsgi/djing.sock +И закомментируйте эту строку: +> http-socket=:8000 + +Строка *http-socket=:8000* была для теста, чтоб посмотреть работает-ли uwsgi сам по себе. + +Теперь можно попробовать запустить *nginx* и *uwsgi*. + +> \# systemctl start uwsgi\ +> \# systemctl start nginx + + +### Настраиваем биллинг +Все настройки биллинга находятся в файле *djing/settings.py*. Большинство опций вы можете найти в документации [Django settings](https://docs.djangoproject.com/en/1.9/ref/settings). +Те опции, которые были добавлены мной в рамках проекта *djing*, описаны ниже в этом разделе документации по установке. + +#### djing/settings.py +**USE_TZ** — Это опция *Django*, но если вы не работаете в разных часовых диапазонах то я не рекомендую включать эту опцию чтоб небыло путаницы со временем. Это связано с тем что +я ещё не тестировал поведение работу со временем при включённой этой опции. + +**DEFAULT_PICTURE** — Это путь к изображению по умолчанию, оно используется когда нужное изображение не найдено. + + +**PAGINATION_ITEMS_PER_PAGE** — Количество выводимых элементов списка на странце с таблицей. Например если поставить 30, +то на странице абонентов на одной странице будет выведено 30 строк абонентов. + +**pay_SERV_ID** — Эта опция, так же как и **pay_SECRET** опции для платёжной системы *AllTime24*, если вы используете любую +другую платёжную систему то можете удалить эти опции. + + +**DIALING_MEDIA** — Путь, где биллинг сможет найти файлы записей asterisk чтоб вывести статистику звонков. +Подробнее читайте в описании работы с [АТС](./ats.ms). + +**DHCP_TIMEOUT** — Время аренды настроек DHCP в секундах. + +**DEFAULT_SNMP_PASSWORD** — Пароль snmp по умолчанию для устройств, чтоб при создании устройства он был заполнен в нужном поле. +Если нет такого пароля то оставьте пустым или None. ### Настраиваем демоны Если ваша система работает с поддержкой *systemd* то в каталоге *systemd_units* проекта вы найдёте юниты для systemd. @@ -111,7 +183,7 @@ chown -R http:http /etc/uwsgi.* __Настоятельно рекомендую заглянуть внутрь этих юнитов__. Проверте пути исполняемых файлов, права и прочее. А теперь включим и запустим нужные демоны -``` +```bash # systemctl daemon-reload # systemctl enable djing_queue.service # systemctl start djing_queue.service From 17f057364e0d76d8ce61094a588eb4823e1ea5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 22 Aug 2017 16:00:03 +0300 Subject: [PATCH 06/14] =?UTF-8?q?FIX:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BA?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/install.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/install.md b/docs/install.md index 0d879f4..7157017 100644 --- a/docs/install.md +++ b/docs/install.md @@ -18,7 +18,7 @@ Условимся что путь к папке с проектом находится по адресу: */var/www/djing*. Дальше создадим каталок для web, затем обновляем pip и ставим проект через pip: ``` -# mkdir /vaw/www +# mkdir /var/www # cd /var/www # pip3 install --upgrade pip # git clone https://github.com/nerosketch/djing.git From f31fe1847e1d5d7d51f7db6c8c727adb515a4c49 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 23 Aug 2017 12:23:22 +0300 Subject: [PATCH 07/14] refactoring --- devapp/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/devapp/views.py b/devapp/views.py index 115a744..f332ef7 100644 --- a/devapp/views.py +++ b/devapp/views.py @@ -14,7 +14,7 @@ from .models import Device, Port, DeviceDBException from mydefs import pag_mn, res_success, res_error, only_admins, ping, order_helper from .forms import DeviceForm, PortForm from abonapp.models import AbonGroup, Abon -from djing.settings import DEFAULT_SNMP_PASSWORD +from django.conf import settings @login_required @@ -103,7 +103,7 @@ def dev(request, grp, devid=0): 'mac_addr': request.GET.get('mac'), 'comment': request.GET.get('c'), 'ip_address': request.GET.get('ip'), - 'man_passw': DEFAULT_SNMP_PASSWORD or '' + 'man_passw': getattr(settings, 'DEFAULT_SNMP_PASSWORD', '') }) else: frm = DeviceForm(instance=devinst) From 60f157385ac94d01c14ef7c5f20e711fa83129c0 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 23 Aug 2017 15:49:14 +0300 Subject: [PATCH 08/14] Screenshot for install instruction --- docs/img/login.png | Bin 0 -> 14778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/img/login.png diff --git a/docs/img/login.png b/docs/img/login.png new file mode 100644 index 0000000000000000000000000000000000000000..10e78794612551f620729ad48fa6d01cca16a822 GIT binary patch literal 14778 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 literal 0 HcmV?d00001 From 60e293a1b28b86707b69fa171c190f95c488d719 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 23 Aug 2017 16:51:09 +0300 Subject: [PATCH 09/14] If not found Telegram token then raise exception --- chatbot/locale/ru/LC_MESSAGES/django.po | 3 +++ chatbot/telebot.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/chatbot/locale/ru/LC_MESSAGES/django.po b/chatbot/locale/ru/LC_MESSAGES/django.po index e6277c8..0543256 100644 --- a/chatbot/locale/ru/LC_MESSAGES/django.po +++ b/chatbot/locale/ru/LC_MESSAGES/django.po @@ -55,3 +55,6 @@ msgstr "Давай пинганём, напиши ip. Нужно будет по msgid "Yes, it's nice to meet% s, I will notify you about events in billing. Successful work;)" msgstr "Да, приятно познакомиться %s, я буду оповещать тебя о событиях в биллинге. Удачной работы ;)" + +msgid "Telegram bot token not found" +msgstr "Токен для бота Telegram не найден" diff --git a/chatbot/telebot.py b/chatbot/telebot.py index 42e0ad5..b238bdc 100755 --- a/chatbot/telebot.py +++ b/chatbot/telebot.py @@ -130,6 +130,8 @@ class DjingTelebot(helper.ChatHandler): # Просто отправляем текст оповещения указанному админу def send_notify(msg_text, account): try: + if token is None: + raise ChatException(_('Telegram bot token not found')) tb = TelegramBot.objects.get(user=account) tbot = Bot(token) tbot.sendMessage(tb.chat_id, msg_text) From f711547d4dcb8a227e955c42cb98328502d18c0a Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 23 Aug 2017 16:52:50 +0300 Subject: [PATCH 10/14] =?UTF-8?q?=D0=BF=D0=BE=D0=B4=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D0=BB=20=D0=BA=D0=BE=D0=BC=D0=BC=D0=B5=D0=BD=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cron.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cron.py b/cron.py index 1369392..049080c 100755 --- a/cron.py +++ b/cron.py @@ -15,7 +15,7 @@ def main(): users = Abon.objects.all() for user in users: try: - # бдим за услугами абонента: просроченные отключить, заказанные подключить + # бдим за услугами абонента user.bill_service(user) # если нет ip то и нет смысла лезть в NAS From cb1dc0c2739d73846c489e7fb7be0ab878cc4fa6 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 23 Aug 2017 16:54:07 +0300 Subject: [PATCH 11/14] Regular expression for validation telephone moved to settings --- accounts_app/models.py | 12 +++++++----- djing/settings_example.py | 2 ++ 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/accounts_app/models.py b/accounts_app/models.py index 2508257..a5f5238 100644 --- a/accounts_app/models.py +++ b/accounts_app/models.py @@ -3,11 +3,14 @@ from django.db import models from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.core.validators import RegexValidator from django.utils.translation import ugettext as _ - -from djing.settings import DEFAULT_PICTURE +from django.conf import settings from photo_app.models import Photo +DEFAULT_PICTURE = getattr(settings, 'DEFAULT_PICTURE', '/static/images/default-avatar.png') +TELEPHONE_REGEXP = getattr(settings, 'TELEPHONE_REGEXP', r'^\+[7,8,9,3]\d{10,11}$') + + class MyUserManager(BaseUserManager): def create_user(self, telephone, username, password=None): """ @@ -51,7 +54,7 @@ class UserProfile(AbstractBaseUser, PermissionsMixin): max_length=16, verbose_name=_('Telephone'), #unique=True, - validators=[RegexValidator('^\+[7,8,9,3]\d{10,11}$')] + validators=[RegexValidator(TELEPHONE_REGEXP)] ) avatar = models.ForeignKey(Photo, null=True, blank=True, on_delete=models.SET_NULL) email = models.EmailField(default='admin@example.ru') @@ -65,13 +68,12 @@ class UserProfile(AbstractBaseUser, PermissionsMixin): def get_short_name(self): return self.username or self.telephone - # Use UserManager to get the create_user method, etc. objects = MyUserManager() @property def is_staff(self): - "Is the user a member of staff?" + " Is the user a member of staff?" # Simplest possible answer: All admins are staff return self.is_admin diff --git a/djing/settings_example.py b/djing/settings_example.py index df00937..fc038d8 100644 --- a/djing/settings_example.py +++ b/djing/settings_example.py @@ -168,3 +168,5 @@ DHCP_TIMEOUT = 14400 DEFAULT_SNMP_PASSWORD = 'public' TELEGRAM_BOT_TOKEN = 'bot token' + +TELEPHONE_REGEXP = r'^\+[7,8,9,3]\d{10,11}$' From d5e6adf12a2f9ddfb9a84b1534be00ff905a8ad8 Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 23 Aug 2017 16:55:07 +0300 Subject: [PATCH 12/14] Add instruction for install --- docs/install.md | 130 +++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 112 insertions(+), 18 deletions(-) diff --git a/docs/install.md b/docs/install.md index 0d879f4..6704bfd 100644 --- a/docs/install.md +++ b/docs/install.md @@ -15,6 +15,11 @@ # dnf -y install python3 python3-devel python3-pip python3-pillow mariadb mariadb-devel uwsgi nginx uwsgi-plugin-python3 redis net-snmp net-snmp-libs net-snmp-utils net-snmp-devel net-snmp-python git redhat-rpm-config ``` +Лучше чтоб версия python по умолчанию была третья: +``` +# ln -sf python3 /usr/bin/python +``` + Условимся что путь к папке с проектом находится по адресу: */var/www/djing*. Дальше создадим каталок для web, затем обновляем pip и ставим проект через pip: ``` @@ -50,11 +55,21 @@ $ cd /var/www/djing user http; worker_processes auto; pid /run/nginx.pid; + events { worker_connections 1024; } + http { - sendfile on; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 65; + types_hash_max_size 2048; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + upstream djing { server unix:///run/uwsgi/djing.sock; } server { @@ -108,7 +123,7 @@ cap = setgid,setuid Зададим конфиг для *uwsgi vassal*: > /etc/uwsgi.d/djing.ini -``` +```ini [uwsgi] chdir=/var/www/djing/ module=djing.wsgi @@ -122,21 +137,31 @@ vacuum=True plugin=python3 ``` +Примените к созданному файлу пользователя http: +> \# chown http:http /etc/uwsgi.d/djing.ini + Перед пробой запуска отключим все ограничения фаервола: > \# systemctl stop firewalld +Или даже отключить, если вы отложите настройку *firewalld* на потом: +> \# systemctl disable firewalld + +Перед тем как попробовать запустить тестовый сервер скомпилируйте переводы: +> \$ ./manage.py compilemessages -l ru + Попробуем запустить *uwsgi* и djing без Nginx: -> \# sudo uwsgi --gid http --uid http /etc/uwsgi.d/djing.ini +> \# uwsgi --gid http --uid http /etc/uwsgi.d/djing.ini -пробуем зайти в биллинг с браузера на <адрес сервера>:8000. +пробуем зайти в биллинг с браузера на <адрес сервера>:8000. Вам должен показаться диалог входа в систему: +![Login screenshot](./img/login.png) -Для того чтоб uwsgi применял к своим файлам пользователя http надо подредактировать системный юнит uwsgi, у меня он имеет такой путь: +Для того чтоб uwsgi применял к своим файлам пользователя http, надо подредактировать системный юнит uwsgi, у меня он имеет такой путь: > /usr/lib/systemd/system/uwsgi.service -В нём надо чтоб chown менял пользователя не на uwsgi, а на http: +В нём надо чтоб chown менял пользователя на http, а не на uwsgi: > ExecStartPre=/bin/chown -r http:http /run/uwsgi -Теперь, если всё прошло успешно, поменяйте в конфиге *uwsgi vassal* сокет с http на unix socket: +Теперь, если всё прошло успешно, поменяйте в конфиге */etc/uwsgi.d/djing.ini* сокет с http на unix socket: Раскомментируйте это: > socket=/run/uwsgi/djing.sock @@ -145,30 +170,37 @@ plugin=python3 Строка *http-socket=:8000* была для теста, чтоб посмотреть работает-ли uwsgi сам по себе. -Теперь можно попробовать запустить *nginx* и *uwsgi*. +Теперь можно попробовать запустить *nginx* и *uwsgi*. Ставим в **djing/settings.py** опцию **DEBUG = False**, и пробуем запустить нужные юниты: > \# systemctl start uwsgi\ > \# systemctl start nginx +По умолчанию на fedora включено SELinux и вы не сможете зайти на сайт пока не настроите его. Для того, чтоб проверить всё +ли правильно мы настроили, отключите *SELinux* коммандой **setenforce 0* и попробуйте зайти. После успешного запуска вы +можете снова включить опцию и настроить её. + ### Настраиваем биллинг -Все настройки биллинга находятся в файле *djing/settings.py*. Большинство опций вы можете найти в документации [Django settings](https://docs.djangoproject.com/en/1.9/ref/settings). +Все настройки биллинга находятся в файле *djing/settings.py*. Большинство опций вы можете найти в документации +[Django settings](https://docs.djangoproject.com/en/1.9/ref/settings). Те опции, которые были добавлены мной в рамках проекта *djing*, описаны ниже в этом разделе документации по установке. #### djing/settings.py -**USE_TZ** — Это опция *Django*, но если вы не работаете в разных часовых диапазонах то я не рекомендую включать эту опцию чтоб небыло путаницы со временем. Это связано с тем что -я ещё не тестировал поведение работу со временем при включённой этой опции. +**USE_TZ** — Это опция *Django*, но если вы не работаете в разных часовых диапазонах то я не рекомендую включать +эту опцию чтоб небыло путаницы со временем. Это связано с тем что я ещё не тестировал поведение работы со временем при +включённой опции *USE_TZ*. -**DEFAULT_PICTURE** — Это путь к изображению по умолчанию, оно используется когда нужное изображение не найдено. +**ALLOWED_HOSTS** — Тоже опция *Django*, но важная для безопасности, укажите в списке возможные имена вашего сервера. +Подробнее в документации [Django settings](https://docs.djangoproject.com/en/1.9/ref/settings/#allowed-hosts). +**DEFAULT_PICTURE** — Это путь к изображению по умолчанию, оно используется когда нужное изображение не найдено. -**PAGINATION_ITEMS_PER_PAGE** — Количество выводимых элементов списка на странце с таблицей. Например если поставить 30, +**PAGINATION_ITEMS_PER_PAGE** — Количество выводимых элементов списка на странце с таблицей. Например, если поставить 30, то на странице абонентов на одной странице будет выведено 30 строк абонентов. **pay_SERV_ID** — Эта опция, так же как и **pay_SECRET** опции для платёжной системы *AllTime24*, если вы используете любую другую платёжную систему то можете удалить эти опции. - **DIALING_MEDIA** — Путь, где биллинг сможет найти файлы записей asterisk чтоб вывести статистику звонков. Подробнее читайте в описании работы с [АТС](./ats.ms). @@ -177,13 +209,77 @@ plugin=python3 **DEFAULT_SNMP_PASSWORD** — Пароль snmp по умолчанию для устройств, чтоб при создании устройства он был заполнен в нужном поле. Если нет такого пароля то оставьте пустым или None. +**TELEPHONE_REGEXP** — Регулярное выражение для валидации номера телефона. + + +#### Создание БД +Подразумевается что сервер баз данных у вас уже есть, или вы его можете установить сами. +В конфиге настроить БД можно по инструкции [Django databases](https://docs.djangoproject.com/en/1.9/ref/settings/#databases). + +Убедитесть что вы в папке с проектом, комманда **pwd** должна выдать */var/www/djing*. +Чтоб создать бд, как описано в документации [Django admin \& migrate](https://docs.djangoproject.com/en/1.9/ref/django-admin/#migrate), +нужно запустить **./manage.py migrate** чтоб создать структуру БД. Вывод будет примерно таким: +``` +$ ./manage.py migrate +Operations to perform: + Apply all migrations: mapapp, contenttypes, dialing_app, django_messages, taskapp, photo_app, accounts_app, devapp, statistics, tariff_app, admin, sessions, chatbot, auth, abonapp +Running migrations: + Rendering model states... DONE + Applying mapapp.0001_initial... OK + Applying devapp.0001_initial... OK + Applying devapp.0002_auto_20160909_1018... OK + Applying devapp.0003_device_map_dot... OK + Applying photo_app.0001_initial... OK + Applying contenttypes.0001_initial... OK +... + Applying taskapp.0012_auto_20170407_0124... OK + Applying taskapp.0013_auto_20170413_1944... OK + Applying taskapp.0014_auto_20170416_1029... OK + Applying taskapp.0015_auto_20170816_1109... OK +``` + +После этого вам стоит создать супер пользователя чтоб зайти в систему. +``` +$ ./manage.py createsuperuser +``` +В интерактивном режиме ответьте на вопросы. +``` +$ ./manage.py createsuperuser +Username: username +Telephone: +12223334455 +Password: +Password (again): +Superuser created successfully. +``` +Обратите внимание на то что номер телефона это обязательное поле для заполнения. +Если у вас не выходит указать номер телефона, то проверте чтоб ваш телефон соответствовал регулярному выражению **^\+[7,8,9,3]\d{10,11}$**. +Если регулярное выражение вам не подхожит, то вы можете изенить его в настройках, см. опции в настройках выше. +После изменения настроек они не сразу вступят в силу, нужно перезагрузить код django, для этого перезапустите **uwsgi**: +> \# systemctl restart uwsgi + +Теперь произведите тестовый запуск: +> \# ./manage.py runserver 192.168.0.100:8000 + +Если не подтягивается статика то проверте чтоб опция **DEBUG** в настройках была **True**. + +При условии что адрес вашего сервера *192.168.0.100*, вы сможете открыть биллинг по адресу **http://192.168.0.100:8000/**. +Введите логин и пароль супер пользователя которого вы создали по инструкции выше. + +Если вы успешно зашли то можно пробовать запускать биллинг в рабочую обстановку. +В настройках смените переменную **DEBUG** на **False** и перезапустите *uwsgi*. + ### Настраиваем демоны -Если ваша система работает с поддержкой *systemd* то в каталоге *systemd_units* проекта вы найдёте юниты для systemd. +Если ваша система работает с поддержкой [**systemd**](https://www.freedesktop.org/wiki/Software/systemd/) то в каталоге *systemd_units* проекта вы найдёте юниты для systemd. Скопируйте их в каталог юнитов systemd, у меня это путь */etc/systemd/system*. __Настоятельно рекомендую заглянуть внутрь этих юнитов__. Проверте пути исполняемых файлов, права и прочее. +Для запуска сервиса **djing_rotate.service** вам нужно сначала настроить сбор статистики по [netflow](./netflow.md). + +Перед включением юнита *djing_telebot.service* создайте Telegram бота и впишите в файл *djing/settings.py* в переменную *TELEGRAM_BOT_TOKEN* токен вашего бота. +С помощью этого бота вы будете получать различные сообщения из биллинга. Подробнее в инструкции к [модулю оповещений](./bot.md). + А теперь включим и запустим нужные демоны -```bash +```shell # systemctl daemon-reload # systemctl enable djing_queue.service # systemctl start djing_queue.service @@ -192,5 +288,3 @@ __Настоятельно рекомендую заглянуть внутрь # systemctl enable djing_telebot.service # systemctl start djing_telebot.service ``` -Перед включением юнита *djing_telebot.service* создайте Telegram бота и впишите в файл *djing/settings.py* в переменную *TELEGRAM_BOT_TOKEN* токен вашего бота. -С помощью этого бота вы будете получать различные сообщения из биллинга. Подробнее в инструкции к [модулю оповещений](./bot.md). From d4512da049ef74ded0d5a57763e50192f4a18e0f Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 23 Aug 2017 16:57:04 +0300 Subject: [PATCH 13/14] replaces import setting directly, to django.conf settigs. And use getattr. --- abonapp/pay_systems.py | 4 +++- agent/mod_mikrotik.py | 4 ++-- chatbot/models.py | 4 +++- mydefs.py | 5 ++++- photo_app/models.py | 3 ++- 5 files changed, 14 insertions(+), 6 deletions(-) diff --git a/abonapp/pay_systems.py b/abonapp/pay_systems.py index 4835348..c159507 100644 --- a/abonapp/pay_systems.py +++ b/abonapp/pay_systems.py @@ -3,9 +3,11 @@ from django.utils import timezone from mydefs import safe_int, safe_float from .models import Abon, AllTimePayLog from django.db import DatabaseError +from django.conf import settings -from djing.settings import pay_SECRET as SECRET, pay_SERV_ID as SERV_ID +SECRET = getattr(settings, 'pay_SECRET') +SERV_ID = getattr(settings, 'pay_SERV_ID') #?ACT=1&PAY_ACCOUNT=960849&SERVICE_ID=y832r92y8f9e&PAY_ID=3561234&TRADE_POINT=377&SIGN=32e533a72389fe4e93746509f9d672f8 diff --git a/agent/mod_mikrotik.py b/agent/mod_mikrotik.py index 1924b14..31c3cb7 100644 --- a/agent/mod_mikrotik.py +++ b/agent/mod_mikrotik.py @@ -7,11 +7,11 @@ from .core import BaseTransmitter, NasFailedResult, NasNetworkError from mydefs import ping from .structs import TariffStruct, AbonStruct, IpStruct from . import settings -from djing.settings import DEBUG +from django.conf import settings import re -#DEBUG=True +DEBUG = getattr(settings, 'DEBUG', False) LIST_USERS_ALLOWED = 'DjingUsersAllowed' LIST_USERS_BLOCKED = 'DjingUsersBlocked' diff --git a/chatbot/models.py b/chatbot/models.py index 550924f..27726ee 100644 --- a/chatbot/models.py +++ b/chatbot/models.py @@ -1,5 +1,7 @@ from django.db import models -from djing.settings import AUTH_USER_MODEL +from django.conf import settings + +AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL') class ChatException(Exception): diff --git a/mydefs.py b/mydefs.py index 7eea08a..a428a6c 100644 --- a/mydefs.py +++ b/mydefs.py @@ -10,9 +10,12 @@ from django.http import HttpResponse, Http404, HttpResponseRedirect from django.shortcuts import redirect from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage from django.db import models -from djing.settings import PAGINATION_ITEMS_PER_PAGE, DEBUG +from django.conf import settings +PAGINATION_ITEMS_PER_PAGE = getattr(settings, 'PAGINATION_ITEMS_PER_PAGE', 10) +DEBUG = getattr(settings, 'DEBUG', False) + ip_addr_regex = r'^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' diff --git a/photo_app/models.py b/photo_app/models.py index 5f33500..fc7f8eb 100644 --- a/photo_app/models.py +++ b/photo_app/models.py @@ -5,8 +5,9 @@ import hashlib from django.db import models from PIL import Image +from django.conf import settings -from djing.settings import BASE_DIR +BASE_DIR = getattr(settings, 'BASE_DIR', '.') class Photo(models.Model): From 559276f2717b3854a448fc73f81057b274c576fc Mon Sep 17 00:00:00 2001 From: bashmak Date: Wed, 23 Aug 2017 16:57:41 +0300 Subject: [PATCH 14/14] setup.py not required --- setup.py | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 setup.py diff --git a/setup.py b/setup.py deleted file mode 100644 index 34eb9c3..0000000 --- a/setup.py +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env python3 -import os -import sys