четверг, 28 февраля 2019 г.

вторник, 26 февраля 2019 г.

3сх cmd/ под windows 10 обработчик номеров

в браузере
использовать расширение
greasemonkey


для win7

Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\sip]
@="URL:sip"
"EditFlags"=hex:02,00,00,00
"URL Protocol"=""
[HKEY_CLASSES_ROOT\sip\shell]
[HKEY_CLASSES_ROOT\sip\shell\open]
[HKEY_CLASSES_ROOT\sip\shell\open\command]
@="\"C:\\Program Files (x86)\\3CXPhone\\3CXPhone\" \"%1\""


для win10
d win 10 привести к виду
ветку реестра
@="\"C:\\Program Files (x86)\\3CXPhone\\3CXPhone\" \"%1\""
вот такому:
Компьютер\HKEY_CLASSES_ROOT\sip\shell\open\command
"C:\Program Files (x86)\3CXPhone\3CXPhone"%1


sip.vladlink.usercard.js

// Click to Dial SIP
// Author: Fiver.com/hybriditservices
// Made For: Paul Harvey
// License: GNU GPL v2 or later
// Modified version of:
//  Phone to Tel by Phone Guy (https://userscripts-mirror.org/scripts/show/56262)
//  Skype Linkify by Marco Abiuso (https://userscripts-mirror.org/scripts/show/10990)
//  VoIP Dialer Linkify by Ralf Muehlen (http://www.muehlen.com/projects/voip/voip_dial.user.js)
//  Inspired by: UPS Tracking Linkify (http://plutor.org/files/upslinkify.user.js) by Logan Ingalls
//
//
// ==UserScript==
// @name           Click to Dial SIP
// @namespace      http://fiverr.com/hybriditservice
// @description    Looks for phone numbers in the page and hyperlinks them for calling with any app registered to the sip: URI
// ==/UserScript==
//default country prefix
const defaultPrefix= '8';
(function () {
  //const trackRegex = /(\+\d\d\d?)?[\-\s\/\.]?[\(]?(\d){2,4}[\)]?[\-\s\/\.]?\d\d\d[\-\s\/\.]?(\d){2,4}\b/ig;
    //const trackRegex = /(\+\d\d\d?)?[\-\s\/\.]?[\(]?(\d?\d?){2,5}[\)]?[\-\s\/\.]?\d\d\d?\d?[\-\s\/\.]?(\d){2,5}\b/ig;      
 //const trackRegex = /\(?1300|1800|04)\b/ig;
 //const trackRegex =  /((\d{3})\s?\-\s?(\d{4}))|(\(\d{3}\)\s?\d{3}\s?\-\s?\d{4})|(\d{3}\s\d{4})|(\d{11})/g;
 //const trackRegex = /(\+61)\s\(2|4|3|7|8)){0,1}\){0,1}(\ |-)(\ |\s){0,1}[0-9]{2}(\ |-){0,1}[0-9]{2}(\ |-)(\ |\s){0,1}[0-9]{1}(\ |-){0,1}[0-9]{3}\b/ig;
    //Регулярное выражение для валидации номера телефона: /((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}\b/ig;
    const trackRegex = /(8|\+7|7)[\d]{7,10}\b/ig;
   
 function trackUrl(t) {
  if ((String(t).charAt(0) == '8')||(String(t).charAt(1) == '8'))
  {
     t= String(t);
     return "sip:" + (String(t).replace(/[\-\s\/\(\)\.]/g, ""));
  }
        if ((String(t).charAt(0) == '+')&&(String(t).charAt(1) == '7'))
  {
     t= String(t);
     return "sip:" + (String(t).replace("+7", "8"));
  }
        if (String(t).charAt(0) == '7')
  {
     t= String(t);
     return "sip:" + (String(t).replace("7", "8"));
  }
  /*if ((String(t).charAt(0) != '+')&&(String(t).charAt(1) != '1'))
  {
     t= defaultPrefix + String(t).replace("0","");
     return "sip:" + (String(t).replace(/[\-\s\/\(\)\.]/g, ""));
  }
        */
        /*
  if ((String(t).charAt(0) == '+')||(String(t).charAt(1) == '6'))
  {
     t= String(t);
     return "sip:" + (String(t).replace(/[\-\s\/\(\)\.]/g, ""));
  }
        */
 }
    // tags we will scan looking for un-hyperlinked urls
    var allowedParents = [
        //"b", "td"
        //"/html/body/table/tbody/tr/td.center_block/div.content/table.t-list/tbody/tr/td/b"
        "b"
        ];
    //alert (allowedParents);
   
    var xpath = "//text()[(parent::" + allowedParents.join(" or parent::") + ")" +
    //and contains(@class, 'table_nb')" +
    "]";
    var candidates = document.evaluate(xpath, document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
    for (var cand = null, i = 0; (cand = candidates.snapshotItem(i)); i++) {
        if (trackRegex.test(cand.nodeValue)) {
            var span = document.createElement("span");
            var source = cand.nodeValue;
           
            cand.parentNode.replaceChild(span, cand);
            trackRegex.lastIndex = 0;
            for (var match = null, lastLastIndex = 0; (match = trackRegex.exec(source)); ) {
                span.appendChild(document.createTextNode(source.substring(lastLastIndex, match.index)));
               
                var a = document.createElement("a");
                a.setAttribute("href", trackUrl(match[0]));
                a.appendChild(document.createTextNode(match[0]));
                span.appendChild(a);
                lastLastIndex = trackRegex.lastIndex;
            }
            span.appendChild(document.createTextNode(source.substring(lastLastIndex)));
            span.normalize();
        }
    }
})();

вторник, 9 октября 2018 г.

change mysql root password


Source :

https://stackoverflow.com/questions/7534056/mysql-root-password-change

This is the updated answer for WAMP v3.0.6 and up

> UPDATE mysql.user 
> SET authentication_string=PASSWORD('MyNewPass') 
> WHERE user='root';

>FLUSH PRIVILEGES;

In MySQL version 5.7.x there is no more password field in the mysql table. It was replaced with authentication_string.



воскресенье, 7 октября 2018 г.

samba в домен windows

по мотивам:

http://ricktbaker.com/2017/11/08/ubuntu-16-with-active-directory-connectivity/


https://bx.vladlink.ru/company/personal/user/1369/tasks/task/view/276702/?IFRAME=Y&IFRAME_TYPE=SIDE_SLIDER#

https://help.ubuntu.ru/wiki/%D0%B2%D0%B2%D0%BE%D0%B4_%D0%B2_%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD_windows

+
полезно по теме:

http://www.lissyara.su/articles/freebsd/programms/samba+nt_acl/

Мои конфиги на основе ubuntu 16.04:

/etc/samba/smb.conf
[global]
        #security = domain
        winbind use default domain = no
        log file = /var/log/samba/log.%m
        obey pam restrictions = yes
        map to guest = bad user
        encrypt passwords = true
        dns proxy = no
        netbios name = smb-share
        server string = %h server (Samba, Ubuntu)
        unix password sync = yes
        workgroup = SUBDOMAIN
##        os level = 20
        security = ADS
        syslog = 4
        panic action = /usr/share/samba/panic-action %d
        usershare allow guests = yes
        max log size = 1000
        pam password change = yes
        realm = SUBDOMAIN.COMPANY.ORG
        idmap config * : range = 10000-20000
        idmap config * : backend = tdb
        template shell = /bin/bash
        template homedir = /data/%D/%U
        winbind enum groups = yes
        winbind enum users = yes
        winbind refresh tickets = yes
        acl compatibility = auto
        map acl inherit = yes
###
domain master = no
local master = no
preferred master = no
os level = 0
domain logons = no
###
       # usershare path = /var/lib/samba/usershares
[OE]
   comment = OE Directories
   path =  "/data/homes/Отдел эксплуатации"
   write list =  @"SUBDOMAIN\grus_отдел эксплуатации" @"SUBDOMAIN\администраторы домена"
   #alid users = "SUBDOMAIN\администраторы домена" "SUBDOMAIN\grus_отдел эксплуатации"
   admin users = @"SUBDOMAIN\grus_отдел эксплуатации" @"SUBDOMAIN\администраторы домена"
   write list = @"SUBDOMAIN\grus_отдел эксплуатации" @"SUBDOMAIN\администраторы домена"
   read only = no

   browseable = yes
   inherit acls = yes
   inherit owner = yes
   inherit permissions = yes
   map acl inherit = yes
   nt acl support = yes
##        valid users = SUBDOMAIN\%U
 ##       inherit acls = yes
 ##       inherit owner = yes
 ##       inherit permissions = yes
 ##       map acl inherit = yes
 ##       nt acl support = yes
 ##       hide unreadable = yes

[Full]
        browseable = yes
        comment = Full data for Domain Admins
        read only = yes
##        valid users = SUBDOMAIN\%U
        path = /data
        inherit acls = yes
        inherit owner = yes
        inherit permissions = yes
        map acl inherit = yes
        nt acl support = yes
        write list = @"SUBDOMAIN\администраторы домена"
        admin users = @"SUBDOMAIN\администраторы домена"
        hide unreadable = yes
[homes]
   comment = Home Directories
   browseable = no
   path =  /data/%D/%U
   read only = no
   create mask = 0700
   directory mask = 0700
   valid users = SUBDOMAIN\%S
__________________________________________________________________

/etc/krb5.conf

[libdefaults]
ticket_lifetime = 24000
default_realm = SUBDOMAIN.COMPANY.ORG
default_tgs_entypes = rc4-hmac des-cbc-md5
default_tkt__enctypes = rc4-hmac des-cbc-md5
permitted_enctypes = rc4-hmac des-cbc-md5
dns_lookup_realm = true
dns_lookup_kdc = true
dns_fallback = yes

[realms]
COMPANY.ORG = {

  kdc = SUBDOMAIN-CORE1.COMPANY.ORG
  kdc = SUBDOMAIN-CORE2.COMPANY.ORG
  default_domain = SUBDOMAIN-CORE1.COMPANY.ORG
}

[domain_realm]
.COMPANY.ORG= SUBDOMAIN-CORE1.COMPANY.ORG
COMPANY.ORG = SUBDOMAIN-CORE1.COMPANY.ORG

[appdefaults]
pam = {
   debug = false
   ticket_lifetime = 36000
   renew_lifetime = 36000
   forwardable = true
   krb4_convert = false
}

[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
___________________________________________________

/etc/network/interfaces

dns-nameservers ipDC_1 ipDC_2
dns-search SUBDOMAIN.COMPANY.ORG

________________________________________________

/etc/pam.d/common-session-noninteractive

session         required                 pam_mkhomedir.so skel=/etc/skel umask=0022

______________________________________________

/etc/sssd/sssd.conf

[sssd]
domains = SUBDOMAIN.COMPANY.ORG
config_file_version = 2
services = nss, pam

[domain/SUBDOMAIN.COMPANY.ORG]
ad_domain = SUBDOMAIN.COMPANY.ORG
krb5_realm = SUBDOMAIN.COMPANY.ORG
realmd_tags = manages-system joined-with-adcli
cache_credentials = True
id_provider = ad
krb5_store_password_if_offline = True
default_shell = /bin/bash
ldap_id_mapping = True
use_fully_qualified_names = True
fallback_homedir = /home/%u
simple_allow_users = $
access_provider = ad
ad_gpo_access_control = permissive



воскресенье, 12 августа 2018 г.

03_Testing_django




 source /opt/myenv/bin/activate
 cd /opt/myenv/myproject/
./manage.py startapp news

(myenv) user@u_18_s:/opt/myenv/myproject$ ls
db.sqlite3  manage.py  myproject  static

(myenv) user@u_18_s:/opt/myenv/myproject$ ./manage.py startapp news

(myenv) user@u_18_s:/opt/myenv/myproject$ ls
db.sqlite3  manage.py  myproject  news  static


edit

 vi myproject/settings.py
add

 'news',

to

INSTALLED_APPS = [

save it

________________

(myenv) user@u_18_s:/opt/myenv/myproject$ vi news/models.py

add:

_____________________
class Article(models.Model): 
    title = models.CharField(max_length=225)   
    text = models.TextField()    
    pub_date = models.DateField(auto_now_add=True)
_____________




(myenv) user@u_18_s:/opt/myenv/myproject$ ./manage.py makemigrations
Migrations for 'news':
  news/migrations/0001_initial.py
    - Create model Article






add to:

(myenv) user@u_18_s:/opt/myenv/myproject$ vi news/admin.py


from .models import Article
admin.site.register(Article)


______________________________________


adding func to :


user@u_18_s:/opt/myenv/myproject$ vi news/views.py

from django.shortcuts import HttpResponce
def show_news(request):
    return HttpResponse(u'Hello World')
adding to the "router"  - /urls.py "template" for working with func  "show_news" :








понедельник, 6 августа 2018 г.

Django + Python3 + Nginx + Gunicorn кое-что адаптировано под 2018


Django + Python3 + Nginx + Gunicorn

кое-что адаптировано под 2018
ubuntu 18.04





Источник




Здравствуй, дорогой друг!
Затрону тему, которая не раз обсуждалась на форуме. Здесь же можете найти ссылки на многие туториалы по тому, как развернуть свой сайт на сервере.
Также есть уже готовый рецепт.
Я захотел написать вариант немножко в другой связке: Python3 (уж простите, но вот так мне приятнее), в качестве веб-сервера Nginx, в качестве http-сервера Gunicorn, размещаемся на digitalocean.com.
Внимание! Статейка моя адресована больше тем, кто делает первые шаги в разворачивании боевого сервера, она достаточно подробная и может вызвать приступы скуки и, возможно, тошноты у "бывалых".
Почему решил написать свой вариант, несмотря на то, что есть уже рецепты и на самом digitalocean.com? 4 пункта:
просто по их рецепту у меня ничего не вышло, в итоге я слепил картину из трех источников; потому что кому-то, только начавшему, мой вариант может и помочь. Чтоб не натыкались на те же грабли. Я просидел за решением проблем 3 вечера, а знал бы как правильно, сделал бы быстрее; вдруг кто-нибудь увидит в моих шагах сложность и предложит более правильное решение (я буду только рад, т.к. сам еще далеко не гуру); ну и также я оставлю это здесь, чтоб самому в перспективе обращаться. Итак! Пользоваться будем сервисом digitalocean.com (далее DO). Если еще кто-то не знаком, попробуйте. Это провайдер облачного хостинга. Для пробы используйте промо-код "radio-t" и вам на аккаунт упадет 10$ (сейчас июль 2014. Если читаете позже, код может не действовать). На минималке с одним инстансом 10$ хватит на 2 месяца.
Предположу, что вы уже зарегистрировались и денежки у вас на аккаунте уже есть.
1) Первое, что сразу посоветую сделать - создайте пару SSH и закиньте публичный на DO, для этого у них есть вкладка "SSH Keys". Далее это вам сильно облегчит жизнь.
2) Создадим инстанс (у них это называется "droplet"). Очень просто все: Нажимаете "Create" -> В поле ввода вносите имя дроплета (in english, please) -> выбираете размер -> выбираете регион (Для сайтов, которые ориентированы на Евразию, лучше выбрать Амстердам или Лондон) -> Затем выбираете дистрибутив (я ставил Ubuntu 12.04) -> жмакаете на свой ssh key (если создавали, под выбором дистрибутива должен появится пункт по этому поводу) -> и жмакаете "Create droplet". Ждете минтку.
3) Далее, если создавали ssh, заходите в терминал и коннектитесь с вашим дроплетом. Предположим, что ваш IP 111.222.333.44 (можете его найти под именем дроплета).
ssh root@111.222.333.44
Если все сделали правильно, то должно все сработать. При первом заходе, спросит вашего подтверждения, что вы хотите законнектится по этому ключу, это стандартное поведение при работе через ssh. Подтверждайте.
Если вы не захотели заморачиваться с ключами, то можете зайти в дроплет на сайте DO и кликнуть на большую синюю кнопку "Console Access". Т.е. вы будете все то же самое делать через браузер, но для входа нужен будет пароль, который DO вышлют вам на почту.
Ну, это была только прелюдия
Вот вы в консоли. Давайте установим все необходимые программы.
4) Для начала нужно сделать апгрейд
sudo apt-get update

sudo apt-get upgrade
5) Если вы следуете за мной по пятам и поставили Ubuntu 12.04, то вам следует поставить python3 (напомню, что описание для определенной связки. Если работаете на 2.х-версии, то вы молодец, вам это не нужно делать).
sudo apt-get install python3
6) Поставим nginx
sudo apt-get install nginx
7) Ставим третий pip.
sudo apt-get install python3-setuptools?

sudo apt install python3-pip
!!!!sudo easy_install3 pip
8) Virtualenv
установим само виртуальное окружение
sudo pip3 proxy 109.126.3.245:1989 install  virtualenv!!!pip3 install virtualenv #если pip не хочет, можете поставить командой easy_install3 virtualenv
sudo mkdir /opt/myenvsudo chown user:user /opt/myenv
virtualenv /opt/myenv   # myenv можете заменить на любое другое имя
user@u_18_s:~$ virtualenv /opt/myenvUsing base prefix '/usr'New python executable in /opt/myenv/bin/python3Also creating executable in /opt/myenv/bin/pythonInstalling setuptools, pip, wheel...done.user@u_18_s:~$
source /opt/myenv/bin/activate # активируем виртуальное окружение. После этого в начале строки консоли должен появиться маркер (myenv)
(myenv) user@u_18_s:~$
Далее внутри виртуального окружения ставим необходимый пакет программ
9) Ставим django и gunicorn.


(myenv) user@u_18_s:~$ pip3 install django gunicorn

 предварительно настроить прокси !!!
pip install django gunicorn
__________________________________________(myenv) user@u_18_s:~$ pip install django gunicorn
Collecting django
  Downloading https://files.pythonhosted.org/packages/51/1a/e0ac7886c7123a03814178d7517dc822af0fe51a72e1a6bff26153103322/Django-2.1-py3-none-any.whl (7.3MB)
    100% |████████████████████████████████| 7.3MB 4.5MB/s
Collecting gunicorn
  Downloading https://files.pythonhosted.org/packages/8c/da/b8dd8deb741bff556db53902d4706774c8e1e67265f69528c14c003644e6/gunicorn-19.9.0-py2.py3-none-any.whl (112kB)
    100% |████████████████████████████████| 122kB 11.1MB/s
Collecting pytz (from django)
  Downloading https://files.pythonhosted.org/packages/30/4e/27c34b62430286c6d59177a0842ed90dc789ce5d1ed740887653b898779a/pytz-2018.5-py2.py3-none-any.whl (510kB)
    100% |████████████████████████████████| 512kB 8.9MB/s
Installing collected packages: pytz, django, gunicorn
Successfully installed django-2.1 gunicorn-19.9.0 pytz-2018.5
_________________________________________
На этом все установки закончились. Теперь перейдем к тестам и запуску.
10) Создадим проект
Все стандартно: перейдем в окружение, если еще не там
cd /opt/myenv
source bin/activate
и
django-admin.py startproject myproject
перейдем в папку проекта
cd myproject
11) Тест gunicorn
теперь именно из папки проекта (там, где лежит manage.py) запускаем gunicorn
gunicorn myproject.wsgi:application --bind 111.222.333.44:8000  #пишете ваш ip
Теперь в строке вашего браузера наберите 111.222.333.44:8000 #пишете ваш ip
Должна появиться стартовая страница django "It worked!"
Если работает, я радуюсь вместе с вами.

Получаем ошибку:

(myenv) user@u_18_s:/opt/myenv/myproject$ gunicorn myproject.wsgi:application --bind 10.240.230.60:8000[2018-08-10 11:02:30 +0000] [3218] [INFO] Starting gunicorn 19.9.0[2018-08-10 11:02:30 +0000] [3218] [INFO] Listening at: http://10.240.230.60:8000 (3218)[2018-08-10 11:02:30 +0000] [3218] [INFO] Using worker: sync[2018-08-10 11:02:30 +0000] [3221] [INFO] Booting worker with pid: 3221Invalid HTTP_HOST header: '10.240.230.60:8000'. You may need to add '10.240.230.60' to ALLOWED_HOSTS.Bad Request: /Invalid HTTP_HOST header: '10.240.230.60:8000'. You may need to add '10.240.230.60' to ALLOWED_HOSTS.Bad Request: /favicon.ico

edit this:
(myenv) user@u_18_s:/opt/myenv/myproject/myproject$ vi settings.py

change to:

ALLOWED_HOSTS = ['*']

start again ok!

myenv) user@u_18_s:/opt/myenv/myproject$ gunicorn myproject.wsgi:application --bind 10.240.230.60:8000



start again ok!

12) Статика
К сожалению, статика к нашему проекту еще не подключена. И вы можете в этом убедиться, сделав python manage.py syncdb

2018!
$python manage.py syncdb is deprecated and not supported now. So instead of this follow below instructions..
Whatever model you have created: First run:
$python manage.py makemigrations
After running this command you model will be reflected in a migration.
Then you have to run:
$python manage.py migrate
(myenv) user@u_18_s:/opt/myenv/myproject$ python manage.py migrateOperations to perform:  Apply all migrations: admin, auth, contenttypes, sessionsRunning migrations:  Applying contenttypes.0001_initial... OK  Applying auth.0001_initial... OK  Applying admin.0001_initial... OK  Applying admin.0002_logentry_remove_auto_add... OK  Applying admin.0003_logentry_add_action_flag_choices... OK  Applying contenttypes.0002_remove_content_type_name... OK  Applying auth.0002_alter_permission_name_max_length... OK  Applying auth.0003_alter_user_email_max_length... OK  Applying auth.0004_alter_user_username_opts... OK  Applying auth.0005_alter_user_last_login_null... OK  Applying auth.0006_require_contenttypes_0002... OK  Applying auth.0007_alter_validators_add_error_messages... OK  Applying auth.0008_alter_user_username_max_length... OK  Applying auth.0009_alter_user_last_name_max_length... OK  Applying sessions.0001_initial... OK


Then run server:
$python manage.py runserver



затем перезапустить gunicorn 

(myenv) user@u_18_s:/opt/myenv/myproject$ python manage.py runserver 10.240.230.60:8000Performing system checks...
System check identified no issues (0 silenced).August 10, 2018 - 11:18:55Django version 2.1, using settings 'myproject.settings'Starting development server at http://10.240.230.60:8000/Quit the server with CONTROL-C.[10/Aug/2018 11:19:11] "GET / HTTP/1.0" 404 74[10/Aug/2018 11:19:18] "GET /admin HTTP/1.0" 301 0[10/Aug/2018 11:19:18] "GET /admin/ HTTP/1.0" 302 0[10/Aug/2018 11:19:18] "GET /admin/login/?next=/admin/ HTTP/1.0" 200 1819[10/Aug/2018 11:19:18] "GET /static/admin/css/base.css HTTP/1.0" 404 99[10/Aug/2018 11:19:18] "GET /static/admin/css/responsive.css HTTP/1.0" 404 105[10/Aug/2018 11:19:18] "GET /static/admin/css/login.css HTTP/1.0" 404 100


и зайти в админку (ваш_ip:8000/admin). Будет все без стилей.











Разместим статику в папке проекта.
Открываем settings.py либо в вашем любимом редакторе, либо через nano.
nano settings.py
и прописываем static_root
STATIC_ROOT = '/opt/myenv/myproject/static/'
сохраняем и выходим
из папки проекта запускаем
python manage.py collectstatic
в папке проекта появится папка с именем static
(myenv) user@u_18_s:/opt/myenv/myproject$ python manage.py collectstatic
119 static files copied to '/opt/myenv/myproject/static'.(myenv) user@u_18_s:/opt/myenv/myproject$ ls /opt/myenv/myproject/staticadmin


13) Настроим nginx
перейдем по следующему пути
cd /etc/nginx/sites-available/
открываем файлик default
nano default
Удаляем оттуда все и пишем
server {
    listen 80;
    server_name 111.222.333.44; #либо ip, либо доменное имя
    access_log  /var/log/nginx/example.log;

    location /static/ {
        root /opt/myenv/myproject/;
        expires 30d;
    }

    location / {
        proxy_pass http://127.0.0.1:8000; 
        proxy_set_header Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
  }
Сохраняем, выходим.
14) "Поехали!" (с)
возвращаемся в папку проекта
cd /opt/myenv/myproject
Перезапустим nginx
sudo service nginx restart
Запустим gunicorn
gunicorn myproject.wsgi:application


(myenv) user@u_18_s:/opt/myenv/myproject$ gunicorn myproject.wsgi:application   [2018-08-10 11:42:27 +0000] [1637] [INFO] Starting gunicorn 19.9.0
[2018-08-10 11:42:27 +0000] [1637] [INFO] Listening at: http://127.0.0.1:8000 (1637)
[2018-08-10 11:42:27 +0000] [1637] [INFO] Using worker: sync
[2018-08-10 11:42:27 +0000] [1640] [INFO] Booting worker with pid: 1640

В браузере набираем 111.222.333.44
It worked!



15) Supervisor.
Чтобы наше приложение стратовало после любого непредвиденного ребута или сбоя, нам нужно обзавестись supervisor-ом.
Установим supervisor
apt-get install supervisor
Создадим конфиг файл для gunicorn
cd /opt/myenv/myproject/myproject #лучше делать именно в каталоге с settings.py
touch gunicorn.conf.py
Открываем на редактирование
nano gunicorn.conf.py
или

vi /opt/myenv/myproject/myproject/gunicorn.conf.py


Вносим
bind = '127.0.0.1:8000'
workers = 3
user = "nobody" ## changed to "user" fo me

создадим конфиг файл для супервизора
cd /etc/supervisor/conf.d/
touch myproject.conf

Откроем
nano myproject.conf
или
sudo vi  /etc/supervisor/conf.d/myproject.conf



Внутрь внесем
[program:myproject]
command=/opt/myenv/bin/gunicorn myproject.wsgi:application -c /opt/myenv/myproject/myproject/gunicorn.conf.py
directory=/opt/myenv/myproject
user=nobody ## changed to user fo me

autorestart=true
redirect_stderr=true
Команды для supervisor
sudo supervisorctl rereadsudo supervisorctl update
sudo supervisorctl status myproject
sudo supervisorctl restart myproject
После старта роверяем свой сайт в браузере. Должен работать.
Останавливаем машину
sudo shutdown -r now
Или можно просто вырубить инстанс
Заводим и проверяем. Все должно работать.



Create django addmin


source /opt/myenv/bin/activate
python /opt/myenv/myproject/manage.py createsuperuser

user@u_18_s:~$ source /opt/myenv/bin/activate
(myenv) user@u_18_s:~$ cd /opt/myenv/myproject
(myenv) user@u_18_s:/opt/myenv/myproject$ python manage.py createsuperuser
Username (leave blank to use 'user'): admin
Email address:
Password:
Password (again):
Superuser created successfully.


заходим на : ..../admin

получаем 
OperationalError at /admin/login/ attempt to write a readonly database
решение было :

vi /opt/myenv/myproject/myproject/gunicorn.conf.py

Вносим
bind = '127.0.0.1:8000'
workers = 3
user = "nobody" ## changed to "user" fo me=======================================================
sudo vi  /etc/supervisor/conf.d/myproject.conf

Внутрь внесем
[program:myproject]
command=/opt/myenv/bin/gunicorn myproject.wsgi:application -c /opt/myenv/myproject/myproject/gunicorn.conf.py
directory=/opt/myenv/myproject
user=nobody ## changed to user fo me

autorestart=true
redirect_stderr=true======================================================
Обязательные правки для боевого.
1) в settings.py
DEBUG = False  #так должно быть
2) Но при debug = False обязательно нужно указать ALLOWED_HOSTS­. Это, по идее, должен быть ваш домен
3) если вы просто скопировали проект из другого места, то лучше заменить SECRET_KEY
=======================================================
Какие еще могут появиться проблемы?
Невероятные кейсы
Кейс 1
Если вы запустили gunicorn, а после этого вышли из терминала, вспомнили, что хотели еще небольшие правки внести. Зашли снова в терминал. Внесли правки. Перезапустили nginx. Запускаете gunicorn, а он выдет вам следующее:
Retrying in 1 second… # несколько раз
Can't connect to ваш_IP
Есть вероятность, что просто ваш процесс gunicorn уже запущен.
Проверяем.
ps xa | grep gunicorn
если появилась портянка с гоникорнами, то так и есть
убиваем процесс
killall gunicorn
затем запускаем.
Кейс 2
Если вы создали дроплет и зашли по ключу, а потом этот дроплет кикнули, а потом снова создали ))))), есть вероятность, что вам дадут тот же IP. В этом случае при коннекте по ssh может ругнуться на ошибку. Не беспокойтесь! Откройте known_hosts (данный файл содержит список адресов и соответствующих им публичных ключей. лежит в .ssh на вашем компьютере) и почистите его. (Не самый лучший способ, если у вас несколько уже "настроенных" пар ключей).