- 1. 1-қадам - Жүйені жаңарту
- 2. 4-қадам — Виртуалды ортаны орнату
- 3. 5-қадам — PostgreSQL драйверін орнату
- 4. 6-қадам – Жобаны құру
- 5. 7-қадам — Дерекқорға қосылуды орнату
- 6. 8-қадам — Дерекқорды тасымалдауды орындау
- 7. 9-қадам — Gunicorn орнату
- 8. 10-қадам — Статикалық файлдарды орнату
- 9. 11-қадам — Nginx орнату
- 10. 12-қадам — Супервайзерді конфигурациялау
- 11. Ескерту
Ubuntu 16.04 серверіне кіру [алдыңғы мақалалардың] бірінде конфигурацияланғаннан кейін (https://evileg.com/en/post/1/), сайтта жұмыс істеу үшін қажеттінің барлығын орналастыру уақыты келді. , атап айтқанда:
- Джанго
- Python тілінде веб-қосымшаларды әзірлеуге арналған фреймворк;
- PostgreSQL
- SQL деректер қоры;
- Gunicorn - UNIX жүйелеріне арналған Python тіліндегі WSGI HTTP сервері;
- Ngnix – HTTP сервері және кері прокси, пошта проксиі және жалпы мақсаттағы TCP/UDP проксиі;
- Supervisor – ұзақ жұмыс істейтін бағдарламаларды, атап айтқанда, бұзылулардан кейін автоматты түрде қайта іске қосылуы қажет сайттарды басқаруды айтарлықтай жеңілдететін процесс менеджері.
1-қадам - Жүйені жаңарту
Бар пакеттерді жаңартайық. Сіз ешқашан білмейсіз, жүйеде ескірген пакеттер бар.
sudo apt-get update sudo apt-get upgrade
2-қадам — Виртуалды ортаны орнатпай барлық қажетті пакеттерді орнату
Virtualenv арқылы пайдаланылмайтын барлық қажетті бумалардың бумасын орнатыңыз, атап айтқанда Python 3, PostgreSQL, Nginx.
sudo apt-get install python3-dev python3-setuptools libpq-dev postgresql postgresql-contrib nginx
Pip python3-setuptools бірге жеткізілетін easy_install3 утилитасы арқылы бөлек орнатуды аяқтадым, біріншіден, соңғы нұсқасы орнатылғандықтан, екіншіден, apt-get арқылы орнатылған болса, қателер болды. virtualenv ішінде бумаларды орнату кезінде.
sudo easy_install3 pip
3-қадам — Мәліметтер қорын және ДҚ пайдаланушысын құру
Ал енді PostgreSQL орнатылған кезде жасалатын sudo утилитасы арқылы postgres пайдаланушысына кеңейтілген құқықтар беретін мәліметтер базасы мен пайдаланушыны жасайық.
sudo -u postgres psql
Осы пәрменді орындағаннан кейін біз PostgreSQL консоліне өтеміз, онда біз қажетті дерекқорды және оның атынан Django қолданбасы осы дерекқорға қосылатын пайдаланушыны жасаймыз.
Мәліметтер қорын құрайық:
CREATE DATABASE myproject;
Пайдаланушыны жасайық:
CREATE USER myprojectuser WITH PASSWORD 'password';
Әрі қарай, жоба пайдаланушысын конфигурациялаңыз. Ол UTF8 кодтауын пайдаланады, өйткені Django да осы кодтауды пайдаланады және Python файлдарды UTF8 кодтауымен қатты кодтауды ұсынады, әсіресе оларда сайт беттерінде көрсетілетін мәтін болса. Ол сонымен қатар дерекқордағы оқшаулау деңгейін орнатады. Яғни, деректер оқу үшін қолжетімді болған кезде. Бұл жағдайда мәмілені жалпы жағдайда растағаннан кейін. Әрине, деректер растауға дейін қол жетімді болатын жағдайлар бар, бірақ бұл талқылауға арналған бөлек тақырып. Ол сонымен қатар уақыт белдеуі түрін орнатады, ол Django үшін әдепкі бойынша UTC болады.
ALTER ROLE myprojectuser SET client_encoding TO 'utf8'; ALTER ROLE myprojectuser SET default_transaction_isolation TO 'read committed'; ALTER ROLE myprojectuser SET timezone TO 'UTC';
Содан кейін біз осы пайдаланушыға дерекқорға кіру құқығын береміз:
GRANT ALL PRIVILEGES ON DATABASE myproject TO myprojectuser;
Ал, PostgreSQL консолінен шығайық.
\q
Серверде кодтауға қатысты мәселелер туындаса, серверде LATIN1 кодтауы болғанда және дерекқорды UTF8 тілінде жасау қажет болса, [келесі мақаланы] қараңыз (https://evileg.com/en/post/2 /), бұл тапсырма шешілетін жерде.
4-қадам — Виртуалды ортаны орнату
Виртуалды ортаны орнату және іске қосу:
pip3 install virtualenv virtualenv ~/myprojectenv source myprojectenv/bin/activate
5-қадам — PostgreSQL драйверін орнату
Келесі пәрменмен орнатамыз
sudo pip install django psycopg2
Виртуалды ортада pip3 емес, pip пәрменін пайдалану керек.
6-қадам – Жобаны құру
Виртуалды ортасы бар қалтаға барайық, біз әлі де виртуалды ортада жұмыс істеу режимінде болуымыз керек. Ал енді жоба жасайық.
cd ~/myprojectenv django-admin.py startproject myproject
7-қадам — Дерекқорға қосылуды орнату
Енді Django конфигурация файлын SQLite дерекқорын жасап, кейіннен оған қосылмай, PostgreSQL дерекқорына қосылатындай етіп өңдейік.
nano ~/myproject/myproject/settings.py
Мұны істеу үшін файлдан келесі код бөлігін табыңыз:
... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } ...
Дерекқорға қосылу үшін деректеріңізді ескере отырып, оны келесімен ауыстырыңыз:
... DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', 'NAME': 'myproject', 'USER': 'myprojectuser', 'PASSWORD': 'password', 'HOST': 'localhost', 'PORT': '', } } ...
8-қадам — Дерекқорды тасымалдауды орындау
Джангоның бір үлкен артықшылығы бар – оның өмірді өте жеңілдететін кірістірілген басқару панелі бар. Бірақ оның жұмыс істеуі үшін дерекқорды көшіру қажет, яғни деректер базасының құрылымын құрайтын SQL деректер үлгілерінен сұраныстарды дайындау.
cd ~/myproject python manage.py makemigrations python manage.py migrate
Сондай-ақ біз сіздің сайтыңызға максималды кіру құқығы бар әкімші болатын суперпайдаланушыны жасаймыз. Келесі пәрменді іске қосыңыз және нұсқауларды орындаңыз.
python manage.py createsuperuser
9-қадам — Gunicorn орнату
Біздің веб-сайт үшін HTTP сервері ретінде әрекет ететін Gunicorn орнатайық. Біз оны виртуалды ортаға орнатамыз.
sudo pip install django gunicorn
Сайттың жұмыс істеп тұрғанын тексеруге болады:
gunicorn myproject.wsgi:application --bind 111.222.333.44:8000 # Укажите ваш IP-адрес
10-қадам — Статикалық файлдарды орнату
Django өндірістік серверде пайдаланылмайтын әдепкі бойынша Debug режимінде статикалық файлдарға ғана қызмет етеді. Өндіріс сервері үшін барлық жобалардағы барлық статикалық файлдар collectstatic пәрмені арқылы бөлек арнайы қалтаға жиналады және қалтаның өзі settings.py. файлында көрсетілуі керек.
Оны өңдеп көрейік:
nano ~/myproject/settings.py
Статикалық файлдарды қайда жинау керектігін көрсететін жолды қосыңыз.
STATIC_ROOT = '/home/user/myprojectenv/myproject/myproject/static/'
Енді осы каталогтағы барлық статистиканы жинайық:
python manage.py collectstatic
11-қадам — Nginx орнату
Nginx конфигурация файлын өңдейік.
sudo nano /etc/nginx/sites-available/default
Оның барлық мазмұнын жойып, келесімен ауыстырыңыз.
server { listen 80; server_name 111.222.333.44; # здесь прописать или IP-адрес или доменное имя сервера access_log /var/log/nginx/example.log; location /static/ { root /home/user/myprojectenv/myproject/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; } }
Nginx қайта іске қосайық.
sudo service nginx restart
Ал енді мылтықты жүгірейік
gunicorn myproject.wsgi:application
Осыдан кейін сіз сайттың 80 портында қол жетімді екенін көресіз.
12-қадам — Супервайзерді конфигурациялау
Сайт тәуліктің кез келген уақытында қолжетімді болуы үшін жадта қызмет ретінде ілінетін және сайттың үнемі жұмыс істейтініне көз жеткізетін супервайзерді конфигурациялау қажет.
sudo apt-get install supervisor
Gunicorn тұрақты жұмыс істеуі үшін оның конфигурация файлын жасау қажет. Ол біздің веб-қосымшамыз үшін іске қосылатын файлдың жанында орналасады.
cd /home/user/myprojectenv/myproject/myproject touch gunicorn.conf.py nano gunicorn.conf.py
Келесі конфигурация ақпаратын қосамыз:
bind = '127.0.0.1:8000' workers = 3 user = "nobody"
Яғни, біз қай портқа байланыстыратынымызды және қандай пайдаланушы процесті бастайтынын көрсеттік. Сондай-ақ жұмыс процестерінің саны. Бұл жағдайда үшеуі бар. Мына формула бойынша есептелген:
жұмысшылар = Ncpu + 1
Содан кейін біз супервайзердің конфигурациясын жасаймыз
cd /etc/supervisor/conf.d/ touch myproject.conf nano myproject.conf
Оған келесі параметрлерді жазыңыз
[program:myproject] command=/home/user/myprojectenv/bin/gunicorn myproject.wsgi:application -c /home/user/myprojectenv/myproject/myproject/gunicorn.conf.py directory=/home/user/myprojectenv/myproject user=nobody autorestart=true redirect_stderr=true
Енді супервайзерді бастайық. Супервайзерді орнату кезінде бір ескерту бар. Ол орнатылғаннан кейін қызмет ретінде іске қосылмады. Сондықтан серверді қайта іске қосқыңыз келмесе, оны іске қосуға мәжбүрлеп қосып, қолмен бастау керек.
sudo update-rc.d supervisor enable sudo service supervisor start
Сонымен, конфигурацияларды жаңартып, сайт қолданбасының күйін тексеріп, оны қайта іске қосуға болады.
supervisorctl reread supervisorctl update supervisorctl status myproject supervisor restart myproject
Сервер қайта іске қосылғанда бәрі автоматты түрде басталады
Ескерту
Жоба файлдарын өзгерткен болсаңыз, gunicorn бағдарламасын қайта іске қосуыңыз керек. Ол үшін виртуалды ортаны белсендіріп, killall пәрменін пайдаланыңыз
source ~/myprojectenv/bin/activate sudo killall gunicorn
Supervisor осы пәрменнен кейін Gunicorn қолданбасын автоматты түрде іске қосады, сондықтан сервер ұзақ уақыт жұмыс істемей қалады деп алаңдамайсыз. Екінші сәтсіздіктен артық емес.
Django
үшін [Timeweb хостының VDS-серверін] ұсынамын (http://timeweb.com/ru/?i=27415)
.
С чем может быть связана ошибка? ставил всё на свою машину, статический ip не покупал.
(myprojectenv) ubuntu@ubuntu:~/myprojectenv/myproject$ gunicorn myproject.wsgi:application --bind мойайпишник:8000
[2017-10-28 11:54:39 +0000] [31426] [INFO] Starting gunicorn 19.7.1
[2017-10-28 11:54:39 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:39 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:40 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:40 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:41 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:41 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:42 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:42 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:43 +0000] [31426] [ERROR] Invalid address: ('мойайпишник', 8000)
[2017-10-28 11:54:43 +0000] [31426] [ERROR] Retrying in 1 second.
[2017-10-28 11:54:44 +0000] [31426] [ERROR] Can't connect to ('мойайпишник', 8000)
Этот ваш IP адрес случайно не внешний IP адрес роутера, за которым Вы сидите со своим ПК?
перепробывал все ip, которые нашёл у себя на компе. не подскажите, как найти нужный?
А Вы делали вообще bind на '127.0.0.1:8000'?
По моему sudo здесь лишнее. Разве sudo устанавливает внутри виртуального окружения?
Как ни странно - Да.
Некропост, однако, хотел бы добавить, что в случае с продакшеном, миграции там делать нельзя. (точнее, конечно, можно, но нельзя)
Все миграции необходимо хранить в репозитории.
Твоя правда. Согласен. Свои миграции храню в репозитории. На продакшене только выполняю обновление структуры базы данных, после тестирования на дев сервере конечно (читай локальная машина разработки).
Здравствуйте, подскажите пожалуйста, как исправить:
в Ubuntu 20.04, в каталоге проекта пытаюсь создать вертуальную среду
virtualenv env
вылезает ошибка:
ModuleNotFoundError: No module named 'virtualenv.seed.via_app_data'
Спасибо.
Это может быть и ошибка в вашей версии virtualenv и не совсем верная установка, и косяки в процессе следования туториалу.
Но подобные ошибки вылезали на GitHub в репозитории virtualenv.
Впрочем я сам с таким не сталкивался, так что готового ответа у меня нет.
Установите venv:
после этого можно сделать
virtualenv - устаревший, venv - часть стандартной библиотеки. в Windows - venv ставится вместе с питоном, в убунте, к сожалению, даже куски стандартной библиотеки приходится доставлять руками.
Ок, спасибо, буду пробовать.
Все заработало, немного ругнулся, что лучше:
python3 -m venv .venv
но в итоге все сработало.
Спасибо!
Стави все по статье. Добрался до шага 12 и после него перестал запускатся сервер через gunicorn myproject.wsgi:application. выдает ошибку
", line 1014, in _gcd_import
", line 991, in _find_and_load
", line 973, in _find_and_load_un locked
[ERROR] Exception in worker process
Traceback (most recent call last):
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/arbiter.py", line 583, in spawn_worker
worker.init_process()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/wo rkers/base.py", line 119, in init_process
self.load_wsgi()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/workers/base.py", line 144, in load_wsgi
self.wsgi = self.app.wsgi()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/base.py", line 67, in wsgi
self.callable = self.load()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 49, in load
return self.load_wsgiapp()
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/app/wsgiapp.py", line 39, in load_wsgiapp
return util.import_app(self.app_uri)
File "/home/user/myproject/lib/python3.8/site-packages/gunicorn/util.py", line 358, in import_app
mod = importlib.import_module(module)
File "/usr/lib/python3.8/importlib/ init .py", line 127, in import _module
return _bootstrap._gcd_import(name[level:], package, level)
File "
File "
File "
ModuleNotFoundError: No module named 'myproject.wsgi'
На что обратить внимание?
После команд запуска supervisor'а
sudo update-rc.d supervisor enable
sudo service supervisor start
нужно ли вообще в виртуальном окружении запускать Gunicorn
я думаю, вам стоит кастовать сюда Евгения - я предпочитаю использовать systemd для запуска и менеджмента сервера
попробуйте призвать его через кнопку ответить
Евгений доброй ночи, можете что-то посоветовать?
привет
тут нужна твоя помощь=)
я в супервизоре - ноль=)
Ошибка в конфиге инжинкса про статику в root последний слеш лишний путь в таком виде получается
День добрый.
А как вы это делаете?
А разве это не миграция? И как тогда быть с вашим утверждением о миграциях:
я имел в виду, что на проде нельзя делать
правильнее было бы сказать, что на проде нельзя создавать миграции. мигрировать БД - без этого, естественно, никак
Всё, теперь понял. Спасибо!
Ещё вопрос: как правильно обновлять кодовую базу, если произошли изменения в ней?
обновлять где?
если на проде -
если вы используете systemd для управления сервером
То есть я правильно понимаю, что на боевом сервере нужно ставить помимо всего ещё и git?
в целом, тут все не просто
в зависимости от способа доставки это может быть k8s, docker, rsync, ansible, git... да хоть wget-ом качать архив с условного гитхаба
и для каждого способа свои способы доставки и развертывания
для начала, если у вас 1 сервер и минимум каких-то особенностей, git pull вполне хватит. И да, для этого нужно, чтобы был git установлен
Ясно. Спасибо за развёрнутый ответ.
Думаю, что мне для моих целей хватит и git. Локально я им пользоваться умею, а вот с удалёнными серверами не сталкивался, только с github, отсюда и вопросы.
Сижу, ковыряюсь с git pull на виртуалке, и ни черта не понимаю.
Как правильно залить проект на удалённый сервер, чтобы он по git pull принимал изменения? Отправить изменения с локальной машины у меня получилось, а вот на git pull ругается:
Всё, разобрался.
В виртуальном окружении ругается на отсутствие pip:
pip ставил вот так:
поскольку easy_install3 почему-то не поставился вместе с setuptools.
в виртуальном окружении не надо использовать sudo
используя sudo вы ставите пакеты глобально. Если у вас один проект на сервере - ок. но если нет, все плюсы от venv-ов идут на смарку.
кстати, советую посмотреть в сторону poetry - на мой взгялд, это проект уже production-ready. пакеты ставятся в несколько потоков, фиксируются не только зависимости, но и зависимости зависимостей. А venv-вы создаются автоматически и не в проекте. может быть не очень удобно, но можно переопределить поведение локально и глобально. в целом, советую
Ага, спасибо, завелось!
Да мне бы хотя бы с основами разобраться, куда уж продвинутые уровни...
На шаге 11 вылезла вот такая ошибка:
Проблема решилась добавлением в settings.py в ALLOWED_HOSTS IP-адреса 10.0.3.15.
После шага 12 сайт вместо стартовой страницы Django показывает: "502 Bad Gateway".
Что не так?
покажите конфиг nginx и ка запускаете gunicorn
Всё по мануалу выше, буква в букву.
Всё по мануалу выше, буква в букву.
нужна твоя помощь=)
Поднял сервис с помощью systemd, вот по этому мануалу: https://habr.com/ru/post/501414/
А почему нельзя? Где можно об этом почитать? Киньте, пожалуйста, в меня ссылкой.
При любых попытках взаимодействовать с супервизаром, выбивает в такую ошибку
Помогите пожалуйста, уже все волосы выдрал
Это на какую команду так отвечает?
Отвечал на все команды после
Исправил таким образом