Django Ð ÑководÑÑво ÑаÑÑÑ 11: РазвоÑаÑивание ÑайÑа на ÑеÑвеÑе
ТепеÑÑ, когда Ð²Ñ Ñоздали (и пÑоÑеÑÑиÑовали) Ñвой ÑикаÑнÑй ÑÐ°Ð¹Ñ LocalLibrary, Ñ Ð²Ð°Ñ ÑкоÑее вÑего, еÑÑÑ Ð¶ÐµÐ»Ð°Ð½Ð¸Ðµ ÑазмеÑÑиÑÑ ÐµÐ³Ð¾ на пÑблиÑном веб-ÑеÑвеÑе, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑÑал доÑÑÑпен ÑеÑез инÑеÑÐ½ÐµÑ Ð¿ÐµÑÑÐ¾Ð½Ð°Ð»Ñ Ð¸ поÑеÑиÑелÑм библиоÑеки. ÐÐ°Ð½Ð½Ð°Ñ ÑÑаÑÑÑ Ð´Ð°ÑÑ Ð¾Ð±Ñее пÑедÑÑавление о Ñом, каким обÑазом подойÑи к поиÑÐºÑ Ñ Ð¾ÑÑинга Ð´Ð»Ñ ÑазмеÑÐµÐ½Ð¸Ñ ÑайÑа, а Ñакже, ÑÑо нÑжно ÑделаÑÑ ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовиÑÑ Ñвой ÑÐ°Ð¹Ñ Ðº пÑбликаÑии.
| ТÑебованиÑ: | ÐавеÑÑиÑÑ Ð¸Ð·ÑÑение вÑÐµÑ Ð¿ÑедÑдÑÑÐ¸Ñ ÑаÑÑей ÑÑководÑÑва, вклÑÑÐ°Ñ Django Ð ÑководÑÑво ÑаÑÑÑ 10: ТеÑÑиÑование веб-пÑиложений в Django. |
|---|---|
| ЦелÑ: | ÐзÑÑиÑÑ, где и как Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑазвеÑнÑÑÑ Ð¿Ñиложение Django Ð´Ð»Ñ Ð¿ÑблиÑного доÑÑÑпа. |
ÐбзоÑ
Ðаже когда ÑазÑабоÑка ваÑего ÑайÑа завеÑÑена (или "доÑÑаÑоÑно" завеÑÑена Ð´Ð»Ñ Ð½Ð°Ñала пÑблиÑного ÑеÑÑиÑованиÑ), Ñо Ð´Ð»Ñ Ð¿ÑблиÑного доÑÑÑпа вам надо его где-Ñо ÑазмеÑÑиÑÑ.
Ðо Ñего моменÑа Ð²Ñ ÑабоÑали в каком-Ñо ÑабоÑем окÑÑжении - ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑаÑÑ Ð¾ÑладоÑнÑÑ Ð¸ дÑÑгÑÑ ÑаÑÑнÑÑ Ð¸Ð½ÑоÑмаÑиÑ, Ð²Ñ Ð¸ÑполÑзовали веб-ÑеÑÐ²ÐµÑ Django в локалÑной ÑеÑи пÑи ÑÑом запÑÑкали ÑÐ°Ð¹Ñ Ñ (небезопаÑнÑми) наÑÑÑойками ÑазÑабоÑки. ÐеÑед Ñем как ÑазмеÑÑиÑÑ ÑÐ°Ð¹Ñ Ð¿ÑблиÑно, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑделаÑÑ ÑледÑÑÑее:
- СделаÑÑ Ð½ÐµÑколÑко изменений в наÑÑÑÐ¾Ð¹ÐºÐ°Ñ Ð¿ÑоекÑа.
- ÐÑбÑаÑÑ/ÐаÑÑÑоиÑÑ Ð¾ÐºÑÑжение Ð´Ð»Ñ Ñ Ð¾ÑÑинга пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Django.
- ÐÑбÑаÑÑ/ÐаÑÑÑоиÑÑ Ð¾ÐºÑÑжение Ð´Ð»Ñ ÑазмеÑÐµÐ½Ð¸Ñ ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов.
- Ð ÑелÑÑ Ð¾Ð±ÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÑайÑа наÑÑÑоиÑÑ Ð¸Ð½ÑÑаÑÑÑÑкÑÑÑÑ Ð´Ð»Ñ ÐµÐ³Ð¾ ÑазвÑÑÑÑваниÑ.
Ðанное ÑÑководÑÑво пÑедоÑÑавлÑÐµÑ Ð½ÐµÐ±Ð¾Ð»ÑÑой Ð¾Ð±Ð·Ð¾Ñ Ð²ÑбоÑа Ñ Ð¾ÑÑинга, пÑигоÑÐ¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑайÑа к пÑблиÑÐ½Ð¾Ð¼Ñ ÑазмеÑениÑ, а Ñакже пÑакÑиÑеÑкий пÑÐ¸Ð¼ÐµÑ ÑÑÑановки ÑайÑа LocalLibrary на облаÑнÑй ÑеÑÐ²Ð¸Ñ Heroku.
ЧÑо Ñакое окÑÑжение ÑазвÑÑÑÑваниÑ?
ÐкÑÑжение ÑазвÑÑÑÑÐ²Ð°Ð½Ð¸Ñ - ÑÑо ÑÑеда, коÑоÑое пÑедоÑÑавлÑÐµÑ ÑеÑвеÑ, на коÑоÑом Ð²Ñ Ð±ÑдеÑе ÑазмеÑаÑÑ Ñвой веб-ÑÐ°Ð¹Ñ Ð´Ð»Ñ Ð¿ÑблиÑного запÑÑка и доÑÑÑпа. Ðанное окÑÑжение вклÑÑÐ°ÐµÑ Ð² ÑебÑ:
- Ðелезо на коÑоÑом бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑÑкаÑÑÑÑ ÑайÑ.
- ÐпеÑаÑионнÑÑ ÑиÑÑÐµÐ¼Ñ (Linux, Windows).
- ЯзÑки пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñемени вÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ (ÑкÑипÑовÑе) и библиоÑеки, коÑоÑÑе иÑполÑзÑÐµÑ Ð²Ð°Ñ ÑайÑ.
- Ðеб-ÑеÑвеÑ, иÑполÑзÑемÑй Ð´Ð»Ñ Ð¾Ð±ÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑÑÐ°Ð½Ð¸Ñ Ð¸ дÑÑгого конÑенÑа (Nginx, Apache).
- СеÑÐ²ÐµÑ Ð¿Ñиложений, коÑоÑÑй пеÑедаÑÑ "динамиÑеÑкие" запÑоÑÑ Ð¼ÐµÐ¶Ð´Ñ ÑайÑом Django и веб-ÑеÑвеÑом.
- ÐÐ°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , Ð¾Ñ ÐºÐ¾ÑоÑой завиÑÐ¸Ñ Ð²Ð°Ñ ÑайÑ.
ÐÑимеÑание: У Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¿Ð¾ÑÑебноÑÑÑ Ð² обÑаÑном пÑокÑи, баланÑиÑовÑике загÑÑзки и Ñак далее.
СеÑÐ²ÐµÑ Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð²Ð°Ñим ÑобÑÑвеннÑм Ñ Ð¿Ð¾Ð´ÐºÐ»ÑÑением к инÑеÑнеÑÑ Ð¿Ð¾ ÑкоÑоÑÑÐ½Ð¾Ð¼Ñ ÐºÐ°Ð½Ð°Ð»Ñ, но более обÑим Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¾Ð¼ ÑвлÑеÑÑÑ Ð¿Ñименение "облаÑнÑÑ ÑеÑений". ЧÑо дейÑÑвиÑелÑно Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, Ñак ÑÑо Ñо, ÑÑо Ð²Ð°Ñ ÐºÐ¾Ð´ запÑÑкаеÑÑÑ Ð½Ð° некоÑоÑом ÑдалÑнном компÑÑÑеÑе (возможно и "виÑÑÑалÑном"), в Ñ Ð¾ÑÑинговом даÑа-ÑенÑÑе. УдалÑннÑй ÑеÑÐ²ÐµÑ Ð¾Ð±ÑÑно пÑедоÑÑавлÑÐµÑ Ð¾Ð¿ÑеделÑннÑй доÑÑÑп к компÑÑÑеÑнÑм ÑеÑÑÑÑам (пÑоÑеÑÑоÑÑ, опеÑаÑивной памÑÑи, памÑÑи на жÑÑÑÐºÐ¸Ñ Ð½Ð¾ÑиÑелÑÑ Ð¸ Ñак далее) и Ñоединение Ñ Ð¸Ð½ÑеÑнеÑом за некоÑоÑÑÑ ÑенÑ.
Такой Ñип ÑдалÑнного доÑÑÑпа к вÑÑиÑлиÑелÑномÑ/ÑеÑÐµÐ²Ð¾Ð¼Ñ Ð¶ÐµÐ»ÐµÐ·Ñ Ð½Ð°Ð·ÑваеÑÑÑ ÐнÑÑаÑÑÑÑкÑÑÑа как СеÑÐ²Ð¸Ñ (Infrastructure as a Service - IaaS). ÐножеÑÑво IaaS поÑÑавÑиков пÑедлагаÑÑ ÑÑлÑги по пÑедÑÑÑановке какой-либо опеÑаÑионной ÑиÑÑемÑ, на коÑоÑÑÑ Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑÑÑановиÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе Ð´Ð»Ñ Ð²Ð°Ñего ÑабоÑего окÑÑÐ¶ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½ÑÑ. ÐÑÑгие поÑÑавÑики пÑедлагаÑÑ Ð²Ð°Ð¼ вÑбÑаÑÑ Ñже гоÑовÑе полноÑеннÑе ÑабоÑие окÑÑжениÑ, возможно, вклÑÑаÑÑие в ÑÐµÐ±Ñ Django и наÑÑÑоеннÑй веб-ÑеÑвеÑ.
ÐÑимеÑание: ÐоÑовÑе окÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð³ÑÑ ÑделаÑÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ Ð²Ð°Ñего веб-ÑайÑа оÑÐµÐ½Ñ Ð¿ÑоÑÑой задаÑей, поÑколÑÐºÑ Ð¾Ð½Ð¸ имеÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑнÑÑ ÐºÐ¾Ð½ÑигÑÑаÑиÑ, однако, либо колиÑеÑÑво доÑÑÑпнÑÑ Ð¾Ð¿Ñий Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ´Ð¾ÑÑаÑоÑнÑм, или они бÑдÑÑ ÑооÑвеÑÑÑвоваÑÑ ÑÑÑаÑевÑей опеÑаÑионной ÑиÑÑеме. ЧаÑÑо, более пÑедпоÑÑиÑелÑно ÑÑÑановиÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе компоненÑÑ ÑамоÑÑоÑÑелÑно, Ñаким обÑазом Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе Ñо, ÑÑо вам Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾, а в поÑледÑÑÑем, пÑи обновлении ÑиÑÑемÑ, Ñже бÑдеÑе знаÑÑ ÑÑо нÑжно делаÑÑ!
ÐекоÑоÑÑе пÑовайдеÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаÑÑ Django как ÑаÑÑÑ Ñвоего пÑÐµÐ´Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÐлаÑÑоÑма как СеÑÐ²Ð¸Ñ (Platform as a Service - PaaS). ÐÑи данном виде Ñ Ð¾ÑÑинга вам не нÑжно беÑпокоиÑÑÑÑ Ð¾ болÑÑей ÑаÑÑи окÑÑÐ¶ÐµÐ½Ð¸Ñ (веб-ÑеÑвеÑе, ÑеÑвеÑе пÑиложений, баланÑиÑовÑике загÑÑзки), Ñак как Ñама плаÑÑоÑма беÑÑÑ ÑÑо на ÑÐµÐ±Ñ (вклÑÑÐ°Ñ Ð²Ñе моменÑÑ, каÑаÑÑиеÑÑ ÑоÑÑа и ÑазвиÑÐ¸Ñ Ð²Ð°Ñего пÑиложениÑ). Рданном ÑлÑÑае ÑазвÑÑÑÑвание пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑвлÑеÑÑÑ Ð´Ð¾ÑÑаÑоÑно пÑоÑÑой задаÑей, - вам нÑжно ÑконÑенÑÑиÑоваÑÑÑÑ ÑолÑко на ваÑем пÑиложении, а не на инÑÑаÑÑÑÑкÑÑÑе.
ÐекоÑоÑÑе ÑазÑабоÑÑики вÑбиÑаÑÑ Ð±Ð¾Ð»ÐµÐµ гибкое ÑеÑение, пÑедоÑÑавлÑемое IaaS, в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº дÑÑгие пÑедпоÑиÑаÑÑ Ð¸Ð¼ÐµÑÑ Ð½Ð°Ð¸Ð¼ÐµÐ½ÑÑие накладнÑе ÑаÑÑ Ð¾Ð´Ñ Ð¸ пÑоÑÑое маÑÑÑабиÑование, пÑедоÑÑавлÑемое PaaS. Ðогда Ð²Ñ ÑолÑко наÑинаеÑе, Ñо ÑиÑÑема Ñипа PaaS ÑвлÑеÑÑÑ Ð¿ÑедпоÑÑиÑелÑной и ÑÑо именно Ñо, ÑÑо Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ Ð² данном ÑÑководÑÑве.
ÐÑимеÑание: ÐÑли Ð²Ñ Ð²ÑбиÑаеÑе Ñ Ð¾ÑÑинг Ñ Ð¿Ð¾Ð´Ð´ÐµÑжкой Python/Django, Ñо он должен имеÑÑ Ð¸Ð½ÑÑÑÑкÑÐ¸Ñ Ð¿Ð¾ ÑÑÑановке веб-ÑайÑа Django, ÑÑиÑÑваÑÑÑÑ ÑазлиÑнÑе конÑигÑÑаÑии веб-ÑеÑвеÑа, ÑеÑвеÑа пÑиложений, обÑаÑного пÑокÑи и Ñак далее (ÑÑо не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение, еÑли Ð²Ñ Ð²ÑбÑали PaaS). ÐапÑимеÑ, ÑÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво инÑÑÑÑкÑий "Ñаг-за-Ñагом" Ð´Ð»Ñ ÑазлиÑнÑй конÑигÑÑаÑий в ÐокÑменÑаÑии DigitalOcean по Django.
ÐÑÐ±Ð¾Ñ Ñ Ð¾ÑÑинг пÑовайдеÑа
СÑÑеÑÑвÑÐµÑ Ð±Ð¾Ð»ÐµÐµ 100 Ñ Ð¾ÑоÑо извеÑÑнÑÑ Ñ Ð¾ÑÑинг пÑовайдеÑов, коÑоÑÑе либо акÑивно поддеÑживаÑÑ, или ÑабоÑаÑÑ Ñ Django (Ð¸Ñ ÑпиÑок можно ÑвидеÑÑ Ð² Django-дÑÑжеÑÑвеннÑе Ñ Ð¾ÑÑинги). ÐаннÑе поÑÑавÑики пÑедоÑÑавлÑÑÑ ÑазлиÑнÑе ÑÐ¸Ð¿Ñ Ð¾ÐºÑÑжений (IaaS, PaaS), и ÑазлиÑнÑе ÑÑовни доÑÑÑпа к вÑÑиÑлиÑелÑнÑм и ÑеÑевÑм ÑеÑÑÑÑам, за ÑазнÑÑ ÑенÑ.
ÐекоÑоÑÑе веÑи на коÑоÑÑе надо обÑаÑиÑÑ Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ðµ пÑи вÑбоÑе Ñ Ð¾ÑÑинга:
- ÐаÑколÑко ÑÑебоваÑелÑнÑм к вÑÑиÑлиÑелÑнÑм ÑеÑÑÑÑам ÑвлÑеÑÑÑ Ð²Ð°Ñ ÑайÑ.
- УÑÐ¾Ð²ÐµÐ½Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки гоÑизонÑалÑного (добавление болÑÑего колиÑеÑÑва маÑин) и веÑÑикалÑного маÑÑÑабиÑÐ¾Ð²Ð°Ð½Ð¸Ñ (пеÑÐµÑ Ð¾Ð´ на более моÑное железо), а Ñакже ÑÑоимоÑÑÑ Ð²Ñего ÑÑого.
- Ðде ÑаÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ñ Ð´Ð°Ñа-ÑенÑÑÑ Ð¸, ÑледоваÑелÑно, оÑкÑда бÑÐ´ÐµÑ Ð±Ð¾Ð»ÐµÐµ бÑÑÑÑÑй доÑÑÑп.
- ÐÑÐµÐ¼Ñ Ð½ÐµÐ¿ÑеÑÑвной ÑабоÑÑ Ñ Ð¾ÑÑинга, а Ñакже вÑÐµÐ¼Ñ Ð¸ колиÑеÑÑво пÑоÑÑоÑ.
- ÐнÑÑÑÑменÑÑ, коÑоÑÑе пÑедоÑÑавлÑÑÑÑÑ Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ ÑайÑом â пÑоÑÑоÑа и безопаÑноÑÑÑ Ð¸Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ (SFTP и FTP).
- ÐÑÑÑоеннÑе ÑÑеймвоÑки Ð´Ð»Ñ Ð¼Ð¾Ð½Ð¸ÑоÑинга ваÑего ÑеÑвеÑа.
- ÐгÑаниÑениÑ. ÐекоÑоÑÑе Ñ Ð¾ÑÑинги могÑÑ Ð±Ð»Ð¾ÐºÐ¸ÑоваÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе ÑеÑвиÑÑ (напÑимеÑ, ÑлекÑÑоннÑÑ Ð¿Ð¾ÑÑÑ) . ÐÑÑгие пÑедлагаÑÑ ÑолÑко опÑеделÑнное колиÑеÑÑво ÑаÑов "живого вÑемени" за опÑеделÑннÑÑ ÑенÑ, или неболÑÑое колиÑеÑÑво меÑÑа Ð´Ð»Ñ Ð´Ð°Ð½Ð½ÑÑ .
- ÐÑеимÑÑеÑÑва. ÐекоÑоÑÑе пÑовайдеÑÑ Ð¼Ð¾Ð³ÑÑ Ð¿ÑедложиÑÑ Ð±ÐµÑплаÑнÑе доменнÑе имена и поддеÑÐ¶ÐºÑ ÑеÑÑиÑикаÑов SSL, коÑоÑÑе, в дÑÑÐ³Ð¸Ñ ÑлÑÑаÑÑ , Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ñли Ð±Ñ ÐºÑпиÑÑ.
- ЧÑо бÑÐ´ÐµÑ Ð¿Ñи иÑÑеÑении вÑемени иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ "беÑплаÑного" Ñ Ð¾ÑÑинга, какова "ÑÑоимоÑÑÑ" мигÑаÑии на более "доÑогие" ÑаÑиÑÑ Ð¸ Ñак далее?
ХоÑоÑей новоÑÑÑÑ ÑвлÑеÑÑÑ Ñо, ÑÑо Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ ÑÑÑеÑÑвÑÐµÑ Ð´Ð¾ÑÑаÑоÑное колиÑеÑÑво компаний, коÑоÑÑе пÑедоÑÑавлÑÑÑ Ð¿ÑобнÑе "беÑплаÑнÑе" ÑаÑиÑÑ Ñипа "evaluation" (Ð´Ð»Ñ Ð¿ÑобÑ), "developer" (ÑазÑабоÑка), или "hobbyist" (Ñ Ð¾Ð±Ð±Ð¸). ÐÑегда ÑÑÑеÑÑвÑÑÑ ÑеÑÑÑÑÑ Ñ Ð¾Ð³ÑаниÑеннÑм окÑÑжением, пÑи иÑполÑзовании коÑоÑÑÑ Ð²Ð°Ð¼ надо беÑпокоиÑÑÑÑ Ð»Ð¸ÑÑ Ð¾ Ñом, ÑÑо они могÑÑ Ð±ÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð»Ð¸ÑÑ Ð² ÑеÑении опÑеделÑнного пеÑиода вÑемени. Тем не менее, они ÑвлÑÑÑÑÑ Ð¾ÑлиÑнÑм ÑеÑением Ð´Ð»Ñ ÑеÑÑиÑÐ¾Ð²Ð°Ð½Ð¸Ñ ÑайÑов Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑим ÑÑаÑиком в ÑеалÑном окÑÑжении, а Ñакже могÑÑ Ð¿ÑедоÑÑавлÑÑÑ Ð¿ÑоÑÑой доÑÑÑп к плаÑнÑм ÑеÑÑÑÑам, в ÑлÑÑае Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи. Ðаиболее попÑлÑÑнÑми пÑовайдеÑами ÑвлÑÑÑÑÑ Heroku, Python Anywhere, Amazon Web Services, Microsoft Azure и Ñак далее.
Ðногие пÑовайдеÑÑ Ð¸Ð¼ÐµÑÑ "basic" (базовÑй) ÑаÑиÑ, пÑедоÑÑавлÑÑÑий доÑÑаÑоÑнÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð²ÑÑиÑлиÑелÑной моÑноÑÑи Ñ Ð½ÐµÐ±Ð¾Ð»ÑÑим колиÑеÑÑвом огÑаниÑений. Digital Ocean и Python Anywhere ÑвлÑÑÑÑÑ Ð¿ÑимеÑами пÑовайдеÑов, коÑоÑÑе пÑедлагаÑÑ Ð¾ÑноÑиÑелÑно недоÑогой базовÑй ÑаÑÐ¸Ñ (Ð¾Ñ $5 до $10USD в меÑÑÑ).
ÐÑимеÑание: ÐÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ помниÑÑ, ÑÑо Ñена не ÑвлÑеÑÑÑ ÐµÐ´Ð¸Ð½ÑÑвеннÑм кÑиÑеÑием вÑбоÑа. ÐÑли Ð²Ð°Ñ ÑÐ°Ð¹Ñ ÑÑпеÑен, Ñо Ð¼Ð¾Ð¶ÐµÑ Ñак ÑлÑÑиÑÑÑÑ, ÑÑо маÑÑÑабиÑование ÑÑÐ°Ð½ÐµÑ ÑамÑм важнÑм ÑлеменÑом ваÑего Ð²Ð½Ð¸Ð¼Ð°Ð½Ð¸Ñ Ð¿Ñи вÑбоÑе ÑÑлÑг Ñ Ð¾ÑÑинга.
ÐодгоÑовка веб-ÑайÑа к пÑбликаÑии
Ð¡ÐºÐµÐ»ÐµÑ ÑайÑа бÑл Ñоздан пÑи помоÑи инÑÑÑÑменÑов django-admin и manage.py, коÑоÑÑе наÑÑÑÐ¾ÐµÐ½Ñ Ñаким обÑазом, ÑÑÐ¾Ð±Ñ ÑделаÑÑ ÑазÑабоÑÐºÑ Ð¿ÑоÑе. Ðногие наÑÑÑойки Ñайла пÑоекÑа (опÑеделÑннÑÑ Ð² settings.py) Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ñ Ð¿ÐµÑед пÑбликаÑией ÑайÑа, либо из-за вопÑоÑов безопаÑноÑÑи, либо пÑоизводиÑелÑноÑÑи.
ÐÑимеÑание: ÐбÑепÑинÑÑÑм ÑеÑением ÑвлÑеÑÑÑ Ð¸Ð¼ÐµÑÑ Ð¾ÑделÑнÑй Ñайл settings.py Ð´Ð»Ñ Ð¿ÑбликаÑии, коÑоÑÑй импоÑÑиÑÑÐµÑ Ð²Ð°Ð¶Ð½Ñе наÑÑÑойки из внеÑÐ½Ð¸Ñ Ñайлов, или из пеÑеменнÑÑ Ð¾ÐºÑÑжениÑ. ÐоÑÑÑп к Ð´Ð°Ð½Ð½Ð¾Ð¼Ñ ÑÐ°Ð¹Ð»Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð¾Ð³ÑаниÑен, даже еÑли оÑÑалÑÐ½Ð°Ñ ÑаÑÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кода доÑÑÑпна в пÑблиÑном ÑепозиÑоÑии.
ÐÑиÑиÑеÑки важнÑе наÑÑÑойки Ñайла settings.py:
-
DEBUG. ÐÑи ÑазвÑÑÑÑвании ÑайÑа должен бÑÑÑ ÑÑÑановлен вFalse(DEBUG = False). Тем ÑамÑм, пÑекÑаÑиÑÑÑ Ð²Ñвод важной оÑладоÑной инÑоÑмаÑии. -
SECRET_KEY. ÐÑо болÑÑое ÑлÑÑайное ÑиÑло, пÑименÑемое Ð´Ð»Ñ Ð·Ð°ÑиÑÑ Ð¾Ñ CSRF. Ðажно, ÑÑÐ¾Ð±Ñ ÐºÐ»ÑÑ, иÑполÑзÑемÑй в пÑодакÑене, не ÑказÑвалÑÑ Ð² иÑÑ Ð¾Ð´Ð½Ð¾Ð¼ коде, и/или не запÑаÑивалÑÑ Ñ Ð´ÑÑгого ÑеÑвеÑа. Django ÑекомендÑÐµÑ ÑазмеÑаÑÑ Ð·Ð½Ð°Ñение клÑÑа либо в пеÑеменной окÑÑжениÑ, или в Ñайле Ñ Ð´Ð¾ÑÑÑпом ÑолÑко на ÑÑение.# ЧÑение SECRET_KEY из пеÑеменной окÑÑÐ¶ÐµÐ½Ð¸Ñ import os SECRET_KEY = os.environ['SECRET_KEY'] #ÐÐÐ #ЧÑение клÑÑа из Ñайла with open('/etc/secret_key.txt') as f: SECRET_KEY = f.read().strip()
ÐавайÑе изменим пÑиложение LocalLibrary Ñаким обÑазом, ÑÑÐ¾Ð±Ñ ÑиÑаÑÑ SECRET_KEY и DEBUG из пеÑеменнÑÑ
окÑÑжениÑ, еÑли Ñе опÑеделенÑ, инаÑе иÑполÑзоваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑаниÑ.
ÐÑкÑойÑе /locallibrary/settings.py, закомменÑиÑÑйÑе иÑÑ
одное знаÑение SECRET_KEY и добавÑÑе новÑе ÑÑÑоки, как Ñказано ниже жиÑнÑм. Ð ÑеÑении ÑазÑабоÑки, никакиÑ
пеÑеменнÑÑ
окÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñеделено не бÑло, Ñаким обÑазом бÑдÑÑ Ð¸ÑполÑзоваÑÑÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð¿Ð¾ ÑмолÑÐ°Ð½Ð¸Ñ (не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ°ÐºÐ¾Ð¹ клÑÑ Ð²Ñ Ð¸ÑполÑзÑеÑе в пÑоÑеÑÑе ÑазÑабоÑки, поÑколÑÐºÑ Ð¿Ñи ÑазвÑÑÑÑвании пÑоекÑа Ð²Ñ Ð±ÑдеÑе иÑполÑзоваÑÑ Ð´ÑÑгой).
# SECURITY WARNING: keep the secret key used in production secret!
# SECRET_KEY = 'cg#p$g+j9tax!#a3cup@1$8obt2_+&k3q+pmu)5%asj6yjpkag'
import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'cg#p$g+j9tax!#a3cup@1$8obt2_+&k3q+pmu)5%asj6yjpkag')
ÐаÑем закомменÑиÑÑйÑе ÑÑÑÐ¾ÐºÑ Ñ Ð½Ð°ÑÑÑойкой DEBUG, а заÑем, добавÑÑе новÑÑ, ÑказаннÑÑ Ð½Ð¸Ð¶Ðµ.
# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = True
DEBUG = bool( os.environ.get('DJANGO_DEBUG', True) )
ÐнаÑение DEBUG бÑÐ´ÐµÑ True по ÑмолÑÐ°Ð½Ð¸Ñ Ð¸ ÑÑÐ°Ð½ÐµÑ False, в Ñом ÑлÑÑае, еÑли пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¾ÐºÑÑÐ¶ÐµÐ½Ð¸Ñ DJANGO_DEBUG бÑÐ´ÐµÑ Ð¿ÑоиниÑиализиÑована пÑÑÑой ÑÑÑокой, Ñо еÑÑÑ, DJANGO_DEBUG=''.
ÐÑимеÑание:
ÐÑло Ð±Ñ Ð±Ð¾Ð»ÐµÐµ понÑÑнÑм, еÑли Ð±Ñ Ð¼Ñ Ð¼Ð¾Ð³Ð»Ð¸ пÑоÑÑо ÑÑÑановиÑÑ Ð¸ ÑнÑÑÑ Ñ DJANGO_DEBUG непоÑÑедÑÑвенно на True и False , напÑÑмÑÑ, а не иÑполÑзоваÑÑ Â«Ð»ÑбÑÑ ÑÑÑокÑ» или «пÑÑÑÑÑ ÑÑÑокÑ» (ÑооÑвеÑÑÑвенно). Ð ÑожалениÑ, знаÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеменнÑÑ
ÑÑÐµÐ´Ñ Ñ
ÑанÑÑÑÑ ÐºÐ°Ðº ÑÑÑоки Python и единÑÑÐ²ÐµÐ½Ð½Ð°Ñ ÑÑÑока, коÑоÑÐ°Ñ Ð¾ÑениваеÑÑÑ ÐºÐ°Ðº False ÑвлÑеÑÑÑ Ð¿ÑÑÑой ÑÑÑокой (напÑимеÑ, bool('')==False).
ÐеÑÑ Ð¿ÐµÑеÑÐµÐ½Ñ Ð½Ð°ÑÑÑоек Ð´Ð»Ñ ÑазвоÑаÑÐ¸Ð²Ð°Ð½Ð¸Ñ Ð²Ð°Ñего ÑайÑа Ð½Ð°Ñ Ð¾Ð´Ð¸ÑÑÑ Ð¿Ð¾ ÑÑÑлке Deployment checklist (Django docs). ÐÑоме Ñого, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе полÑÑиÑÑ ÑпиÑок наÑÑÑоек, вÑполнив в ÑеÑминале командÑ:
python3 manage.py check --deploy
ÐÑимеÑ: УÑÑановка LocalLibrary на Heroku
ÐаннÑй Ñаздел пÑедоÑÑавлÑÐµÑ Ð´ÐµÐ¼Ð¾Ð½ÑÑÑаÑÐ¸Ñ Ñого, как ÑÑÑановиÑÑ LocalLibrary на Heroku PaaS cloud.
ÐоÑÐµÐ¼Ñ Heroku?
Heroku - один из ÑамÑÑ Ð¿ÑодолжиÑелÑнÑÑ Ð¸ попÑлÑÑнÑÑ Ð¾Ð±Ð»Ð°ÑнÑÑ ÑеÑвиÑов PaaS. ÐеÑвонаÑалÑно он поддеÑживал ÑолÑко пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ruby, но ÑепеÑÑ ÐµÐ³Ð¾ можно иÑполÑзоваÑÑ Ð´Ð»Ñ ÑазмеÑÐµÐ½Ð¸Ñ Ð¿Ñиложений из Ð¼Ð½Ð¾Ð³Ð¸Ñ ÑÑед пÑогÑаммиÑованиÑ, вклÑÑÐ°Ñ Django!
ÐÑ Ð²ÑбиÑаем Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Heroku по неÑколÑким пÑиÑинам:
-
У Heroku еÑÑÑ ÑвободнÑй ÑÑовенÑ, коÑоÑÑй дейÑÑвиÑелÑно Ñвободен (Ñ Ð¾ÑÑ Ð¸ Ñ Ð½ÐµÐºÐ¾ÑоÑÑми огÑаниÑениÑми)
-
Ðак PaaS, Heroku забоÑиÑÑÑ Ð¾ болÑÑой веб-инÑÑаÑÑÑÑкÑÑÑе Ð´Ð»Ñ Ð½Ð°Ñ. ÐÑо знаÑиÑелÑно облегÑÐ°ÐµÑ ÑабоÑÑ, поÑÐ¾Ð¼Ñ ÑÑо Ð²Ñ Ð½Ðµ беÑпокоиÑеÑÑ Ð¾ ÑеÑвеÑÐ°Ñ , баланÑиÑÐ°Ñ Ð½Ð°Ð³ÑÑзки, обÑаÑнÑÑ Ð¿ÑокÑи или лÑбой дÑÑгой веб-инÑÑаÑÑÑÑкÑÑÑе, коÑоÑÑÑ Heroku пÑедоÑÑавлÑÐµÑ Ð½Ð°Ð¼ под капоÑом.
-
ХоÑÑ Ñ ÑÑого еÑÑÑ Ð½ÐµÐºÐ¾ÑоÑÑе огÑаниÑениÑ, ÑÑо не повлиÑÐµÑ Ð½Ð° ÑÑо конкÑеÑное пÑиложение. ÐапÑимеÑ:
- Heroku пÑедоÑÑавлÑÐµÑ ÑолÑко недолговеÑное Ñ ÑанилиÑе, поÑÑÐ¾Ð¼Ñ Ð·Ð°Ð³ÑÑженнÑе полÑзоваÑелем ÑÐ°Ð¹Ð»Ñ Ð½ÐµÐ»ÑÐ·Ñ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñно Ñ ÑаниÑÑ Ð½Ð° Ñамом Heroku.
- СвободнÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð±ÑÐ´ÐµÑ ÑпаÑÑ Ñ Ð½ÐµÐ°ÐºÑивнÑм веб-пÑиложением, еÑли в ÑеÑение полÑÑаÑа не бÑÐ´ÐµÑ Ð·Ð°Ð¿ÑоÑов.ÐоÑле ÑÑого ÑÐ°Ð¹Ñ Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½ÑÑÑ Ð½ÐµÑколÑко ÑекÑнд, ÑÑÐ¾Ð±Ñ Ð¾ÑвеÑиÑÑ, когда он пÑоÑнÑлÑÑ.
- СвободнÑй ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¾Ð³ÑаниÑÐ¸Ð²Ð°ÐµÑ Ð²ÑемÑ, в ÑеÑение коÑоÑого Ð²Ð°Ñ ÑÐ°Ð¹Ñ ÑабоÑÐ°ÐµÑ Ð´Ð¾ опÑеделÑнного колиÑеÑÑва ÑаÑов каждÑй меÑÑÑ (не вклÑÑÐ°Ñ Ð²ÑемÑ, когда ÑÐ°Ð¹Ñ Â«ÑпиÑ»).ÐÑо ноÑмалÑно Ð´Ð»Ñ ÑайÑа Ñ Ð½Ð¸Ð·ÐºÐ¸Ð¼ ÑÑовнем иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ / демонÑÑÑаÑии, но не Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ, еÑли ÑÑебÑеÑÑÑ 100% вÑÐµÐ¼Ñ Ð±ÐµÐ·Ð¾Ñказной ÑабоÑÑ.
- ÐÑÑгие огÑаниÑÐµÐ½Ð¸Ñ Ð¿ÐµÑеÑиÑÐ»ÐµÐ½Ñ Ð² Limits (докÑменÑÑ Heroku).
-
РоÑновном ÑÑо пÑоÑÑо ÑабоÑаеÑ, и еÑли Ð²Ñ Ð² конеÑном иÑоге полÑбиÑе его, маÑÑÑабиÑование ваÑего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð±ÑÐ´ÐµÑ Ð¾ÑÐµÐ½Ñ Ð¿ÑоÑÑÑм.
ХоÑÑ Heroku идеалÑно Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ Ð¿ÑÐ¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÑÑой демонÑÑÑаÑии, она Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½Ðµ идеалÑна Ð´Ð»Ñ Ð²Ð°Ñего ÑеалÑного ÑайÑа. Heroku ÑпÑоÑÐ°ÐµÑ Ð½Ð°ÑÑÑÐ¾Ð¹ÐºÑ Ð¸ маÑÑÑабиÑование за ÑÑÑÑ Ð¼ÐµÐ½ÑÑей гибкоÑÑи и, возможно, обойдÑÑÑÑ Ð½Ð°Ð¼Ð½Ð¾Ð³Ð¾ доÑоже, когда Ð²Ñ Ð²ÑÑ Ð¾Ð´Ð¸Ñе из Ñвободного ÑÑовнÑ.
Ðак ÑабоÑÐ°ÐµÑ Heroku?
Heroku запÑÑÐºÐ°ÐµÑ ÑайÑÑ Django внÑÑÑи одного, или более, изолиÑованнÑÑ Ð´ÑÑг Ð¾Ñ Ð´ÑÑга "Dynos", коÑоÑÑе ÑвлÑÑÑÑÑ Ð²Ð¸ÑÑÑалÑнÑми Unix-конÑейнеÑами, пÑедоÑÑавлÑÑÑими Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾Ðµ окÑÑжение Ð´Ð»Ñ Ð²Ð°Ñего пÑиложениÑ. ÐаннÑе dynos полноÑÑÑÑ Ð¸Ð·Ð¾Ð»Ð¸ÑÐ¾Ð²Ð°Ð½Ñ Ð¸ имеÑÑ ÑÑемеÑнÑÑ ÑайловÑÑ ÑиÑÑÐµÐ¼Ñ ("коÑоÑкоживÑÑаÑ" ÑÐ°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑÑема, коÑоÑÐ°Ñ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¾ÑиÑаеÑÑÑ Ð¸ обновлÑеÑÑÑ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда dyno пеÑезапÑÑкаеÑÑÑ). ÐдинÑÑвенной ÑÑÑноÑÑÑÑ, коÑоÑÑÑ Ð¿ÑедоÑÑавлÑÐµÑ dynos по ÑмолÑаниÑ, ÑвлÑеÑÑÑ Ð¿Ñиложение по конÑигÑÑаÑии пеÑеменнÑÑ . Heroku внÑÑÑи ÑÐµÐ±Ñ Ð¿ÑименÑÐµÑ Ð±Ð°Ð»Ð°Ð½ÑиÑовÑик загÑÑзки Ð´Ð»Ñ ÑаÑпÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²ÐµÐ±-ÑÑаÑика ÑÑеди вÑÐµÑ "веб"-dynos. ÐоÑколÑÐºÑ dynos изолиÑованÑ, Heroku Ð¼Ð¾Ð¶ÐµÑ Ð¼Ð°ÑÑÑабиÑоваÑÑ Ð¿Ñиложение гоÑизонÑалÑно, пÑоÑÑо добавлÑÑ Ð±Ð¾Ð»ÑÑе dynos (Ñ Ð¾ÑÑ, конеÑно, Ñ Ð²Ð°Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿Ð¾ÑвиÑÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑÑ ÑаÑÑиÑиÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð´Ð»Ñ Ð¾Ð±ÑабоÑки дополниÑелÑнÑÑ Ñоединений).
Ð¤Ð°Ð¹Ð»Ð¾Ð²Ð°Ñ ÑиÑÑема ÑÑемеÑна, поÑÑÐ¾Ð¼Ñ Ð²Ñ Ð½Ðµ можеÑе напÑÑмÑÑ ÑÑÑановиÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе Ð´Ð»Ñ Ð²Ð°Ñего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑеÑвиÑÑ (Ñо еÑÑÑ, Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , оÑеÑеди, ÑиÑÑÐµÐ¼Ñ ÐºÐµÑиÑованиÑ, Ñ ÑанениÑ, ÑеÑвиÑÑ ÑлекÑÑонной поÑÑÑ Ð¸ Ñак далее). Ðзамен ÑÑого, Heroku пÑедоÑÑавлÑÐµÑ ÑеÑвиÑÑ, доÑÑÑпнÑе как незавиÑимÑе "дополнениÑ" ("add-ons") либо Ð¾Ñ Ñамой Heroku, или Ð¾Ñ ÑÑоÑÐ¾Ð½Ð½Ð¸Ñ ÑазÑабоÑÑиков. Ð ÑÐ¾Ñ Ð¼Ð¾Ð¼ÐµÐ½Ñ ÐºÐ¾Ð³Ð´Ð° ваÑе пÑиложение запÑÑкаеÑÑÑ Ð² ÑиÑÑеме, dynos полÑÑÐ°ÐµÑ Ð´Ð¾ÑÑÑп к ÑеÑвиÑам, иÑполÑзÑÑ Ð¸Ð½ÑоÑмаÑиÑ, ÑодеÑжаÑÑÑÑÑ Ð² пеÑеменнÑÑ Ð½Ð°ÑÑÑойки ваÑего пÑиложениÑ.
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð²ÑполниÑÑ Ð²Ð°Ñе пÑиложение Heroku Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑÑÑановиÑÑ ÑооÑвеÑÑÑвÑÑÑее окÑÑжение и завиÑимоÑÑи, а Ñакже понимаÑÑ ÐºÐ°Ðº его (пÑиложение) запÑÑÑиÑÑ. Ð ÑлÑÑае пÑиложений Django Ð¼Ñ Ð¿ÑедоÑÑавлÑем ÑооÑвеÑÑÑвÑÑÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² неÑколÑÐºÐ¸Ñ ÑекÑÑовÑÑ ÑÐ°Ð¹Ð»Ð°Ñ :
- runtime.txt: ÑзÑк пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ его веÑÑиÑ.
- requirements.txt: Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ñе Ð´Ð»Ñ Python компоненÑÑ, вклÑÑÐ°Ñ Django.
- Procfile: СпиÑок пÑоÑеÑÑов, коÑоÑÑе бÑдÑÑ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ñ Ð´Ð»Ñ ÑÑаÑÑа веб-пÑиложениÑ. ÐÐ»Ñ Django ÑÑо обÑÑно ÑеÑÐ²ÐµÑ Ð²ÐµÐ±-пÑиложений Gunicorn (ÑкÑипÑ
.wsgi). - wsgi.py: конÑигÑÑаÑÐ¸Ñ WSGI Ð´Ð»Ñ Ð²Ñзова наÑего пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Django в окÑÑжении Heroku.
РазÑабоÑÑики Developers взаимодейÑÑвÑÑÑ Ñ Heroku пÑи помоÑи ÑпеÑиалÑного клиенÑÑкого пÑиложениÑ/ÑеÑминала, коÑоÑÑй ÑилÑно Ð¿Ð¾Ñ Ð¾Ð¶ на bash-ÑкÑÐ¸Ð¿Ñ Unix. Ðно позволÑÐµÑ Ð²Ð°Ð¼ загÑÑжаÑÑ ÐºÐ¾Ð´, Ð½Ð°Ñ Ð¾Ð´ÑÑийÑÑ Ð² git-ÑепозиÑоÑии, конÑÑоллиÑоваÑÑ Ð²ÑполнÑемÑе пÑоÑеÑÑÑ, ÑмоÑÑеÑÑ Ð»Ð¾Ð³Ð¸, ÑÑÑанавливаÑÑ ÐºÐ¾Ð½ÑигÑÑаÑионнÑе пеÑеменнÑе и многое дÑÑгое!
ÐÐ»Ñ Ñого, ÑÑÐ¾Ð±Ñ Ð·Ð°ÑÑавиÑÑ Ð²Ð°Ñе пÑиложение ÑабоÑаÑÑ Ñ Heroku, нам нÑжно ÑазмеÑÑиÑÑ Ð½Ð°Ñе веб-пÑиложение в git-ÑепозиÑоÑии, добавиÑÑ, пеÑеÑиÑленнÑе Ñанее, ÑайлÑ, подклÑÑиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ (add-on) Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ вÑполниÑÑ Ð½Ð°ÑÑÑойки Ð´Ð»Ñ Ð¿ÑавилÑной ÑабоÑÑ Ñо ÑÑаÑиÑеÑкими Ñайлами.
Ðогда Ð¼Ñ Ð²Ñполним вÑе, ÑÑо Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ Ð´Ð»Ñ Ð½Ð°Ñего ÑайÑа Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ Ð°ÐºÐºÐ°ÑÐ½Ñ Heroku, полÑÑиÑÑ Ð´Ð¾ÑÑÑп к клиенÑÑ Heroku и иÑполÑзоваÑÑ ÐµÐ³Ð¾, Ð´Ð»Ñ ÑÑÑановки наÑего веб-ÑайÑа.
ÐÑимеÑание: ÐнÑÑÑÑкÑии, пеÑеÑиÑленнÑе ниже, ÑооÑвеÑÑÑвÑÑÑ Ð¿ÑоÑеÑÑÑ ÑабоÑÑ Ñ Heroku во вÑÐµÐ¼Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ ÑÑаÑÑи (английÑкой веÑÑии - пÑим. пеÑев.). ÐÑли Heroku знаÑиÑелÑно Ð¸Ð·Ð¼ÐµÐ½Ð¸Ñ ÑÑÐ¾Ñ Ð¿ÑоÑеÑÑ, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе воÑполÑзоваÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑим опиÑанием: Heroku наÑало ÑабоÑÑ Ñ Django.
Ðа ÑÑом завеÑÑаеÑÑÑ ÐºÑаÑкий Ð¾Ð±Ð·Ð¾Ñ Ð½Ð°Ñала ÑабоÑÑ Ñ Heroku (более подÑобное ÑÑководÑÑво Ðак ÑабоÑÐ°ÐµÑ Heroku).
Создание ÑепозиÑоÑÐ¸Ñ Ð¿ÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð½Ð° Github
Heroku ÑеÑно инÑегÑиÑована Ñ ÑиÑÑемой ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²ÐµÑÑиÑми иÑÑ Ð¾Ð´Ð½Ð¾Ð³Ð¾ кода git, иÑполÑзÑÑ ÐµÑ Ð´Ð»Ñ Ð·Ð°Ð³ÑÑзки / ÑÐ¸Ð½Ñ ÑонизаÑии лÑбÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, коÑоÑÑе Ð²Ñ Ð²Ð½Ð¾ÑиÑе в живÑÑ ÑиÑÑемÑ. Ðн Ð´ÐµÐ»Ð°ÐµÑ ÑÑо, добавлÑÑ Ð½Ð¾Ð²Ñй «ÑдалÑннÑй» ÑепозиÑоÑий heroku Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ heroku, ÑказÑваÑÑий на ÑепозиÑоÑий Ð´Ð»Ñ Ð²Ð°Ñего иÑÑоÑника в облаке Heroku. Ðо вÑÐµÐ¼Ñ ÑазÑабоÑки Ð²Ñ Ð¸ÑполÑзÑеÑе git Ð´Ð»Ñ Ñ ÑÐ°Ð½ÐµÐ½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ в ваÑем «master» ÑепозиÑоÑии. Ðогда Ð²Ñ Ñ Ð¾ÑиÑе ÑазвеÑнÑÑÑ Ñвой ÑайÑ, Ð²Ñ ÑÐ¸Ð½Ñ ÑонизиÑÑеÑе Ñвои Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑепозиÑоÑии Heroku.
ÐÑимеÑание: ÐÑли Ð²Ñ Ð¿ÑивÑкли ÑледоваÑÑ Ñ Ð¾ÑоÑей пÑакÑике ÑазÑабоÑки пÑогÑаммного обеÑпеÑениÑ, вÑ, веÑоÑÑно, Ñже иÑполÑзÑеÑе git или какÑÑ-либо дÑÑгÑÑ ÑиÑÑÐµÐ¼Ñ SCM. ÐÑли Ñ Ð²Ð°Ñ Ñже еÑÑÑ git-ÑепозиÑоÑий, Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе пÑопÑÑÑиÑÑ ÑÑÐ¾Ñ Ñаг.
СÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑпоÑобов ÑабоÑÑ Ñ git, но одним из ÑамÑÑ Ð¿ÑоÑÑÑÑ ÑвлÑеÑÑÑ Ñоздание ÑÑÑÑной запиÑи в Github, Ñоздание ÑепозиÑоÑÐ¸Ñ Ñам, а заÑем ÑÐ¸Ð½Ñ ÑонизаÑÐ¸Ñ Ñ Ð½Ð¸Ð¼ локалÑно:
-
ÐоÑеÑиÑе https://github.com/ и ÑоздайÑе аккаÑнÑ.
-
ÐоÑле Ð²Ñ Ð¾Ð´Ð° в ÑиÑÑÐµÐ¼Ñ Ð½Ð°Ð¶Ð¼Ð¸Ñе ÑÑÑÐ»ÐºÑ + в веÑÑ Ð½ÐµÐ¹ панели инÑÑÑÑменÑов и вÑбеÑиÑе ÐовÑй ÑепозиÑоÑий.
-
ÐаполниÑе вÑе Ð¿Ð¾Ð»Ñ Ð½Ð° ÑÑой ÑоÑме. ХоÑÑ Ð¾Ð½Ð¸ не ÑвлÑÑÑÑÑ Ð¾Ð±ÑзаÑелÑнÑми, они наÑÑоÑÑелÑно ÑекомендÑÑÑÑÑ.
- ÐведиÑе Ð¸Ð¼Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ ÑепозиÑоÑÐ¸Ñ (напÑÐ¸Ð¼ÐµÑ django_local_library), и комменÑаÑий к ÑепозиÑоÑÐ¸Ñ (напÑÐ¸Ð¼ÐµÑ "Local Library website written in Django".
- ÐажмиÑе на ÐºÐ½Ð¾Ð¿ÐºÑ Add .gitignore и в поÑвивÑемÑÑ ÑпиÑке вÑбеÑиÑе Python.
- ÐÑбеÑиÑе Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑÑÑ Ð²Ð°Ð¼ лиÑÐµÐ½Ð·Ð¸Ñ Ð¸Ð· ÑпиÑка Add license. ÐÑли не знаеÑе Ð´Ð»Ñ Ñего ÑÑо - оÑÑавÑÑе как бÑло.
- УÑÑановиÑе галоÑÐºÑ Ð½Ð°Ð¿ÑоÑив Initialize this repository with a README.
-
ÐажмиÑе ÐºÐ½Ð¾Ð¿ÐºÑ Create repository, Ñем ÑамÑм Ñоздав Ð²Ð°Ñ ÑепозиÑоÑий.
-
ÐеÑейдиÑе на ÑÑÑаниÑÑ Ð²Ð°Ñего ÑепозиÑоÑиÑ. Там нажмиÑе на зелÑнÑÑ ÐºÐ½Ð¾Ð¿ÐºÑ Clone or download. СкопиÑÑйÑе URL из ÑекÑÑового Ð¿Ð¾Ð»Ñ Ð¸Ð· поÑвивÑегоÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²Ð¾Ð³Ð¾ окна (ÐÑо бÑÐ´ÐµÑ Ð¿Ð¾Ñ Ð¾Ð¶Ðµ на:
https://github.com/<your_git_user_id>/django_local_library.git). ÐдеÑÑ<your_git_user_id>- ÑÑо бÑÐ´ÐµÑ Ð²Ð°Ñ id полÑзоваÑÐµÐ»Ñ git.
Ðогда Ð²Ð°Ñ ÑепозиÑоÑий бÑÐ´ÐµÑ Ñоздан - загÑÑзиÑе его Ñебе на компÑÑÑеÑ, ÑледÑÑ Ð¸Ð½ÑÑÑÑкÑии, опиÑанной ниже:
-
УÑÑановиÑе git Ñебе на компÑÑÑÐµÑ (ÐÑ Ð¼Ð¾Ð¶ÐµÑе найÑи веÑÑÐ¸Ñ Ð´Ð»Ñ Ñвоей плаÑÑоÑÐ¼Ñ Ð·Ð´ÐµÑÑ).
-
ÐÑкÑойÑе команднÑÑ ÑÑÑÐ¾ÐºÑ (или ÑеÑминал) и вÑполниÑе в нÑм ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ, иÑполÑзÑÑ ÑÑÑлкÑ, коÑоÑÑÑ Ð²Ñ Ð¿Ð¾Ð»ÑÑили Ñ github:
bashgit clone https://github.com/<your_git_user_id>/django_local_library.gitÐÑо ÑоздаÑÑ Ð¿Ð¾Ð´Ð¿Ð°Ð¿ÐºÑ (Ñ ÑодеÑжанием ваÑего ÑепозиÑоÑÐ¸Ñ Ð¸ именем ваÑего ÑепозиÑоÑиÑ) внÑÑÑи папки, в коÑоÑой вÑполнÑлаÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°.
-
ÐеÑейдиÑе в ÑÑÑ Ð¿Ð°Ð¿ÐºÑ:
bashcd django_local_library.git
ÐоÑледний Ñаг. ÐÑжно ÑкопиÑоваÑÑ Ð²Ð°Ñе Django-пÑиложение и добавиÑÑ ÐµÐ³Ð¾ ÑÐ°Ð¹Ð»Ñ Ð² новÑй ÑепозиÑоÑий, иÑполÑзÑÑ git:
-
СкопиÑÑйÑе ваÑе пÑиложение в Ð¿Ð°Ð¿ÐºÑ ÑепозиÑоÑÐ¸Ñ (вÑе ÑÐ°Ð¹Ð»Ñ Ñ Ñаким же ÑÑовнем, как Ñ manage.py, ÐÐРпапки пÑоекÑа, в коÑоÑой ÑÑи ÑÐ°Ð¹Ð»Ñ Ð½Ð°Ñ Ð¾Ð´ÑÑÑÑ).
-
ÐÑкÑойÑе Ñайл Ñ ÑаÑÑиÑением .gitignore в ÑекÑÑовом ÑедакÑоÑе, вÑÑавÑÑе в ÑамÑй его ÐºÐ¾Ð½ÐµÑ ÑÑÑоки, пÑиведÑннÑе ниже, а заÑем ÑÐ¾Ñ ÑаниÑе (ÑÑÐ¾Ñ Ñайл "говоÑиÑ" о ÑÐ°Ð¹Ð»Ð°Ñ , коÑоÑÑе не Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐ½Ñ Ð² git по ÑмолÑаниÑ).
# Text backup files *.bak #Database *.sqlite3
-
ÐÑкÑойÑе команднÑÑ ÑÑÑÐ¾ÐºÑ Ð¸Ð»Ð¸ ÑеÑминал и иÑполÑзÑйÑе
addÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ñ Ñлагом-A. ÐÑа команда ÑÐ¾Ñ ÑÐ°Ð½Ð¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑепозиÑоÑий:bashgit add -A -
ÐÑполÑзÑйÑе командÑ
status, ÑÑо Ð±Ñ ÑбедиÑÑÑÑ, ÑÑо вÑе ÑайлÑ, коÑоÑÑе Ð²Ñ ÑобиÑаеÑеÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ Ð²ÐµÑÐ½Ñ (Ð²Ñ Ñ Ð¾ÑиÑе вклÑÑиÑÑ Ð¸ÑÑ Ð¾Ð´Ð½Ñе ÑайлÑ, а не бинаÑнÑе ÑайлÑ, вÑеменнÑе ÑÐ°Ð¹Ð»Ñ Ð¸ Ñ. д.). РконÑÐ¾Ð»Ñ Ð²ÑведеÑÑÑ ÑÑо Ñо вÑоде ÑÑого:> git status On branch master Your branch is up-to-date with 'origin/master'. Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: .gitignore new file: catalog/__init__.py ... new file: catalog/migrations/0001_initial.py ... new file: templates/registration/password_reset_form.html -
ТепеÑÑ, заÑикÑиÑÑйÑе ÑÐ°Ð¹Ð»Ñ Ð² локалÑном ÑепозиÑоÑии:
bashgit commit -m "First version of application moved into github" -
Ð¡Ð¸Ð½Ñ ÑонизиÑÑеÑе Ñвой локалÑнÑй ÑепозиÑоÑий Ñ ÑайÑом Github:
git push origin master
Ðогда ÑÑи опеÑаÑии завеÑÑаÑÑÑ, веÑниÑеÑÑ Ð½Ð° ÑÑÑаниÑÑ Github где Ð²Ñ Ñоздали Ñвой ÑепозиÑоÑий, обновиÑе ÑÑÑаниÑÑ, и ÑбедиÑеÑÑ, ÑÑо ваÑе пÑиложение полноÑÑÑÑ Ð·Ð°Ð³ÑÑжено. ÐÑи надобноÑÑи обновиÑÑ ÑÐ°Ð¹Ð»Ñ Ð½Ð° ÑепозиÑоÑии - повÑоÑиÑе Ñикл ввода команд add/commit/push.
ÐÑимеÑание: ÐÑо Ñ Ð¾ÑоÑий Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑезеÑвной копии ваÑего «ванилÑного» пÑоекÑа â в Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº некоÑоÑÑе изменениÑ, коÑоÑÑе Ð¼Ñ ÑобиÑаемÑÑ ÑделаÑÑ Ð² ÑледÑÑÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ , могÑÑ Ð±ÑÑÑ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñ Ð´Ð»Ñ ÑазвÑÑÑÑÐ²Ð°Ð½Ð¸Ñ Ð½Ð° лÑбой плаÑÑоÑме (или ÑазÑабоÑке), коÑоÑÑе дÑÑгие могÑÑ Ð½Ðµ иÑполÑзоваÑÑ.
ÐÑÑÑий ÑпоÑоб ÑделаÑÑ ÑÑо - иÑполÑзоваÑÑ git Ð´Ð»Ñ ÑпÑÐ°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð°Ñими изменениÑми. С git Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе не ÑолÑко веÑнÑÑÑÑÑ Ðº опÑеделÑнной ÑÑаÑой веÑÑии, но и ÑÐ¾Ñ ÑаниÑÑ ÐµÑ Ð² оÑделÑной «веÑке» ваÑÐ¸Ñ Ð¿ÑоизводÑÑвеннÑÑ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹, and cherry-pick - вÑбÑаÑÑ Ð»ÑбÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¿ÐµÑемеÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ Ð²ÐµÑвÑми пÑоизводÑÑва и ÑазвиÑиÑ. ÐзÑÑение Git бÑÐ´ÐµÑ ÑÑоиÑÑ ÑÑилий, но ÑÑо вÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° Ñамки данной ÑемÑ. СамÑй пÑоÑÑой ÑпоÑоб ÑделаÑÑ ÑÑо - пÑоÑÑо ÑкопиÑоваÑÑ ÑÐ°Ð¹Ð»Ñ Ð² дÑÑгое меÑÑо. ÐÑполÑзÑйÑе ÑÐ¾Ñ Ð¿Ð¾Ð´Ñ Ð¾Ð´, коÑоÑÑй наилÑÑÑим обÑазом ÑооÑвеÑÑÑвÑÐµÑ Ð²Ð°Ñим знаниÑм git!
ÐбновиÑÑ Ð¿Ñиложение Ð´Ð»Ñ Heroku
Ð ÑÑой ÑаÑÑи говоÑиÑÑÑ Ð¾Ð± изменениÑÑ , коÑоÑÑе Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑделаÑÑ Ð½Ð° наÑем пÑиложении LocalLibrary, ÑÑо Ð±Ñ Ð¾Ð½Ð¾ ÑабоÑало на Heroku. Ð Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº докÑменÑаÑÐ¸Ñ "наÑало ÑабоÑÑ Ñ Heroku Ñ Ð¸Ð½ÑÑÑÑкÑиÑми Django" пÑедполагаеÑ, ÑÑо Ð²Ñ Ð±ÑдеÑе иÑполÑзоваÑÑ Heroku client Ð´Ð»Ñ Ð·Ð°Ð¿ÑÑка локалÑной ÑÑÐµÐ´Ñ ÑазÑабоÑки, наÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð·Ð´ÐµÑÑ ÑовмеÑÑÐ¸Ð¼Ñ Ñ ÑÑÑеÑÑвÑÑÑим ÑеÑвеÑом ÑазÑабоÑки Django и ÑпоÑобами ÑабоÑÑ, коÑоÑÑе Ð¼Ñ Ñже Ñзнали.
Procfile
СоздайÑе Ñайл Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ Procfile (без ÑаÑÑиÑениÑ) в коÑне наÑего GitHub ÑепозиÑоÑии обÑÑвиÑÑ ÑÐ¸Ð¿Ñ Ð¿ÑоÑеÑÑов и ÑоÑки вÑ
ода пÑиложениÑ. СкопиÑÑйÑе в него ÑледÑÑÑий ÑекÑÑ:
web: gunicorn locallibrary.wsgi --log-file -
«web:» ÑообÑÐ°ÐµÑ Heroku, ÑÑо ÑÑо веб динамиÑеÑкий и Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð¾ÑпÑавлен HTTP-ÑÑаÑик. ÐÑоÑеÑÑ, коÑоÑÑй наÑнÑÑÑÑ Ð² ÑÑом динамиÑеÑки, - ÑÑо gunicorn, коÑоÑÑй ÑвлÑеÑÑÑ Ð¿Ð¾Ð¿ÑлÑÑнÑм ÑеÑвеÑом веб-пÑиложений, коÑоÑÑй ÑекомендÑÐµÑ Heroku. ÐÑ Ð·Ð°Ð¿ÑÑкаем Gunicorn, иÑполÑзÑÑ ÐºÐ¾Ð½ÑигÑÑаÑионнÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² модÑле locallibrary.wsgi (ÑозданнÑй Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð½Ð°Ñего ÑкелеÑа пÑиложениÑ: /locallibrary/wsgi.py).
Gunicorn
Gunicorn ÑекомендÑемÑй http ÑеÑÐ²ÐµÑ Ñ Django на Heroku (Ðак Ñказано в Procfile вÑÑе). ÐÑо ÑиÑÑÑй python http ÑеÑÐ²ÐµÑ Ð´Ð»Ñ WSGI пÑиложений коÑоÑÑе могÑÑ Ð·Ð°Ð¿ÑÑкаÑÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво паÑаллелÑнÑÑ python пÑоÑеÑÑов в пÑÐµÐ´ÐµÐ»Ð°Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ динамиÑеÑкого (поÑмоÑÑиÑе Deploying Python applications with Gunicorn Ð´Ð»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑÑей инÑоÑмаÑии).
Также нам не понадобиÑÑÑ Gunicorn Ð´Ð»Ñ Ð¾Ð±ÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ñей LocalLibrary пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² ÑеÑение ÑазÑабоÑки, Ð¼Ñ ÑÑÑановим ÑÑо Ñак, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑÑал ÑаÑÑÑÑ Ð½Ð°ÑÐ¸Ñ ÑÑебований к Heroku Ð´Ð»Ñ Ð½Ð°ÑÑÑойки на ÑдалÑнном ÑеÑвеÑе.
УÑÑановка Gunicorn локалÑно в командной ÑÑÑоке иÑполÑзÑÑ Ð¿Ð°ÐºÐµÑнÑй Ð¼ÐµÐ½ÐµÐ´Ð¶ÐµÑ pip (коÑоÑÑе Ð¼Ñ ÑÑÑановили когда наÑÑÑаивали ÑÑÐµÐ´Ñ ÑазÑабоÑки):
pip3 install gunicorn
ÐаÑÑÑойка ÐÐ°Ð·Ñ ÐаннÑÑ
ÐÑ Ð½Ðµ можем иÑполÑзоваÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ SQLite по ÑмолÑÐ°Ð½Ð¸Ñ Ð½Ð° Heroku, поÑÐ¾Ð¼Ñ ÑÑо она оÑнована на ÑÐ°Ð¹Ð»Ð°Ñ , и она бÑÐ´ÐµÑ Ñдалена из ÑÑемеÑной Ñайловой ÑиÑÑÐµÐ¼Ñ ÐºÐ°Ð¶Ð´Ñй Ñаз, когда пÑиложение пеÑезагÑÑжаеÑÑÑ (обÑÑно один Ñаз в Ð´ÐµÐ½Ñ Ð¸ каждÑй Ñаз, когда изменÑеÑÑÑ Ð¿Ñиложение или его пеÑеменнÑе конÑигÑÑаÑии ).
ÐÐµÑ Ð°Ð½Ð¸Ð·Ð¼ Heroku Ð´Ð»Ñ Ð¾Ð±ÑабоÑки ÑÑой ÑиÑÑаÑии заклÑÑаеÑÑÑ Ð² иÑполÑзовании надÑÑÑойки Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸ наÑÑÑойке веб-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ Ð¸ÑполÑзованием инÑоÑмаÑии из пеÑеменной конÑигÑÑаÑии ÑÑедÑ, ÑÑÑановленной надÑÑÑойкой. СÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво опÑий Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ , но Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ hobby ÑÑÐ¾Ð²ÐµÐ½Ñ Ð² базе даннÑÑ postgres Heroku, поÑколÑÐºÑ ÑÑо беÑплаÑно, поддеÑживаеÑÑÑ Django и авÑомаÑиÑеÑки добавлÑеÑÑÑ Ð² наÑи новÑе пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Heroku пÑи иÑполÑзовании беÑплаÑного ÑÑÐ¾Ð²Ð½Ñ Ð´Ð¸Ð½Ð°Ð¼Ð¸ÑеÑкого плана Ð´Ð»Ñ Ñ Ð¾Ð±Ð±Ð¸.
ÐнÑоÑмаÑÐ¸Ñ Ð¾ подклÑÑении Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
пÑедоÑÑавлÑеÑÑÑ Ð½Ð° web dyno, иÑполÑзÑÑ ÐºÐ¾Ð½ÑигÑÑаÑионнÑÑ Ð¿ÐµÑеменнÑÑ Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ DATABASE_URL. ÐмеÑÑо Ñого, ÑÑÐ¾Ð±Ñ Ð¶ÑÑÑко кодиÑоваÑÑ ÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð² Django, Heroku ÑекомендÑÐµÑ ÑазÑабоÑÑикам иÑполÑзоваÑÑ dj-database-url Ð¿Ð°ÐºÐµÑ Ð´Ð»Ñ Ð°Ð½Ð°Ð»Ð¸Ð·Ð° DATABASE_URL пеÑеменнÑÑ Ð¾ÐºÑÑÐ¶ÐµÐ½Ð¸Ñ Ð¸ авÑомаÑиÑеÑки пÑеобÑазоваÑÑ ÐµÑ Ð² желаемÑй ÑоÑÐ¼Ð°Ñ ÐºÐ¾Ð½ÑигÑÑаÑии Django. Рдополнение к ÑÑÑановке пакеÑа dj-database-url нам Ñакже поÑÑебÑеÑÑÑ ÑÑÑановиÑÑ psycopg2, поÑколÑÐºÑ Django нÑждаеÑÑÑ Ð² ÑÑом, ÑÑÐ¾Ð±Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑвоваÑÑ Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ даннÑÑ
Postgres.
dj-database-url (Django конÑигÑÑаÑии Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Ð¸Ð· пеÑеменной окÑÑжениÑ)
УÑÑановиÑе dj-database-url локалÑно, ÑÑÐ¾Ð±Ñ Ð¾Ð½ ÑÑал ÑаÑÑÑÑ Ð½Ð°ÑÐ¸Ñ ÑÑебований к наÑÑÑойке Heroku на ÑдалÑнном ÑеÑвеÑе:
pip3 install dj-database-url
settings.py
ÐÑкÑойÑе /locallibrary/settings.py и ÑкопиÑÑйÑе ÑледÑÑÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð² нижнÑÑ ÑаÑÑÑ Ñайла:
# Heroku: Update database configuration from $DATABASE_URL. import dj_database_url db_from_env = dj_database_url.config(conn_max_age=500) DATABASES['default'].update(db_from_env)
ÐÑимеÑание:
- ÐÑ Ð²Ñе еÑÑ Ð±Ñдем иÑполÑзоваÑÑ SQLite во вÑÐµÐ¼Ñ ÑазÑабоÑки, поÑколÑкÑ
DATABASE_URLпеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ Ð½Ðµ бÑÐ´ÐµÑ ÑÑÑановлена на наÑем компÑÑÑеÑе ÑазÑабоÑки. - ÐнаÑение
conn_max_age=500Ð´ÐµÐ»Ð°ÐµÑ Ñоединение поÑÑоÑннÑм, ÑÑо намного ÑÑÑекÑивнее, Ñем воÑÑоздаваÑÑ Ñоединение в каждом Ñикле запÑоÑов. Ðднако ÑÑо необÑзаÑелÑно и пÑи Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼Ð¾ÑÑи можно ÑдалиÑÑ.
psycopg2 (Python Postgres database support)
Django нÑждаеÑÑÑ Ð² psycopg2 Ð´Ð»Ñ ÑабоÑÑ Ñ Ð±Ð°Ð·Ð°Ð¼Ð¸ даннÑÑ Postgres, и вам нÑжно бÑÐ´ÐµÑ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑÑо в Ñайл ÑÑебований.txt Ð´Ð»Ñ Heroku, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ ÑÑо на ÑдалÑнном ÑеÑвеÑе (как опиÑано в Ñазделе ÑÑебований ниже).
Django бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð½Ð°ÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ SQLite локалÑно по ÑмолÑаниÑ, поÑколÑÐºÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ ÑÑÐµÐ´Ñ DATABASE_URL не задана в наÑей локалÑной ÑÑеде. ÐÑли Ð²Ñ Ñ Ð¾ÑиÑе полноÑÑÑÑ Ð¿ÐµÑейÑи на Postgres и иÑполÑзоваÑÑ Ð½Ð°ÑÑ Ð±ÐµÑплаÑнÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ Heroku Ð´Ð»Ñ ÑазÑабоÑки и пÑоизводÑÑва, Ñо Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ ÑÑÑановиÑÑ psycopg2 и его завиÑимоÑÑи локалÑно в ÑиÑÑеме на базе Linux, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¸ÑполÑзоваÑÑ ÑледÑÑÑие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ bash / terminal:
sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib
pip3 install psycopg2
ÐнÑÑÑÑкÑии по ÑÑÑановке Ð´Ð»Ñ Ð´ÑÑÐ³Ð¸Ñ Ð¿Ð»Ð°ÑÑоÑм можно найÑи на веб-ÑайÑе psycopg2.
Ðднако вам не нÑжно ÑÑо делаÑÑ - вам не нÑжно, ÑÑÐ¾Ð±Ñ PostGreSQL бÑл акÑивнÑм на локалÑном компÑÑÑеÑе, еÑли Ð²Ñ Ð¿ÐµÑедаÑÑе его в Heroku в каÑеÑÑве ÑÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² Ñайле ÑÑебований.txt (Ñм. Ðиже).
ÐбÑлÑживание ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов в пÑоизводÑÑве
Ðо вÑÐµÐ¼Ñ ÑазÑабоÑки Ð¼Ñ Ð¸ÑполÑзовали Django и веб-ÑеÑÐ²ÐµÑ ÑазÑабоÑки Django Ð´Ð»Ñ Ð¾Ð±ÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð°ÑÐ¸Ñ ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов (CSS, JavaScript и Ñ. Ð.). РпÑоизводÑÑвенной ÑÑеде вмеÑÑо ÑÑого Ð¼Ñ Ð¾Ð±ÑÑно обÑлÑживаем ÑÑаÑиÑеÑкие ÑÐ°Ð¹Ð»Ñ Ð¸Ð· ÑеÑи доÑÑавки конÑенÑа (CDN) или веб-ÑеÑвеÑа.
ÐÑимеÑание: ÐбÑлÑживание ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов ÑеÑез Django / веб-пÑиложение неÑÑÑекÑивно, поÑÐ¾Ð¼Ñ ÑÑо запÑоÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑÐ¾Ñ Ð¾Ð´Ð¸ÑÑ ÑеÑез ненÑжнÑй дополниÑелÑнÑй код (Django), а не обÑабаÑÑваÑÑÑÑ Ð½ÐµÐ¿Ð¾ÑÑедÑÑвенно веб-ÑеÑвеÑом или полноÑÑÑÑ Ð¾ÑделÑнÑм CDN. ХоÑÑ ÑÑо не Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¼ÐµÑÑного иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ ÑазÑабоÑки, ÑÑо бÑÐ´ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°ÑиÑелÑное влиÑние на пÑоизводиÑелÑноÑÑÑ, еÑли Ð¼Ñ Ð±Ñдем иÑполÑзоваÑÑ ÑÐ¾Ñ Ð¶Ðµ Ð¿Ð¾Ð´Ñ Ð¾Ð´ в пÑоизводÑÑве.
ЧÑÐ¾Ð±Ñ ÑпÑоÑÑиÑÑ ÑазмеÑение ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов оÑделÑно Ð¾Ñ Ð²ÐµÐ±-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Django, Django пÑедоÑÑавлÑÐµÑ ÑÑедÑÑво ÑбоÑа даннÑÑ Ð´Ð»Ñ ÑбоÑа ÑÑÐ¸Ñ Ñайлов Ð´Ð»Ñ ÑазвÑÑÑÑÐ²Ð°Ð½Ð¸Ñ (имееÑÑÑ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¿Ð°ÑамеÑÑов, опÑеделÑÑÑаÑ, где ÑÐ°Ð¹Ð»Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑобиÑаÑÑÑÑ Ð¿Ñи запÑÑке collectstatic). Ð¨Ð°Ð±Ð»Ð¾Ð½Ñ Django оÑноÑÑÑÑÑ Ðº меÑÑÑ ÑазмеÑÐµÐ½Ð¸Ñ ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов оÑноÑиÑелÑно пеÑеменной паÑамеÑÑов (STATIC_URL), Ñак ÑÑо ÑÑо можно измениÑÑ, еÑли ÑÑаÑиÑеÑкие ÑÐ°Ð¹Ð»Ñ Ð¿ÐµÑемеÑаÑÑÑÑ Ð½Ð° дÑÑгой Ñ Ð¾ÑÑ / ÑеÑвеÑ.
СооÑвеÑÑÑвÑÑÑими паÑамеÑÑами наÑÑÑойки ÑвлÑÑÑÑÑ:
STATIC_URL: ÑÑо базовое ÑаÑположение URL, из коÑоÑого бÑдÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐ½Ñ ÑÑаÑиÑеÑкие ÑайлÑ, напÑимеÑ, на CDN. ÐÑо иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÐµÑеменной ÑÑаÑиÑеÑкого Ñаблона, доÑÑÑп к коÑоÑой оÑÑÑеÑÑвлÑеÑÑÑ Ð² наÑем базовом Ñаблоне (Ñм. УÑебник по Django Part 5: Создание наÑей домаÑней ÑÑÑаниÑÑ). STATIC_ROOT: ÐÑо абÑолÑÑнÑй пÑÑÑ Ðº каÑалогÑ, в коÑоÑом инÑÑÑÑÐ¼ÐµÐ½Ñ Â«collectstatic» Django бÑÐ´ÐµÑ ÑобиÑаÑÑ Ð»ÑбÑе ÑÑаÑиÑеÑкие ÑайлÑ, ÑпомÑнÑÑÑе в наÑÐ¸Ñ ÑÐ°Ð±Ð»Ð¾Ð½Ð°Ñ . ÐоÑле Ð¸Ñ ÑбоÑа они заÑем могÑÑ Ð±ÑÑÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐ½Ñ Ð² гÑÑппÑ, где Ð±Ñ ÑÐ°Ð¹Ð»Ñ Ð½Ðµ ÑазмеÑалиÑÑ. STATICFILES_DIRS: Ð ÑÑом ÑпиÑке пеÑеÑиÑÐ»ÐµÐ½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе каÑалоги, в коÑоÑÑÑ Ð¸Ð½ÑÑÑÑÐ¼ÐµÐ½Ñ ÐºÐ¾Ð»Ð»ÐµÐºÑивного поиÑка Django должен иÑкаÑÑ ÑÑаÑиÑеÑкие ÑайлÑ.
settings.py
ÐÑкÑойÑе /locallibrary/settings.py и ÑкопиÑÑйÑе ÑледÑÑÑÑÑ ÐºÐ¾Ð½ÑигÑÑаÑÐ¸Ñ Ð² нижнÑÑ ÑаÑÑÑ Ñайла. BASE_DIR Ñже должен бÑÑÑ Ð¾Ð¿ÑеделÑн в ваÑем Ñайле (STATIC_URL, возможно, Ñже бÑл опÑеделÑн в Ñайле, когда он бÑл Ñоздан. Ð Ñо вÑÐµÐ¼Ñ ÐºÐ°Ðº ÑÑо не пÑиÑÐ¸Ð½Ð¸Ñ Ð²Ñеда, Ð²Ñ Ñакже можеÑе ÑдалиÑÑ Ð´ÑблиÑÑемÑÑ Ð¿ÑедÑдÑÑÑÑ ÑÑÑлкÑ).
# Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/1.10/howto/static-files/ # The absolute path to the directory where collectstatic will collect static files for deployment. STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles') # The URL to use when referring to static files (where they will be served from) STATIC_URL = '/static/'
ФакÑиÑеÑки Ð¼Ñ Ð±Ñдем делаÑÑ Ñайл, иÑполÑзÑÑ Ð±Ð¸Ð±Ð»Ð¸Ð¾ÑÐµÐºÑ WhiteNoise, коÑоÑÑÑ Ð¼Ñ ÑÑÑанавливаем и наÑÑÑаиваем в ÑледÑÑÑем Ñазделе.
ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии Ñм. Django и Static Assets (докÑменÑÑ Heroku).
WhiteNoise
СÑÑеÑÑвÑÐµÑ Ð¼Ð½Ð¾Ð¶ÐµÑÑво ÑпоÑобов обÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов на пÑоизводÑÑве (Ð¼Ñ Ð²Ð¸Ð´ÐµÐ»Ð¸ ÑооÑвеÑÑÑвÑÑÑие наÑÑÑойки Django в пÑедÑдÑÑÐ¸Ñ ÑÐ°Ð·Ð´ÐµÐ»Ð°Ñ ). Heroku ÑекомендÑÐµÑ Ð¸ÑполÑзоваÑÑ Ð¿ÑÐ¾ÐµÐºÑ WhiteNoise Ð´Ð»Ñ Ð¾Ð±ÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑаÑиÑеÑÐºÐ¸Ñ Ð°ÐºÑивов непоÑÑедÑÑвенно из Gunicorn в пÑоизводÑÑве.
ÐÑимеÑание: Heroku авÑомаÑиÑеÑки вÑзÑÐ²Ð°ÐµÑ collectstatic и гоÑÐ¾Ð²Ð¸Ñ Ð²Ð°Ñи ÑÑаÑиÑеÑкие ÑÐ°Ð¹Ð»Ñ Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ WhiteNoise поÑле Ñого, как он загÑÑÐ·Ð¸Ñ Ð²Ð°Ñе пÑиложение. ÐоÑмоÑÑиÑе WhiteNoise докÑменÑаÑÐ¸Ñ Ð´Ð»Ñ Ð¾Ð±ÑÑÑÐ½ÐµÐ½Ð¸Ñ Ñого, как она ÑабоÑаеÑ, и поÑÐµÐ¼Ñ ÑеализаÑÐ¸Ñ ÑвлÑеÑÑÑ Ð¾ÑноÑиÑелÑно ÑÑÑекÑивнÑм меÑодом Ð´Ð»Ñ Ð¾Ð±ÑлÑÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑÐ¸Ñ Ñайлов.
Шаги по наÑÑÑойке WhiteNoise Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² пÑоекÑе:
УÑÑановка WhiteNoise
УÑÑановиÑе WhiteNoise локалÑно, иÑполÑзÑÑ ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
pip3 install whitenoise
settings.py
ЧÑÐ¾Ð±Ñ ÑÑÑановиÑÑ WhiteNoise в пÑиложение Django, оÑкÑойÑе /locallibrary/settings.py, найдиÑе паÑамеÑÑ MIDDLEWARE и добавÑÑе WhiteNoiseMiddleware в веÑÑ Ð½ÐµÐ¹ ÑаÑÑи ÑпиÑка, ÑÑÑÑ Ð½Ð¸Ð¶Ðµ SecurityMiddleware:
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'whitenoise.middleware.WhiteNoiseMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ÐÑи желании Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе ÑменÑÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов пÑи Ð¸Ñ Ð¾Ð±ÑлÑживании (ÑÑо более ÑÑÑекÑивно). ÐÑоÑÑо добавÑÑе ÑледÑÑÑее в ÐºÐ¾Ð½ÐµÑ /locallibrary/settings.py:
# Simplified static file serving. # https://warehouse.python.org/project/whitenoise/ STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'
Requirements
ТÑÐµÐ±Ð¾Ð²Ð°Ð½Ð¸Ñ Python ваÑего веб-пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ñ ÑаниÑÑÑÑ Ð² Ñайле requirements.txt в коÑневом каÑалоге ваÑего ÑепозиÑоÑиÑ. ÐоÑле ÑÑого Heroku авÑомаÑиÑеÑки ÑÑÑÐ°Ð½Ð¾Ð²Ð¸Ñ Ð¸Ñ Ð¿Ñи воÑÑÑановлении ваÑей ÑÑедÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе ÑоздаÑÑ ÑÑÐ¾Ñ Ñайл Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ pip в командной ÑÑÑоке (запÑÑÑиÑе в коÑне repo):
pip3 freeze > requirements.txt
ÐоÑле ÑÑÑановки вÑÐµÑ ÑазнÑÑ Ð·Ð°Ð²Ð¸ÑимоÑÑей вÑÑе, Ñайл requirements.txt должен имеÑÑ Ð¿Ð¾ менÑÑей меÑе ÑÑи пеÑеÑиÑленнÑе ÑлеменÑÑ (Ñ Ð¾ÑÑ Ð½Ð¾Ð¼ÐµÑа веÑÑий могÑÑ Ð¾ÑлиÑаÑÑÑÑ). УдалиÑе лÑбÑе дÑÑгие завиÑимоÑÑи, не пеÑеÑиÑленнÑе ниже, еÑли Ð²Ñ Ñвно не добавили Ð¸Ñ Ð´Ð»Ñ ÑÑого пÑиложениÑ.
dj-database-url==0.4.1 Django==1.10.2 gunicorn==19.6.0 psycopg2==2.6.2 whitenoise==3.2.2
ÐÑимеÑание: УбедиÑеÑÑ, ÑÑо ÑÑÑока psycopg2, Ð¿Ð¾Ð´Ð¾Ð±Ð½Ð°Ñ Ð¿ÑиведÑнной вÑÑе, пÑиÑÑÑÑÑвÑеÑ! Ðаже еÑли Ð²Ñ Ð½Ðµ ÑÑÑановили ÑÑо локалÑно, Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð´Ð¾Ð±Ð°Ð²Ð¸ÑÑ ÑÑо в requirements.txt.
СÑеда вÑполнениÑ
Файл runtime.txt, еÑли опÑеделÑн, говоÑÐ¸Ñ Heroku, какой ÑзÑк пÑогÑаммиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð¸ÑполÑзоваÑÑ. СоздайÑе Ñайл в коÑне Ñепо и добавÑÑе ÑледÑÑÑий ÑекÑÑ:
python-3.5.2
ÐÑимеÑание: Heroku поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ ÑолÑко неболÑÑое колиÑеÑÑво Python runtimes. (на Ð¼Ð¾Ð¼ÐµÐ½Ñ Ð½Ð°Ð¿Ð¸ÑÐ°Ð½Ð¸Ñ ÑÑаÑÑи, в Ñом ÑиÑле и вÑÑе). Heroku бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑ Ð¿Ð¾Ð´Ð´ÐµÑживаемÑÑ ÑÑÐµÐ´Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ð·Ð½Ð°ÑениÑ, Ñказанного в ÑÑом Ñайле.
Ð¡Ð¾Ñ ÑаниÑе Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Github и пеÑепÑовеÑÑÑе
Ðалее Ð¼Ñ ÑÐ¾Ñ Ñаним вÑе наÑи Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Github. Ð ÑеÑминале (whist внÑÑÑи наÑего ÑепозиÑоÑиÑ) введиÑе ÑледÑÑÑие командÑ:
git add -A
git commit -m "Added files and changes required for deployment to heroku"
git push origin master
ÐÑежде Ñем пÑодолжиÑÑ, дайÑе возможноÑÑÑ Ð¿ÑовеÑиÑÑ ÑÐ°Ð¹Ñ Ñнова локалÑно и ÑбедиÑÑÑÑ, ÑÑо ÑÑо не повлиÑло ни на одно из наÑÐ¸Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ð¹ вÑÑе. ÐапÑÑÑиÑе веб-ÑеÑÐ²ÐµÑ ÑазÑабоÑки как обÑÑно, а заÑем пÑовеÑÑÑе, ÑабоÑÐ°ÐµÑ Ð»Ð¸ ÑайÑ, как Ð²Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑе в ÑвоÑм бÑаÑзеÑе.
python3 manage.py runserver
ТепеÑÑ Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ð³Ð¾ÑÐ¾Ð²Ñ Ð½Ð°ÑаÑÑ ÑазвÑÑÑÑвание LocalLibrary на Heroku.
ÐолÑÑиÑÑ Ð°ÐºÐºÐ°ÑÐ½Ñ Ð² heroku
ЧÑÐ¾Ð±Ñ Ð½Ð°ÑаÑÑ Ð¸ÑполÑзоваÑÑ Heroku, вам ÑнаÑала нÑжно ÑоздаÑÑ ÑÑÑÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ:
- ÐеÑейдиÑе www.heroku.com и нажмиÑе SIGN UP FOR FREE кнопкÑ.
- ÐведиÑе ваÑи даннÑе, а заÑем нажмиÑе CREATE FREE ACCOUNT. Ðам бÑÐ´ÐµÑ Ð¿Ñедложено пÑовеÑиÑÑ ÑÐ²Ð¾Ñ ÑÑÑÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð¿Ð¾ адÑеÑÑ ÑлекÑÑонной поÑÑÑ Ð´Ð»Ñ ÑегиÑÑÑаÑии.
- ÐажмиÑе ÑÑÑÐ»ÐºÑ Ð°ÐºÑиваÑии ÑÑÑÑной запиÑи в ÑлекÑÑонной поÑÑе Ð´Ð»Ñ ÑегиÑÑÑаÑии. ÐÑ Ð²ÐµÑнÑÑеÑÑ Ð² ÑÐ²Ð¾Ñ ÑÑÑÑнÑÑ Ð·Ð°Ð¿Ð¸ÑÑ Ð² веб-бÑаÑзеÑе.
- ÐведиÑе Ñвой паÑÐ¾Ð»Ñ Ð¸ нажмиÑе SET PASSWORD AND LOGIN.
- ÐаÑем Ð²Ñ Ð²Ð¾Ð¹Ð´ÑÑе в ÑиÑÑÐµÐ¼Ñ Ð¸ попадÑÑе в пÑибоÑнÑÑ Ð¿Ð°Ð½ÐµÐ»Ñ Heroku: https://dashboard.heroku.com/apps.
УÑÑановка клиенÑа
ÐагÑÑзиÑе и ÑÑÑановиÑе ÐºÐ»Ð¸ÐµÐ½Ñ Heroku, ÑледÑÑ Ð¸Ð½ÑÑÑÑкÑиÑм Heroku здеÑÑ.
ÐоÑле ÑÑÑановки клиенÑа вам бÑдÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ. ÐапÑимеÑ, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑпÑÐ°Ð²ÐºÑ Ð¾ клиенÑе:
heroku help
Создание и загÑÑзка веб-ÑайÑа
ЧÑÐ¾Ð±Ñ ÑоздаÑÑ Ð¿Ñиложение, Ð¼Ñ Ð·Ð°Ð¿ÑÑкаем ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Â«create» в коÑневом каÑалоге наÑего ÑепозиÑоÑиÑ. ÐÑо ÑоздаÑÑ git remote («ÑказаÑÐµÐ»Ñ Ð½Ð° ÑдалÑннÑй ÑепозиÑоÑий»), названнÑй heroku в наÑей локалÑной ÑÑеде git.
heroku create
ÐÑимеÑание: ÐÑ Ð¼Ð¾Ð¶ÐµÑе назваÑÑ ÑдалÑннÑй, еÑли Ñ Ð¾ÑиÑе, Ñказав знаÑение поÑле «create». ÐÑли Ð²Ñ ÑÑого не ÑделаеÑе, Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе ÑлÑÑайное имÑ. ÐÐ¼Ñ Ð¸ÑполÑзÑеÑÑÑ Ð² URL-адÑеÑе по ÑмолÑаниÑ.
ÐаÑем Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ подÑолкнÑÑÑ Ð½Ð°Ñе пÑиложение в ÑепозиÑоÑий heroku как показано ниже. ÐÑо Ð¿Ð¾Ð·Ð²Ð¾Ð»Ð¸Ñ Ð·Ð°Ð³ÑÑзиÑÑ Ð¿Ñиложение, ÑпаковаÑÑ ÐµÐ³Ð¾ в dyno, запÑÑÑиÑÑ collectstatic, и запÑÑÑиÑÑ Ñам ÑайÑ.
git push heroku master
ÐÑли нам повезÑÑ, пÑиложение «заÑабоÑаеÑ» на ÑайÑе, но оно не бÑÐ´ÐµÑ ÑабоÑаÑÑ Ð´Ð¾Ð»Ð¶Ð½Ñм обÑазом, поÑÐ¾Ð¼Ñ ÑÑо Ð¼Ñ Ð½Ðµ наÑÑÑоили ÑаблиÑÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
Ð´Ð»Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð°Ñим пÑиложением. ÐÐ»Ñ ÑÑого нам нÑжно иÑполÑзоваÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ heroku run и запÑÑÑиÑÑ "one off dyno" Ð´Ð»Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑаÑии пеÑеноÑа. ÐведиÑе в ÑеÑминал ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
heroku run python manage.py migrate
ÐÑ Ñакже Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±Ñдем имеÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑÑ ÐºÐ½Ð¸Ð³Ð¸ и авÑоÑов, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð²Ð°Ð¹Ñе Ñакже Ñоздадим ÑÑпеÑполÑзоваÑелÑ, Ñнова иÑполÑзÑÑ Ð¾Ð´Ð½Ð¾ÑазовÑй динамиÑеÑкий Ñежим:
heroku run python manage.py createsuperuser
Ðак ÑолÑко ÑÑо бÑÐ´ÐµÑ Ð·Ð°Ð²ÐµÑÑено, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ поÑмоÑÑеÑÑ ÑайÑ. Ðн должен ÑабоÑаÑÑ, Ñ Ð¾ÑÑ Ð² нем еÑÑ Ð½ÐµÑ ÐºÐ½Ð¸Ð³. ЧÑÐ¾Ð±Ñ Ð¾ÑкÑÑÑÑ Ð±ÑаÑÐ·ÐµÑ Ð½Ð° новом веб-ÑайÑе, иÑполÑзÑйÑе командÑ:
heroku open
СоздайÑе неÑколÑко книг на ÑайÑе админиÑÑÑаÑоÑа и пÑовеÑÑÑе, ÑабоÑÐ°ÐµÑ Ð»Ð¸ ÑайÑ, как Ð²Ñ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑе.
УпÑавление аддонами
ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑиÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð² ÑвоÑм пÑиложении, иÑполÑзÑÑ heroku addons командÑ. ÐÑо бÑÐ´ÐµÑ ÑпиÑок вÑеÑ
аддонов, иÑ
ÑÐµÐ½Ð¾Ð²Ð°Ñ ÐºÐ°ÑегоÑÐ¸Ñ Ð¸ ÑоÑÑоÑние.
>heroku addons
Add-on Plan Price State
âââââââââââââââââââââââââââââââââââââââââ âââââââââ âââââ âââââââ
heroku-postgresql (postgresql-flat-26536) hobby-dev free created
ââ as DATABASE
ÐдеÑÑ Ð¼Ñ Ð²Ð¸Ð´Ð¸Ð¼, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑолÑко одна надÑÑÑойка, база даннÑÑ postgres SQL. ÐÑо беÑплаÑно и авÑомаÑиÑеÑки ÑоздаÑÑÑÑ Ð¿Ñи Ñоздании пÑиложениÑ. ÐÑ Ð¼Ð¾Ð¶ÐµÑе оÑкÑÑÑÑ Ð²ÐµÐ±-ÑÑÑаниÑÑ, ÑÑÐ¾Ð±Ñ Ð±Ð¾Ð»ÐµÐµ подÑобно изÑÑиÑÑ Ð½Ð°Ð´ÑÑÑÐ¾Ð¹ÐºÑ Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ (или лÑбое дÑÑгое дополнение), иÑполÑзÑÑ ÑледÑÑÑÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ:
heroku addons:open heroku-postgresql
ÐÑÑгие ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»ÑÑÑ ÑоздаваÑÑ, ÑниÑÑожаÑÑ, обновлÑÑÑ Ð¸ понижаÑÑ Ð°Ð´Ð´Ð¾Ð½Ñ (иÑполÑзÑÑ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸ÑнÑй ÑинÑакÑÐ¸Ñ Ð´Ð»Ñ Ð¾ÑкÑÑÑиÑ). ÐÐ»Ñ Ð¿Ð¾Ð»ÑÑÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑной инÑоÑмаÑии Ñм. Managing Add-ons (Heroku docs).
ÐаÑÑÑойка пеÑеменнÑÑ ÐºÐ¾Ð½ÑигÑÑаÑии
ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑиÑÑ ÐºÐ¾Ð½ÑигÑÑаÑионнÑе пеÑеменнÑе Ð´Ð»Ñ ÑайÑа, иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ heroku config. Ðиже Ð²Ñ Ð¼Ð¾Ð¶ÐµÑе видеÑÑ, ÑÑо Ñ Ð½Ð°Ñ ÐµÑÑÑ ÑолÑко одна пеÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ DATABASE_URL , иÑполÑзÑÐµÐ¼Ð°Ñ Ð´Ð»Ñ Ð½Ð°ÑÑÑойки наÑей Ð±Ð°Ð·Ñ Ð´Ð°Ð½Ð½ÑÑ
.
>heroku config
=== locallibrary Config Vars
DATABASE_URL: postgres://uzfnbcyxidzgrl:j2jkUFDF6OGGqxkgg7Hk3ilbZI@ec2-54-243-201-144.compute-1.amazonaws.com:5432/dbftm4qgh3kda3
ÐÑли Ð²Ñ Ð²ÑпомниÑе из Ñаздела, поÑвÑÑÑнного getting the website ready to publish, Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ ÑÑÑановиÑÑ Ð¿ÐµÑеменнÑе ÑÑÐµÐ´Ñ Ð´Ð»Ñ DJANGO_SECRET_KEY и DJANGO_DEBUG. ÐавайÑе Ñделаем ÑÑо ÑейÑаÑ.
ÐÑимеÑание:
СекÑеÑнÑй клÑÑ Ð´Ð¾Ð»Ð¶ÐµÐ½ бÑÑÑ Ð´ÐµÐ¹ÑÑвиÑелÑно ÑекÑеÑнÑм! Ðдин из ÑпоÑобов генеÑаÑии нового клÑÑа - ÑоздаÑÑ Ð½Ð¾Ð²Ñй пÑÐ¾ÐµÐºÑ Django (django-admin startproject someprojectname) а заÑем полÑÑиÑÑ ÐºÐ»ÑÑ, коÑоÑÑй генеÑиÑÑеÑÑÑ Ð´Ð»Ñ Ð²Ð°Ñ Ð² его settings.py.
ÐÑ ÑÑÑанавливаем DJANGO_SECRET_KEY иÑполÑзÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ config:set (как показано ниже). Ðе забÑдÑÑе иÑполÑзоваÑÑ Ñвой ÑекÑеÑнÑй клÑÑ!
>heroku config:set DJANGO_SECRET_KEY=eu09(ilk6@4sfdofb=b_2ht@vad*$ehh9-)3u_83+y%(+phh&=
Setting DJANGO_SECRET_KEY and restarting locallibrary... done, v7
DJANGO_SECRET_KEY: eu09(ilk6@4sfdofb=b_2ht@vad*$ehh9-)3u_83+y%(+phh
ÐналогиÑно Ð¼Ñ ÑÑÑанавливаем DJANGO_DEBUG:
>heroku config:set DJANGO_DEBUG=''
Setting DJANGO_DEBUG and restarting locallibrary... done, v8
ÐÑли Ð²Ñ Ð¿Ð¾ÑеÑиÑе веб-ÑÐ°Ð¹Ñ ÑейÑаÑ, Ð²Ñ Ð¿Ð¾Ð»ÑÑиÑе оÑÐ¸Ð±ÐºÑ "Bad request" , поÑÐ¾Ð¼Ñ ÑÑо в ALLOWED_HOSTS надо внеÑÑи паÑамеÑÑÑ, еÑли Ñ Ð²Ð°Ñ DEBUG=False (в каÑеÑÑве меÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°ÑноÑÑи). ÐÑкÑойÑе /locallibrary/settings.py и измениÑе ALLOWED_HOSTS Ð´Ð»Ñ Ð²ÐºÐ»ÑÑÐµÐ½Ð¸Ñ Ð²Ð°Ñего базового URL-адÑеÑа пÑÐ¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ (напÑимеÑ, 'locallibrary1234.herokuapp.com') URL, коÑоÑÑй Ð²Ñ Ð¾Ð±ÑÑно иÑполÑзÑеÑе на локалÑном ÑеÑвеÑе ÑазÑабоÑки.
ALLOWED_HOSTS = ['<your app URL without the https:// prefix>.herokuapp.com','127.0.0.1']
# For example:
# ALLOWED_HOSTS = ['fathomless-scrubland-30645.herokuapp.com','127.0.0.1']
ÐаÑем ÑÐ¾Ñ ÑаниÑе наÑÑÑойки и пеÑедайÑе Ð¸Ñ Ð² ÑепозиÑоÑий Github и в Heroku:
git add -A
git commit -m 'Update ALLOWED_HOSTS with site and development server URL'
git push origin master
git push heroku master
ÐÑимеÑание: ÐоÑле завеÑÑÐµÐ½Ð¸Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑайÑа на Heroku введиÑе URL-адÑеÑ, коÑоÑÑй не ÑÑÑеÑÑвÑÐµÑ (напÑимеÑ, /catalog/doesnotexist/). РанÑÑе ÑÑо оÑобÑажало Ð±Ñ Ð¿Ð¾Ð´ÑобнÑÑ ÑÑÑаниÑÑ Ð¾Ñладки, но ÑепеÑÑ Ð²Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ Ð¿ÑоÑÑо ÑвидеÑÑ Ð¿ÑоÑÑÑÑ ÑÑÑаниÑÑ Â«Ðе найдено».
ÐÑладка
ÐÐ»Ð¸ÐµÐ½Ñ Heroku пÑедоÑÑавлÑÐµÑ Ð½ÐµÑколÑко инÑÑÑÑменÑов Ð´Ð»Ñ Ð¾Ñладки:
heroku logs # Show current logs
heroku logs --tail # Show current logs and keep updating with any new results
heroku config:set DEBUG_COLLECTSTATIC=1 # Add additional logging for collectstatic (this tool is run automatically during a build)
heroku ps #Display dyno status
ÐÑли вам нÑжно болÑÑе инÑоÑмаÑии, пÑедоÑÑавленной здеÑÑ, вам нÑжно бÑÐ´ÐµÑ Ð½Ð°ÑаÑÑ Ð¸Ð·ÑÑаÑÑ Django Logging.
ÐÑоги
ÐÑо ÐºÐ¾Ð½ÐµÑ ÑÑого ÑÑководÑÑва по наÑÑÑойке и ÑазвÑÑÑÑвании пÑиложений Django, а Ñакже ÑеÑÐ¸Ñ ÑÑководÑÑв по ÑабоÑе Ñ Django. ÐадеемÑÑ, Ð²Ñ Ð½Ð°Ñли Ð¸Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ñми. ÐÑ Ð¼Ð¾Ð¶ÐµÑе пÑовеÑиÑÑ Ð¿Ð¾Ð»Ð½Ð¾ÑÑÑÑ Ð¿ÑоÑабоÑаннÑÑ Ð²ÐµÑÑÐ¸Ñ Ð¿Ð¾ иÑÑ Ð¾Ð´Ð½Ð¸ÐºÐ°Ð¼ на Github. СледÑÑÑий Ñаг - пÑоÑиÑаÑÑ Ð½Ð°Ñи поÑледние неÑколÑко ÑÑаÑей, а заÑем завеÑÑиÑÑ Ð¾ÑеноÑнÑÑ Ð·Ð°Ð´Ð°ÑÑ.
СмоÑÑиÑе Ñакже
-
РазвÑÑÑÑвание Django (Django docs)
- ÐонÑÑолÑнÑй ÑпиÑок ÑазвÑÑÑÑÐ²Ð°Ð½Ð¸Ñ (Django docs)
- РазвÑÑÑÑвание ÑÑаÑиÑеÑÐºÐ¸Ñ Ñайлов (Django docs)
- Ðак ÑазвеÑнÑÑÑ Ñ WSGI (Django docs)
- Ðак иÑполÑзоваÑÑ Django Ñ Apache и mod_wsgi (Django docs)
- Ðак иÑполÑзоваÑÑ Django Ñ Gunicorn (Django docs)
-
Heroku
- ÐаÑÑÑойка Django пÑиложений Ð´Ð»Ñ Heroku (Heroku docs)
- ÐаÑало ÑабоÑÑ Ð² Heroku Ñ Django (Heroku docs)
- Django and Static Assets (Heroku docs)
- ÐаÑаллелизм и подклÑÑение к базе даннÑÑ Ð² Django (Heroku docs)
- Ðак Heroku ÑабоÑÐ°ÐµÑ (Heroku docs)
- Dynos and the Dyno Manager (Heroku docs)
- ÐаÑÑÑойка и Config Vars (Heroku docs)
- ÐгÑаниÑÐµÐ½Ð¸Ñ (Heroku docs)
- РазвÑÑÑÑвание Python applications Ñ Gunicorn (Heroku docs)
- РазвÑÑÑÑвание Python и Django apps в Heroku (Heroku docs)
- ÐÑÑ Ð¾ Heroku Django docs
-
Digital Ocean