Selfish, вопросы деплоймента

avm

Опубликован:  2018-04-15T09:58:55.322384Z
Отредактирован:  2018-04-16T03:26:35.498111Z
400
Продолжение пошагового описания процесса разработки web-приложения Selfish. Рассмотрены вопросы деплоймента. В результате выполненных действий приложение Selfish будет развёрнуто на виртуальном сервере под управлением Debian stretch в режиме production. Функциональные страницы приложения будут протестированы в браузере.

1. В предыдущих сериях

Selfish - web-приложение на базе Python3 и Flask. Начальная конфигурация Selfish
и последующие этапы разработки детально описаны в порядке следования в следующих топиках:

Все топики посвященные Selfish можно отфильтровать по метке selfish.

В этом описании будут рассмотрены вопросы деплоймента, смоделировано развёртывание приложения на виртуальный сервер под управлением Debian stretch в режиме production.

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

2. Набор необходимых инструментов

Для реализации задуманного мне потребуется:

  • компьютер с установленным и настроенным Debian stretch, в моём случае это LXDE-десктоп;
  • установленный и настроенный VirtualBox, установка и предварительная настройка программы описана в Debian stretch, установка VirtualBox;
  • установочный 64-х битный ISO-образ Debian stretch, мой выбор - netinst, его можно скачать с любого зеркала debian-cd;
  • Git, его можно установить из официального репозитория Debian stretch;
  • безлимитное соединение с сетью Интернет.

Поскольку устанавливаемый сервер будет виртуальным, я прикручу его к совершенно произвольному домену, который будет настроен на моей машине посредством /etc/hosts.

Так как приложение Selfish на текущий момент находится в стадии разработки, это описание будет моделировать возможный деплоймент и в будущем пригодится в качестве начального анализа при разработке автоматизированного решения для развёртывания приложения.

3. Установка и настройка базового сервера

Процесс установки базового сервера на виртуальную машину детально описан в Debian stretch, установка базового сервера на виртуальную машину. Для установки Selfish я полностью повторил все действия описанные по ссылке выше, при этом мой сервер имеет имя selfish и домен selfish.ru.

server-name

server-domain

Мой сервер установлен и доступен на ip-адресе 192.168.56.107.

sadmin@debian:~$ ping -c 5 192.168.56.107
PING 192.168.56.107 (192.168.56.107) 56(84) bytes of data.
64 bytes from 192.168.56.107: icmp_seq=1 ttl=64 time=0.390 ms
64 bytes from 192.168.56.107: icmp_seq=2 ttl=64 time=0.374 ms
64 bytes from 192.168.56.107: icmp_seq=3 ttl=64 time=0.434 ms
64 bytes from 192.168.56.107: icmp_seq=4 ttl=64 time=0.382 ms
64 bytes from 192.168.56.107: icmp_seq=5 ttl=64 time=0.453 ms

--- 192.168.56.107 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4083ms
rtt min/avg/max/mdev = 0.374/0.406/0.453/0.038 ms
sadmin@debian:~$ 

В окне сервера вхожу как root и устанавливаю sudo.

root@selfish:~# apt-get install sudo

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

root@selfish:~# usermod -a -G sudo,adm sadmin

Чтобы эти изменения вступили в силу перезагружаю сервер.

root@selfish:~# shutdown -r now

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

sakura

Следует обратить внимание, что приглашение командной строки моего виртуального сервера имеет вид:

sadmin@selfish:~$ 

А приглашение командной строки моей host-машины имеет вид:

sadmin@debian:~$

Это нужно иметь ввиду при чтении листингов выполняемых команд в этом описании далее.

4. Дополнительная настройка host-машины

Host-машина - это мой десктоп, на котором установлен VirtualBox, который в свою очередь предоставляет виртуальную машину, на которой и стоит мой базовый сервер. Чтобы host-машина имела возможность соединяться с виртуальной машиной в web-браузере посредством доменного имени, мне необходимо прописать выбранный домен в файле /etc/hosts своей host-машины. Открываю в консоли host-машины при помощи текстового редактора Nano этот файл.

sadmin@debian:~$ sudo nano /etc/hosts

И вписываю в этот файл одну строчку.

nano-etc-hosts

Сохраняю файл и выхожу. С этого момента домен selfish.ru на моей host-машине затенён моим виртуальным сервером, но поскольку в сети Интернет этот домен не имеет сервера в настоящее время, действие вполне допустимо.

Чтобы убедиться, что теперь домен связан с моим виртуальным сервером, просто попробую его попинговать.

sadmin@debian:~$ ping -c 5 selfish.ru
PING selfish.ru (192.168.56.107) 56(84) bytes of data.
64 bytes from selfish.ru (192.168.56.107): icmp_seq=1 ttl=64 time=0.405 ms
64 bytes from selfish.ru (192.168.56.107): icmp_seq=2 ttl=64 time=0.460 ms
64 bytes from selfish.ru (192.168.56.107): icmp_seq=3 ttl=64 time=0.411 ms
64 bytes from selfish.ru (192.168.56.107): icmp_seq=4 ttl=64 time=0.409 ms
64 bytes from selfish.ru (192.168.56.107): icmp_seq=5 ttl=64 time=0.340 ms

--- selfish.ru ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4092ms
rtt min/avg/max/mdev = 0.340/0.405/0.460/0.038 ms
sadmin@debian:~$ 

Можно приступать к деплойменту Selfish.

5. Установка дополнительных пакетов на сервер

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

  • postgresql;
  • libpq-dev;
  • redis-server;
  • gcc;
  • python3-venv и python3-dev;
  • git.

Все пакеты имеются в официальном репозитории Debian stretch и установить их можно одной командой.

sadmin@selfish:~$ sudo apt-get install postgresql libpq-dev redis-server gcc python3-venv python3-dev git

apt-get-install

Соглашаюсь и дожидаюсь полной установки всех пакетов.

6. Настройка пользователя PostgreSQL

Мне понадобится пользователь базы данных. Чтобы создать его вхожу пользователем postgres.

sadmin@selfish:~$ sudo -i -u postgres
postgres@selfish:~$ 

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

postgres@selfish:~$ createuser sadmin -P -d --interactive
Введите пароль для новой роли: 
Повторите его: 
Должна ли новая роль иметь полномочия суперпользователя? (y - да/n - нет) n
Новая роль должна иметь право создавать другие роли? (y - да/n - нет) n
postgres@selfish:~$ 

Пароль при вводе не отображается. Теперь нужно покинуть учётную запись postgres.

postgres@selfish:~$ exit
выход
sadmin@selfish:~$ 

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

sadmin@selfish:~$ createdb selfish
sadmin@selfish:~$ psql -U sadmin -d selfish
psql (9.6.7)
Введите "help", чтобы получить справку.

selfish=> 

Создаю ещё две базы данных и выхожу.

selfish=> CREATE DATABASE selfish_d;
CREATE DATABASE
selfish=> CREATE DATABASE selfish_t;
CREATE DATABASE
selfish=> \q
sadmin@selfish:~$ 

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

7. Рабочее пространство Selfish

Создаю каталог, в котором будут храниться файлы Selfish и вхожу в этот каталог.

sadmin@selfish:~$ mkdir -p workspace/selfish.ru
sadmin@selfish:~$ cd workspace/selfish.ru/
sadmin@selfish:~/workspace/selfish.ru$ 

Мне понадобится виртуальное окружение, создаю его.

sadmin@selfish:~/workspace/selfish.ru$ python3 -m venv venv
sadmin@selfish:~/workspace/selfish.ru$ 

Активирую виртуальное окружение.

sadmin@selfish:~/workspace/selfish.ru$ source venv/bin/activate
(venv) sadmin@selfish:~/workspace/selfish.ru$ 

Обновляю wheel.

(venv) sadmin@selfish:~/workspace/selfish.ru$ pip install --upgrade wheel
Collecting wheel
  Downloading wheel-0.31.0-py2.py3-none-any.whl (41kB)
    100% |████████████████████████████████| 51kB 282kB/s 
Installing collected packages: wheel
Successfully installed wheel-0.31.0
(venv) sadmin@selfish:~/workspace/selfish.ru$ 

Получаю исходные файлы Selfish с git-сервера github.com.

(venv) sadmin@selfish:~/workspace/selfish.ru$ git clone https://github.com/tgi-f/selfish.git
Клонирование в «selfish»…
remote: Counting objects: 226, done.
remote: Compressing objects: 100% (157/157), done.
remote: Total 226 (delta 63), reused 208 (delta 45), pack-reused 0
Получение объектов: 100% (226/226), 452.44 KiB | 398.00 KiB/s, готово.
Определение изменений: 100% (63/63), готово.
(venv) sadmin@selfish:~/workspace/selfish.ru$ 

Вхожу в каталог selfish.

(venv) sadmin@selfish:~/workspace/selfish.ru$ cd selfish/
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Устанавливаю зависимости, напоминаю, что у Selfish есть два файла: requirements-first.txt и requirements.txt, начинаю с первого файла.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ pip install -r requirements-first.txt 
Collecting psycopg2==2.7.4 (from -r requirements-first.txt (line 1))
  Downloading psycopg2-2.7.4.tar.gz (425kB)
    100% |████████████████████████████████| 430kB 1.4MB/s 
Skipping bdist_wheel for psycopg2, due to binaries being disabled for it.
Installing collected packages: psycopg2
  Running setup.py install for psycopg2 ... done
Successfully installed psycopg2-2.7.4
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Затем устанавливаю зависимости из второго файла.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ pip install -r requirements.txt
...
...
...
Successfully installed Flask-0.12.2 Flask-Assets-0.12 Flask-Login-0.4.1 Flask-Mail-0.9.1 Flask-Migrate-2.1.1 Flask-SQLAlchemy-2.3.2 Flask-Script-2.0.6 Flask-WTF-0.14.2 Jinja2-2.10 Mako-1.0.7 MarkupSafe-1.0 SQLAlchemy-1.2.5 WTForms-2.1 Werkzeug-0.14.1 alembic-0.9.8 amqp-2.2.2 billiard-3.5.0.3 blinker-1.4 celery-4.1.0 click-6.7 cssmin-0.2.0 itsdangerous-0.24 jsmin-2.2.2 kombu-4.1.0 python-dateutil-2.6.1 python-editor-1.0.3 pytz-2018.3 redis-2.10.6 six-1.11.0 validate-email-1.3 vine-1.1.4 webassets-0.12.1
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Для полноценного функционирования Selfish на сервере мне понадобятся ещё пара пакетов, устанавливаю Gunicorn.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ pip install gunicorn
Collecting gunicorn
  Downloading gunicorn-19.7.1-py2.py3-none-any.whl (111kB)
    100% |████████████████████████████████| 112kB 399kB/s 
Installing collected packages: gunicorn
Successfully installed gunicorn-19.7.1
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Устанавливаю Gevent, этот пакет нужен Guniconr-у, чтобы иметь возможность реализовать асинхронный рабочий процесс.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ pip install gevent
Collecting gevent
  Downloading gevent-1.2.2-cp35-cp35m-manylinux1_x86_64.whl (1.7MB)
    100% |████████████████████████████████| 1.7MB 384kB/s 
Collecting greenlet>=0.4.10 (from gevent)
  Downloading greenlet-0.4.13-cp35-cp35m-manylinux1_x86_64.whl (42kB)
    100% |████████████████████████████████| 51kB 2.2MB/s 
Installing collected packages: greenlet, gevent
Successfully installed gevent-1.2.2 greenlet-0.4.13
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Последний штрих, создаю ссылку на статику в корневом каталоге сайта.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ ln -s -T /home/sadmin/workspace/selfish.ru/selfish/selfish/static/ /home/sadmin/workspace/selfish.ru/static
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Можно приступать к восстановлению конфигурационного файла Selfish.

8. Конфигурация Selfish

Для конфигурации Selfish мне нужен почтовый ящик с паролем, с которого будут уходить регистрационный сообщения. Я буду использовать Yandex-почту для доменов и ящик robot@elardy.ru.

Копирую файл config.template.py с именем config.py.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ cp config.template.py config.py
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Открываю файл config.py в текстовом редакторе Nano и привожу к следующему виду.

import os

from datetime import timedelta


class Config:
    SECRET_KEY = 'yzJrznTwFOlcEk2Cw9EkZSK&LNP4BNvme4p=muZhPe*GgCcg4a'
    SITE_NAME = 'Selfish'
    PERMANENT_SESSION_LIFETIME = timedelta(hours=2)
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    CELERY_RESULT_BACKEND = 'redis://localhost:6379/0'
    CELERY_BROCKER_URL = 'redis://localhost:6379/0'
    CELERY_IMPORTS = ('selfish.tasks',)
    CELERY_TASK_RESULT_EXPIRES = timedelta(hours=1)
    MAIL_SERVER = 'smtp.yandex.ru'
    MAIL_PORT = 465
    MAIL_USE_SSL = True
    MAIL_USERNAME = 'robot@elardy.ru'    # ящик
    MAIL_PASSWORD = '######'             # пароль к ящику
    SELFISH_SUBJECT_PREFIX = '[Selfish] '
    SELFISH_SENDER = 'robot <robot@elardy.ru>'
    TOKEN_LENGTH = 1
    REQUEST_INTERVAL = 2

    @staticmethod
    def init_app(app):
        pass


class Development(Config):
    DEBUG = True
    ASSETS_DEBUG = True
    SEND_FILE_MAX_AGE_DEFAULT = 0
    SESSION_PROTECTION = None
    MAIL_DEBUG = True
    MAIL_SUPPRESS_SEND = True
    TOKEN_LENGTH = 0.1
    REQUEST_INTERVAL = 0.12
    SQLALCHEMY_DATABASE_URI = \
        'postgresql+psycopg2://{0}:{1}@localhost/selfish_d'.format(
            os.getenv('SDBU', 'sadmin'),
            os.getenv('SDBP', 'aa'))


class Testing(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = \
        'postgresql+psycopg2://{0}:{1}@localhost/selfish_t'.format(
            os.getenv('SDBU', 'sadmin'),
            os.getenv('SDBP', 'aa'))


class Production(Config):
    SEND_FILE_MAX_AGE_DEFAULT = int(timedelta(days=28).total_seconds())
    USERS_PER_PAGE = 30
    SQLALCHEMY_DATABASE_URI = \
        'postgresql+psycopg2://{0}:{1}@localhost/selfish'.format(
            os.getenv('SDBU', 'sadmin'),
            os.getenv('SDBP', 'aa'))


config = {'development': Development,
          'testing': Testing,
          'production': Production,
          'default': Production}

Относительно начального файла изменились свойства классов отвечающие за конфигурацию Celery и SQLAlchemy, а так же свойства определяющие параметры почты. Кроме этого внимание нужно обратить на словарь config в этом файле и на значение в его ключе default.

Создаю таблицы базы данных.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ python manage.py db upgrade
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> 2cb33e363edc, Create Account
INFO  [alembic.runtime.migration] Running upgrade 2cb33e363edc -> d1993d37afb0, Create User
INFO  [alembic.runtime.migration] Running upgrade d1993d37afb0 -> 2ca0d1617358, Modify Account
INFO  [alembic.runtime.migration] Running upgrade 2ca0d1617358 -> 632025f76e86, Create Permission
INFO  [alembic.runtime.migration] Running upgrade 632025f76e86 -> 35db70e39606, Modify User and Permission
INFO  [alembic.runtime.migration] Running upgrade 35db70e39606 -> 6c51a9cad634, Remove bonds
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Подключаюсь к базе данных selfish.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ psql -d selfish
psql (9.6.7)
Введите "help", чтобы получить справку.

selfish=> 

Убеждаюсь, что эта база данных теперь содержит таблицы и выхожу.

selfish=> \dt
               Список отношений
 Схема  |       Имя       |   Тип   | Владелец 
--------+-----------------+---------+----------
 public | accounts        | таблица | sadmin
 public | alembic_version | таблица | sadmin
 public | permissions     | таблица | sadmin
 public | users           | таблица | sadmin
(4 строки)

selfish=> \q
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Создаю администратора сайта.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ python manage.py create_root
Enter your username: support
Enter your email address: support@elardy.ru
Enter your password: 
Confirm the password: 
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Приложение сконфигурировано.

9. Каталог для временных файлов

Чтобы создать каталог для временных файлов Selfish создаю новый файл в каталоге /etc/tmpfiles.d при помощи текстового редактора Nano.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo nano /etc/tmpfiles.d/workspace.conf

И вписываю в этот файл одну строчку.

tmpfiles.d

Сохраняю файл и покидаю текстовый редактор. При первой же перезагрузке сервера будет автоматически создан каталог /run/selfish.ru, принадлежащий пользователю sadmin. В этом каталоге будут храниться временные файлы необходимые Selfish.

10. Автоматический запуск Selfish при старте сервера

Чтобы обеспечить автоматический запуск Selfish во время загрузки сервера мне понадобятся два юнита systemd. Первый юнит будет запускать дежурный процесс Celery. Второй юнит будет запускать сервер Gunicorn с необходимыми параметрами. Оба юнита буду создавать при помощи текстового редактора Nano.

Юнит запуска Celery создаю такой командой.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo nano /etc/systemd/system/celery-selfish.ru.service

Пишу в этот файл такой текст.

[Unit]
Description=celery worker for selfish.ru application
After=network.target
Requires=redis-server.service
After=redis-server.service

[Service]
User=sadmin
Group=sadmin
WorkingDirectory=/home/sadmin/workspace/selfish.ru/selfish
ExecStart=/home/sadmin/workspace/selfish.ru/venv/bin/celery worker \
           -A celery_worker.celery -l info \
           -P gevent --autoscale=16,4 \
           --pidfile=/run/selfish.ru/celery.pid

[Install]
WantedBy=multi-user.target
WantedBy=gunicorn-selfish.ru.service

Создаю юнит запуска Gunicorn.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo nano /etc/systemd/system/gunicorn-selfish.ru.service 

В этот файл пишу следующее.

[Unit]
Description=gunicorn instance to serve selfish.ru
After=network.target
Requires=celery-selfish.ru.service
After=celery-selfish.ru.service

[Service]
User=sadmin
Group=sadmin
WorkingDirectory=/home/sadmin/workspace/selfish.ru/selfish
ExecStart=/home/sadmin/workspace/selfish.ru/venv/bin/gunicorn \
           --workers 4 -k gevent \
           --worker-tmp-dir /run/selfish.ru/ \
           -p /run/selfish.ru/gunicorn.pid \
           --bind unix:/run/selfish.ru/selfish.ru.socket celery_worker:app

[Install]
WantedBy=multi-user.target

Включаю созданные юниты systemd. Первый.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo systemctl enable celery-selfish.ru.service 
Created symlink /etc/systemd/system/multi-user.target.wants/celery-selfish.ru.service → /etc/systemd/system/celery-selfish.ru.service.
Created symlink /etc/systemd/system/gunicorn-selfish.ru.service.wants/celery-selfish.ru.service → /etc/systemd/system/celery-selfish.ru.service.
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Второй.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo systemctl enable gunicorn-selfish.ru.service 
Created symlink /etc/systemd/system/multi-user.target.wants/gunicorn-selfish.ru.service → /etc/systemd/system/gunicorn-selfish.ru.service.
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Можно приступать к установке и настройке Nginx.

11. Установка и настройка Nginx

Устанавливаю Nginx.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo apt-get install nginxЧтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Будут установлены следующие дополнительные пакеты:
  fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0
  libjpeg62-turbo libnginx-mod-http-auth-pam libnginx-mod-http-dav-ext
  libnginx-mod-http-echo libnginx-mod-http-geoip
  libnginx-mod-http-image-filter libnginx-mod-http-subs-filter
  libnginx-mod-http-upstream-fair libnginx-mod-http-xslt-filter
  libnginx-mod-mail libnginx-mod-stream libtiff5 libwebp6 libxpm4 nginx-common
  nginx-full
Предлагаемые пакеты:
  libgd-tools fcgiwrap nginx-doc
НОВЫЕ пакеты, которые будут установлены:
  fontconfig-config fonts-dejavu-core libfontconfig1 libgd3 libjbig0
  libjpeg62-turbo libnginx-mod-http-auth-pam libnginx-mod-http-dav-ext
  libnginx-mod-http-echo libnginx-mod-http-geoip
  libnginx-mod-http-image-filter libnginx-mod-http-subs-filter
  libnginx-mod-http-upstream-fair libnginx-mod-http-xslt-filter
  libnginx-mod-mail libnginx-mod-stream libtiff5 libwebp6 libxpm4 nginx
  nginx-common nginx-full
обновлено 0, установлено 22 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 4 073 kБ архивов.
После данной операции, объём занятого дискового пространства возрастёт на 9 025 kB.
Хотите продолжить? [Д/н] 

Соглашаюсь и дожидаюсь завершения установки всех пакетов.

При помощи текстового редактора Nano создаю новый файл.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo nano /etc/nginx/sites-available/selfish.ru

Пишу в этот файл следующий текст.

server { 
    listen 80;
    server_name selfish.ru;

    location /static { 
        alias /home/sadmin/workspace/selfish.ru/static;
        expires 2419200;
        add_header Cache-Control "public";
    }

    location / {     
        proxy_set_header Host $host;
        proxy_pass http://unix:/run/selfish.ru/selfish.ru.socket;
    }
}

Создаю ссылку на этот файл.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo ln -s -T /etc/nginx/sites-available/selfish.ru /etc/nginx/sites-enabled/selfish.ru
(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ 

Деактивирую виртуальное окружение.

(venv) sadmin@selfish:~/workspace/selfish.ru/selfish$ deactivate
sadmin@selfish:~/workspace/selfish.ru/selfish$ 

И перезагружаю сервер.

sadmin@selfish:~/workspace/selfish.ru/selfish$ sudo shutdown -r now
Connection to 192.168.56.107 closed by remote host.
Connection to 192.168.56.107 closed.
sadmin@debian:~$ 

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

home

Welcome home!

 
Осталось: 63
Комментарии: