ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΠΌ RHEL 8 Beta: Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π²Π΅Π±-прилоТСния

RHEL 8 Beta ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²Ρ‹Ρ… возмоТностСй, пСрСчислСниС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Π½ΡΡ‚ΡŒ страницы, ΠΎΠ΄Π½Π°ΠΊΠΎ, ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π½ΠΎΠ²ΠΎΠ΅ всСгда Π»ΡƒΡ‡ΡˆΠ΅ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, поэтому Π½ΠΈΠΆΠ΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅ΠΌ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ создания инфраструктуры ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π° Π±Π°Π·Π΅ Red Hat Enterprise Linux 8 Beta.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΠΌ RHEL 8 Beta: Π‘ΠΎΠ±ΠΈΡ€Π°Π΅ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π²Π΅Π±-прилоТСния

Π—Π° основу возьмСм Python, популярный срСди Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² язык программирования, ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ Django ΠΈ PostgreSQL, довольно Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½Π΅Π½Π½ΡƒΡŽ связку для создания ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈ сконфигурируСм RHEL 8 Beta для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ. ΠŸΠΎΡ‚ΠΎΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Π΅ ΠΏΠ°Ρ€Ρƒ (нСсСкрСтных) ΠΈΠ½Π³Ρ€Π΅Π΄ΠΈΠ΅Π½Ρ‚ΠΎΠ².

ВСстовоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ, вСдь Π»ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚ΡŒ возмоТности Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Ρƒ с ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€Π°ΠΌΠΈ ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ срСды с нСсколькими сСрвСрами. Для Π½Π°Ρ‡Π°Π»Π° Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΎΠ²Ρ‹ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ с создания нСбольшого простого ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ – Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΡ‚ΠΈ ΠΈ ΠΊΠ°ΠΊ осущСствляСтся взаимодСйствиС, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ созданию Π±ΠΎΠ»Π΅Π΅ слоТных ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ. БСгодня рассказ ΠΎ создании Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°.

НачнСм с развСртывания ΠΎΠ±Ρ€Π°Π·Π° Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ RHEL 8 Beta VM. МоТно ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ с нуля, ΠΈΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ гостСвой ΠΎΠ±Ρ€Π°Π· KVM, доступный вмСстС с подпиской Π½Π° Beta. ΠŸΡ€ΠΈ использовании гостСвого ΠΎΠ±Ρ€Π°Π·Π° потрСбуСтся Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ CD, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ для ΠΎΠ±Π»Π°Ρ‡Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (cloud-init). НичСго особСнного со структурой диска ΠΈΠ»ΠΈ доступными ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ, ΠΏΠΎΠ΄ΠΎΠΉΠ΄Π΅Ρ‚ любая конфигурация.

Π”Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим вСсь процСсс ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅.

Установка Django

Π‘ новСйшСй вСрсиСй Django потрСбуСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ (virtualenv) с Python 3.5 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ·Π΄Π½Π΅ΠΉ вСрсиСй. Π’ примСчаниях ΠΊ Beta ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ доступСн Python 3.6, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π»ΠΈ это Ρ‚Π°ΠΊ:

[cloud-user@8beta1 ~]$ python
-bash: python: command not found
[cloud-user@8beta1 ~]$ python3
-bash: python3: command not found

Red Hat Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Python Π² качСствС систСмного инструмСнтария Π² RHEL, Ρ‚Π°ΠΊ ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΆΠ΅ получаСтся Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚?

Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Python, всС Π΅Ρ‰Π΅ Ρ€Π°Π·ΠΌΡ‹ΡˆΠ»ΡΡŽΡ‚ ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π΅ с Python 2 Π½Π° Python 2, ΠΏΡ€ΠΈ этом сам Python 3 находится Π² стадии Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, ΠΈ постоянно ΠΏΠΎΡΠ²Π»ΡΡŽΡ‚ΡΡ всС Π½ΠΎΠ²Ρ‹Π΅ ΠΈ Π½ΠΎΠ²Ρ‹Π΅ вСрсии. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ Π² ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½Ρ‹Ρ… систСмных инструмСнтах, ΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ доступ ΠΊ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ Π½ΠΎΠ²Ρ‹ΠΌ вСрсиям Python, систСмный Python пСрСнСсли Π² Π½ΠΎΠ²Ρ‹ΠΉ ΠΏΠ°ΠΊΠ΅Ρ‚ ΠΈ обСспСчили Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ установки ΠΊΠ°ΠΊ Python 2.7, Ρ‚Π°ΠΊ ΠΈ 3.6. Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎΠ± измСнСниях ΠΈ ΠΎ Ρ‚ΠΎΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это Π±Ρ‹Π»ΠΎ сдСлано, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡Π΅Ρ€ΠΏΠ½ΡƒΡ‚ΡŒ ΠΈΠ· ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π² Π±Π»ΠΎΠ³Π΅ Лэнгдона Π£Π°ΠΉΡ‚Π° (Langdon White).

Π˜Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ Python, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ всСго Π΄Π²Π° ΠΏΠ°ΠΊΠ΅Ρ‚Π°, ΠΏΡ€ΠΈ этом python3-pip подтянСтся Π² Π²ΠΈΠ΄Π΅ зависимости.

sudo yum install python36 python3-virtualenv

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ стоит ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ нСпосрСдствСнныС обращСния ΠΊ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ, ΠΊΠ°ΠΊ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Лэнгдон, ΠΈ Π½Π΅ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ pip3? Помня ΠΎ прСдстоящСй Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ, извСстно, Ρ‡Ρ‚ΠΎ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ansible потрСбуСтся установлСнный pip, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ pip Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Π΅ окруТСния (virtualenvs) с кастомным исполняСмым Ρ„Π°ΠΉΠ»ΠΎΠΌ pip.

ИмСя Π² своСм распоряТСнии Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ python3, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ процСсс установки Django ΠΈ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΡƒΡŽ систСму вмСстС с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ нашими ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. Π’ сСти прСдставлСно мноТСство Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Π—Π΄Π΅ΡΡŒ прСдставлСна ΠΎΠ΄Π½Π° вСрсия, Π½ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ свои собствСнныС процСссы.

ВСрсии PostgreSQL ΠΈ Nginx, доступныС Π² RHEL 8 ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Yum.

sudo yum install nginx postgresql-server

Для PostgreSQL потрСбуСтся psycopg2, Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ΠΎ Π±Ρ‹Π»ΠΎ доступно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ virtualenv, поэтому Π΅Π³ΠΎ Π±ΡƒΠ΄Π΅ΠΌ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip3 вмСстС с Django ΠΈ Gunicorn. Но сначала Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ virtualenv.

На Ρ‚Π΅ΠΌΡƒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ Π²Ρ‹Π±ΠΎΡ€Π° мСста установки ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Django всСгда вСдСтся ΠΌΠ½ΠΎΠ³ΠΎ споров, Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ сомнСния, всСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ стандарту Linux Filesystem Hierarchy Standard. Π’ частности, Π² FHS сказано, Ρ‡Ρ‚ΠΎ /srv ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для: «хранСния Π΄Π°Π½Π½Ρ‹Ρ…, спСцифичСских для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ ΡƒΠ·Π»Π°, – Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π΄Π°Π΅Ρ‚ систСма, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ скриптов Π²Π΅Π±-сСрвСров, Π΄Π°Π½Π½Ρ‹Ρ…, хранящихся Π½Π° FTP сСрвСрах, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² систСм контроля вСрсий (ΠΏΠΎΡΠ²ΠΈΠ²ΡˆΠΈΡ…ΡΡ Π² FHS-2.3 Π² 2004 Π³ΠΎΠ΄Ρƒ)Β».

Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π°Π· наш случай, поэтому складываСм всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ Π² /srv, Π²Π»Π°Π΄Π΅Π»ΡŒΡ†Π΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ являСтся наш ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ прилоТСния (cloud-user).

sudo mkdir /srv/djangoapp
sudo chown cloud-user:cloud-user /srv/djangoapp
cd /srv/djangoapp
virtualenv django
source django/bin/activate
pip3 install django gunicorn psycopg2
./django-admin startproject djangoapp /srv/djangoapp

Настройка PostgreSQL ΠΈ Django Π½Π΅ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ слоТностСй: создаСм Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, создаСм ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, настраиваСм Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ. БущСствуСт ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ‚, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ слСдуСт ΠΏΠΎΠΌΠ½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ исходной установкС PostgreSQL – это скрипт postgresql-setup, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ устанавливаСтся вмСстС с ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ postgresql-server. Π­Ρ‚ΠΎΡ‚ скрипт ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, связанныС с администрированиСм кластСра Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ кластСра ΠΈΠ»ΠΈ процСсс обновлСния. Для настройки Π½ΠΎΠ²ΠΎΠ³ΠΎ экзСмпляра PostgreSQL Π½Π° систСмС RHEL Π½Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

sudo /usr/bin/postgresql-setup -initdb

ПослС этого ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ PostgreSQL с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ systemd, ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² Django. НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ PostgreSQL послС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π°ΡƒΡ‚Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ это pg_hba.conf) для настройки хранСния пароля для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ прилоТСния. Если Π²Ρ‹ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ слоТностями, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ‹ настройки IPv4 ΠΈ IPv6 Π² Ρ„Π°ΠΉΠ»Π΅ pg_hba.conf.

systemctl enable -now postgresql

sudo -u postgres psql
postgres=# create database djangoapp;
postgres=# create user djangouser with password 'qwer4321';
postgres=# alter role djangouser set client_encoding to 'utf8';
postgres=# alter role djangouser set default_transaction_isolation to 'read committed';
postgres=# alter role djangouser set timezone to 'utc';
postgres=# grant all on DATABASE djangoapp to djangouser;
postgres=# q

Π’ Ρ„Π°ΠΉΠ»Π΅ /var/lib/pgsql/data/pg_hba.conf:

# IPv4 local connections:
host    all        all 0.0.0.0/0                md5
# IPv6 local connections:
host    all        all ::1/128                 md5

Π’ Ρ„Π°ΠΉΠ»Π΅ /srv/djangoapp/settings.py:

# Database
DATABASES = {
   'default': {
       'ENGINE': 'django.db.backends.postgresql_psycopg2',
       'NAME': '{{ db_name }}',
       'USER': '{{ db_user }}',
       'PASSWORD': '{{ db_password }}',
       'HOST': '{{ db_host }}',
   }
}

ПослС конфигурирования Ρ„Π°ΠΉΠ»Π° settings.py Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ΠΈ настройки ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвСр Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚. ПослС запуска сСрвСра Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ admin с Ρ†Π΅Π»ΡŒΡŽ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ соСдинСниС с Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ….

./manage.py runserver 0.0.0.0:8000
./manage.py createsuperuser

WSGI? Π’Π°ΠΉ?

Π‘Π΅Ρ€Π²Π΅Ρ€ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΠΎΠ»Π΅Π·Π΅Π½ ΠΏΡ€ΠΈ тСстировании, Π½ΠΎ для запуска прилоТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ сСрвСр ΠΈ прокси для Web Server Gateway Interface (WSGI). БущСствуСт нСсколько распространСнных связок, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Apache HTTPD с uWSGI ΠΈΠ»ΠΈ Nginx с Gunicorn.

Π—Π°Π΄Π°Ρ‡Π° Web Server Gateway Interface – ΠΏΠ΅Ρ€Π΅Π½Π°ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ запросы ΠΎΡ‚ Π²Π΅Π±-сСрвСра ΠΊ Π²Π΅Π±-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΡƒ Python. WSGI – это эдакоС наслСдиС уТасного ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ, ΠΊΠΎΠ³Π΄Π° Π² Ρ…ΠΎΠ΄Ρƒ Π±Ρ‹Π»ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΡ‹ CGI, ΠΈ сСгодня WSGI являСтся фактичСски стандартом, нСзависимо ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ Π²Π΅Π±-сСрвСра ΠΈΠ»ΠΈ Python-Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°. Но нСсмотря Π½Π° Π΅Π³ΠΎ ΡˆΠΈΡ€ΠΎΠΊΠΎΠ΅ распространСниС, всС ΠΆΠ΅ сущСствуСт мноТСство нюансов ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с этими Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°ΠΌΠΈ, ΠΈ мноТСство возмоТностСй Π²Ρ‹Π±ΠΎΡ€Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС постараСмся Π½Π°Π»Π°Π΄ΠΈΡ‚ΡŒ взаимодСйствиС Gunicorn ΠΈ Nginx Ρ‡Π΅Ρ€Π΅Π· сокСт.

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ±Π° эти ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° установлСны Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ сСрвСрС, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ вмСсто сСтСвого сокСта сокСт UNIX. Π’Π°ΠΊ ΠΊΠ°ΠΊ для ΠΊΠΎΠΌΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΉ Π² любом случаС Π½ΡƒΠΆΠ΅Π½ сокСт, ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ шаг ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π°ΠΊΡ‚ΠΈΠ²Π°Ρ†ΠΈΡŽ сокСта для Gunicorn Ρ‡Π΅Ρ€Π΅Π· systemd.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ создания сСрвисов, Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… сокСтами (socket activated services), достаточно прост. Π‘Π½Π°Ρ‡Π°Π»Π° создаСтся unit-Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρƒ ListenStream, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π½Π° Ρ‚ΠΎΡ‡ΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π±ΡƒΠ΄Π΅Ρ‚ создан сокСт UNIX, Π·Π°Ρ‚Π΅ΠΌ β€” unit-Ρ„Π°ΠΉΠ» для сСрвиса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Requires Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° unit-Ρ„Π°ΠΉΠ» сокСта. Π—Π°Ρ‚Π΅ΠΌ Π² unit-Ρ„Π°ΠΉΠ»Π΅ сСрвиса останСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Gunicorn ΠΈΠ· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ окруТСния ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ WSGI-привязку для сокСта UNIX ΠΈ прилоТСния Django.

Π’ΠΎΡ‚ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² unit Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π²Π·ΡΡ‚ΡŒ Π·Π° основу. Π‘Π½Π°Ρ‡Π°Π»Π° настраиваСм сокСт.

[Unit]
Description=Gunicorn WSGI socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄Π΅ΠΌΠΎΠ½ Gunicorn.

[Unit]
Description=Gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=cloud-user
Group=cloud-user
WorkingDirectory=/srv/djangoapp

ExecStart=/srv/djangoapp/django/bin/gunicorn 
         β€”access-logfile - 
         β€”workers 3 
         β€”bind unix:gunicorn.sock djangoapp.wsgi

[Install]
WantedBy=multi-user.target

Для Nginx, достаточно просто ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ прокси ΠΈ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡŽ для хранСния статичного ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, Ссли Π²Ρ‹ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅. Π’ RHEL Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Nginx находятся /etc/nginx/conf.d. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΡƒΠ΄Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² Ρ„Π°ΠΉΠ» /etc/nginx/conf.d/default.conf, ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвис. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ ΡƒΠΊΠ°Π·Π°Π»ΠΈ server_name Π² соотвСтствии с Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ вашСго хоста.

server {
   listen 80;
   server_name 8beta1.example.com;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /srv/djangoapp;
   }

   location / {
       proxy_set_header Host $http_host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
       proxy_pass http://unix:/run/gunicorn.sock;
   }
}

ЗапускайтС сокСт Gunicorn ΠΈ Nginx с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ systemd, ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ.

Ошибка Bad Gateway?

Если Π²Ρ‹ Π²Π²Π΅Π΄Π΅Ρ‚Π΅ адрСс Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, Ρ‚ΠΎ, вСроятнСС всСго, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ ΠΎΡˆΠΈΠ±ΠΊΡƒ 502 Bad Gateway. Она ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²Ρ‹Π·Π²Π°Π½Π° Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ настроСнными Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ для сокСта UNIX, ΠΈΠ»ΠΈ обусловлСна Π±ΠΎΠ»Π΅Π΅ слоТными ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ, связанными с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ доступом Π² SELinux.

Π’ ΠΆΡƒΡ€Π½Π°Π»Π΅ ошибок nginx ΠΌΠΎΠΆΠ½ΠΎ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒ строчку ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°:

2018/12/18 15:38:03 [crit] 12734#0: *3 connect() to unix:/run/gunicorn.sock failed (13: Permission denied) while connecting to upstream, client: 192.168.122.1, server: 8beta1.example.com, request: "GET / HTTP/1.1", upstream: "http://unix:/run/gunicorn.sock:/", host: "8beta1.example.com"

Если Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Gunicorn Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ пустой ΠΎΡ‚Π²Π΅Ρ‚.

curl β€”unix-socket /run/gunicorn.sock 8beta1.example.com

Π”Π°Π²Π°ΠΉΡ‚Π΅ разбСрСмся, ΠΏΠΎΡ‡Π΅ΠΌΡƒ это происходит. Если ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΆΡƒΡ€Π½Π°Π», Ρ‚ΠΎ вСроятнСС всСго, ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° связана с SELinux. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Ρƒ нас Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π΄Π΅ΠΌΠΎΠ½, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π΅ Π±Ρ‹Π»ΠΎ создано своСй ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, ΠΎΠ½ помСчаСтся ΠΊΠ°ΠΊ init_t. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ эту Ρ‚Π΅ΠΎΡ€ΠΈΡŽ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

sudo setenforce 0

ВсС это ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΊΡ€ΠΈΡ‚ΠΈΠΊΡƒ ΠΈ ΠΊΡ€ΠΎΠ²Π°Π²Ρ‹Π΅ слСзы, Π½ΠΎ это всСго лишь ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ°. ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΠΌ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ лишь Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΈΠΌΠ΅Π½Π½ΠΎ Π² этом, послС Ρ‡Π΅Π³ΠΎ Π²Π΅Ρ€Π½Π΅ΠΌ всС Π½Π°Π·Π°Π΄ Π½Π° свои мСста.

Обновив страницу Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ ΠΈΠ»ΠΈ пСрСзапустив Π½Π°ΡˆΡƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ curl, ΠΌΠΎΠΆΠ½ΠΎ Π»ΠΈΡ†Π΅Π·Ρ€Π΅Ρ‚ΡŒ Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ страницу Django.

Π˜Ρ‚Π°ΠΊ, ΡƒΠ±Π΅Π΄ΠΈΠ²ΡˆΠΈΡΡŒ, Ρ‡Ρ‚ΠΎ всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, ΠΈ большС Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ Π½Π΅Ρ‚, ΠΌΡ‹ вновь Π²ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌ SELinux.

sudo setenforce 1

Π—Π΄Π΅ΡΡŒ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ рассказа ΠΎΠ± audit2allow ΠΈ ΠΎ создании ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ Π½Π° основС ΠΎΠΏΠΎΠ²Π΅Ρ‰Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ sepolgen, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅Ρ‚ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ прилоТСния Django, Ρ‚ΠΎ Π½Π΅Ρ‚ ΠΈ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΊΠ°Ρ€Ρ‚Ρ‹ Ρ‚ΠΎΠ³ΠΎ, ΠΊ Ρ‡Π΅ΠΌΡƒ Gunicorn ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°Ρ…ΠΎΡ‚Π΅Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ доступ, ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ этот доступ слСдуСт Π·Π°ΠΏΡ€Π΅Ρ‚ΠΈΡ‚ΡŒ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ SELinux для Π·Π°Ρ‰ΠΈΡ‚Ρ‹ систСмы, ΠΈ Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π·Π°ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΈ ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ сообщСния Π² ΠΆΡƒΡ€Π½Π°Π»Π΅ Π°ΡƒΠ΄ΠΈΡ‚Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π·Π°Ρ‚Π΅ΠΌ Π½Π° ΠΈΡ… основС ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ.

Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² (permissive domains)

О Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½Π°Ρ… Π² SELinux Π½Π΅ всС ΡΠ»Ρ‹ΡˆΠ°Π»ΠΈ, Π½ΠΎ Π² Π½ΠΈΡ… Π½Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ. МногиС Π΄Π°ΠΆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ с Π½ΠΈΠΌΠΈ, сами ΠΎΠ± этом Π½Π΅ Π΄ΠΎΠ³Π°Π΄Ρ‹Π²Π°ΡΡΡŒ. Когда создаСтся ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Π½Π° основС сообщСний Π°ΡƒΠ΄ΠΈΡ‚Π°, созданная ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° прСдставляСт собой Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΡƒΡŽ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΉ Π΄ΠΎΠΌΠ΅Π½ для Gunicorn, Π½ΡƒΠΆΠ½Π° нСкая ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ°, Π° Ρ‚Π°ΠΊΠΆΠ΅ потрСбуСтся ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ инструмСнты, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ.

sudo yum install selinux-policy-devel

ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… Π΄ΠΎΠΌΠ΅Π½ΠΎΠ² – прСкрасный инструмСнт для выявлСния ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, особСнно ΠΊΠΎΠ³Π΄Π° Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ кастомном ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΈΠ»ΠΈ ΠΎ прилоТСниях, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ Π±Π΅Π· ΡƒΠΆΠ΅ созданных ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠ° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½ΠΎΠ³ΠΎ Π΄ΠΎΠΌΠ΅Π½Π° для Gunicorn Π±ΡƒΠ΄Π΅Ρ‚ максимально простой – объявим основной Ρ‚ΠΈΠΏ (gunicorn_t), объявим Ρ‚ΠΈΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для ΠΏΠΎΠΌΠ΅Ρ‚ΠΊΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² (gunicorn_exec_t), ΠΈ Π·Π°Ρ‚Π΅ΠΌ настроим ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ (transition) для system, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ процСссы. ПослСдняя строчка устанавливаСт ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Π΅ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ.

gunicorn.te:

policy_module(gunicorn, 1.0)

type gunicorn_t;
type gunicorn_exec_t;
init_daemon_domain(gunicorn_t, gunicorn_exec_t)
permissive gunicorn_t;

МоТно ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ этот Ρ„Π°ΠΉΠ» ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊ ΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² систСму.

make -f /usr/share/selinux/devel/Makefile
sudo semodule -i gunicorn.pp

sudo semanage permissive -a gunicorn_t
sudo semodule -l | grep permissive

Π”Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Π½Π΅ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ Π»ΠΈ SELinux Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Π΅Ρ‰Π΅, ΠΏΠΎΠΌΠΈΠΌΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊ Ρ‡Π΅ΠΌΡƒ обращаСтся наш нСизвСстный Π΄Π΅ΠΌΠΎΠ½.

sudo ausearch -m AVC

type=AVC msg=audit(1545315977.237:1273): avc:  denied { write } for pid=19400 comm="nginx" name="gunicorn.sock" dev="tmpfs" ino=52977 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:var_run_t:s0 tclass=sock_file permissive=0

SELinux Π½Π΅ Π΄Π°Π΅Ρ‚ Nginx Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ Π² сокСт UNIX, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ Gunicorn. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² Ρ‚Π°ΠΊΠΈΡ… случаях Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΠΈ, Π½ΠΎ Π²ΠΏΠ΅Ρ€Π΅Π΄ΠΈ прСдстоит Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ. МоТно Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ настройки Π΄ΠΎΠΌΠ΅Π½Π°, ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ² Π΅Π³ΠΎ ΠΈΠ· Π΄ΠΎΠΌΠ΅Π½Π° ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π² Π΄ΠΎΠΌΠ΅Π½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ пСрСнСсСм httpd_t Π² Π΄ΠΎΠΌΠ΅Π½ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ. Π­Ρ‚ΠΎ обСспСчит Nginx Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ доступ, ΠΈ ΠΌΡ‹ смоТСм ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ΡŒ Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΏΠΎ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅.

sudo semanage permissive -a httpd_t

Π˜Ρ‚Π°ΠΊ, ΠΊΠΎΠ³Π΄Π° ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π·Π°Ρ‰ΠΈΡ‚Ρƒ SELinux (Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ слСдуСт ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с SELinux Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ) ΠΈ Π΄ΠΎΠΌΠ΅Π½Ρ‹ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ gunicorn_exec_t, Ρ‡Ρ‚ΠΎΠ±Ρ‹ всС вновь Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π²Π΅Π±-сайту, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ сообщСния ΠΎΠ± ограничСниях Π² доступС.

sudo ausearch -m AVC -c gunicorn

МоТно Π²ΠΈΠ΄Π΅Ρ‚ΡŒ мноТСство сообщСний, содСрТащих ‘comm=Β«gunicornΒ»’, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ дСйствия Π½Π°Π΄ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² /srv/djangoapp, поэтому, ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, это ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΎΠ΄Π½Π° ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ стоит ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ.

Но ΠΊΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, появляСтся сообщСниС Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π²ΠΈΠ΄Π°:

type=AVC msg=audit(1545320700.070:1542): avc:  denied { execute } for pid=20704 comm="(gunicorn)" name="python3.6" dev="vda3" ino=8515706 scontext=system_u:system_r:init_t:s0 tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0

Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ статус сСрвиса gunicorn ΠΈΠ»ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ ps, Ρ‚ΠΎ Π½Π΅ появится ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… процСссов. ΠŸΠΎΡ…ΠΎΠΆΠ΅, Ρ‡Ρ‚ΠΎ gunicorn пытаСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Python Π² нашСм ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠΈ virtualenv, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, для запуска Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… скриптов (workers). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ сСйчас ΠΏΠΎΠΌΠ΅Ρ‚ΠΈΠΌ эти Π΄Π²Π° исполняСмых Ρ„Π°ΠΉΠ»Π° ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, получится Π»ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Π½Π°ΡˆΡƒ Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ страницу Django.

chcon -t gunicorn_exec_t /srv/djangoapp/django/bin/gunicorn /srv/djangoapp/django/bin/python3.6

ΠŸΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сСрвис gunicorn, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ. Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ сразу ΠΈΠ»ΠΈ ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ сСрвис ΠΈ Π΄Π°Ρ‚ΡŒ сокСту Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΏΡ€ΠΈ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ сайта Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅. Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ процСссы ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΊΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ps.

ps -efZ | grep gunicorn

НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΌ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΠΎΠ»ΠΈΡ‚ΠΈΠΊΡƒ SELinux!

Если ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ сообщСния AVC сСйчас, Ρ‚ΠΎ послСднСС сообщСниС содСрТит permissive=1 для всСго, Ρ‡Ρ‚ΠΎ относится ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, ΠΈ permissive=0 для всСй ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ систСмы. Если ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ ΠΈΠΌΠ΅Π½Π½ΠΎ доступ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ, ΠΌΠΎΠΆΠ½ΠΎ быстрСС Π½Π°ΠΉΡ‚ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Но Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ систСма Π±Ρ‹Π»Π° Π·Π°Ρ‰ΠΈΡ‰Π΅Π½Π°, ΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ понятный ΠΈ ΠΏΡ€ΠΈΠ³ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊ использованию Π°ΡƒΠ΄ΠΈΡ‚ ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ Django.

sudo ausearch -m AVC

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ!

Появился Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Django с Ρ„Ρ€ΠΎΠ½Ρ‚Π΅Π½Π΄ΠΎΠΌ Π½Π° Nginx ΠΈ Gunicorn WSGI. ΠœΡ‹ настроили Python 3 ΠΈ PostgreSQL 10 ΠΈΠ· Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠ΅Π² RHEL 8 Beta. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²ΠΈΠ³Π°Ρ‚ΡŒΡΡ дальшС ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ (ΠΈΠ»ΠΈ просто Ρ€Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ) прилоТСния Django ΠΈΠ»ΠΈ ΠΈΠ·ΡƒΡ‡Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ доступныС инструмСнты Π² RHEL 8 Beta для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ процСсса настройки, ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ этой ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com