Разворачиваем Django-проект на Digital Ocean

В этой статье приведено пошаговое руководство по развертыванию проектов Django на сервере DigitalOcean.

DigitalOcean является одним из ведущих VPS провайдеров, и их тарифные планы очень дешевые — всего от 5 долларов в месяц.

Если у вас нет учетной записи, воспользуйтесь этой ссылкой, чтобы зарегистрироваться, и вы получите бесплатный баланс в размере 100 долларов США на 60 дней. Сможете купить пару выделенных серверов, задеплоить свой проект, потестировать, может и намайните че за 2 месяца, если знаете как.

Git-репозиторий Django-проекта, используемый в этой статье, доступен здесь. Но вы также можете использовать свой собственный проект, если хотите.

Создание дроплета

Войдите в свою учетную запись DigitalOcean, и вы попадете на страницу панели инструментов.

Нажмите кнопку «Create» в верхней части страницы и выберите «Droplets».

На странице «Droplets creation» в разделе «Choose an image» выберите Ubuntu 16.04.

Выберите необходимую память под дроплет:

Выберите регион, в котором будет расположен сервер:

Дополнительные параметры и ключи SSH являются необязательными.

Дайте название вашему дроплету и нажмите кнопку «Create».

После создания дроплета вы получите электронное письмо с учетными данными, необходимыми для входа на сервер.

Подключение к серверу

Для подключения к серверу запустите терминал и введите следующую команду:

$ ssh root@167.99.235.81

Примечание. Пользователи Windows могут использовать PuTTY SSH-клиент для подключения к серверу.

Если вы входите в систему в первый раз, вам будет предложено изменить пароль.

Создание пользователя с ограниченным доступом

Вы никогда не должны запускать приложения как суперпользователь, потому что если злоумышленник проник в ваше приложение, он сразу же получает доступ ко всей системе как суперпользователь.

Кроме того, суперпользователь является очень мощным и, таким образом, может выполнять любые действия, даже если это приведет к поломке системы. Хотите отформатировать диски? или удалить директорию /usr, просто выполните команду, и все готово. Когда вы суперпользователь, система предполагает, что вы знаете, что делаете.

По этой причине большинство приложений в Linux запускаются как пользователи системы с ограниченным доступом.

Чтобы добавить дополнительный уровень безопасности, некоторые дистрибутивы поставляются с отключенным доступом root. Для выполнения действий администратора вам нужно будет повысить свои привилегии с помощью команды sudo.

Чтобы создать нового пользователя введите следующую команду:

$ adduser django

Вам будет предложено ввести пароль и некоторые дополнительные данные.

Затем добавьте пользователя в группу sudo, выполнив следующую команду:

$ gpasswd -a django sudo

Теперь этот пользователь имеет возможность выполнять команды администратора.

Для входа в систему с использованием только что созданного пользователя введите su, а затем имя пользователя:

$ su django

Измените свой текущий рабочий каталог на домашний каталог пользователя django, используя команду cd:

$ cd

В следующем шаге мы обновим нашу систему и установим некоторые необходимые пакеты.

Установка PIP, PostgreSQL и Nginx

Для начала обновите систему с помощью следующей команды:

$ sudo apt-get update
$ sudo apt-get upgrade

Ubuntu 16.04 поставляется с предустановленным Python 3.5, поэтому нам не нужно устанавливать Python. Однако вам нужно установить pip.

PIP

Для установки pip введите следующее:

$ sudo apt-get install python3-pip

Virtualenv

Как и в процессе разработки, мы будем использовать virtualenv для создания виртуальной среды. Установите virtualenv, набрав:

$ pip3 install virtualenv

PostgreSQL

PostgreSQL является наиболее предпочтительной базой данных в сообществе Django. Чтобы установить его, наберите:

$ sudo apt-get install postgresql postgresql-contrib

После установки сервер базы данных запустится автоматически. Чтобы проверить состояние сервера, наберите:

$ sudo service postgresql status

Вывод будет таким:

● postgresql.service - PostgreSQL RDBMS
   Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
   Active: active (exited) since Fri 2018-05-18 13:33:21 UTC; 1h 54min ago
 Main PID: 20416 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/postgresql.service

May 18 13:33:21 djangobin-ubuntu systemd[1]: Starting PostgreSQL RDBMS...
May 18 13:33:21 djangobin-ubuntu systemd[1]: Started PostgreSQL RDBMS.
May 18 13:33:26 djangobin-ubuntu systemd[1]: Started PostgreSQL RDBMS.

Nginx

Nginx — это высокопроизводительный веб-сервер с очень низким потреблением ресурсов. Мы будем использовать Nginx в качестве прокси-сервера и для обслуживания статических файлов. Чтобы установить его пропишите:

$ sudo apt-get install nginx

После установки Nginx запустится автоматически. Мы можем проверить состояние сервера Nginx, набрав:

$ sudo service nginx status

Вывод будет примерно таким:

● nginx.service - A high-performance web server <strong>and</strong> a reverse proxy server
   Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-05-18 15:17:51 UTC; 9min ago
 Main PID: 22691 (nginx)
   CGroup: /system.slice/nginx.service
           ├─22691 nginx: master process /usr/sbin/nginx -g daemon on; master_process on
           └─22692 nginx: worker process                           

May 18 15:17:51 djangobin-ubuntu systemd[1]: Starting A high performance web server <strong>and</strong> a reverse proxy server...
May 18 15:17:51 djangobin-ubuntu systemd[1]: Started A high performance web server <strong>and</strong> a reverse proxy server.

Мы также можем проверить, работает ли Nginx или нет, напрямую запросив у него страницу. Откройте браузер и укажите адрес http://167.99.235.81/ (замените 167.99.235.81 на свой IP). Вы должны получить страницу, похожую на эту:

RabbitMQ

Установите RabbitMQ набрав следующий запрос:

$ sudo apt-get install rabbitmq-server

Создание базы данных и пользователя

Когда вы устанавливаете PostgreSQL, он автоматически создает пользователя с именем postgres для выполнения задач администратора.

Прежде чем что-то делать, давайте войдем в систему через эту учетную запись написав psql и создадим новую базу данных.

$ sudo -u postgres psql

Вывод будет примерно таким:

psql (9.5.12)
Type "help" for help.

postgres=#
postgres=#
Create a new database by typing:

postgres=# CREATE DATABASE djangobin;
CREATE DATABASE
postgres=#
Next, create a new user by typing:

postgres=#
postgres=# CREATE ROLE db_user WITH LOGIN PASSWORD 'password' CREATEDB;
CREATE ROLE
postgres=#
Finally, grant all privileges on database `djangobin` <strong>to</strong> `db_user`:

postgres=#
postgres=# GRANT ALL PRIVILEGES ON DATABASE djangobin <strong>TO</strong> db_user;
GRANT
postgres=#

Создание виртуальной среды и настройка проекта

Чтобы клонировать репозиторий, введите следующую команду:

$ git clone https://github.com/overiq/djangobin.git

Так вы создадите каталог с именем djangobin внутри вашего текущего рабочего каталога. Измените текущий рабочий каталог на djangobin используя команду cd и создайте новую виртуальную среду:

$ cd djangobin
$ virtualenv env

После этого активируйте виртуальную среду и переместитесь в каталог django_project.

$ source env/bin/activate
$ cd django_project/

Затем установите зависимости из файла requirements.txt.

$ pip install -r requirements.txt

Поскольку мы используем базу данных PostgreSQL в разработке, нам нужно установить адаптер базы данных PostgreSQL для Python, который называется psycopg2.

$ pip install psycopg2

Создайте JSON-файл для хранения конфиденциальной конфигурации.

$ nano djangobin-secrets.json

И добавьте в него следующий код:

djangobin/django_project/djangobin-secrets.json

{
  "SECRET_KEY": "rj3vhyKiDRNmth75sxJKgS9JP8Gp7SpsS9xAlvBMTXW3Z6VTODvvFcV3TmtrZUbGkHBcs$",
  "DATABASE_NAME": "djangobin",
  "DATABASE_USER": "db_user",
  "DATABASE_PASSWORD": "password",
  "DATABASE_HOST": "127.0.0.1",
  "DATABASE_PORT": "5432",
  "EMAIL_HOST_USER": "apikey",
  "EMAIL_HOST": "smtp.sendgrid.net",
  "EMAIL_HOST_PASSWORD": "TW.qQecgRphQDa3TkLLlj18pqA.5Xrjod3G8XXojH45W4loxAsktdY3Nc",
  "EMAIL_PORT": 587
}

Обязательно замените учетные данные базы данных и ключи API на свои собственные.

На этом этапе, если вы попытаетесь исполнить файл ./manage.py, вы получите ошибку, потому что Django не знает, где находится ваш файл настроек:

Укажите местоположение файла настроек временно с помощью команды export :

export DJANGO_SETTINGS_MODULE = django_project.settings.prod


С помощью этой команды мы перевели наше приложение в рабочий режим.

Для создания всех необходимых таблиц в базе данных djangobin выполните команду migrate:

$ ./manage.py migrate

Создайте суперпользователя для проекта, набрав:

$ ./manage.py createsuperuser
Username (leave blank to use 'django'): admin
Email address: admin@mail.com
Password:
Password (again):
Superuser created successfully.

Затем создайте гостевого пользователя и установите для него атрибут is_active=False, чтобы учетную запись нельзя было использовать для входа.

$ ./manage.py createsuperuser
Username (leave blank to use 'django'): guest
Email address: guest@mail.com
Password:
Password (again):
Superuser created successfully.
$
$
$ ./manage.py shell
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
>>> from django.contrib.auth.models import User
>>>
>>> u = User.objects.get(username="guest")
>>>
>>> u.is_active
True
>>>
>>> u.is_active = False
>>>
>>> u.save()
>>>
>>> u.is_active
False
>>>

Как было сказано ранее, мы будем обслуживать статические файлы через сервер Nginx. Чтобы собрать все статические файлы проекта из каталога static, введите следующую команду:

$ ./manage.py collectstatic

Gunicorn

Nginx начнет работать и будет обслуживать статические файлы. Тем не менее, он не может коммуницировать с приложением Django; ему нужно что-то, что будет запускать приложение, отправлять запросы в Интернет и возвращать ответы. Вот тогда Gunicorn вступает в игру.

Установите Gunicorn, набрав:

$ pip install gunicorn

Для работы сервера нашего приложения через Gunicorn введите следующую команду:

$ gunicorn -w 3 -b 0.0.0.0:8000 django_project.wsgi
[2018-05-19 07:07:32 +0000] [25653] [INFO] Starting gunicorn 19.8.1
[2018-05-19 07:07:32 +0000] [25653] [INFO] Listening at: http://0.0.0.0:8000 (25653)
[2018-05-19 07:07:32 +0000] [25653] [INFO] Using worker: sync
[2018-05-19 07:07:32 +0000] [25656] [INFO] Booting worker with pid: 25656
[2018-05-19 07:07:32 +0000] [25658] [INFO] Booting worker with pid: 25658
[2018-05-19 07:07:32 +0000] [25659] [INFO] Booting worker with pid: 25659
This command starts Gunicorn with three worker processes and binds the socket to `0.0.0.0` address. By default, Gunicorn only listens on the local interface (i.e `127.0.0.1`), which means you can't access your work from other computers on the network. To tell Gunicorn to listen on all interfaces bind the socket to `0.0.0.0`.

Откройте браузер и перейдите по адресу http://167.99.235.81:8000/. Вы должны увидеть такую ​​страницу:

Наше приложение, похоже, не работает. Так получается, потому что мы еще не обслуживаем статические файлы.

Настройка Nginx

Gunicorn запущен и работает, теперь нам нужно настроить Nginx для передачи ему запросов.

Начните с создания файла конфигурации сервера в  каталоге /etc/nginx/sites-available/:

$ sudo nano /etc/nginx/sites-available/djangobin

Затем добавьте следующую конфигурацию в файл:

/etc/nginx/sites-available/djangobin

server {
    server_name 167.99.235.81;

    access_log off;

    location /static/ {
        alias /home/django/djangobin2/django_project/static/;
    }

    location / {
        proxy_set_header Host $http_host;
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header X-Forwarded-Host $server_name;
        proxy_set_header X-Real-IP $remote_addr;
        add_header P3P 'CP="ALL DSP COR PSAa PSDa OUR NOR ONL UNI COM NAV"';
    }
}

Замените 167.99.235.81 на свой IP и укажите путь к каталогу static , чтобы он соответствовал вашей файловой системе.

Чтобы включить эту конфигурацию, создайте symbolic-ссылку в папке sites-enabled.

$ sudo ln -s /etc/nginx/sites-available/djangobin /etc/nginx/sites-enabled/djangobin

Проверьте синтаксис файла конфигурации:

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Наконец, перезапустите сервер, чтобы изменения вступили в силу.

$ sudo service nginx restart

Теперь мы готовы проверить, все ли работает.

Прежде всего, запустите воркера celery вместе с самим celery, набрав:

$ celery -A django_project worker -l info -B

Нажмите Ctrl + Z, а затем пропишите bg и поместите процесс в фоновый режим. Затем запустите Gunicorn, набрав:

$ gunicorn -w 3 -b 127.0.0.1:8000 django_project.wsgi

Обратите внимание, что на этот раз мы привязываем сокет для прослушивания на локальном интерфейсе (т. е. 127.0.0.1), потому что на этот раз Nginx будет работать нелокально, а не с Gunicorn.

Откройте браузер и зайдите на http://167.99.235.81/. Вы должны увидеть стартовую страницу DjangoBin, которая выглядит следующим образом:

Если вы попытаетесь посетить страницу About или EULA, вы получите ошибку 404, поскольку эти страницы еще не существуют в базе данных. Для создания этих страниц войдите на сайт администратора Django, посетив сайт http://167.99.235.81/admin/.

Введите имя пользователя и пароль, которые мы создали ранее в этой главе.

Нажмите на ссылку «Добавить» перед «Flat pages» и добавьте страницу «About» и EULA следующим образом:

Пока мы занимаемся этим, давайте обновим доменное имя в фреймворке sites (django.contrib.sites), чтобы платформа Sitemap могла генерировать правильные ссылки.

Посетите страницу со списком сайтов по адресу http://<ваш_айпи_адрес>/admin/sites/site/. Нажмите на имя домена для редактирования и введите IP-адрес вашего сервера в поля «Имя домена» и «Отображаемое имя» следующим образом:

Все работает, как и ожидалось, но что произойдет, если gunicorn или celery по какой-то причине будут остановлены или DigitalOcean перезапустит ваш дроплет после некоторого технического обслуживания?

В этом случае пользователи увидят ошибку 502 Bad Gateway:

Мы можем предотвратить такие ошибки, используя инструмент мониторинга процессов, называемый Supervisor.

Процесс мониторинга с Supervisor

Supervisor — это инструмент, который позволяет нам отслеживать процессы. Его задача — убедиться, что определенные процессы продолжают работать. Если процесс завершается или по какой-либо причине погибает, Supervisor запустит его автоматически.

Установите Supervisor, введя следующую команду:

$ sudo apt-get install supervisor

Supervisor запустится автоматически после установки. Мы можем проверить его статус, набрав:

 $ sudo service supervisor status
 ● supervisor.service - Supervisor process control system for UNIX    Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)    Active: active (running) since Sat 2018-05-19 15:27:28 UTC; 1min 16s ago      Docs: http://supervisord.org  Main PID: 592 (supervisord)    CGroup: /system.slice/supervisor.service            └─592 /usr/bin/python /usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf May 19 15:27:28 djangobin-ubuntu systemd[1]: Started Supervisor process control system for UNIX. May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,830 CRIT Supervisor running a May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,831 WARN No file matches via  May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,847 INFO RPC interface 'super May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,847 CRIT Server 'unix_http_se May 19 15:27:28 djangobin-ubuntu supervisord[592]: 2018-05-19 15:27:28,848 INFO supervisord started 

С установленным Supervisor теперь у нас есть доступ к  команде echo_supervisord_conf для создания файлов конфигурации.

Файл конфигурации представляет собой файл в стиле Windows-INI, который определяет программу, которую нужно запустить, чтобы обрабатывать выходные данные, переменные среды для передачи в программы и так далее.

Когда Supervisor запускается, он автоматически считывает конфигурации из  каталога /etc/supervisor/conf.d.

Создайте новый файл конфигурации, набрав:

$ echo_supervisord_conf > ./djangobin.conf

А затем переместите его в  каталог /etc/supervisor/conf.d/ с помощью команды mv:

$ sudo mv djangobin.conf /etc/supervisor/conf.d/

Если вы откроете  файл djangobin.conf, вы обнаружите, что он содержит много разделов и комментариев (строки начинаются с ;). Удалите все разделы, кроме  раздела supervisor в верхней части файла.

Следующим шагом является добавление одного или нескольких разделов  [program:x], чтобы Supervisor знал, какие программы следует запускать и отслеживать. В разделе Х программы указывается произвольная уникальная метка, присваиваемая каждому разделу. Этот ярлык будет использоваться для управления программой.

В следующей таблице перечислены некоторые общие параметры, которые мы можем определить внутри раздела  [program].

опцияОписаниеобязательна?
commandЭта опция указывает путь к программе для запуска.да
directoryОна указывает каталог, в который будет обращаться супервизор cdдо запуска программынет
autostartЕсли установлено значение true, говорит Supervisor запускать программу при загрузке системы.нет
autorestartЕсли установлено значение, trueговорит Supervisor запускать программу, если она закрываетсянет
stdout_logfileФайл для хранения стандартного вывода процесса.нет
stderr_logfileФайл для хранения стандартной ошибки процесса.нет

Откройте  файл djangobin.conf и добавьте следующие три  раздела [program] в конец файла:

[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)

[program:gunicorn]
command=/home/django/djangobin2/env/bin/gunicorn --access-logfile - --workers 3 --bind 127.0.0.1:8000 django_project.wsgi:application
directory=/home/django/djangobin2/django_project
autostart=true
autorestart=true
stderr_logfile=/var/log/gunicorn.err.log
stdout_logfile=/var/log/gunicorn.out.log


[program:celery_worker]
command=/home/django/djangobin2/env/bin/celery -A django_project worker -l info
directory=/home/django/djangobin2/django_project
autostart=true
autorestart=true
stderr_logfile=/var/log/celery.err.log
stdout_logfile=/var/log/celery.out.log


[program:celery_beat]
command=/home/django/djangobin2/env/bin/celery -A django_project beat -l info
directory=/home/django/djangobin2/django_project
autostart=true
autorestart=true
stderr_logfile=/var/log/celery_beat.err.log
stdout_logfile=/var/log/celery_beat.out.log

Мы также хотим, чтобы Supervisor передавал переменные среды DJANGO_SETTINGS_MODULE всем трем процессам. Для этого добавьте опцию environment в конце  раздела [supervisord] следующим образом:

[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)
environment=DJANGO_SETTINGS_MODULE="django_project.settings.prod"


[program:gunicorn]
command=/home/django/djangobin2/env/bin/gunicorn --access-logfile - --workers 3 --bind 127.0.0.1:8000 django_project.wsgi:application
directory=/home/django/djangobin2/django_project
autostart=true
autorestart=true
#...

Скажите Supervisor, чтобы загрузил этот новый тип конфигурации следующими двумя командами:

$ sudo supervisorctl reread
celery_beat: available
celery_worker: available
gunicorn: available
$ sudo supervisorctl update
celery_beat: added process group
celery_worker: added process group
gunicorn: added process group

Вам придется выполнять эти две команды каждый раз, когда вы изменяете файл конфигурации.

Теперь все наши программы запущены и работают. В любой момент вы можете проверить статус программ, набрав:

$ sudo supervisorctl status
celery_beat                      RUNNING   pid 6027, uptime 1:44:03
celery_worker                    RUNNING   pid 6028, uptime 1:44:03
gunicorn                         RUNNING   pid 6029, uptime 1:44:03
supervisor>

Если мы запустим программу supervisorctl без каких-либо аргументов, она запустит интерактивную оболочку, которая позволит нам контролировать процессы, в настоящее время управляемые Supervisor.

 $ sudo supervisorctl
celery_beat                      RUNNING   pid 6027, uptime 1:48:42
celery_worker                    RUNNING   pid 6028, uptime 1:48:42
gunicorn                         RUNNING   pid 6029, uptime 1:48:42
supervisor>

Как видите, в интерактивном режиме supervisorctl начинает выводить состояния управляемых в данный момент программ.

Когда вы окажетесь внутри интерактивной оболочки, чтобы увидеть доступные команды, введите help:

supervisor> 
supervisor> help

default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail   
avail  fg        pid   remove  shutdown  status  update 
clear  maintail  quit  reread  signal    stop    version

supervisor>

Теперь мы можем остановить, запустить и перезапустить процесс, используя соответствующую команду с меткой программы.

supervisor> 
supervisor> stop gunicorn 
gunicorn: stopped
supervisor> 
supervisor> start gunicorn 
gunicorn: started
supervisor> 
supervisor> restart gunicorn 
gunicorn: stopped
gunicorn: started
supervisor>

Чтобы получить статус всех запущенных процессов, наберите status:

celery_beat                      RUNNING   pid 6027, uptime 5:51:00
celery_worker                    RUNNING   pid 6028, uptime 5:51:00
gunicorn                         RUNNING   pid 12502, uptime 0:02:06
supervisor>

Мы также можем просмотреть содержимое файла журнала, используя  команду tail:

supervisor> 
supervisor> tail gunicorn 
27.0.0.1 - - [20/May/2018:13:56:42 +0000] "GET / HTTP/1.0" 200 10327 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
127.0.0.1 - - [20/May/2018:13:56:42 +0000] "GET / HTTP/1.0" 200 10327 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"
127.0.0.1 - - [20/May/2018:13:56:43 +0000] "POST /GponForm/diag_Form?images/ HTTP/1.0" 404 92 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"
127.0.0.1 - - [20/May/2018:13:57:31 +0000] "GET / HTTP/1.0" 200 10327 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"

supervisor>

По умолчанию команда tail читает из stdout. Вот как мы можем читать stderr.

supervisor> 
supervisor> tail gunicorn stderr
[2018-05-20 17:29:28 +0000] [12492] [INFO] Worker exiting (pid: 12492)
[2018-05-20 17:29:28 +0000] [12493] [INFO] Worker exiting (pid: 12493)
[2018-05-20 17:29:28 +0000] [12490] [INFO] Worker exiting (pid: 12490)
[2018-05-20 17:29:29 +0000] [12487] [INFO] Shutting down: Master
[2018-05-20 17:29:29 +0000] [12502] [INFO] Starting gunicorn 19.8.1
[2018-05-20 17:29:29 +0000] [12502] [INFO] Listening at: http://127.0.0.1:8000 (12502)
[2018-05-20 17:29:29 +0000] [12502] [INFO] Using worker: sync
[2018-05-20 17:29:29 +0000] [12505] [INFO] Booting worker with pid: 12505
[2018-05-20 17:29:29 +0000] [12507] [INFO] Booting worker with pid: 12507
[2018-05-20 17:29:29 +0000] [12508] [INFO] Booting worker with pid: 12508

supervisor>

Наконец, мы можем остановить, запустить и перезапустить все процессы сразу следующим образом:

supervisor> 
supervisor> stop all
celery_beat: stopped
gunicorn: stopped
celery_worker: stopped
supervisor> 
supervisor> 
supervisor> start all
celery_beat: started
celery_worker: started
gunicorn: started
supervisor> 
supervisor> 
supervisor> restart all
celery_beat: stopped
gunicorn: stopped
celery_worker: stopped
celery_beat: started
celery_worker: started
gunicorn: started
supervisor>

Как только вы закончите, нажмите Ctrl + C или введите quit чтобы выйти из оболочки supervisorctl.

В настоящее время Supervisor контролирует все наши процессы. Если какой-либо процесс завершается по какой-либо причине, Supervisor запустит процесс автоматически.

В качестве теста попробуйте перезагрузить дроплет с помощью команды sudo reboot. Вы обнаружите, что все процессы будут запускаться автоматически при загрузке.

Поздравляем, вы успешно развернули проект DjangoBin.