Мета цього посту - є описати один з базових і простих способів деплоя Django-проекту на чисту Ubuntu.
Серйозні production системи звичайно ж зажадають більш точного налаштування. Якщо говорити про великі проекти, то там піде мова про контейнери, велику автоматизацію, більше фокусу на безпеку і тонке налаштування кожної софтверної складової.
Майже напевно способи деплоя, спосіб вказівки налаштувань в проекті буде відрізнятися, а також підхід до роботи з статикою і медіа файлами буде іншим, наприклад будуть використані CDN, AWS S3 та інше.
Однак, в цьому пості я хочу допомогти тим, хто розбирається з Django, можливо прийшов з PHP і шукає інформацію про те, з чого почати і як налаштувати свій перший product сервер з django-проектом, який до цього запускався тільки на локальній машині за допомогою python manage.py runserver
Крок 1. Вибираємо хостинг
- DigitalOcean - VPS від $ 5 за 512мб оперативки і 20Гб місця на диску.
- Linode.com - VPS від $ 10 за 2гб оперативки і 24гб місця на диску.
- Webfaction.com - Shared або VPS в залежності від тарифного плану. 10 $ - 1Гб оперативки, 100 ГБ SSD диска. Зручна панель, яка допоможе хостити будь-які види сайтів, управляти поштою і DNS. Один з перших хостингів, які хостів не тільки php сайти. У випадку з Webfaction, вам не доведеться займатися налаштуванням сервера, а бази даних, веб-сервер не входять в ваш тариф по оперативної пам'яті.
Крок 2. Налаштування сервера
Для запуску python-проекту нам буде потрібно:
python 3.5 за замовчуванням не йде в установці Убунту, тому ми його ставимо з кастомними ppa-сховища.
nginx - веб-сервер, який буде проксіровать запити до нашого django-додатком, а також обслуговувати віддачу статичних і медіа файлів.
postgresql - найбільш зручна реляційна СУБД, з безліччю різних можливостей.
supervisor - система управління процесами. Вона буде запускати наш python-проект, перезапускати в разі потреби і саме з його допомогою ми будемо контролювати і управляти роботою запущених з його допомогою додатків.
rabbitmq - брокер повідомлень. Отримує і перенаправляє повідомлення. Потрібен для зберігання черги повідомлень, яка знадобиться на випадок використання celery для асинхронного виконання ресурсоємних функцій django-проекту.
git - система контролю версій. За замовчуванням Ubunutu комплектується дуже старою версією Гіта, тому ми його ставимо з ppa-сховища.
Крім того, ми поставимо кілька зручних утиліт на зразок mc, htop і smem.
Всі команди настройки в даному прикладі слід вводити від користувача root. Для цього рекомендую запустити bash від імені суперкористувача:
і ввести ваш пароль.
Додамо потрібні джерела пакетів.
Оновимо дані з репозиторіїв, а потім відновимо все встановлене у яких доступні оновлення
Встановимо часовий пояс сервера, а також виберемо російську локаль
Встановимо пакунки пов'язані з Python3
Встановимо postgresql і деякі допоміжні утиліти і бібліотеки
Тепер створимо користувача під яким у нас буде запущений наш проект. Назвемо його sites.
Для нього ми створимо каталог / sites, сгенерируем rsa ключ, який може знадобитися внести в настройки github / bitbucket як deploy key, щоб дозволити серверу read-only доступ до репозторію для установки вашого проекту.
Готово. Ми підготували сервер, створили користувача і каталог в якій будуть жити ваші проекти і можемо приступити до запуску вашого проекту!
Всі команди, які були перераховані вище я зібрав в окремий bash-скрипт, який можна завантажити і запустити на чистій установці Ubuntu 16.
Для цього замість всіх перерахованих вище команд вбийте ці дві: одна для того, щоб завантажити файл, друга - щоб запустити його.
Пам'ятайте, що ці запускати його треба від root.
Цей скрипт зробить за вас початкову настройку сервера.
Раз ми закінчили з установкою і налаштуванням сервера, тепер можна зайнятися деплоем django-проекту.
Крок 3. Деплой Django-проекту
Каталог / sites буде містити підкаталоги, в яких ми будемо розміщувати наші django-проекти.
Створимо перший каталог для нашого django-проекту.
Всі команди тут ми виконуємо від рута. Так як файли проекту повинні належати користувачеві від якого ми запускаємо проект, а саме sites, то після всіх маніпуляцій з установки, ми змінимо власника файлів і каталогів на потрібний.
В каталозі tutorial ми створили 4 каталогу для логів, статичних файлів, медіа файлів і для конфігов. В останній ми покладемо файли з конфіга для цього проекту для supervisor і nginx
Тепер створимо віртуальне оточення для python-проекту.
Віртуальні оточення (virtualenv) потрібні для того, щоб ізолірвоать встановлені python-пакети для кожного проекту. За допомогою virtualenv, можна робити безліч установок різних пітонячіх проектів і вони не будуть заважати один одному, якщо одному потрібно одна версія якогось пакета, а іншому - інша.
Віртуальне оточення в каталозі env створено.
Створимо конфігураційні файли.
Я вважаю за краще зберігати їх в каталозі проекту, щоб можна було подивитися все пов'язані файли до проекту в одному місці, а не шукати їх по всьому сервера. Для цього я і пропоную використовувати configs підкаталог в каталозі проекту.
Наведу приклад конфіга nginx.conf:
В даному конфіги варто звернути увагу на те, що django-проект буде запущений на порте 9023, а логи веб-сервера будуть зберігатися в файлі logs / nginx_access.log
Тепер конфиг супервізора, supervisor.conf
До того як ми застосуємо ці конфіги, нам треба створити сам проект.
Як видно з конфіга supervisor.conf я пропоную зберігати сам проект в каталозі project (/ sites / tutorial / project).
В рамках цієї статті, ми створимо django-проект за допомогою утиліти django-admin.py
Для цього нам потрібно активувати віртуальне оточення і поставити туди Django, а заодно gunicorn, який буде запускати наш проект.
Тепер у віртуальному оточенні проекту є утиліта django-admin. Створимо базовий Django-проект.
Після виконання цієї команди у нас з'явився каталог project.
Тепер можна застосувати наші конфіги.
Цими рядками ми зробили символічні посилання (симлінк) до наших конфігов в тих каталогах, де nginx і supervisor очікують побачити доступні конфіги додатків. Для supervisor важливо, щоб файл з конфіг мав розширення .conf. В іншому випадку він його проігнорує. Для nginx це не важливо, але для однаковості я пропоную в обох випадках мати однаковий формат назв.
Тепер, коли файли створені, треба щоб обидва додатки про них дізналися.
Тепер nginx буде проксіровать запити до вашого додатком на порт 9023, а supervisor намагатиметься його запустити.
Зверну вашу увагу на те, що для реального проекту потрібно зробити ще кілька кроків, наприклад створити базу в postgres, в конфіги django-проекту прописати шляхи до статичних файлів і URL для них. В даному випадку настройки будуть мати такий вигляд:
Після того як ці настройки будуть вказані можна зібрати статичні файли в каталог зі статикою і nginx зможе їх віддавати.
Щоб зробити це, при активованому віртуальному оточенні проекту (source / sites / tutorial / env / bin / activate) слід виконати наступні команди:
Щоб переконатися в працездатності сайту, відкрийте його в командному браузері:
Ви побачите Django-проект в demo-режимі.
Щоб відкрити сайт зі свого комп'ютера, вам швидше за все доведеться змінити налаштування nginx, прописавши в розділі server_name IP сервера.
Бонус: для тих хто дочитав статтю до кінця, другу частину статті я виділив в другій скрипт, який можна запустити після скрипта установки. Він виконає все базову настройку за вас. Вам залишиться тільки протестувати роботу сайту.
Запустити скрипт на сервері можна відразу після його завантаження!
Під час прогону цих двох скриптів я натрапив на помилки пов'язані з тим, що установка через apt заблокована іншим що виконуються процесом. Це пов'язано з тим, що в Убунту включені автоматичні оновлення і в списку процесів (команда ps aux) було видно процес unattended-upgr. Якщо ви його там побачите - дочекайтеся закінчення його роботи і можете запускати скрипт установки сервера. До скрипту установки проекту це не відноситься.
Є питання по статті? Задайте їх в коментарях!